Make NFD Congestion Control work in ndnSIM
The current NFD congestion detection doesn't work in ndnSIM, since ndnSIM doesn't use the regular TCP, UDP, or Unix faces.
We can discuss how to fix this below.
#1 Updated by Klaus Schneider 9 months ago
From our email discussion (Davide's answer to me):
On Thu, Apr 12, 2018 at 6:21 PM, Klaus Schneider email@example.com wrote:
Forwarding as a more general question:
Is there some fundamental reason why the congestion control scheme
implemented in NFD wouldn't work (at least out of the box) in ndnSIM?
Yes. ndnSIM doesn't use NFD's faces because, well, it's a simulator,
so it obviously cannot use regular OS sockets.
I have two guesses:
- Maybe it's the way ndnSIM handles the face/transport classes for TCP, UDP, and Unix sockets? Do we need add support for ndnSIM faces here?
Yep. NetDeviceTransport needs to gain an implementation (override) of
the virtual function(s) that were added for congestion control.
- Is NDNLP fully supported in ndnSIM, i.e., the way congestion marks are carried from link to link?
It should be, but I'm not sure.
#3 Updated by Junxiao Shi 9 months ago
- Tracker changed from Task to Feature
- Start date deleted (
- Estimated time set to 3.00 h
NetDeviceTransport needs to gain an implementation (override) of the virtual function(s) that were added for congestion control.
There are two functions:
- Transport::getSendQueueCapacity should return QueueBase::GetMaxBytes
- getSendQueueLength should return QueueBase::GetNBytes
The implementation is trivial, and can qualify as a beginner task.
Is NDNLP fully supported in ndnSIM, i.e., the way congestion marks are carried from link to link?
Yes, see ndnsim:commit:5ea3322623a0550799431f25b2fc4e7e4df5c046.
#4 Updated by Klaus Schneider 9 months ago
Thanks for the clarification.
But I think a much cleaner solution would be to provide a queue class that does the congestion marking, as I did with "codel-queue2" in my simulation code: https://github.com/schneiderklaus/ns-3-dev/tree/ndnSIM-v2/src/internet/model
The current NFD code is basically a poor CoDel implementation, as a workaround since we can't access or change the queuing discipline of NFD routers.
In ndnSIM, it's much easier to change the queuing discipline and using the actual CoDel code should improve performance.
With this queue implementation, the only thing the user needs to do is to change the default queue of all netdevices:
Config::SetDefault ("ns3::PointToPointNetDevice::TxQueue", StringValue ("ns3::CoDelQueue2"));