# HG changeset patch # User Yufei Cheng # Date 1336362744 25200 # Node ID 2da1fab73114820ee52df0443287ab8a809c70b8 # Parent efad81f3cb47880df56c33569c57ba68a05a60b1 Update DSR model diff -r efad81f3cb47 -r 2da1fab73114 examples/routing/manet-routing-compare.cc --- a/examples/routing/manet-routing-compare.cc Fri Jan 27 15:15:48 2012 -0800 +++ b/examples/routing/manet-routing-compare.cc Sun May 06 20:52:24 2012 -0700 @@ -269,6 +269,21 @@ wifiMac.SetType ("ns3::AdhocWifiMac"); NetDeviceContainer adhocDevices = wifi.Install (wifiPhy, wifiMac, adhocNodes); + MobilityHelper mobilityAdhoc; + + ObjectFactory pos; + pos.SetTypeId ("ns3::RandomRectanglePositionAllocator"); + pos.Set ("X", RandomVariableValue (UniformVariable (0.0, 300.0))); + pos.Set ("Y", RandomVariableValue (UniformVariable (0.0, 1500.0))); + + Ptr taPositionAlloc = pos.Create ()->GetObject (); + mobilityAdhoc.SetMobilityModel ("ns3::RandomWaypointMobilityModel", + "Speed", RandomVariableValue (UniformVariable (0.0, nodeSpeed)), + "Pause", RandomVariableValue (ConstantVariable (nodePause)), + "PositionAllocator", PointerValue (taPositionAlloc)); + mobilityAdhoc.SetPositionAllocator (taPositionAlloc); + mobilityAdhoc.Install (adhocNodes); + AodvHelper aodv; OlsrHelper olsr; DsdvHelper dsdv; @@ -316,21 +331,6 @@ Ipv4InterfaceContainer adhocInterfaces; adhocInterfaces = addressAdhoc.Assign (adhocDevices); - MobilityHelper mobilityAdhoc; - - ObjectFactory pos; - pos.SetTypeId ("ns3::RandomRectanglePositionAllocator"); - pos.Set ("X", RandomVariableValue (UniformVariable (0.0, 300.0))); - pos.Set ("Y", RandomVariableValue (UniformVariable (0.0, 1500.0))); - - Ptr taPositionAlloc = pos.Create ()->GetObject (); - mobilityAdhoc.SetMobilityModel ("ns3::RandomWaypointMobilityModel", - "Speed", RandomVariableValue (UniformVariable (0.0, nodeSpeed)), - "Pause", RandomVariableValue (ConstantVariable (nodePause)), - "PositionAllocator", PointerValue (taPositionAlloc)); - mobilityAdhoc.SetPositionAllocator (taPositionAlloc); - mobilityAdhoc.Install (adhocNodes); - OnOffHelper onoff1 ("ns3::UdpSocketFactory",Address ()); onoff1.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1))); onoff1.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0))); @@ -344,7 +344,7 @@ UniformVariable var; ApplicationContainer temp = onoff1.Install (adhocNodes.Get (i + nSinks)); - temp.Start (Seconds (var.GetValue (50.0,51.0))); + temp.Start (Seconds (var.GetValue (100.0,101.0))); temp.Stop (Seconds (TotalTime)); } diff -r efad81f3cb47 -r 2da1fab73114 manet-routing.output.csv.dsr --- a/manet-routing.output.csv.dsr Fri Jan 27 15:15:48 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,201 +0,0 @@ -SimulationSecond,ReceiveRate,PacketsReceived,NumberOfSinks,RoutingProtocol,TransmissionPower -0,0,0,10,DSR,7.5 -1,0,0,10,DSR,7.5 -2,0,0,10,DSR,7.5 -3,0,0,10,DSR,7.5 -4,0,0,10,DSR,7.5 -5,0,0,10,DSR,7.5 -6,0,0,10,DSR,7.5 -7,0,0,10,DSR,7.5 -8,0,0,10,DSR,7.5 -9,0,0,10,DSR,7.5 -10,0,0,10,DSR,7.5 -11,0,0,10,DSR,7.5 -12,0,0,10,DSR,7.5 -13,0,0,10,DSR,7.5 -14,0,0,10,DSR,7.5 -15,0,0,10,DSR,7.5 -16,0,0,10,DSR,7.5 -17,0,0,10,DSR,7.5 -18,0,0,10,DSR,7.5 -19,0,0,10,DSR,7.5 -20,0,0,10,DSR,7.5 -21,0,0,10,DSR,7.5 -22,0,0,10,DSR,7.5 -23,0,0,10,DSR,7.5 -24,0,0,10,DSR,7.5 -25,0,0,10,DSR,7.5 -26,0,0,10,DSR,7.5 -27,0,0,10,DSR,7.5 -28,0,0,10,DSR,7.5 -29,0,0,10,DSR,7.5 -30,0,0,10,DSR,7.5 -31,0,0,10,DSR,7.5 -32,0,0,10,DSR,7.5 -33,0,0,10,DSR,7.5 -34,0,0,10,DSR,7.5 -35,0,0,10,DSR,7.5 -36,0,0,10,DSR,7.5 -37,0,0,10,DSR,7.5 -38,0,0,10,DSR,7.5 -39,0,0,10,DSR,7.5 -40,0,0,10,DSR,7.5 -41,0,0,10,DSR,7.5 -42,0,0,10,DSR,7.5 -43,0,0,10,DSR,7.5 -44,0,0,10,DSR,7.5 -45,0,0,10,DSR,7.5 -46,0,0,10,DSR,7.5 -47,0,0,10,DSR,7.5 -48,0,0,10,DSR,7.5 -49,0,0,10,DSR,7.5 -50,0,0,10,DSR,7.5 -51,0,0,10,DSR,7.5 -52,0,0,10,DSR,7.5 -53,1.536,3,10,DSR,7.5 -54,71.168,139,10,DSR,7.5 -55,29.184,57,10,DSR,7.5 -56,0,0,10,DSR,7.5 -57,0,0,10,DSR,7.5 -58,0,0,10,DSR,7.5 -59,3.584,7,10,DSR,7.5 -60,12.288,24,10,DSR,7.5 -61,7.168,14,10,DSR,7.5 -62,5.12,10,10,DSR,7.5 -63,0,0,10,DSR,7.5 -64,0,0,10,DSR,7.5 -65,0,0,10,DSR,7.5 -66,0,0,10,DSR,7.5 -67,1.536,3,10,DSR,7.5 -68,0,0,10,DSR,7.5 -69,0,0,10,DSR,7.5 -70,0,0,10,DSR,7.5 -71,0,0,10,DSR,7.5 -72,0,0,10,DSR,7.5 -73,0,0,10,DSR,7.5 -74,0,0,10,DSR,7.5 -75,0,0,10,DSR,7.5 -76,0,0,10,DSR,7.5 -77,3.584,7,10,DSR,7.5 -78,14.336,28,10,DSR,7.5 -79,12.288,24,10,DSR,7.5 -80,0.512,1,10,DSR,7.5 -81,0,0,10,DSR,7.5 -82,1.024,2,10,DSR,7.5 -83,4.096,8,10,DSR,7.5 -84,4.096,8,10,DSR,7.5 -85,2.048,4,10,DSR,7.5 -86,1.536,3,10,DSR,7.5 -87,7.68,15,10,DSR,7.5 -88,4.608,9,10,DSR,7.5 -89,5.632,11,10,DSR,7.5 -90,0.512,1,10,DSR,7.5 -91,5.632,11,10,DSR,7.5 -92,8.192,16,10,DSR,7.5 -93,14.848,29,10,DSR,7.5 -94,10.752,21,10,DSR,7.5 -95,14.336,28,10,DSR,7.5 -96,2.048,4,10,DSR,7.5 -97,6.144,12,10,DSR,7.5 -98,11.776,23,10,DSR,7.5 -99,8.704,17,10,DSR,7.5 -100,5.632,11,10,DSR,7.5 -101,6.144,12,10,DSR,7.5 -102,9.216,18,10,DSR,7.5 -103,5.12,10,10,DSR,7.5 -104,10.24,20,10,DSR,7.5 -105,5.12,10,10,DSR,7.5 -106,7.68,15,10,DSR,7.5 -107,8.192,16,10,DSR,7.5 -108,3.072,6,10,DSR,7.5 -109,1.536,3,10,DSR,7.5 -110,7.168,14,10,DSR,7.5 -111,7.68,15,10,DSR,7.5 -112,7.168,14,10,DSR,7.5 -113,5.632,11,10,DSR,7.5 -114,4.608,9,10,DSR,7.5 -115,8.704,17,10,DSR,7.5 -116,21.504,42,10,DSR,7.5 -117,4.608,9,10,DSR,7.5 -118,18.944,37,10,DSR,7.5 -119,23.552,46,10,DSR,7.5 -120,46.592,91,10,DSR,7.5 -121,38.4,75,10,DSR,7.5 -122,11.264,22,10,DSR,7.5 -123,44.544,87,10,DSR,7.5 -124,33.28,65,10,DSR,7.5 -125,13.312,26,10,DSR,7.5 -126,18.432,36,10,DSR,7.5 -127,31.744,62,10,DSR,7.5 -128,47.616,93,10,DSR,7.5 -129,48.128,94,10,DSR,7.5 -130,28.672,56,10,DSR,7.5 -131,71.68,140,10,DSR,7.5 -132,50.688,99,10,DSR,7.5 -133,9.728,19,10,DSR,7.5 -134,34.304,67,10,DSR,7.5 -135,12.288,24,10,DSR,7.5 -136,14.848,29,10,DSR,7.5 -137,3.584,7,10,DSR,7.5 -138,10.752,21,10,DSR,7.5 -139,17.92,35,10,DSR,7.5 -140,7.68,15,10,DSR,7.5 -141,29.184,57,10,DSR,7.5 -142,5.12,10,10,DSR,7.5 -143,55.808,109,10,DSR,7.5 -144,28.672,56,10,DSR,7.5 -145,21.504,42,10,DSR,7.5 -146,20.48,40,10,DSR,7.5 -147,46.592,91,10,DSR,7.5 -148,3.072,6,10,DSR,7.5 -149,18.944,37,10,DSR,7.5 -150,48.128,94,10,DSR,7.5 -151,33.792,66,10,DSR,7.5 -152,0,0,10,DSR,7.5 -153,20.48,40,10,DSR,7.5 -154,30.208,59,10,DSR,7.5 -155,17.92,35,10,DSR,7.5 -156,3.072,6,10,DSR,7.5 -157,12.288,24,10,DSR,7.5 -158,23.04,45,10,DSR,7.5 -159,27.648,54,10,DSR,7.5 -160,16.384,32,10,DSR,7.5 -161,9.728,19,10,DSR,7.5 -162,17.92,35,10,DSR,7.5 -163,10.24,20,10,DSR,7.5 -164,20.992,41,10,DSR,7.5 -165,14.336,28,10,DSR,7.5 -166,5.632,11,10,DSR,7.5 -167,11.776,23,10,DSR,7.5 -168,25.6,50,10,DSR,7.5 -169,13.312,26,10,DSR,7.5 -170,3.072,6,10,DSR,7.5 -171,13.824,27,10,DSR,7.5 -172,11.776,23,10,DSR,7.5 -173,8.192,16,10,DSR,7.5 -174,3.072,6,10,DSR,7.5 -175,0.512,1,10,DSR,7.5 -176,3.584,7,10,DSR,7.5 -177,13.824,27,10,DSR,7.5 -178,16.896,33,10,DSR,7.5 -179,5.632,11,10,DSR,7.5 -180,16.896,33,10,DSR,7.5 -181,14.336,28,10,DSR,7.5 -182,6.656,13,10,DSR,7.5 -183,18.432,36,10,DSR,7.5 -184,24.576,48,10,DSR,7.5 -185,13.312,26,10,DSR,7.5 -186,14.848,29,10,DSR,7.5 -187,9.728,19,10,DSR,7.5 -188,6.144,12,10,DSR,7.5 -189,6.656,13,10,DSR,7.5 -190,86.528,169,10,DSR,7.5 -191,13.824,27,10,DSR,7.5 -192,37.888,74,10,DSR,7.5 -193,12.8,25,10,DSR,7.5 -194,2.048,4,10,DSR,7.5 -195,9.728,19,10,DSR,7.5 -196,17.92,35,10,DSR,7.5 -197,2.56,5,10,DSR,7.5 -198,10.24,20,10,DSR,7.5 -199,2.56,5,10,DSR,7.5 diff -r efad81f3cb47 -r 2da1fab73114 manet-routing.output.csv.olsr --- a/manet-routing.output.csv.olsr Fri Jan 27 15:15:48 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,201 +0,0 @@ -SimulationSecond,ReceiveRate,PacketsReceived,NumberOfSinks,RoutingProtocol,TransmissionPower -0,0,0,10,OLSR,7.5 -1,0,0,10,OLSR,7.5 -2,0,0,10,OLSR,7.5 -3,0,0,10,OLSR,7.5 -4,0,0,10,OLSR,7.5 -5,0,0,10,OLSR,7.5 -6,0,0,10,OLSR,7.5 -7,0,0,10,OLSR,7.5 -8,0,0,10,OLSR,7.5 -9,0,0,10,OLSR,7.5 -10,0,0,10,OLSR,7.5 -11,0,0,10,OLSR,7.5 -12,0,0,10,OLSR,7.5 -13,0,0,10,OLSR,7.5 -14,0,0,10,OLSR,7.5 -15,0,0,10,OLSR,7.5 -16,0,0,10,OLSR,7.5 -17,0,0,10,OLSR,7.5 -18,0,0,10,OLSR,7.5 -19,0,0,10,OLSR,7.5 -20,0,0,10,OLSR,7.5 -21,0,0,10,OLSR,7.5 -22,0,0,10,OLSR,7.5 -23,0,0,10,OLSR,7.5 -24,0,0,10,OLSR,7.5 -25,0,0,10,OLSR,7.5 -26,0,0,10,OLSR,7.5 -27,0,0,10,OLSR,7.5 -28,0,0,10,OLSR,7.5 -29,0,0,10,OLSR,7.5 -30,0,0,10,OLSR,7.5 -31,0,0,10,OLSR,7.5 -32,0,0,10,OLSR,7.5 -33,0,0,10,OLSR,7.5 -34,0,0,10,OLSR,7.5 -35,0,0,10,OLSR,7.5 -36,0,0,10,OLSR,7.5 -37,0,0,10,OLSR,7.5 -38,0,0,10,OLSR,7.5 -39,0,0,10,OLSR,7.5 -40,0,0,10,OLSR,7.5 -41,0,0,10,OLSR,7.5 -42,0,0,10,OLSR,7.5 -43,0,0,10,OLSR,7.5 -44,0,0,10,OLSR,7.5 -45,0,0,10,OLSR,7.5 -46,0,0,10,OLSR,7.5 -47,0,0,10,OLSR,7.5 -48,0,0,10,OLSR,7.5 -49,0,0,10,OLSR,7.5 -50,0,0,10,OLSR,7.5 -51,5.632,11,10,OLSR,7.5 -52,16.384,32,10,OLSR,7.5 -53,18.432,36,10,OLSR,7.5 -54,20.48,40,10,OLSR,7.5 -55,18.944,37,10,OLSR,7.5 -56,16.384,32,10,OLSR,7.5 -57,18.944,37,10,OLSR,7.5 -58,18.432,36,10,OLSR,7.5 -59,17.92,35,10,OLSR,7.5 -60,18.432,36,10,OLSR,7.5 -61,18.432,36,10,OLSR,7.5 -62,17.408,34,10,OLSR,7.5 -63,17.92,35,10,OLSR,7.5 -64,17.92,35,10,OLSR,7.5 -65,18.432,36,10,OLSR,7.5 -66,18.432,36,10,OLSR,7.5 -67,17.92,35,10,OLSR,7.5 -68,17.92,35,10,OLSR,7.5 -69,14.848,29,10,OLSR,7.5 -70,18.432,36,10,OLSR,7.5 -71,15.872,31,10,OLSR,7.5 -72,14.848,29,10,OLSR,7.5 -73,14.336,28,10,OLSR,7.5 -74,12.8,25,10,OLSR,7.5 -75,18.432,36,10,OLSR,7.5 -76,18.432,36,10,OLSR,7.5 -77,17.92,35,10,OLSR,7.5 -78,18.432,36,10,OLSR,7.5 -79,18.432,36,10,OLSR,7.5 -80,17.408,34,10,OLSR,7.5 -81,16.896,33,10,OLSR,7.5 -82,20.48,40,10,OLSR,7.5 -83,17.92,35,10,OLSR,7.5 -84,22.016,43,10,OLSR,7.5 -85,16.384,32,10,OLSR,7.5 -86,16.896,33,10,OLSR,7.5 -87,17.92,35,10,OLSR,7.5 -88,19.456,38,10,OLSR,7.5 -89,17.92,35,10,OLSR,7.5 -90,18.432,36,10,OLSR,7.5 -91,17.408,34,10,OLSR,7.5 -92,15.872,31,10,OLSR,7.5 -93,16.384,32,10,OLSR,7.5 -94,16.384,32,10,OLSR,7.5 -95,16.896,33,10,OLSR,7.5 -96,17.408,34,10,OLSR,7.5 -97,18.944,37,10,OLSR,7.5 -98,16.384,32,10,OLSR,7.5 -99,19.456,38,10,OLSR,7.5 -100,20.48,40,10,OLSR,7.5 -101,20.48,40,10,OLSR,7.5 -102,20.48,40,10,OLSR,7.5 -103,19.968,39,10,OLSR,7.5 -104,19.456,38,10,OLSR,7.5 -105,17.92,35,10,OLSR,7.5 -106,17.92,35,10,OLSR,7.5 -107,18.432,36,10,OLSR,7.5 -108,18.432,36,10,OLSR,7.5 -109,18.432,36,10,OLSR,7.5 -110,19.968,39,10,OLSR,7.5 -111,18.944,37,10,OLSR,7.5 -112,18.432,36,10,OLSR,7.5 -113,18.432,36,10,OLSR,7.5 -114,18.432,36,10,OLSR,7.5 -115,20.48,40,10,OLSR,7.5 -116,20.48,40,10,OLSR,7.5 -117,20.48,40,10,OLSR,7.5 -118,20.48,40,10,OLSR,7.5 -119,20.48,40,10,OLSR,7.5 -120,18.944,37,10,OLSR,7.5 -121,17.92,35,10,OLSR,7.5 -122,18.432,36,10,OLSR,7.5 -123,19.968,39,10,OLSR,7.5 -124,20.48,40,10,OLSR,7.5 -125,19.968,39,10,OLSR,7.5 -126,16.384,32,10,OLSR,7.5 -127,16.896,33,10,OLSR,7.5 -128,16.384,32,10,OLSR,7.5 -129,17.92,35,10,OLSR,7.5 -130,18.432,36,10,OLSR,7.5 -131,17.92,35,10,OLSR,7.5 -132,17.92,35,10,OLSR,7.5 -133,20.48,40,10,OLSR,7.5 -134,20.48,40,10,OLSR,7.5 -135,18.432,36,10,OLSR,7.5 -136,17.92,35,10,OLSR,7.5 -137,16.896,33,10,OLSR,7.5 -138,16.384,32,10,OLSR,7.5 -139,17.92,35,10,OLSR,7.5 -140,18.432,36,10,OLSR,7.5 -141,17.408,34,10,OLSR,7.5 -142,16.384,32,10,OLSR,7.5 -143,16.384,32,10,OLSR,7.5 -144,16.384,32,10,OLSR,7.5 -145,18.432,36,10,OLSR,7.5 -146,19.456,38,10,OLSR,7.5 -147,18.944,37,10,OLSR,7.5 -148,18.432,36,10,OLSR,7.5 -149,19.968,39,10,OLSR,7.5 -150,19.968,39,10,OLSR,7.5 -151,18.944,37,10,OLSR,7.5 -152,20.992,41,10,OLSR,7.5 -153,18.944,37,10,OLSR,7.5 -154,18.432,36,10,OLSR,7.5 -155,17.408,34,10,OLSR,7.5 -156,20.48,40,10,OLSR,7.5 -157,18.944,37,10,OLSR,7.5 -158,17.92,35,10,OLSR,7.5 -159,18.944,37,10,OLSR,7.5 -160,18.432,36,10,OLSR,7.5 -161,19.456,38,10,OLSR,7.5 -162,19.968,39,10,OLSR,7.5 -163,19.456,38,10,OLSR,7.5 -164,19.968,39,10,OLSR,7.5 -165,20.48,40,10,OLSR,7.5 -166,20.48,40,10,OLSR,7.5 -167,19.968,39,10,OLSR,7.5 -168,20.48,40,10,OLSR,7.5 -169,18.944,37,10,OLSR,7.5 -170,19.456,38,10,OLSR,7.5 -171,18.944,37,10,OLSR,7.5 -172,21.504,42,10,OLSR,7.5 -173,20.48,40,10,OLSR,7.5 -174,19.968,39,10,OLSR,7.5 -175,18.432,36,10,OLSR,7.5 -176,18.432,36,10,OLSR,7.5 -177,19.456,38,10,OLSR,7.5 -178,20.48,40,10,OLSR,7.5 -179,17.92,35,10,OLSR,7.5 -180,18.944,37,10,OLSR,7.5 -181,19.968,39,10,OLSR,7.5 -182,20.48,40,10,OLSR,7.5 -183,18.944,37,10,OLSR,7.5 -184,18.432,36,10,OLSR,7.5 -185,19.968,39,10,OLSR,7.5 -186,20.48,40,10,OLSR,7.5 -187,20.48,40,10,OLSR,7.5 -188,20.48,40,10,OLSR,7.5 -189,18.432,36,10,OLSR,7.5 -190,18.432,36,10,OLSR,7.5 -191,17.408,34,10,OLSR,7.5 -192,19.456,38,10,OLSR,7.5 -193,17.92,35,10,OLSR,7.5 -194,18.432,36,10,OLSR,7.5 -195,19.968,39,10,OLSR,7.5 -196,20.48,40,10,OLSR,7.5 -197,19.968,39,10,OLSR,7.5 -198,20.992,41,10,OLSR,7.5 -199,20.48,40,10,OLSR,7.5 diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/examples/dsr.cc --- a/src/dsr/examples/dsr.cc Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/examples/dsr.cc Sun May 06 20:52:24 2012 -0700 @@ -29,11 +29,6 @@ * US Department of Defense (DoD), and ITTC at The University of Kansas. */ -#include -#include -#include -#include - #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/applications-module.h" @@ -41,14 +36,13 @@ #include "ns3/config-store-module.h" #include "ns3/wifi-module.h" #include "ns3/internet-module.h" -#include "ns3/ipv4-list-routing-helper.h" #include "ns3/dsr-module.h" -NS_LOG_COMPONENT_DEFINE ("DsrExample"); +using namespace ns3; +NS_LOG_COMPONENT_DEFINE ("DsrTest"); -using namespace ns3; - -int main (int argc, char *argv[]) +int +main (int argc, char *argv[]) { // // Users may find it convenient to turn on explicit debugging @@ -72,150 +66,128 @@ LogComponentEnable ("RouteCache", LOG_LEVEL_ALL); LogComponentEnable ("DsrMaintainBuffer", LOG_LEVEL_ALL); LogComponentEnable ("RreqTable", LOG_LEVEL_ALL); + LogComponentEnable ("DsrErrorBuffer", LOG_LEVEL_ALL); + LogComponentEnable ("DsrNetworkQueue", LOG_LEVEL_ALL); #endif - SeedManager::SetSeed (99); - SeedManager::SetRun (1); + NS_LOG_INFO ("creating the nodes"); - double totalTime = 1000.0; - double dataStart = 50.0; + // General parameters uint32_t nWifis = 50; uint32_t nSinks = 10; - double txp = 8.9048; + double TotalTime = 600.0; + double dataTime = 500.0; + double ppers = 1; + uint32_t packetSize = 64; + double dataStart = 100.0; // start sending data at 100s + + //mobility parameters double pauseTime = 0.0; double nodeSpeed = 20.0; - uint32_t packetSize = 64; - std::string phyModeControl ("DsssRate11Mbps"); - std::string phyModeData ("DsssRate11Mbps"); + double txpDistance = 250.0; + std::string rate = "0.512kbps"; - double ppers = 1.0; - /* - * Define the DSR parameters - */ - uint32_t m_maxCacheLen = 64; - Time m_maxCacheTime = Seconds (30); - Time m_nodeTraversalTime = MicroSeconds (2); - Time m_passiveAckTimeout = MicroSeconds (4); - uint32_t m_maxSendBuffLen = 64; - Time m_sendBufferTimeout = Seconds (30); - uint32_t m_maxMaintainLen = 50; - Time m_maxMaintainTime = Seconds (30); - uint32_t m_maintenanceRetries = 2; - std::string cacheType ("PathCache"); // PathCache - bool enableSubRoute = false; + std::string dataMode ("DsssRate11Mbps"); + std::string phyMode ("DsssRate11Mbps"); //Allow users to override the default parameters and set it to new ones from CommandLine. CommandLine cmd; - cmd.AddValue ("MaxCacheLen", "Max route cache length.", m_maxCacheLen); - cmd.AddValue ("RouteCacheTimeout", "Max route cache timeout.", m_maxCacheTime); - cmd.AddValue ("NodeTraversalTime", "The time it takes to travel to neighboring nodes.", m_nodeTraversalTime); - cmd.AddValue ("PassiveAckTimeout", "The time for ack to traversal the two neighboring nodes.", m_passiveAckTimeout); - cmd.AddValue ("MaxSendBuffLen", "Maximum number of packets that can be stored.", m_maxSendBuffLen); - cmd.AddValue ("MaxSendBuffTime", "Maximum time packets can be queued.", m_sendBufferTimeout); - cmd.AddValue ("MaxMaintLen", "Maximum number of packets that can be stored.", m_maxMaintainLen); - cmd.AddValue ("MaxMaintTime", "Maximum time packets can be queued.", m_maxMaintainTime); - cmd.AddValue ("MaintenanceRetries", "Maximum retransmission retries for maintenance data packet.", m_maintenanceRetries); - cmd.AddValue ("CacheType", "route cache type, Default:PathCache", cacheType); - cmd.AddValue ("EnableSubRoute", "whether to enable the sub route mechanism, Default:false", enableSubRoute); + cmd.AddValue ("nWifis", "Number of wifi nodes", nWifis); + cmd.AddValue ("nSinks", "Number of SINK traffic nodes", nSinks); + cmd.AddValue ("rate", "CBR traffic rate(in kbps), Default:8", rate); + cmd.AddValue ("nodeSpeed", "Node speed in RandomWayPoint model, Default:20", nodeSpeed); + cmd.AddValue ("packetSize", "The packet size", packetSize); + cmd.AddValue ("txpDistance", "Specify node's transmit range, Default:300", txpDistance); + cmd.AddValue ("pauseTime", "pauseTime for mobility model, Default: 0", pauseTime); cmd.Parse (argc, argv); - NS_LOG_INFO ("Create nodes."); - NodeContainer nodes; - nodes.Create (nWifis); - NetDeviceContainer devices; + SeedManager::SetSeed (10); + SeedManager::SetRun (1); - // Fix non-unicast data rate to be the same as that of unicast - Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode", StringValue (phyModeData)); + NodeContainer adhocNodes; + adhocNodes.Create (nWifis); + NetDeviceContainer allDevices; + + NS_LOG_INFO ("setting the default phy and channel parameters"); + Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode", StringValue (phyMode)); Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("2200")); - // disable fragmentation + // disable fragmentation for frames below 2200 bytes Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200")); - NS_LOG_INFO ("Create channels."); + NS_LOG_INFO ("setting the default phy and channel parameters "); WifiHelper wifi; wifi.SetStandard (WIFI_PHY_STANDARD_80211b); YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default (); + YansWifiChannelHelper wifiChannel; wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel"); - wifiChannel.AddPropagationLoss ("ns3::FriisPropagationLossModel"); + wifiChannel.AddPropagationLoss("ns3::RangePropagationLossModel", "MaxRange", DoubleValue (txpDistance)); wifiPhy.SetChannel (wifiChannel.Create ()); // Add a non-QoS upper mac, and disable rate control NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default (); - wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue (phyModeData), - "ControlMode", StringValue (phyModeControl)); - wifiPhy.Set ("TxPowerStart", DoubleValue (txp)); - wifiPhy.Set ("TxPowerEnd", DoubleValue (txp)); - // Set it to adhoc mode - wifiMac.SetType ("ns3::AdhocWifiMac"); - devices = wifi.Install (wifiPhy, wifiMac, nodes); - - InternetStackHelper internet; - DsrMainHelper dsrMain; - DsrHelper dsr; - dsr.Set ("MaxCacheLen", UintegerValue (m_maxCacheLen)); - dsr.Set ("RouteCacheTimeout", TimeValue (m_maxCacheTime)); - dsr.Set ("NodeTraversalTime", TimeValue (m_nodeTraversalTime)); - dsr.Set ("PassiveAckTimeout", TimeValue (m_passiveAckTimeout)); - dsr.Set ("MaxSendBuffLen", UintegerValue (m_maxSendBuffLen)); - dsr.Set ("MaxSendBuffTime", TimeValue (m_sendBufferTimeout)); - dsr.Set ("MaxMaintLen", UintegerValue (m_maxMaintainLen)); - dsr.Set ("MaxMaintTime", TimeValue (m_maxMaintainTime)); - dsr.Set ("MaintenanceRetries", UintegerValue (m_maintenanceRetries)); - dsr.Set ("EnableSubRoute", BooleanValue (false)); - dsr.Set ("CacheType", StringValue (cacheType)); - dsr.Set ("SendBuffInterval", TimeValue (Seconds (50))); - internet.Install (nodes); - dsrMain.Install (dsr, nodes); - - NS_LOG_INFO ("assigning ip address"); - Ipv4AddressHelper addressAdhoc; - addressAdhoc.SetBase ("10.1.1.0", "255.255.255.0"); - Ipv4InterfaceContainer adhocInterfaces; - adhocInterfaces = addressAdhoc.Assign (devices); - - MobilityHelper mobility; + wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue (dataMode), "ControlMode", + StringValue (phyMode)); - ObjectFactory pos; - pos.SetTypeId ("ns3::RandomRectanglePositionAllocator"); - pos.Set ("X", RandomVariableValue (UniformVariable (0.0, 300.0))); - pos.Set ("Y", RandomVariableValue (UniformVariable (0.0, 1500.0))); - Ptr positionAlloc = pos.Create ()->GetObject (); - mobility.SetPositionAllocator (positionAlloc); - - mobility.SetMobilityModel ("ns3::RandomWaypointMobilityModel", - "Speed", RandomVariableValue (ConstantVariable (nodeSpeed)), - "Pause", RandomVariableValue (ConstantVariable (pauseTime)), - "PositionAllocator", PointerValue (positionAlloc)); - mobility.Install (nodes); - - // many to many application - uint16_t port = 9; - double randomStartTime = (1 / ppers) / nSinks; //distributed btw 1s evenly as we are sending 1pkt/s + wifiMac.SetType ("ns3::AdhocWifiMac"); + allDevices = wifi.Install (wifiPhy, wifiMac, adhocNodes); - for (uint32_t i = 0; i < nSinks; i++) - { - PacketSinkHelper sink ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), port)); - ApplicationContainer apps_sink = sink.Install (nodes.Get (i)); - apps_sink.Start (Seconds (0.0)); - apps_sink.Stop (Seconds (totalTime)); - - OnOffHelper onoff1 ("ns3::UdpSocketFactory", Address (InetSocketAddress (adhocInterfaces.GetAddress (i), port))); - onoff1.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1))); - onoff1.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0))); - onoff1.SetAttribute ("PacketSize", UintegerValue (packetSize)); - onoff1.SetAttribute ("DataRate", DataRateValue (DataRate (rate))); - - ApplicationContainer apps1 = onoff1.Install (nodes.Get (i + nSinks)); - apps1.Start (Seconds (dataStart + i * randomStartTime)); - apps1.Stop (Seconds (totalTime)); - } + NS_LOG_INFO ("Configure Tracing."); AsciiTraceHelper ascii; Ptr stream = ascii.CreateFileStream ("dsrtest.tr"); wifiPhy.EnableAsciiAll (stream); + MobilityHelper adhocMobility; + ObjectFactory pos; + pos.SetTypeId ("ns3::RandomRectanglePositionAllocator"); + pos.Set ("X", RandomVariableValue (UniformVariable (0.0, 300.0))); + pos.Set ("Y", RandomVariableValue (UniformVariable (0.0, 1500.0))); + Ptr taPositionAlloc = pos.Create ()->GetObject (); + + adhocMobility.SetMobilityModel ("ns3::RandomWaypointMobilityModel", + "Speed", RandomVariableValue (UniformVariable (0.0, nodeSpeed)), + "Pause", RandomVariableValue (ConstantVariable (pauseTime)), + "PositionAllocator", PointerValue (taPositionAlloc) + ); + adhocMobility.Install (adhocNodes); + + InternetStackHelper internet; + DsrMainHelper dsrMain; + DsrHelper dsr; + internet.Install (adhocNodes); + dsrMain.Install (dsr, adhocNodes); + + NS_LOG_INFO ("assigning ip address"); + Ipv4AddressHelper address; + address.SetBase ("10.1.1.0", "255.255.255.0"); + Ipv4InterfaceContainer allInterfaces; + allInterfaces = address.Assign (allDevices); + + uint16_t port = 9; + double randomStartTime = (1/ppers) / nSinks; //distributed btw 1s evenly as we are sending 4pkt/s + + for (uint32_t i = 0; i < nSinks; ++i) + { + PacketSinkHelper sink ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), port)); + ApplicationContainer apps_sink = sink.Install (adhocNodes.Get (i)); + apps_sink.Start (Seconds (0.0)); + apps_sink.Stop (Seconds (TotalTime)); + + OnOffHelper onoff1 ("ns3::UdpSocketFactory", Address (InetSocketAddress (allInterfaces.GetAddress (i), port))); + onoff1.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1))); + onoff1.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0))); + onoff1.SetAttribute ("PacketSize", UintegerValue (packetSize)); + onoff1.SetAttribute ("DataRate", DataRateValue (DataRate (rate))); + + ApplicationContainer apps1 = onoff1.Install (adhocNodes.Get (i + nWifis - nSinks)); + apps1.Start (Seconds (dataStart + i*randomStartTime)); + apps1.Stop (Seconds (dataTime + i*randomStartTime)); + } + NS_LOG_INFO ("Run Simulation."); - Simulator::Stop (Seconds (totalTime)); + Simulator::Stop (Seconds (TotalTime)); Simulator::Run (); Simulator::Destroy (); } + diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/examples/wscript --- a/src/dsr/examples/wscript Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/examples/wscript Sun May 06 20:52:24 2012 -0700 @@ -1,6 +1,6 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- def build(bld): - obj = bld.create_ns3_program('dsr', ['core', 'network', 'internet', 'wifi', 'dsr']) + obj = bld.create_ns3_program('dsr', ['core', 'simulator', 'node', 'internet-stack']) obj.source = 'dsr.cc' diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/helper/dsr-main-helper.cc --- a/src/dsr/helper/dsr-main-helper.cc Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/helper/dsr-main-helper.cc Sun May 06 20:52:24 2012 -0700 @@ -90,13 +90,13 @@ { NS_LOG_FUNCTION (node); Ptr dsr = m_dsrHelper->Create (node); - Ptr routeCache = CreateObject (); - Ptr rreqTable = CreateObject (); - dsr->SetRouteCache (routeCache); - dsr->SetRequestTable (rreqTable); +// Ptr routeCache = CreateObject (); +// Ptr rreqTable = CreateObject (); +// dsr->SetRouteCache (routeCache); +// dsr->SetRequestTable (rreqTable); dsr->SetNode (node); - node->AggregateObject (routeCache); - node->AggregateObject (rreqTable); +// node->AggregateObject (routeCache); +// node->AggregateObject (rreqTable); } void diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-errorbuff.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dsr/model/dsr-errorbuff.cc Sun May 06 20:52:24 2012 -0700 @@ -0,0 +1,193 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2011 Yufei Cheng + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Yufei Cheng + * + * James P.G. Sterbenz , director + * ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets + * Information and Telecommunication Technology Center (ITTC) + * and Department of Electrical Engineering and Computer Science + * The University of Kansas Lawrence, KS USA. + * + * Work supported in part by NSF FIND (Future Internet Design) Program + * under grant CNS-0626918 (Postmodern Internet Architecture), + * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI), + * US Department of Defense (DoD), and ITTC at The University of Kansas. + */ + +#include "dsr-errorbuff.h" +#include +#include +#include "ns3/ipv4-route.h" +#include "ns3/socket.h" +#include "ns3/log.h" + +NS_LOG_COMPONENT_DEFINE ("DsrErrorBuffer"); + +namespace ns3 { +namespace dsr { + +uint32_t +ErrorBuffer::GetSize () +{ + Purge (); + return m_errorBuffer.size (); +} + +bool +ErrorBuffer::Enqueue (ErrorBuffEntry & entry) +{ + Purge (); + for (std::vector::const_iterator i = m_errorBuffer.begin (); i + != m_errorBuffer.end (); ++i) + { + NS_LOG_INFO ("packet id " << i->GetPacket ()->GetUid () << " " << entry.GetPacket ()->GetUid () << " source " << i->GetSource () << " " << entry.GetSource () + << " next hop " << i->GetNextHop () << " " << entry.GetNextHop () << " dst " << i->GetDestination () << " " << entry.GetDestination ()); + + if ((i->GetPacket ()->GetUid () == entry.GetPacket ()->GetUid ()) && (i->GetSource () == entry.GetSource ()) && (i->GetNextHop () == entry.GetSource ()) + && (i->GetDestination () == entry.GetDestination ())) + { + return false; + } + } + + entry.SetExpireTime (m_errorBufferTimeout); // Initialize the send buffer timeout + /* + * Drop the most aged packet when buffer reaches to max + */ + if (m_errorBuffer.size () >= m_maxLen) + { + Drop (m_errorBuffer.front (), "Drop the most aged packet"); // Drop the most aged packet + m_errorBuffer.erase (m_errorBuffer.begin ()); + } + // enqueue the entry + m_errorBuffer.push_back (entry); + return true; +} + +void +ErrorBuffer::DropPacketForErrLink (Ipv4Address source, Ipv4Address nextHop) +{ + NS_LOG_FUNCTION (this << source << nextHop); + Purge (); + std::vector list; + list.push_back (source); + list.push_back (nextHop); + const std::vector link = list; + /* + * Drop the packet with the error link source----------nextHop + */ + for (std::vector::iterator i = m_errorBuffer.begin (); i + != m_errorBuffer.end (); ++i) + { + if (LinkEqual (*i, link)) + { + DropLink (*i, "DropPacketForErrLink"); + } + } + m_errorBuffer.erase (std::remove_if (m_errorBuffer.begin (), m_errorBuffer.end (), + std::bind2nd (std::ptr_fun (ErrorBuffer::LinkEqual), link)), m_errorBuffer.end ()); +} + +bool +ErrorBuffer::Dequeue (Ipv4Address dst, ErrorBuffEntry & entry) +{ + Purge (); + /* + * Dequeue the entry with destination address dst + */ + for (std::vector::iterator i = m_errorBuffer.begin (); i != m_errorBuffer.end (); ++i) + { + if (i->GetDestination () == dst) + { + entry = *i; + m_errorBuffer.erase (i); + NS_LOG_DEBUG ("Packet size while dequeuing " << entry.GetPacket ()->GetSize ()); + return true; + } + } + return false; +} + +bool +ErrorBuffer::Find (Ipv4Address dst) +{ + /* + * Make sure if the send buffer contains entry with certain dst + */ + for (std::vector::const_iterator i = m_errorBuffer.begin (); i + != m_errorBuffer.end (); ++i) + { + if (i->GetDestination () == dst) + { + NS_LOG_DEBUG ("Found the packet"); + return true; + } + } + return false; +} + +struct IsExpired +{ + bool + operator() (ErrorBuffEntry const & e) const + { + // NS_LOG_DEBUG("Expire time for packet in req queue: "<::iterator i = m_errorBuffer.begin (); i + != m_errorBuffer.end (); ++i) + { + if (pred (*i)) + { + NS_LOG_DEBUG ("Dropping Queue Packets"); + Drop (*i, "Drop out-dated packet "); + } + } + m_errorBuffer.erase (std::remove_if (m_errorBuffer.begin (), m_errorBuffer.end (), pred), + m_errorBuffer.end ()); +} + +void +ErrorBuffer::Drop (ErrorBuffEntry en, std::string reason) +{ + NS_LOG_LOGIC (reason << en.GetPacket ()->GetUid () << " " << en.GetDestination ()); +// en.GetErrorCallback () (en.GetPacket (), en.GetDestination (), +// Socket::ERROR_NOROUTETOHOST); + return; +} + +void +ErrorBuffer::DropLink (ErrorBuffEntry en, std::string reason) +{ + NS_LOG_LOGIC (reason << en.GetPacket ()->GetUid () << " " << en.GetSource () << " " << en.GetNextHop ()); +// en.GetErrorCallback () (en.GetPacket (), en.GetDestination (), +// Socket::ERROR_NOROUTETOHOST); + return; +} +} // namespace dsr +} // namespace ns3 diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-errorbuff.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dsr/model/dsr-errorbuff.h Sun May 06 20:52:24 2012 -0700 @@ -0,0 +1,203 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2011 Yufei Cheng + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Yufei Cheng + * + * James P.G. Sterbenz , director + * ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets + * Information and Telecommunication Technology Center (ITTC) + * and Department of Electrical Engineering and Computer Science + * The University of Kansas Lawrence, KS USA. + * + * Work supported in part by NSF FIND (Future Internet Design) Program + * under grant CNS-0626918 (Postmodern Internet Architecture), + * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI), + * US Department of Defense (DoD), and ITTC at The University of Kansas. + */ + +#ifndef DSR_ERRORBUFF_H +#define DSR_ERRORBUFF_H + +#include +#include "ns3/ipv4-routing-protocol.h" +#include "ns3/simulator.h" + +namespace ns3 { +namespace dsr { +/** + * \ingroup dsr + * \brief DSR Error Buffer Entry + */ +class ErrorBuffEntry +{ +public: + // / c-tor + ErrorBuffEntry (Ptr pa = 0, Ipv4Address d = Ipv4Address (), Ipv4Address s = Ipv4Address (), + Ipv4Address n = Ipv4Address (), Time exp = Simulator::Now (), uint8_t p = 0) + : m_packet (pa), + m_dst (d), + m_source (s), + m_nextHop (n), + m_expire (exp + Simulator::Now ()), + m_protocol (p) + { + } + /** + * Compare send buffer entries + * \return true if equal + */ + bool operator== (ErrorBuffEntry const & o) const + { + return ((m_packet == o.m_packet) && (m_source == o.m_source) && (m_nextHop == o.m_nextHop) && (m_dst == o.m_dst) && (m_expire == o.m_expire)); + } + // /\name Fields + // \{ + Ptr GetPacket () const + { + return m_packet; + } + void SetPacket (Ptr p) + { + m_packet = p; + } + Ipv4Address GetDestination () const + { + return m_dst; + } + void SetDestination (Ipv4Address d) + { + m_dst = d; + } + Ipv4Address GetSource () const + { + return m_source; + } + void SetSource (Ipv4Address s) + { + m_source = s; + } + Ipv4Address GetNextHop () const + { + return m_nextHop; + } + void SetNextHop (Ipv4Address n) + { + m_nextHop = n; + } + void SetExpireTime (Time exp) + { + m_expire = exp + Simulator::Now (); + } + Time GetExpireTime () const + { + return m_expire - Simulator::Now (); + } + void SetProtocol (uint8_t p) + { + m_protocol = p; + } + uint8_t GetProtocol () const + { + return m_protocol; + } + // \} +private: + // / Data packet + Ptr m_packet; + // / Destination address + Ipv4Address m_dst; + // / Source address + Ipv4Address m_source; + // / Nexthop address + Ipv4Address m_nextHop; + // / Expire time for queue entry + Time m_expire; + // / The protocol number + uint8_t m_protocol; +}; + +/** + * \ingroup dsr + * \brief DSR error buffer + */ +/************************************************************************************************************************/ +class ErrorBuffer +{ +public: + // / Default c-tor + ErrorBuffer () + { + } + // / Push entry in queue, if there is no entry with the same packet and destination address in queue. + bool Enqueue (ErrorBuffEntry & entry); + // / Return first found (the earliest) entry for given destination + bool Dequeue (Ipv4Address dst, ErrorBuffEntry & entry); + // / Remove all packets with the error link + void DropPacketForErrLink (Ipv4Address source, Ipv4Address nextHop); + // / Finds whether a packet with destination dst exists in the queue + bool Find (Ipv4Address dst); + // / Number of entries + uint32_t GetSize (); + // /\name Fields + // \{ + uint32_t GetMaxQueueLen () const + { + return m_maxLen; + } + void SetMaxQueueLen (uint32_t len) + { + m_maxLen = len; + } + Time GetErrorBufferTimeout () const + { + return m_errorBufferTimeout; + } + void SetErrorBufferTimeout (Time t) + { + m_errorBufferTimeout = t; + } + // \} + + std::vector & GetBuffer () + { + return m_errorBuffer; + } + +private: + // / The send buffer to cache unsent packet + std::vector m_errorBuffer; + // / Remove all expired entries + void Purge (); + // / Notify that packet is dropped from queue by timeout + void Drop (ErrorBuffEntry en, std::string reason); + // / Notify that packet is dropped from queue by timeout + void DropLink (ErrorBuffEntry en, std::string reason); + // / The maximum number of packets that we allow a routing protocol to buffer. + uint32_t m_maxLen; + // / The maximum period of time that a routing protocol is allowed to buffer a packet for, seconds. + Time m_errorBufferTimeout; + // / Check if the send buffer entry is the same or not + static bool LinkEqual (ErrorBuffEntry en, const std::vector link) + { + return ((en.GetSource () == link[0]) && (en.GetNextHop () == link[1])); + } +}; +/*******************************************************************************************************************************/ +} // namespace dsr +} // namespace ns3 + +#endif /* DSR_ERRORBUFF_H */ diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-fs-header.h --- a/src/dsr/model/dsr-fs-header.h Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-fs-header.h Sun May 06 20:52:24 2012 -0700 @@ -76,13 +76,6 @@ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \endverbatim */ - -enum DsrMessageType -{ - DSR_CONTROL_PACKET = 1, - DSR_DATA_PACKET = 2 -}; - class DsrFsHeader : public Header { public: diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-maintain-buff.cc --- a/src/dsr/model/dsr-maintain-buff.cc Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-maintain-buff.cc Sun May 06 20:52:24 2012 -0700 @@ -56,8 +56,8 @@ != m_maintainBuffer.end (); ++i) { NS_LOG_INFO ("nexthop " << i->GetNextHop () << " " << entry.GetNextHop () << " our add " << i->GetOurAdd () << " " << entry.GetOurAdd () - << " src " << i->GetSrc () << " " << entry.GetSrc () << " dst " << i->GetDst () << " " << entry.GetDst () - << " ackId " << i->GetAckId () << " " << entry.GetAckId () << " SegsLeft " << (uint32_t)i->GetSegsLeft () << " " << (uint32_t)entry.GetSegsLeft () + << " src " << i->GetSrc () << " " << entry.GetSrc () << " dst " << i->GetDst () << " " << entry.GetDst () + << " ackId " << i->GetAckId () << " " << entry.GetAckId () << " SegsLeft " << (uint32_t)i->GetSegsLeft () << " " << (uint32_t)entry.GetSegsLeft () ); if ((i->GetNextHop () == entry.GetNextHop ()) && (i->GetOurAdd () == entry.GetOurAdd ()) && (i->GetSrc () == entry.GetSrc ()) @@ -75,6 +75,7 @@ m_maintainBuffer.erase (m_maintainBuffer.begin ()); // Drop the most aged packet } m_maintainBuffer.push_back (entry); + NS_LOG_DEBUG ("The maintain size " << m_maintainBuffer.size()); return true; } @@ -105,6 +106,34 @@ return false; } +//bool +//MaintainBuffer::FindMaintainEntry (Ptr packet, Ipv4Address ourAdd, Ipv4Address src, Ipv4Address nextHop, Ipv4Address dst, NetworkKey networkKey) +//{ +// // TODO if necessary this one can strip the packet header and have more information +// for (std::vector::const_iterator i = m_maintainBuffer.begin (); i +// != m_maintainBuffer.end (); ++i) +// { +// NS_LOG_INFO ("packet " << i->GetPacket () << " " << packet << " nexthop " << i->GetNextHop () << " " << nextHop +// << " our add " << i->GetOurAdd () << " " << ourAdd << " src " << i->GetSrc () +// << " " << src << " dst " << i->GetDst () << " " << dst +// ); +// +// if ((i->GetPacket () == packet) && (i->GetNextHop () == nextHop) && (i->GetOurAdd () == ourAdd) && (i->GetSrc () == src) +// && (i->GetDst () == dst)) +// { +// NS_LOG_DEBUG ("Same maintenance entry found"); +// networkKey.m_ackId = newEntry.GetAckId (); +// networkKey.m_ourAdd = newEntry.GetOurAdd (); +// networkKey.m_nextHop = newEntry.GetNextHop (); +// networkKey.m_source = newEntry.GetSrc (); +// networkKey.m_destination = newEntry.GetDst (); +// // TODO may need a different network key to have +// return true; +// } +// } +// return false; +//} + bool MaintainBuffer::Find (Ipv4Address nextHop) { @@ -128,8 +157,30 @@ { NS_LOG_DEBUG ("nexthop " << i->GetNextHop () << " " << entry.GetNextHop () << " our address " << i->GetOurAdd () << " " << entry.GetOurAdd () - << " src " << i->GetSrc () << " " << entry.GetSrc () << " dst " << i->GetDst () << " " << entry.GetDst () - << " ackId " << i->GetAckId () << " " << entry.GetAckId ()); + << " src " << i->GetSrc () << " " << entry.GetSrc () << " dst " << i->GetDst () << " " << entry.GetDst () + << " ackId " << i->GetAckId () << " " << entry.GetAckId ()); + + if ((i->GetOurAdd () == entry.GetOurAdd ()) && (i->GetNextHop () == entry.GetNextHop ()) + && (i->GetSrc () == entry.GetSrc ()) && (i->GetDst () == entry.GetDst ()) + && (i->GetAckId () == entry.GetAckId ()) && (i->GetSegsLeft () == entry.GetSegsLeft ())) + { + m_maintainBuffer.erase (i); // Erase the same maintain buffer entry for the received packet + return true; + } + } + return false; +} + +bool +MaintainBuffer::NetworkEqual (MaintainBuffEntry & entry) +{ + for (std::vector::iterator i = m_maintainBuffer.begin (); i + != m_maintainBuffer.end (); ++i) + { + + NS_LOG_DEBUG ("nexthop " << i->GetNextHop () << " " << entry.GetNextHop () << " our address " << i->GetOurAdd () << " " << entry.GetOurAdd () + << " src " << i->GetSrc () << " " << entry.GetSrc () << " dst " << i->GetDst () << " " << entry.GetDst () + << " ackId " << i->GetAckId () << " " << entry.GetAckId ()); if ((i->GetOurAdd () == entry.GetOurAdd ()) && (i->GetNextHop () == entry.GetNextHop ()) && (i->GetSrc () == entry.GetSrc ()) && (i->GetDst () == entry.GetDst ()) @@ -145,18 +196,17 @@ bool MaintainBuffer::PromiscEqual (MaintainBuffEntry & entry) { + NS_LOG_DEBUG ("The maintenance buffer size " << m_maintainBuffer.size()); for (std::vector::iterator i = m_maintainBuffer.begin (); i != m_maintainBuffer.end (); ++i) { + NS_LOG_DEBUG ("src " << i->GetSrc () << " " << entry.GetSrc () << " dst " << i->GetDst () << " " << entry.GetDst () + << " SegsLeft " << (uint32_t)i->GetSegsLeft () << " " << (uint32_t)entry.GetSegsLeft () << " ackId " << (uint32_t)i->GetAckId () << " " + << (uint32_t)entry.GetAckId () + ); - NS_LOG_DEBUG ("nexthop " << i->GetNextHop () << " " << entry.GetNextHop () << " our address " << i->GetOurAdd () << " " << entry.GetOurAdd () - << " src " << i->GetSrc () << " " << entry.GetSrc () << " dst " << i->GetDst () << " " << entry.GetDst () - << " SegsLeft " << (uint32_t)i->GetSegsLeft () << " " << (uint32_t)entry.GetSegsLeft () - ); - - if ((i->GetOurAdd () == entry.GetOurAdd ()) && (i->GetNextHop () == entry.GetNextHop ()) - && (i->GetSrc () == entry.GetSrc ()) && (i->GetDst () == entry.GetDst ()) - && (i->GetSegsLeft () == entry.GetSegsLeft ()) + if ((i->GetSrc () == entry.GetSrc ()) && (i->GetDst () == entry.GetDst ()) + && (i->GetSegsLeft () == entry.GetSegsLeft ()) && (i->GetAckId () == entry.GetAckId ()) ) { m_maintainBuffer.erase (i); // Erase the same maintain buffer entry for the promisc received packet diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-maintain-buff.h --- a/src/dsr/model/dsr-maintain-buff.h Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-maintain-buff.h Sun May 06 20:52:24 2012 -0700 @@ -38,37 +38,54 @@ #include "ns3/ipv4-header.h" #include "dsr-option-header.h" - namespace ns3 { namespace dsr { /* * The maintenance buffer is responsible for maintaining packet next hop delivery * The data packet is saved in maintenance buffer whenever the data packet is sent out of send buffer */ - /* * The packet timer key for controlling data packet retransmission */ -struct PacketKey +struct NetworkKey { uint16_t m_ackId; Ipv4Address m_ourAdd; Ipv4Address m_nextHop; Ipv4Address m_source; Ipv4Address m_destination; + + /** + * Compare maintain Buffer entries + * \return true if equal + */ + bool operator < (NetworkKey const & o) const + { + return ((m_ackId < o.m_ackId) && (m_ourAdd < o.m_ourAdd) && (m_nextHop < o.m_nextHop) && (m_source < o.m_source) + && (m_destination < o.m_destination) + ); + } +}; + +struct PassiveKey +{ + uint16_t m_ackId; + Ipv4Address m_source; + Ipv4Address m_destination; uint8_t m_segsLeft; /** * Compare maintain Buffer entries * \return true if equal */ - bool operator < (PacketKey const & o) const + bool operator < (PassiveKey const & o) const { - return ((m_ackId < o.m_ackId) && (m_ourAdd < o.m_ourAdd) && (m_nextHop < o.m_nextHop) && (m_source < o.m_source) + return ((m_ackId < o.m_ackId) && (m_source < o.m_source) && (m_destination < o.m_destination) && (m_segsLeft < o.m_segsLeft) ); } }; + /** * \ingroup dsr * \brief DSR Maintain Buffer Entry @@ -87,7 +104,6 @@ m_dst (dst), m_ackId (ackId), m_segsLeft (segs), - m_isPassive (true), m_expire (exp + Simulator::Now ()) { } @@ -150,14 +166,6 @@ { m_segsLeft = segs; } - bool GetPassive () const - { - return m_isPassive; - } - void SetPassive (bool pa) - { - m_isPassive = pa; - } void SetExpireTime (Time exp) { m_expire = exp + Simulator::Now (); @@ -184,10 +192,6 @@ uint16_t m_id; // / The segments left field uint8_t m_segsLeft; - // / The fragment offset of ipv4 header - uint16_t m_fragment; - // / if the ack metric is passive ack or not - bool m_isPassive; // / Expire time for queue entry Time m_expire; }; @@ -209,6 +213,7 @@ bool Dequeue (Ipv4Address dst, MaintainBuffEntry & entry); // / Remove all packets with destination IP address dst void DropPacketWithNextHop (Ipv4Address nextHop); + bool FindMaintainEntry (Ptr packet, Ipv4Address ourAdd, Ipv4Address src, Ipv4Address nextHop, Ipv4Address dst, NetworkKey networkKey); // / Finds whether a packet with destination dst exists in the queue bool Find (Ipv4Address nextHop); // / Number of entries @@ -231,8 +236,9 @@ { m_maintainBufferTimeout = t; } + bool AllEqual (MaintainBuffEntry & entry); // / Verify if the maintain buffer entry is the same in every field for network ack - bool AllEqual (MaintainBuffEntry & entry); + bool NetworkEqual (MaintainBuffEntry & entry); // / Verify if the maintain buffer entry is the same in every field for promiscuous ack bool PromiscEqual (MaintainBuffEntry & entry); // \} @@ -240,6 +246,7 @@ private: // / The vector of maintain buffer entries std::vector m_maintainBuffer; + std::vector m_allNetworkKey; // / Remove all expired entries void Purge (); // / The maximum number of packets that we allow a routing protocol to buffer. diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-network-queue.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dsr/model/dsr-network-queue.cc Sun May 06 20:52:24 2012 -0700 @@ -0,0 +1,175 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2011 Yufei Cheng + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Yufei Cheng + * + * James P.G. Sterbenz , director + * ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets + * Information and Telecommunication Technology Center (ITTC) + * and Department of Electrical Engineering and Computer Science + * The University of Kansas Lawrence, KS USA. + * + * Work supported in part by NSF FIND (Future Internet Design) Program + * under grant CNS-0626918 (Postmodern Internet Architecture), + * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI), + * US Department of Defense (DoD), and ITTC at The University of Kansas. + */ + +#include "dsr-network-queue.h" +#include "ns3/test.h" +#include +#include +#include +#include "ns3/log.h" +#include "ns3/ipv4-route.h" +#include "ns3/socket.h" + +NS_LOG_COMPONENT_DEFINE ("DsrNetworkQueue"); + +namespace ns3 { +namespace dsr { + +NS_OBJECT_ENSURE_REGISTERED (DsrNetworkQueue); + +TypeId +DsrNetworkQueue::GetTypeID (void) +{ + static TypeId tid = TypeId ("ns3::dsr::DsrNetworkQueue") + .SetParent () + .AddConstructor () + ; + return tid; +} + +DsrNetworkQueue::DsrNetworkQueue (uint32_t maxLen, Time maxDelay) : + m_size(0), m_maxSize (maxLen), m_maxDelay (maxDelay) +{ + NS_LOG_FUNCTION(this ); +} + +DsrNetworkQueue::DsrNetworkQueue () : m_size(0) +{ + NS_LOG_FUNCTION(this ); +} + +DsrNetworkQueue::~DsrNetworkQueue () +{ + NS_LOG_FUNCTION(this ); + Flush(); +} + +void +DsrNetworkQueue::SetMaxNetworkSize (uint32_t maxSize) +{ + m_maxSize = maxSize; +} + +void +DsrNetworkQueue::SetMaxNetworkDelay (Time delay) +{ + m_maxDelay = delay; +} + +uint32_t +DsrNetworkQueue::GetMaxNetworkSize (void) const +{ + return m_maxSize; +} + +Time +DsrNetworkQueue::GetMaxNetworkDelay (void) const +{ + return m_maxDelay; +} + +bool +DsrNetworkQueue::Enqueue (DsrNetworkQueueEntry & entry) +{ + NS_LOG_FUNCTION (this << m_size << m_maxSize); + if (m_size >= m_maxSize) + { + return false; + } + Time now = Simulator::Now (); + entry.SetInsertedTimeStamp (now); + m_dsrNetworkQueue.push_back (entry); + m_size++; + NS_LOG_DEBUG ("The network queue size for now " << m_size); + return true; +} + +bool +DsrNetworkQueue::Dequeue (DsrNetworkQueueEntry & entry) +{ + NS_LOG_FUNCTION (this); + Cleanup (); + std::vector::iterator i = m_dsrNetworkQueue.begin (); + if (i == m_dsrNetworkQueue.end ()) + { + // no elements in array + NS_LOG_DEBUG ("Does not find the queued packet in the network queue"); + return false; + } + entry = *i; + m_dsrNetworkQueue.erase (i); + m_size--; + return true; +} + +void +DsrNetworkQueue::Cleanup (void) +{ + NS_LOG_FUNCTION(this); + if (m_dsrNetworkQueue.empty ()) + { + return; + } + + Time now = Simulator::Now (); + uint32_t n = 0; + for (std::vector::iterator i = m_dsrNetworkQueue.begin (); i != m_dsrNetworkQueue.end ();) + { + if (i->GetInsertedTimeStamp() + m_maxDelay > now) + { + i++; + } + else + { + i = m_dsrNetworkQueue.erase (i); + n++; + } + } + m_size -= n; +} + +uint32_t +DsrNetworkQueue::GetSize () +{ + NS_LOG_FUNCTION(this); + return m_size; +} + +void +DsrNetworkQueue::Flush (void) +{ + NS_LOG_FUNCTION(this); + m_dsrNetworkQueue.erase (m_dsrNetworkQueue.begin (), m_dsrNetworkQueue.end ()); + m_size = 0; +} + +} // namespace dsr +} // namespace ns3 diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-network-queue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dsr/model/dsr-network-queue.h Sun May 06 20:52:24 2012 -0700 @@ -0,0 +1,136 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2011 Yufei Cheng + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Yufei Cheng + * + * James P.G. Sterbenz , director + * ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets + * Information and Telecommunication Technology Center (ITTC) + * and Department of Electrical Engineering and Computer Science + * The University of Kansas Lawrence, KS USA. + * + * Work supported in part by NSF FIND (Future Internet Design) Program + * under grant CNS-0626918 (Postmodern Internet Architecture), + * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI), + * US Department of Defense (DoD), and ITTC at The University of Kansas. + */ + +#ifndef DSR_NETWORK_QUEUE_H +#define DSR_NETWORK_QUEUE_H + +#include +#include "ns3/ipv4-routing-protocol.h" +#include "ns3/simulator.h" +#include "ns3/ipv4-header.h" +#include "dsr-option-header.h" + +namespace ns3 { +namespace dsr { + +enum DsrMessageType +{ + DSR_CONTROL_PACKET = 1, + DSR_DATA_PACKET = 2 +}; +/** + * \ingroup dsr + * \brief DSR Network Queue Entry + */ +class DsrNetworkQueueEntry +{ +public: + /// c-tor + DsrNetworkQueueEntry (Ptr pa = 0, Ipv4Address s = Ipv4Address (), Ipv4Address n = Ipv4Address (), + Time exp = Simulator::Now (), Ptr r = 0) + : m_packet (pa), + m_srcAddr (s), + m_nextHopAddr (n), + tstamp (exp), + m_ipv4Route (r) + { + } + /** + * Compare send buffer entries + * \return true if equal + */ + bool operator== (DsrNetworkQueueEntry const & o) const + { + return ((m_packet == o.m_packet) && (m_srcAddr == o.m_srcAddr) && (m_nextHopAddr == o.m_nextHopAddr) && + (tstamp == o.tstamp) && (m_ipv4Route == o.m_ipv4Route)); + } + + ///\name Fields + //\{ + Ptr GetPacket () const { return m_packet; } + void SetPacket (Ptr p) { m_packet = p; } + Ptr GetIpv4Route() const { return m_ipv4Route; } + void SetIpv4Route (Ptr route) { m_ipv4Route = route; } + Ipv4Address GetSourceAddress() const { return m_srcAddr; } + void SetSourceAddress (Ipv4Address addr) { m_srcAddr = addr; } + Ipv4Address GetNextHopAddress() const { return m_nextHopAddr; } + void SetNextHopAddress (Ipv4Address addr) { m_nextHopAddr = addr; } + Time GetInsertedTimeStamp (void) const {return tstamp;} + void SetInsertedTimeStamp (Time time) {tstamp = time;} + //\} +private: + /// Data packet + Ptr m_packet; + Ipv4Address m_srcAddr; + Ipv4Address m_nextHopAddr; + Time tstamp; + /// Ipv4Route + Ptr m_ipv4Route; +}; + +class DsrNetworkQueue : public Object +{ +public: + static TypeId GetTypeID (void); + /// Default c-tor + DsrNetworkQueue (); + DsrNetworkQueue (uint32_t maxLen, Time maxDelay); + ~DsrNetworkQueue (); + /// Push entry in queue, if there is no entry with the same packet and destination address in queue. + bool Enqueue (DsrNetworkQueueEntry & entry); + /// Return first found (the earliest) entry for given destination + bool Dequeue (DsrNetworkQueueEntry & entry); + /// Number of entries + uint32_t GetSize (); + + void SetMaxNetworkSize (uint32_t maxSize); + void SetMaxNetworkDelay (Time delay); + uint32_t GetMaxNetworkSize (void) const; + Time GetMaxNetworkDelay (void) const; + void Flush (void); + + std::vector & GetQueue () + { + return m_dsrNetworkQueue; + } + +private: + void Cleanup (void); + std::vector m_dsrNetworkQueue; + uint32_t m_size; + uint32_t m_maxSize; + Time m_maxDelay; +}; + +} // namespace dsr +} // namespace ns3 + +#endif /* DSR_NETWORK_QUEUE_H */ diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-option-header.cc --- a/src/dsr/model/dsr-option-header.cc Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-option-header.cc Sun May 06 20:52:24 2012 -0700 @@ -38,7 +38,6 @@ #include "ns3/packet.h" #include "ns3/enum.h" - namespace ns3 { namespace dsr { NS_LOG_COMPONENT_DEFINE ("DsrOptionHeader"); @@ -681,7 +680,7 @@ m_errorLength (4) { SetType (3); - SetLength (14); + SetLength (18); } DsrOptionRerrHeader::~DsrOptionRerrHeader () @@ -738,7 +737,7 @@ uint32_t DsrOptionRerrHeader::GetSerializedSize () const { - return 16; + return 20; } void DsrOptionRerrHeader::Serialize (Buffer::Iterator start) const @@ -799,10 +798,10 @@ DsrOptionRerrUnreachHeader::DsrOptionRerrUnreachHeader () : m_reserved (0), - m_salvage (0) + m_salvage (0) { SetType (3); - SetLength (14); + SetLength (18); SetErrorType (1); } @@ -850,6 +849,16 @@ return m_unreachNode; } +void DsrOptionRerrUnreachHeader::SetOriginalDst (Ipv4Address originalDst) +{ + m_originalDst = originalDst; +} + +Ipv4Address DsrOptionRerrUnreachHeader::GetOriginalDst () const +{ + return m_originalDst; +} + void DsrOptionRerrUnreachHeader::Print (std::ostream &os) const { os << "( type = " << (uint32_t)GetType () << " length = " << (uint32_t)GetLength () @@ -860,7 +869,7 @@ uint32_t DsrOptionRerrUnreachHeader::GetSerializedSize () const { - return 16; + return 20; } void DsrOptionRerrUnreachHeader::Serialize (Buffer::Iterator start) const @@ -874,7 +883,7 @@ WriteTo (i, m_errorSrcAddress); WriteTo (i, m_errorDstAddress); WriteTo (i, m_unreachNode); - + WriteTo (i, m_originalDst); } uint32_t DsrOptionRerrUnreachHeader::Deserialize (Buffer::Iterator start) @@ -888,6 +897,7 @@ ReadFrom (i, m_errorSrcAddress); ReadFrom (i, m_errorDstAddress); ReadFrom (i, m_unreachNode); + ReadFrom (i, m_originalDst); return GetSerializedSize (); } diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-option-header.h --- a/src/dsr/model/dsr-option-header.h Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-option-header.h Sun May 06 20:52:24 2012 -0700 @@ -957,6 +957,16 @@ */ Ipv4Address GetUnreachNode () const; /** + * \brief Set the unreachable node ip address + * \param The unreachable ip address + */ + void SetOriginalDst (Ipv4Address originalDst); + /** + * \brief Get the unreachable node ip address + * \return The unreachable ip address + */ + Ipv4Address GetOriginalDst () const; + /** * \brief Print some informations about the packet. * \param os output stream * \return info about this packet @@ -1014,6 +1024,10 @@ */ Ipv4Address m_unreachNode; /** + * \brief The original destination address + */ + Ipv4Address m_originalDst; + /** * \brief The specific error type */ uint16_t m_typeSpecific; diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-options.cc --- a/src/dsr/model/dsr-options.cc Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-options.cc Sun May 06 20:52:24 2012 -0700 @@ -106,6 +106,7 @@ bool DsrOptions::ContainAddressAfter (Ipv4Address ipv4Address, Ipv4Address destAddress, std::vector &nodeList) { + NS_LOG_FUNCTION (this << ipv4Address << destAddress); std::vector::iterator it = find (nodeList.begin (), nodeList.end (), destAddress); for (std::vector::iterator i = it; i != nodeList.end (); ++i) @@ -121,6 +122,7 @@ std::vector DsrOptions::CutRoute (Ipv4Address ipv4Address, std::vector &nodeList) { + NS_LOG_FUNCTION (this << ipv4Address); std::vector::iterator it = find (nodeList.begin (), nodeList.end (), ipv4Address); std::vector cutRoute; for (std::vector::iterator i = it; i != nodeList.end (); ++i) @@ -142,6 +144,7 @@ bool DsrOptions::ReverseRoutes (std::vector & vec) { + NS_LOG_FUNCTION (this); std::vector vec2 (vec); vec.clear (); // To ensure vec is empty before start for (std::vector::reverse_iterator ri = vec2.rbegin (); ri @@ -159,7 +162,9 @@ Ipv4Address DsrOptions::SearchNextHop (Ipv4Address ipv4Address, std::vector& vec) { + NS_LOG_FUNCTION (this << ipv4Address); Ipv4Address nextHop; + NS_LOG_DEBUG ("the vector size " << vec.size ()); if (vec.size () == 2) { NS_LOG_DEBUG ("The two nodes are neighbors"); @@ -173,7 +178,7 @@ NS_LOG_DEBUG ("We have reached to the final destination " << ipv4Address << " " << vec.back ()); return ipv4Address; } - for (std::vector::iterator i = vec.begin (); i != vec.end (); ++i) + for (std::vector::const_iterator i = vec.begin (); i != vec.end (); ++i) { if (ipv4Address == (*i)) { @@ -189,6 +194,7 @@ Ipv4Address DsrOptions::ReverseSearchNextHop (Ipv4Address ipv4Address, std::vector& vec) { + NS_LOG_FUNCTION (this << ipv4Address); Ipv4Address nextHop; if (vec.size () == 2) { @@ -214,6 +220,7 @@ void DsrOptions::PrintVector (std::vector& vec) { + NS_LOG_FUNCTION (this); /* * Check elements in a route vector */ @@ -233,6 +240,11 @@ bool DsrOptions::IfDuplicates (std::vector& vec, std::vector& vec2) { + NS_LOG_FUNCTION (this); + NS_LOG_DEBUG ("The first vector "); + PrintVector (vec); + NS_LOG_DEBUG ("The second vector "); + PrintVector (vec2); for (std::vector::const_iterator i = vec.begin (); i != vec.end (); ++i) { for (std::vector::const_iterator j = vec2.begin (); j != vec2.end (); ++j) @@ -252,6 +264,7 @@ bool DsrOptions::CheckDuplicates (Ipv4Address ipv4Address, std::vector& vec) { + NS_LOG_FUNCTION (this << ipv4Address); for (std::vector::const_iterator i = vec.begin (); i != vec.end (); ++i) { if ((*i) == ipv4Address) @@ -268,6 +281,7 @@ void DsrOptions::RemoveDuplicates (std::vector& vec) { + NS_LOG_FUNCTION (this); //Remove duplicate ip address from the route if any, should not happen with normal behavior nodes std::vector vec2 (vec); // declare vec2 as a copy of the vec PrintVector (vec2); // Print all the ip address in the route @@ -312,6 +326,7 @@ uint32_t DsrOptions::GetIDfromIP (Ipv4Address address) { + NS_LOG_FUNCTION (this << address); int32_t nNodes = NodeList::GetNNodes (); for (int32_t i = 0; i < nNodes; ++i) { @@ -327,6 +342,7 @@ Ptr DsrOptions::GetNodeWithAddress (Ipv4Address ipv4Address) { + NS_LOG_FUNCTION (this << ipv4Address); int32_t nNodes = NodeList::GetNNodes (); for (int32_t i = 0; i < nNodes; ++i) { @@ -372,7 +388,6 @@ uint8_t DsrOptionPad1::Process (Ptr packet, Ptr dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc) { NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc); - Ptr p = packet->Copy (); DsrOptionPad1Header pad1Header; p->RemoveHeader (pad1Header); @@ -414,7 +429,6 @@ NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc); Ptr p = packet->Copy (); - DsrOptionPadnHeader padnHeader; p->RemoveHeader (padnHeader); @@ -459,14 +473,24 @@ uint8_t DsrOptionRreq::Process (Ptr packet, Ptr dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc) { NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc); + // Fields from IP header + Ipv4Address srcAddress = ipv4Header.GetSource (); + Ipv4Address destAddress = ipv4Header.GetDestination (); + /* + * \ when the ip source address is equal to the address of our own, this is request packet originated + * \ by the node itself, discard it + */ + if (srcAddress == ipv4Address) + { + NS_LOG_DEBUG ("Discard the packet"); + m_dropTrace (packet); // call the drop trace to show in the tracing + return 0; + } /* * Get the node associated with the ipv4 address and get several objects from the node and leave for further use */ Ptr node = GetNodeWithAddress (ipv4Address); Ptr dsr = node->GetObject (); - Ptr m_routeCache = node->GetObject (); - Ptr m_rreqTable = node->GetObject (); - ActiveRouteTimeout = m_routeCache->GetCacheTimeout (); // Set the isError boolean value as false bool isError = false; @@ -478,7 +502,7 @@ uint8_t buf[2]; p->CopyData (buf, sizeof(buf)); uint8_t numberAddress = (buf[1] - 6) / 4; - + NS_LOG_DEBUG ("The number of Ip addresses " << (uint32_t)numberAddress); if (numberAddress >= 255) { NS_LOG_DEBUG ("Discard the packet, malformed header since two many ip addresses in route"); @@ -486,57 +510,38 @@ return 0; } - NS_LOG_DEBUG ("The number of Ip addresses " << (uint32_t)numberAddress); /* * Create the dsr rreq header */ DsrOptionRreqHeader rreq; - - // Fields from IP header - Ipv4Address srcAddress = ipv4Header.GetSource (); - Ipv4Address destAddress = ipv4Header.GetDestination (); /* * Set the number of addresses with the value from peek data and remove the rreq header */ rreq.SetNumberAddress (numberAddress); - - /* - * \ when the ip source address is equal to the address of our own, this is request packet originated - * \ by the node itself, discard it - */ - if (srcAddress == ipv4Address) + // Remove the route request header + p->RemoveHeader (rreq); + // Verify the option length + uint8_t length = rreq.GetLength (); + if (length % 2 != 0) { - NS_LOG_DEBUG ("Discard the packet"); - m_dropTrace (packet); // call the drop trace to show in the tracing + NS_LOG_LOGIC ("Malformed header. Drop!"); + m_dropTrace (packet); // call drop trace return 0; } - - p->RemoveHeader (rreq); - Ptr errP = p->Copy (); - // The target address is where we want to send the data packets Ipv4Address targetAddress = rreq.GetTarget (); - uint16_t id = rreq.GetId (); // Get the node list and source address from the route request header - std::vector nodeList = rreq.GetNodesAddresses (); + std::vector mainVector = rreq.GetNodesAddresses (); + std::vector nodeList (mainVector); PrintVector (nodeList); - - // Get the TTL value - uint8_t ttl = ipv4Header.GetTtl (); - NS_LOG_DEBUG ("The TTL " << (uint32_t) ttl); /* - * Node checks to determine whether it has received a RREQ with the same Originator IP Address and RREQ ID. - * If such a RREQ has been received, the node silently discards the newly received RREQ. + * Construct the dsr routing header for future use */ - if (ttl) - { - // if the TTL value is not 0, save the route request entry - if (m_rreqTable->FindSrc (source, targetAddress, id)) - { - NS_LOG_DEBUG ("Received the same route request recently, not processing it further"); - return 0; - } - } + DsrRoutingHeader dsrRoutingHeader; + dsrRoutingHeader.SetNextHeader (protocol); + dsrRoutingHeader.SetMessageType (1); + dsrRoutingHeader.SetSourceId (GetIDfromIP (source)); + dsrRoutingHeader.SetDestId (255); if (CheckDuplicates (ipv4Address, nodeList)) { @@ -549,15 +554,6 @@ } else { - // Verify the option length - uint8_t length = rreq.GetLength (); - if (length % 2 != 0) - { - NS_LOG_LOGIC ("Malformed header. Drop!"); - m_dropTrace (packet); // call drop trace - return 0; - } - // A node ignores all RREQs received from any node in its blacklist RouteCacheEntry toPrev; /* @@ -571,6 +567,7 @@ /* * The target address equal to our own ip address */ + NS_LOG_DEBUG ("The target address over here " << targetAddress << " and the ip address " << ipv4Address << " and the source address " << mainVector[0]); if (targetAddress == ipv4Address) { Ipv4Address nextHop; // Declare the next hop address to use @@ -584,9 +581,10 @@ } else { - nodeList.push_back (ipv4Address); // push back our own address + std::vector changeRoute (nodeList); + changeRoute.push_back (ipv4Address); // push back our own address m_finalRoute.clear (); // get a clear route vector - for (std::vector::iterator i = nodeList.begin (); i != nodeList.end (); ++i) + for (std::vector::iterator i = changeRoute.begin (); i != changeRoute.end (); ++i) { m_finalRoute.push_back (*i); // Get the full route from source to destination } @@ -599,7 +597,7 @@ NS_LOG_DEBUG ("The nextHop address " << nextHop); Ipv4Address replyDst = m_finalRoute.front (); /* - * This part add dsr header to the packet and send reply + * This part add dsr header to the packet and send route reply packet */ DsrRoutingHeader dsrRoutingHeader; dsrRoutingHeader.SetNextHeader (protocol); @@ -626,15 +624,15 @@ bool addRoute = false; if (numberAddress > 0) { - RouteCacheEntry toSource (/*IP_VECTOR=*/ m_finalRoute, /*dst=*/ - dst, /*expire time=*/ ActiveRouteTimeout); - if (m_routeCache->IsLinkCache ()) + RouteCacheEntry toSource (/*IP_VECTOR=*/m_finalRoute, /*dst=*/ + dst, /*expire time=*/ActiveRouteTimeout); + if (dsr->IsLinkCache ()) { - addRoute = m_routeCache->AddRoute_Link (m_finalRoute, ipv4Address); + addRoute = dsr->AddRoute_Link (m_finalRoute, ipv4Address); } else { - addRoute = m_routeCache->AddRoute (toSource); + addRoute = dsr->AddRoute (toSource); } } else @@ -645,24 +643,19 @@ if (addRoute) { - NS_LOG_DEBUG ("The route is failed to add in cache"); - return 0; - } - else - { /* * Found a route to the dst, construct the source route option header */ DsrOptionSRHeader sourceRoute; NS_LOG_DEBUG ("The route length " << m_finalRoute.size ()); sourceRoute.SetNodesAddress (m_finalRoute); - if (m_routeCache->IsLinkCache ()) + if (dsr->IsLinkCache ()) { - m_routeCache->UseExtends (m_finalRoute); + dsr->UseExtends (m_finalRoute); } sourceRoute.SetSegmentsLeft ((m_finalRoute.size () - 2)); - uint8_t salvage = 0; - sourceRoute.SetSalvage (salvage); + // The salvage value here is 0 + sourceRoute.SetSalvage (0); Ipv4Address nextHop = SearchNextHop (ipv4Address, m_finalRoute); // Get the next hop address NS_LOG_DEBUG ("The nextHop address " << nextHop); @@ -673,11 +666,16 @@ } SetRoute (nextHop, ipv4Address); /* - * Schedule the packet retry + * Send the data packet from the send buffer */ - dsr->SendPacket (sourceRoute, nextHop, protocol); - // Cancel the route request timer for destination - dsr->CancelRreqTimer (dst); + dsr->SendPacketFromBuffer (sourceRoute, nextHop, protocol); + // Cancel the route request timer for destination after sending the data packet + dsr->CancelRreqTimer (dst, true); + } + else + { + NS_LOG_DEBUG ("The route is failed to add in cache"); + return 0; } } else @@ -694,24 +692,21 @@ * need to delay based on a random value from d = H * (h - 1 + r), which can avoid possible route * reply storm. */ - else if (m_routeCache->LookupRoute (targetAddress, toPrev)) + else if (dsr->LookupRoute (targetAddress, toPrev)) { - RouteCacheEntry::IP_VECTOR ip = toPrev.GetVector (); // The route from our own route cache to dst - PrintVector (ip); - std::vector nodeList = rreq.GetNodesAddresses (); // Route from rreq header std::vector saveRoute (nodeList); PrintVector (saveRoute); // Verify if the two vector contains duplicates, if so, do not use // the route found and forward the route request - if (!(IfDuplicates (ip, nodeList))) + if (!(IfDuplicates (ip, saveRoute))) { - m_finalRoute.clear (); // Clear the final route vector + m_finalRoute.clear (); // Clear the final route vector /** * push back the intermediate node address from the source to this node */ - for (std::vector::iterator i = nodeList.begin (); i != nodeList.end (); ++i) + for (std::vector::iterator i = saveRoute.begin (); i != saveRoute.end (); ++i) { m_finalRoute.push_back (*i); } @@ -730,43 +725,42 @@ if (ReverseRoutes (reverseRoute)) { - Ipv4Address dst = reverseRoute.back (); saveRoute.push_back (ipv4Address); ReverseRoutes (saveRoute); + Ipv4Address dst = saveRoute.back (); + NS_LOG_DEBUG ("This is the route save in route cache"); PrintVector (saveRoute); + RouteCacheEntry toSource (/*IP_VECTOR=*/ saveRoute, /*dst=*/ dst, /*expire time=*/ ActiveRouteTimeout); NS_ASSERT (saveRoute.front () == ipv4Address); // Add the route entry in the route cache - if (m_routeCache->IsLinkCache ()) + if (dsr->IsLinkCache ()) { - addRoute = m_routeCache->AddRoute_Link (saveRoute, ipv4Address); + addRoute = dsr->AddRoute_Link (saveRoute, ipv4Address); } else { - addRoute = m_routeCache->AddRoute (toSource); + addRoute = dsr->AddRoute (toSource); } + if (addRoute) { - NS_LOG_DEBUG ("The route is failed to add in cache"); - return 0; - } - else - { NS_LOG_DEBUG ("We have added the route and search send buffer for packet with destination " << dst); /* * Found a route the dst, construct the source route option header */ DsrOptionSRHeader sourceRoute; - NS_LOG_DEBUG ("The route length " << reverseRoute.size ()); - sourceRoute.SetNodesAddress (reverseRoute); - if (m_routeCache->IsLinkCache ()) + PrintVector (saveRoute); + + sourceRoute.SetNodesAddress (saveRoute); + if (dsr->IsLinkCache ()) { - m_routeCache->UseExtends (reverseRoute); + dsr->UseExtends (saveRoute); } sourceRoute.SetSegmentsLeft ((saveRoute.size () - 2)); uint8_t salvage = 0; sourceRoute.SetSalvage (salvage); - Ipv4Address nextHop = SearchNextHop (ipv4Address, reverseRoute); // Get the next hop address + Ipv4Address nextHop = SearchNextHop (ipv4Address, saveRoute); // Get the next hop address NS_LOG_DEBUG ("The nextHop address " << nextHop); if (nextHop == "0.0.0.0") @@ -778,36 +772,44 @@ /* * Schedule the packet retry */ - dsr->SendPacket (sourceRoute, nextHop, protocol); + dsr->SendPacketFromBuffer (sourceRoute, nextHop, protocol); // Cancel the route request timer for destination - dsr->CancelRreqTimer (dst); + dsr->CancelRreqTimer (dst, true); + } + else + { + NS_LOG_DEBUG ("The route is failed to add in cache"); + return 0; } } else { NS_LOG_DEBUG ("Unable to reverse the route"); + return 0; } /* * Need to first pin down the next hop address before removing duplicates */ Ipv4Address nextHop = ReverseSearchNextHop (ipv4Address, m_finalRoute); + NS_LOG_DEBUG ("The nextHop address " << nextHop); /* * First remove the duplicate ip address to automatically shorten the route, and then reversely * search the next hop address */ - PrintVector (m_finalRoute); // Set the route SetRoute (nextHop, ipv4Address); uint16_t hops = m_finalRoute.size (); DsrOptionRrepHeader rrep; rrep.SetNodesAddress (m_finalRoute); // Set the node addresses in the route reply header - NS_LOG_DEBUG ("The nextHop address " << nextHop); // Get the real source of the reply Ipv4Address realSource = m_finalRoute.back (); + Ipv4Address realDst = m_finalRoute.front (); + PrintVector (m_finalRoute); + NS_LOG_DEBUG ("This is the full route from " << realSource << " to " << realDst); /* - * This part add dsr header to the packet and send reply + * This part add dsr header to the packet and send route reply packet */ DsrRoutingHeader dsrRoutingHeader; dsrRoutingHeader.SetNextHeader (protocol); @@ -823,79 +825,86 @@ dsr->ScheduleCachedReply (newPacket, ipv4Address, nextHop, m_ipv4Route, hops); isPromisc = false; } + else + { + NS_LOG_DEBUG ("There is duplicate ip addresses in the two route parts"); + } + return rreq.GetSerializedSize (); } /* * (iii) no route in any type has been found */ else { - std::vector nodeList = rreq.GetNodesAddresses (); // route from rreq header - PrintVector (nodeList); - /* - * Otherwise, forward the route request packet - */ - PrintVector (nodeList); - nodeList.push_back (ipv4Address); - PrintVector (nodeList); - NS_ASSERT (nodeList.front () == source); - rreq.SetNodesAddress (nodeList); + mainVector.push_back (ipv4Address); + NS_ASSERT (mainVector.front () == source); + NS_LOG_DEBUG ("Print out the main vector"); + PrintVector (mainVector); + rreq.SetNodesAddress (mainVector); + + Ptr errP = p->Copy (); + if (errP->GetSize ()) + { + NS_LOG_DEBUG ("Error header included"); + DsrOptionRerrUnreachHeader rerr; + p->RemoveHeader (rerr); + Ipv4Address errorSrc = rerr.GetErrorSrc (); + Ipv4Address unreachNode = rerr.GetUnreachNode (); + Ipv4Address errorDst = rerr.GetErrorDst (); + + if ((errorSrc == srcAddress) && (unreachNode == ipv4Address)) + { + NS_LOG_DEBUG ("The error link back to work again"); + uint16_t length = rreq.GetLength (); + NS_LOG_DEBUG ("The RREQ header length " << length); + dsrRoutingHeader.AddDsrOption (rreq); + dsrRoutingHeader.SetPayloadLength (length + 2); + } + else + { + isError = true; + dsr->DeleteAllRoutesIncludeLink (errorSrc, unreachNode, ipv4Address); + + DsrOptionRerrUnreachHeader newUnreach; + newUnreach.SetErrorType (1); + newUnreach.SetErrorSrc (errorSrc); + newUnreach.SetUnreachNode (unreachNode); + newUnreach.SetErrorDst (errorDst); + newUnreach.SetSalvage (rerr.GetSalvage ()); // Set the value about whether to salvage a packet or not + uint16_t length = rreq.GetLength () + newUnreach.GetLength (); + NS_LOG_DEBUG ("The RREQ and newUnreach header length " << length); + dsrRoutingHeader.SetPayloadLength (length + 4); + dsrRoutingHeader.AddDsrOption (rreq); + dsrRoutingHeader.AddDsrOption (newUnreach); + } + } + else + { + uint16_t length = rreq.GetLength (); + NS_LOG_DEBUG ("The RREQ header length " << length); + dsrRoutingHeader.AddDsrOption (rreq); + dsrRoutingHeader.SetPayloadLength (length + 2); + } + // Get the TTL value + uint8_t ttl = ipv4Header.GetTtl (); /* * Decrease the TTL value in the packet tag by one, this tag will go to ip layer 3 send function * and drop packet when TTL value equals to 0 */ + NS_LOG_DEBUG ("The ttl value here " << (uint32_t)ttl); if (ttl) { Ptr interP = Create (); SocketIpTtlTag tag; tag.SetTtl (ttl - 1); interP->AddPacketTag (tag); - /* - * Construct the route request header to forward the route requests - */ - DsrRoutingHeader dsrRoutingHeader; - dsrRoutingHeader.SetNextHeader (protocol); - dsrRoutingHeader.SetMessageType (1); - dsrRoutingHeader.SetSourceId (GetIDfromIP (source)); - dsrRoutingHeader.SetDestId (255); - dsrRoutingHeader.AddDsrOption (rreq); - - // if the errP packet is not 0, then there is an error header after it - if (errP->GetSize ()) - { - NS_LOG_DEBUG ("Error header included"); - DsrOptionRerrUnreachHeader rerr; - p->RemoveHeader (rerr); - Ipv4Address errorSrc = rerr.GetErrorSrc (); - Ipv4Address unreachNode = rerr.GetUnreachNode (); - isError = true; - m_routeCache->DeleteAllRoutesIncludeLink (errorSrc, unreachNode, ipv4Address); - - DsrOptionRerrUnreachHeader newUnreach; - newUnreach.SetErrorType (1); - newUnreach.SetErrorSrc (rerr.GetErrorSrc ()); - newUnreach.SetUnreachNode (rerr.GetUnreachNode ()); - newUnreach.SetErrorDst (rerr.GetErrorDst ()); - newUnreach.SetSalvage (rerr.GetSalvage ()); // Set the value about whether to salvage a packet or not - dsrRoutingHeader.AddDsrOption (newUnreach); - uint16_t length = rreq.GetLength () + newUnreach.GetLength (); - NS_LOG_DEBUG ("The RREQ and newUnreach header length " << length); - dsrRoutingHeader.SetPayloadLength (length + 4); - interP->AddHeader (dsrRoutingHeader); - } - else - { - uint16_t length = rreq.GetLength (); - NS_LOG_DEBUG ("The RREQ header length " << length); - dsrRoutingHeader.SetPayloadLength (length + 2); - interP->AddHeader (dsrRoutingHeader); - } - + interP->AddHeader (dsrRoutingHeader); dsr->ScheduleInterRequest (interP); isPromisc = false; } + return rreq.GetSerializedSize (); } } - return rreq.GetSerializedSize (); } @@ -949,14 +958,11 @@ Ptr node = GetNodeWithAddress (ipv4Address); Ptr dsr = node->GetObject (); - Ptr m_routeCache = node->GetObject (); - Ptr m_rreqTable = node->GetObject (); - ActiveRouteTimeout = m_routeCache->GetCacheTimeout (); NS_LOG_DEBUG ("The next header value " << (uint32_t)protocol); std::vector nodeList = rrep.GetNodesAddress (); - /* + /** * Get the destination address, which is the last element in the nodeList */ Ipv4Address targetAddress = nodeList.front (); @@ -970,11 +976,11 @@ NS_LOG_DEBUG ("The route we have contains 0 entries"); return 0; } - /* + /** * Get the destination address for the data packet, which is the last element in the nodeList */ Ipv4Address dst = nodeList.back (); - /* + /** * Add the newly found route to the route cache * The route looks like: * \\ "srcAddress" + "intermediate node address" + "targetAddress" @@ -982,31 +988,26 @@ RouteCacheEntry toDestination (/*IP_VECTOR=*/ nodeList, /*dst=*/ dst, /*expire time=*/ ActiveRouteTimeout); NS_ASSERT (nodeList.front () == ipv4Address); bool addRoute = false; - if (m_routeCache->IsLinkCache ()) + if(dsr->IsLinkCache()) { - m_routeCache->AddRoute_Link (nodeList, ipv4Address); + addRoute = dsr->AddRoute_Link (nodeList, ipv4Address); } else { - m_routeCache->AddRoute (toDestination); + addRoute = dsr->AddRoute (toDestination); } + if (addRoute) { - NS_LOG_DEBUG ("Failed to add the route"); - return 0; - } - else - { NS_LOG_DEBUG ("We have added the route and search send buffer for packet with destination " << dst); - /* + /** * Found a route the dst, construct the source route option header */ DsrOptionSRHeader sourceRoute; NS_LOG_DEBUG ("The route length " << nodeList.size ()); sourceRoute.SetNodesAddress (nodeList); sourceRoute.SetSegmentsLeft ((nodeList.size () - 2)); - uint8_t salvage = 0; - sourceRoute.SetSalvage (salvage); + sourceRoute.SetSalvage (0); Ipv4Address nextHop = SearchNextHop (ipv4Address, nodeList); // Get the next hop address NS_LOG_DEBUG ("The nextHop address " << nextHop); if (nextHop == "0.0.0.0") @@ -1016,12 +1017,17 @@ } PrintVector (nodeList); SetRoute (nextHop, ipv4Address); - /* + // Cancel the route request timer for destination + dsr->CancelRreqTimer (dst, true); + /** * Schedule the packet retry */ - dsr->SendPacket (sourceRoute, nextHop, protocol); - // Cancel the route request timer for destination - dsr->CancelRreqTimer (dst); + dsr->SendPacketFromBuffer (sourceRoute, nextHop, protocol); + } + else + { + NS_LOG_DEBUG ("Failed to add the route"); + return 0; } } else @@ -1049,17 +1055,17 @@ RouteCacheEntry toDestination (/*IP_VECTOR=*/ cutRoute, /*dst=*/ dst, /*expire time=*/ ActiveRouteTimeout); NS_ASSERT (cutRoute.front () == ipv4Address); bool addRoute = false; - if (m_routeCache->IsLinkCache ()) + if(dsr->IsLinkCache()) { - m_routeCache->AddRoute_Link (nodeList, ipv4Address); + addRoute = dsr->AddRoute_Link (nodeList, ipv4Address); } else { - m_routeCache->AddRoute (toDestination); + addRoute = dsr->AddRoute (toDestination); } if (addRoute) { - dsr->CancelRreqTimer (dst); + dsr->CancelRreqTimer (dst, true); } else { @@ -1148,14 +1154,8 @@ // The route size saved in the source route std::vector nodeList = sourceRoute.GetNodesAddress (); - uint8_t segsLeft = sourceRoute.GetSegmentsLeft (); uint8_t salvage = sourceRoute.GetSalvage (); - - // Here we remove the ack packet to the previous hop - DsrOptionAckReqHeader ackReq; - p->RemoveHeader (ackReq); - uint16_t ackId = ackReq.GetAckId (); /* * Get the node from IP address and get the DSR extension object */ @@ -1180,12 +1180,11 @@ */ Ptr node = GetNodeWithAddress (ipv4Address); Ptr dsr = node->GetObject (); - - bool findSame = dsr->FindSamePackets (packet, ipv4Header, source, destination, segsLeft); + bool findSame = dsr->FindSamePackets (packet, source, destination, segsLeft); if (findSame) { - NS_LOG_DEBUG ("Received one passive acknowledgment for data packet"); + NS_LOG_DEBUG ("Received one passive acknowledgment for a successfully delivered packet"); } if (ContainAddressAfter (ipv4Address, destAddress, nodeList)) { @@ -1205,18 +1204,38 @@ uint8_t length = sourceRoute.GetLength (); uint8_t nextAddressIndex; Ipv4Address nextAddress; - /* - * Send back acknowledgment packet to the earlier hop - */ - m_ipv4Route = SetRoute (srcAddress, ipv4Address); - NS_LOG_DEBUG ("Send back ACK to the earlier hop " << srcAddress << " from us " << ipv4Address); - dsr->SendAck (ackId, srcAddress, source, destination, protocol, m_ipv4Route); + + // Get the option type value + uint32_t size = p->GetSize (); + uint8_t *data = new uint8_t[size]; + p->CopyData (data, size); + uint8_t optionType = 0; + optionType = *(data); + NS_LOG_DEBUG ("The packet size over here " << p->GetSize()); + + NS_LOG_DEBUG ("The option type over here " << (uint32_t)optionType); + if (optionType == 160) + { + NS_LOG_DEBUG ("Here we remove the ack request header and add ack header to the packet"); + // Here we remove the ack packet to the previous hop + DsrOptionAckReqHeader ackReq; + p->RemoveHeader (ackReq); + uint16_t ackId = ackReq.GetAckId (); + NS_LOG_DEBUG ("The type value " << (uint32_t)ackReq.GetType ()); + /* + * Send back acknowledgment packet to the earlier hop + */ + m_ipv4Route = SetRoute (srcAddress, ipv4Address); + NS_LOG_DEBUG ("Send back ACK to the earlier hop " << srcAddress << " from us " << ipv4Address); + dsr->SendAck (ackId, srcAddress, source, destination, protocol, m_ipv4Route); + } /* * After send back ACK, check if the segments left value has turned to 0 or not, if yes, update the route entry * and return header length */ if (segsLeft == 0) { + NS_LOG_DEBUG ("This is the final destination"); isPromisc = false; return sourceRoute.GetSerializedSize (); } @@ -1274,6 +1293,7 @@ } // Set the route and forward the data packet SetRoute (nextAddress, ipv4Address); + NS_LOG_DEBUG ("dsr packet size " << dsrP->GetSize()); dsr->ForwardPacket (dsrP, newSourceRoute, ipv4Header, realSource, nextAddress, targetAddress, protocol, m_ipv4Route); } return sourceRoute.GetSerializedSize (); @@ -1314,7 +1334,6 @@ uint8_t DsrOptionRerr::Process (Ptr packet, Ptr dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc) { NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc); - Ptr p = packet->Copy (); uint32_t size = p->GetSize (); uint8_t *data = new uint8_t[size]; @@ -1325,13 +1344,11 @@ */ Ptr node = GetNodeWithAddress (ipv4Address); Ptr dsr = node->GetObject (); - - Ipv4Address srcAddress = ipv4Header.GetSource (); - Ipv4Address destAddress = ipv4Header.GetDestination (); /* * The error serialized size */ uint32_t rerrSize; + NS_LOG_DEBUG ("The error type value here " << (uint32_t)errorType); if (errorType == 1) // unreachable ip address { /* @@ -1355,8 +1372,7 @@ * Delete all the routes including the unreachable node address from the route cache */ Ptr node = GetNodeWithAddress (ipv4Address); - Ptr m_routeCache = node->GetObject (); - m_routeCache->DeleteAllRoutesIncludeLink (errorSource, unreachAddress, ipv4Address); + dsr->DeleteAllRoutesIncludeLink (errorSource, unreachAddress, ipv4Address); Ptr newP = p->Copy (); uint32_t serialized = DoSendError (newP, rerrUnreach, rerrSize, ipv4Address, protocol); @@ -1376,7 +1392,7 @@ p->RemoveHeader (rerrUnsupport); rerrSize = rerrUnsupport.GetSerializedSize (); - // This is for the other two error options TODO + // This is for the other two error options, not supporting for now TODO // uint32_t serialized = DoSendError (p, rerrUnsupport, rerrSize, ipv4Address, protocol); uint32_t serialized = 0; return serialized; @@ -1405,9 +1421,7 @@ * Get the segments left field and the next address */ uint8_t segmentsLeft = sourceRoute.GetSegmentsLeft (); - NS_LOG_DEBUG ("The segments left " << (uint32_t)segmentsLeft); uint8_t length = sourceRoute.GetLength (); - NS_LOG_DEBUG ("The number of addresses we have " << (uint32_t)numberAddress); uint8_t nextAddressIndex; Ipv4Address nextAddress; /* @@ -1438,18 +1452,11 @@ */ if (segmentsLeft == 0 && targetAddress == ipv4Address) { - NS_LOG_DEBUG ("This is the destination of the error"); + NS_LOG_INFO ("This is the destination of the error, send error request"); dsr->SendErrorRequest (rerr, protocol); return serializedSize; } - DsrOptionRerrUnreachHeader newUnreach; - newUnreach.SetErrorType (1); - newUnreach.SetErrorSrc (rerr.GetErrorSrc ()); - newUnreach.SetUnreachNode (rerr.GetUnreachNode ()); - newUnreach.SetErrorDst (rerr.GetErrorDst ()); - newUnreach.SetSalvage (rerr.GetSalvage ()); // Set the value about whether to salvage a packet or not - // Get the next Router Address DsrOptionSRHeader newSourceRoute; newSourceRoute.SetSegmentsLeft (segmentsLeft - 1); @@ -1468,7 +1475,7 @@ // Set the route entry SetRoute (nextAddress, ipv4Address); - dsr->ForwardErrPacket (newUnreach, newSourceRoute, nextAddress, protocol, m_ipv4Route); + dsr->ForwardErrPacket (rerr, newSourceRoute, nextAddress, protocol, m_ipv4Route); return serializedSize; } @@ -1521,7 +1528,6 @@ */ Ptr node = GetNodeWithAddress (ipv4Address); Ptr dsr = node->GetObject (); - Ptr m_routeCache = node->GetObject (); NS_LOG_DEBUG ("The next header value " << (uint32_t)protocol); @@ -1583,8 +1589,7 @@ */ Ptr node = GetNodeWithAddress (ipv4Address); Ptr dsr = node->GetObject (); - Ptr srcRouteCache = node->GetObject (); - srcRouteCache->UpdateRouteEntry (realDst); + dsr->UpdateRouteEntry (realDst); /* * Cancel the packet retransmit timer when receiving the ack packet */ diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-rcache.cc --- a/src/dsr/model/dsr-rcache.cc Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-rcache.cc Sun May 06 20:52:24 2012 -0700 @@ -52,12 +52,33 @@ namespace ns3 { namespace dsr { -void Link::Print () const +bool CompareRoutesBoth (const RouteCacheEntry &a, const RouteCacheEntry &b) +{ + // compare based on both with hop count considered priority + return (a.GetVector ().size () < b.GetVector ().size ()) || + ((a.GetVector ().size () == b.GetVector ().size ()) && (a.GetExpireTime() > b.GetExpireTime())) + ; +} + +bool CompareRoutesHops (const RouteCacheEntry &a, const RouteCacheEntry &b) +{ + // compare based on hops + return a.GetVector ().size () < b.GetVector ().size (); +} + +bool CompareRoutesExpire (const RouteCacheEntry &a, const RouteCacheEntry &b) +{ + // compare based on expire time + return a.GetExpireTime() > b.GetExpireTime(); +} + +void Link::Print() const { NS_LOG_DEBUG (m_low << "----" << m_high); } -NodeStab::NodeStab () +NodeStab::NodeStab (Time nodeStab) + : m_nodeStability (nodeStab + Simulator::Now ()) { } @@ -65,19 +86,8 @@ { } -void -NodeStab::IncStability () -{ - m_nodeStability = Time (GetNodeStability () * m_stabilityIncrFactor); -} - -void -NodeStab::DecStability () -{ - m_nodeStability = Time (GetNodeStability () / m_stabilityDecrFactor); -} - -LinkStab::LinkStab () +LinkStab::LinkStab (Time linkStab) + : m_linkStability (linkStab + Simulator::Now ()) { } @@ -121,23 +131,6 @@ << "\t"; } -bool CompareRoutesExpire (const RouteCacheEntry &a, const RouteCacheEntry &b) -{ - return a.GetExpireTime () > b.GetExpireTime (); -} - -bool CompareRoutesHop (const RouteCacheEntry &a, const RouteCacheEntry &b) -{ - return a.GetVector ().size () < b.GetVector ().size (); -} - -bool CompareRoutes (const RouteCacheEntry &a, const RouteCacheEntry &b) -{ - return (a.GetVector ().size () < b.GetVector ().size ()) - || ((a.GetVector ().size () == b.GetVector ().size ()) && (a.GetExpireTime () > b.GetExpireTime ())) - ; -} - NS_OBJECT_ENSURE_REGISTERED (RouteCache); TypeId RouteCache::GetTypeId () @@ -211,7 +204,7 @@ RouteCache::LookupRoute (Ipv4Address id, RouteCacheEntry & rt) { NS_LOG_FUNCTION (this << id); - if (IsLinkCache ()) + if (IsLinkCache()) { return LookupRoute_Link (id, rt); } @@ -261,7 +254,7 @@ RouteCacheEntry changeEntry; // Create the route entry changeEntry.SetVector (changeVector); changeEntry.SetDestination (id); - // use the expire time from original route entry + // Use the expire time from original route entry changeEntry.SetExpireTime (k->GetExpireTime ()); // We need to add new route entry here std::list newVector; @@ -285,7 +278,7 @@ */ std::list rtVector = m->second; rt = rtVector.front (); // use the first entry in the route vector - NS_LOG_DEBUG ("Route to " << id << " with route size " << rtVector.size ()); + NS_LOG_DEBUG ("Route to " << id << " with route size " << rtVector.size()); return true; } } @@ -295,23 +288,20 @@ { NS_LOG_FUNCTION (this << type); if (type == std::string ("LinkCache")) - { - m_isLinkCache = true; - } + m_isLinkCache = true; else if (type == std::string ("PathCache")) - { - m_isLinkCache = false; - } + m_isLinkCache = false; else { m_isLinkCache = false; // use path cache as default - NS_LOG_DEBUG ("Error Cache Type"); + NS_LOG_INFO ("Error Cache Type"); } } bool RouteCache::IsLinkCache () { + NS_LOG_FUNCTION (this); return m_isLinkCache; } @@ -319,14 +309,13 @@ RouteCache::RebuildBestRouteTable (Ipv4Address source) { NS_LOG_FUNCTION (this << source); - /* - * the followings are initialize-single-source + /** + * \brief The followings are initialize-single-source */ // @d shortest-path estimate std::map d; // @pre preceeding node std::map pre; - NS_LOG_FUNCTION (this << source); for (std::map >::iterator i = m_netGraph.begin (); i != m_netGraph.end (); ++i) { if (i->second.find (source) != i->second.end ()) @@ -342,72 +331,72 @@ } d[source] = 0; /** - * the followings are core of dijskra algorithm - * + * \brief The followings are core of dijskra algorithm */ // the node set which shortest distance has been calculated, if true calculated std::map s; double temp = MAXWEIGHT; Ipv4Address tempip = Ipv4Address ("255.255.255.255"); for (uint32_t i = 0; i < m_netGraph.size (); i++) + { + temp = MAXWEIGHT; + for (std::map::const_iterator j = d.begin (); j != d.end (); ++j) + { + Ipv4Address ip = j->first; + if (s.find (ip) == s.end ()) + { + /** + * \brief The followings are for comparison + */ + if (j->second <= temp) + { + temp = j->second; + tempip = ip; + } + } + } + if (!tempip.IsBroadcast ()) { - temp = MAXWEIGHT; - for (std::map::iterator j = d.begin (); j != d.end (); ++j) + s[tempip] = true; + for (std::map::const_iterator k = m_netGraph[tempip].begin (); k != m_netGraph[tempip].end (); ++k) + { + if (s.find (k->first) == s.end () && d[k->first] > d[tempip] + k->second) + { + d[k->first] = d[tempip] + k->second; + pre[k->first] = tempip; + } + /** + * Selects the shortest-length route that has the longest expected lifetime + * (highest minimum timeout of any link in the route) + * For the computation overhead and complexity + * Here I just implement kind of greedy strategy to select link with the longest expected lifetime when there is two options + */ + else if (d[k->first] == d[tempip] + k->second) { - Ipv4Address ip = j->first; - if (s.find (ip) == s.end ()) + std::map::iterator oldlink = m_linkCache.find (Link (k->first, pre[k->first])); + std::map::iterator newlink = m_linkCache.find (Link (k->first, tempip)); + if (oldlink != m_linkCache.end () && newlink != m_linkCache.end ()) { - /* - * the followings are for comparison - */ - if (j->second <= temp) + if (oldlink->second.GetLinkStability () < newlink->second.GetLinkStability ()) { - temp = j->second; - tempip = ip; - } - } - } - if (!tempip.IsBroadcast ()) - { - s[tempip] = true; - for (std::map::iterator k = m_netGraph[tempip].begin (); k != m_netGraph[tempip].end (); ++k) - { - if (s.find (k->first) == s.end () && d[k->first] > d[tempip] + k->second) - { + NS_LOG_INFO ("Select the link with longest expected lifetime"); d[k->first] = d[tempip] + k->second; pre[k->first] = tempip; } - /** - * Selects the shortest-length route that has the longest expected lifetime - * (highest minimum timeout of any link in the route) - * For the computation overhead and complexity - * Here I just implement kind of greedy strategy to select link with the longest expected lifetime when there is two options - */ - else if (d[k->first] == d[tempip] + k->second) - { - std::map::iterator oldlink = m_linkCache.find (Link (k->first, pre[k->first])); - std::map::iterator newlink = m_linkCache.find (Link (k->first, tempip)); - if (oldlink != m_linkCache.end () && newlink != m_linkCache.end ()) - { - if (oldlink->second.GetLinkStability () < newlink->second.GetLinkStability ()) - { - NS_LOG_DEBUG ("Select the link with longest expected lifetime"); - d[k->first] = d[tempip] + k->second; - pre[k->first] = tempip; - } - } - else - { - NS_LOG_DEBUG ("Link Stability Info Corrupt"); - } - } + } + else + { + NS_LOG_INFO ("Link Stability Info Corrupt"); } } + } } + } // clean the best route table m_bestRoutesTable_link.clear (); - for (std::map::iterator i = pre.begin (); i != pre.end (); ++i) - { // loop for all vertexes + for(std::map::iterator i = pre.begin (); i != pre.end (); ++i) + { + // loop for all vertexes RouteCacheEntry::IP_VECTOR route; Ipv4Address iptemp = i->first; @@ -419,11 +408,11 @@ iptemp = pre[iptemp]; } route.push_back (source); - /* - * reverse the route + /** + * \brief Reverse the route */ RouteCacheEntry::IP_VECTOR reverseroute; - for (RouteCacheEntry::IP_VECTOR::reverse_iterator j = route.rbegin (); j != route.rend (); ++j) + for(RouteCacheEntry::IP_VECTOR::reverse_iterator j = route.rbegin (); j!= route.rend (); ++j) { reverseroute.push_back (*j); } @@ -438,24 +427,26 @@ RouteCache::LookupRoute_Link (Ipv4Address id, RouteCacheEntry & rt) { NS_LOG_FUNCTION (this << id); - NS_LOG_DEBUG ("Use Link Cache"); - std::map::iterator i = m_bestRoutesTable_link.find (id); + std::map::const_iterator i = m_bestRoutesTable_link.find (id); if (i == m_bestRoutesTable_link.end ()) { - NS_LOG_DEBUG ("No Route To " << id); + NS_LOG_INFO("No Route To " << id); return false; } else { if (i->second.size () < 2) { - NS_LOG_DEBUG ("Route To " << id << " Error"); + NS_LOG_DEBUG ("Route To " << id << " error"); return false; } - RouteCacheEntry toSource (/*IP_VECTOR=*/ i->second, /*dst=*/ id, /*expire time=*/ Time (0)); - rt = toSource; - NS_LOG_DEBUG ("The route length " << i->second.size ()); - NS_LOG_LOGIC ("Route to " << id << " found"); + + RouteCacheEntry newEntry; // Create the route entry + newEntry.SetVector (i->second); + newEntry.SetDestination (id); + newEntry.SetExpireTime (RouteCacheTimeout); + NS_LOG_INFO ("Route to " << id << " found with the route length " << i->second.size ()); + rt = newEntry; std::vector path = rt.GetVector (); PrintVector (path); return true; @@ -466,26 +457,34 @@ RouteCache::PurgeLinkNode () { NS_LOG_FUNCTION (this); - for (std::map::iterator i = m_linkCache.begin (); i != m_linkCache.end (); ) + NS_LOG_DEBUG ("The size of the link cache before " << m_linkCache.size()); + for (std::map::iterator i = m_linkCache.begin (); i != m_linkCache.end ();) { + NS_LOG_DEBUG ("The link stability " << i->second.GetLinkStability()); + std::map::iterator itmp = i; if (i->second.GetLinkStability () <= Seconds (0)) { - m_linkCache.erase (i++); + ++i; + m_linkCache.erase (itmp); } else { - i++; + ++i; } } - for (std::map::iterator i = m_nodeCache.begin (); i != m_nodeCache.end (); ) + NS_LOG_DEBUG ("The size of the node cache before " << m_nodeCache.size()); + for (std::map::iterator i = m_nodeCache.begin (); i != m_nodeCache.end ();) { + NS_LOG_DEBUG ("The node stability " << i->second.GetNodeStability ()); + std::map::iterator itmp = i; if (i->second.GetNodeStability () <= Seconds (0)) { - m_nodeCache.erase (i++); + ++i; + m_nodeCache.erase (itmp); } else { - i++; + ++i; } } } @@ -495,8 +494,9 @@ { NS_LOG_FUNCTION (this); m_netGraph.clear (); - for (std::map::iterator i = m_linkCache.begin (); i != m_linkCache.end (); ++i) + for(std::map::iterator i = m_linkCache.begin (); i != m_linkCache.end (); ++i) { + // Here the weight is set as 1 uint32_t weight = 1; m_netGraph[i->first.m_low][i->first.m_high] = weight; m_netGraph[i->first.m_high][i->first.m_low] = weight; @@ -504,6 +504,47 @@ } bool +RouteCache::IncStability (Ipv4Address node) +{ + NS_LOG_FUNCTION (this << node); + std::map::const_iterator i = m_nodeCache.find (node); + if (i == m_nodeCache.end ()) + { + NS_LOG_INFO ("The initial stability " << m_initStability.GetSeconds ()); + NodeStab ns (m_initStability); + m_nodeCache[node] = ns; + return false; + } + else + { + NodeStab ns (Time (i->second.GetNodeStability () * m_stabilityIncrFactor)); + m_nodeCache[node] = ns; + return true; + } + return false; +} + +bool +RouteCache::DecStability (Ipv4Address node) +{ + NS_LOG_FUNCTION (this << node); + std::map::const_iterator i = m_nodeCache.find (node); + if (i == m_nodeCache.end ()) + { + NodeStab ns (m_initStability); + m_nodeCache[node] = ns; + return false; + } + else + { + NodeStab ns (Time (i->second.GetNodeStability () / m_stabilityDecrFactor)); + m_nodeCache[node] = ns; + return true; + } + return false; +} + +bool RouteCache::AddRoute_Link (RouteCacheEntry::IP_VECTOR nodelist, Ipv4Address source) { NS_LOG_FUNCTION (this << source); @@ -511,34 +552,31 @@ for (uint32_t i = 0; i < nodelist.size () - 1; i++) { NodeStab ns; - ns.SetNodeStability (Seconds (m_initStability)); - ns.SetStabilityIncrFactor (m_stabilityIncrFactor); - ns.SetStabilityDecrFactor (m_stabilityDecrFactor); + ns.SetNodeStability (m_initStability); if (m_nodeCache.find (nodelist[i]) == m_nodeCache.end ()) { m_nodeCache[nodelist[i]] = ns; } - if (m_nodeCache.find (nodelist[i + 1]) == m_nodeCache.end ()) + if (m_nodeCache.find (nodelist[i+1]) == m_nodeCache.end ()) { - m_nodeCache[nodelist[i + 1]] = ns; + m_nodeCache[nodelist[i+1]] = ns; } - Link link (nodelist[i], nodelist[i + 1]); + Link link (nodelist[i], nodelist[i+1]); LinkStab stab; - stab.SetLinkStability (Seconds (m_initStability)); - if (m_nodeCache[nodelist[i]].GetNodeStability () < m_nodeCache[nodelist[i + 1]].GetNodeStability ()) + stab.SetLinkStability (m_initStability); + if (m_nodeCache[nodelist[i]].GetNodeStability () < m_nodeCache[nodelist[i+1]].GetNodeStability ()) { stab.SetLinkStability (m_nodeCache[nodelist[i]].GetNodeStability ()); } else { - stab.SetLinkStability (m_nodeCache[nodelist[i + 1]].GetNodeStability ()); + stab.SetLinkStability (m_nodeCache[nodelist[i+1]].GetNodeStability ()); } - - if (stab.GetLinkStability () < (Seconds (m_minLifeTime))) + if (stab.GetLinkStability () < m_minLifeTime) { - NS_LOG_DEBUG ("stability: " << stab.GetLinkStability ()); - stab.SetLinkStability (Seconds (m_minLifeTime)); + NS_LOG_DEBUG ("Stability: " << stab.GetLinkStability ().GetSeconds ()); + stab.SetLinkStability (m_minLifeTime); } m_linkCache[link] = stab; NS_LOG_DEBUG ("Add a new link"); @@ -555,24 +593,25 @@ void RouteCache::UseExtends (RouteCacheEntry::IP_VECTOR rt) { + NS_LOG_FUNCTION (this); if (rt.size () < 2) { - NS_LOG_DEBUG ("The route is too short"); + NS_LOG_INFO ("The route is too short"); } for (RouteCacheEntry::IP_VECTOR::iterator i = rt.begin (); i != rt.end () - 1; ++i) { - Link link (*i, *(i + 1)); + Link link (*i, *(i+1)); if (m_linkCache.find (link) != m_linkCache.end ()) { - if (m_linkCache[link].GetLinkStability () < Time (Seconds (m_useExtends))) + if (m_linkCache[link].GetLinkStability () < m_useExtends) { - m_linkCache[link].SetLinkStability (Time (Seconds (m_useExtends))); + m_linkCache[link].SetLinkStability (m_useExtends); + NS_LOG_DEBUG ("The time of the link " << m_linkCache[link].GetLinkStability ().GetSeconds ()); } - NS_LOG_DEBUG ("The time of the link " << m_linkCache[link].GetLinkStability ().GetSeconds ()); } else { - NS_LOG_DEBUG ("we cannot find a link in cache"); + NS_LOG_INFO ("we cannot find a link in cache"); } } // Increase the stability of the node cache @@ -580,14 +619,14 @@ { if (m_nodeCache.find (*i) != m_nodeCache.end ()) { - NS_LOG_DEBUG ("increase the stability"); + NS_LOG_DEBUG ("Increase the stability"); if (m_nodeCache[*i].GetNodeStability () <= m_initStability) { - m_nodeCache[*i].IncStability (); + IncStability (*i); } else { - NS_LOG_DEBUG ("The node stability has already been increased"); + NS_LOG_INFO ("The node stability has already been increased"); } } } @@ -609,8 +648,8 @@ if (i == m_sortedRoutes.end ()) { rtVector.push_back (rt); - m_sortedRoutes.erase (dst); // erase the route entries for dst first - /* + m_sortedRoutes.erase (dst); // Erase the route entries for dst first + /** * Save the new route cache along with the destination address in map */ std::pair >::iterator, bool> result = @@ -621,8 +660,8 @@ { rtVector = i->second; NS_LOG_DEBUG ("The existing route size " << rtVector.size () << " for destination address " << dst); - /* - * Drop the most aged packet when buffer reaches to max + /** + * \brief Drop the most aged packet when buffer reaches to max */ if (rtVector.size () >= m_maxEntriesEachDst) { @@ -643,12 +682,12 @@ // This sort function will sort the route cache entries based on the size of route in each of the // route entries rtVector.sort (CompareRoutesExpire); - NS_LOG_DEBUG ("The first time" << rtVector.front ().GetExpireTime ().GetSeconds () << " The second time " - << rtVector.back ().GetExpireTime ().GetSeconds ()); + NS_LOG_DEBUG ("The first time" << rtVector.front().GetExpireTime().GetSeconds() << " The second time " + << rtVector.back ().GetExpireTime ().GetSeconds ()); NS_LOG_DEBUG ("The first hop" << rtVector.front ().GetVector ().size () << " The second hop " - << rtVector.back ().GetVector ().size ()); + << rtVector.back ().GetVector ().size ()); m_sortedRoutes.erase (dst); // erase the route entries for dst first - /* + /** * Save the new route cache along with the destination address in map */ std::pair >::iterator, bool> result = @@ -657,7 +696,7 @@ } else { - NS_LOG_DEBUG ("The newly found route is expired"); + NS_LOG_INFO ("The newly found route is already expired"); } } } @@ -676,9 +715,9 @@ if (routeVector == newVector) { NS_LOG_DEBUG ("Found same routes in the route cache with the vector size " - << rt.GetDestination () << " " << rtVector.size ()); - NS_LOG_DEBUG ("The new route expire time " << rt.GetExpireTime ().GetSeconds () - << " the original expire time " << i->GetExpireTime ().GetSeconds ()); + << rt.GetDestination() << " " << rtVector.size()); + NS_LOG_DEBUG ("The new route expire time " << rt.GetExpireTime().GetSeconds() + << " the original expire time " << i->GetExpireTime().GetSeconds()); if (rt.GetExpireTime () > i->GetExpireTime ()) { i->SetExpireTime (rt.GetExpireTime ()); @@ -699,6 +738,7 @@ bool RouteCache::DeleteRoute (Ipv4Address dst) { + NS_LOG_FUNCTION (this << dst); Purge (); // purge the route cache first to remove timeout entries if (m_sortedRoutes.erase (dst) != 0) { @@ -713,37 +753,36 @@ RouteCache::DeleteAllRoutesIncludeLink (Ipv4Address errorSrc, Ipv4Address unreachNode, Ipv4Address node) { NS_LOG_FUNCTION (this << errorSrc << unreachNode << node); - if (IsLinkCache ()) + if(IsLinkCache ()) { /* - * the followings are for cleaning the broken link in linkcache + * The followings are for cleaning the broken link in linkcache * */ - Link link (errorSrc, unreachNode); - if (m_linkCache.erase (link) == 0) + Link link1 (errorSrc, unreachNode); + Link link2 (unreachNode, errorSrc); + // erase the two kind of links to make sure the link is removed from the link cache + NS_LOG_DEBUG ("Erase the route "); + m_linkCache.erase (link1); + m_linkCache.erase (link2); + + std::map::iterator i = m_nodeCache.find (errorSrc); + if (i == m_nodeCache.end ()) { - NS_LOG_LOGIC ("Cut route unsuccessful and erase the route"); + NS_LOG_LOGIC ("Update the node stability unsuccessfully"); } else { - std::map::iterator i = m_nodeCache.find (errorSrc); - if (i == m_nodeCache.end ()) - { - NS_LOG_LOGIC ("Update the node stability unsuccessfully"); - } - else - { - i->second.DecStability (); - } - i = m_nodeCache.find (unreachNode); - if (i == m_nodeCache.end ()) - { - NS_LOG_LOGIC ("Update the node stability unsuccessfully"); - } - else - { - i->second.DecStability (); - } + DecStability (i->first); + } + i = m_nodeCache.find (unreachNode); + if (i == m_nodeCache.end ()) + { + NS_LOG_LOGIC ("Update the node stability unsuccessfully"); + } + else + { + DecStability (i->first); } PurgeLinkNode (); UpdateNetGraph (); @@ -845,10 +884,8 @@ } ++j; if (!IsLinkCache ()) - { - m_sortedRoutes.erase (jtmp); - } - if (rtVector.size ()) + m_sortedRoutes.erase (jtmp); + if (rtVector.size()) { /* * Save the new route cache along with the destination address in map @@ -867,6 +904,7 @@ void RouteCache::PrintVector (std::vector& vec) { + NS_LOG_FUNCTION (this); /* * Check elements in a route vector, used when one wants to check the IP addresses saved in */ @@ -887,10 +925,11 @@ void RouteCache::PrintRouteVector (std::list route) { + NS_LOG_FUNCTION (this); for (std::list::iterator i = route.begin (); i != route.end (); i++) { - std::vector path = i->GetVector (); - NS_LOG_DEBUG ("Route NO. "); + std::vector path = i->GetVector(); + NS_LOG_INFO ("Route NO. "); PrintVector (path); } } @@ -898,6 +937,7 @@ void RouteCache::Purge () { + NS_LOG_FUNCTION (this); //Trying to purge the route cache if (m_sortedRoutes.empty ()) { @@ -905,7 +945,7 @@ return; } for (std::map >::iterator i = - m_sortedRoutes.begin (); i != m_sortedRoutes.end (); ) + m_sortedRoutes.begin (); i != m_sortedRoutes.end (); ) { // Loop of route cache entry with the route size std::map >::iterator itmp = i; @@ -914,7 +954,7 @@ */ Ipv4Address dst = i->first; std::list rtVector = i->second; - NS_LOG_DEBUG ("The route vector size of1 " << dst << " " << rtVector.size ()); + NS_LOG_DEBUG ("The route vector size of 1 " << dst << " " << rtVector.size()); if (rtVector.size ()) { for (std::list::iterator j = rtVector.begin (); j != rtVector.end (); ) @@ -936,7 +976,7 @@ ++j; } } - NS_LOG_DEBUG ("The route vector size of2 " << dst << " " << rtVector.size ()); + NS_LOG_DEBUG ("The route vector size of 2 " << dst << " " << rtVector.size()); if (rtVector.size ()) { ++i; @@ -965,6 +1005,7 @@ void RouteCache::Print (std::ostream &os) { + NS_LOG_FUNCTION (this); Purge (); os << "\nDSR Route Cache\n" << "Destination\tGateway\t\tInterface\tFlag\tExpire\tHops\n"; @@ -983,14 +1024,14 @@ uint16_t RouteCache::CheckUniqueAckId (Ipv4Address nextHop) { - NS_LOG_DEBUG ("The size of ack id cache " << m_ackIdCache.size ()); + NS_LOG_FUNCTION (this); std::map::const_iterator i = m_ackIdCache.find (nextHop); if (i == m_ackIdCache.end ()) { - NS_LOG_LOGIC ("No Ack id for " << nextHop << " found"); - m_ackIdCache[nextHop] = 0; - return 0; + NS_LOG_LOGIC ("No Ack id for " << nextHop << " found and use id 1 for the first network ack id"); + m_ackIdCache[nextHop] = 1; + return 1; } else { @@ -1015,6 +1056,7 @@ bool RouteCache::IsNeighbor (Ipv4Address addr) { + NS_LOG_FUNCTION (this); PurgeMac (); // purge the mac cache for (std::vector::const_iterator i = m_nb.begin (); i != m_nb.end (); ++i) @@ -1030,6 +1072,7 @@ Time RouteCache::GetExpireTime (Ipv4Address addr) { + NS_LOG_FUNCTION (this); PurgeMac (); for (std::vector::const_iterator i = m_nb.begin (); i != m_nb.end (); ++i) @@ -1045,6 +1088,7 @@ void RouteCache::UpdateNeighbor (std::vector nodeList, Time expire) { + NS_LOG_FUNCTION (this); for (std::vector::iterator i = m_nb.begin (); i != m_nb.end (); ++i) { for (std::vector::iterator j = nodeList.begin (); j != nodeList.end (); ++j) diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-rcache.h --- a/src/dsr/model/dsr-rcache.h Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-rcache.h Sun May 06 20:52:24 2012 -0700 @@ -79,7 +79,6 @@ \endverbatim */ - /** * \ingroup dsr * \brief DSR Route Cache Entry @@ -89,90 +88,37 @@ Ipv4Address m_low; Ipv4Address m_high; Link (Ipv4Address ip1, Ipv4Address ip2) - { - if (ip1 < ip2) - { - m_low = ip1; - m_high = ip2; - } - else - { - m_low = ip2; - m_high = ip1; - } - } + { + if (ip1 < ip2) + { + m_low = ip1; + m_high = ip2; + } + else + { + m_low = ip2; + m_high = ip1; + } + } bool operator < (Link const& L) const - { - if (m_low < L.m_low) - { + { + if (m_low < L.m_low) return true; - } - else if (m_low == L.m_low) - { + else if (m_low == L.m_low) return (m_high < L.m_high); - } - else - { + else return false; - } - } + } void Print () const; }; -class NodeStab -{ -public: - /** - * \brief Constructor - */ - NodeStab (); - /** - * \brief Destructor - */ - virtual ~NodeStab (); - - void SetStabilityIncrFactor (double stabilityIncrFactor) - { - m_stabilityIncrFactor = stabilityIncrFactor; - } - double GetStabilityIncrFactor () const - { - return m_stabilityIncrFactor; - } - void SetStabilityDecrFactor (double stabilityDecrFactor) - { - m_stabilityDecrFactor = stabilityDecrFactor; - } - double GetStabilityDecrFactor () const - { - return m_stabilityDecrFactor; - } - - void IncStability (); - - void DecStability (); - - void SetNodeStability (Time nodeStab) - { - m_nodeStability = nodeStab + Simulator::Now (); - } - Time GetNodeStability () const - { - return m_nodeStability - Simulator::Now (); - } -private: - Time m_nodeStability; - double m_stabilityIncrFactor; - double m_stabilityDecrFactor; -}; - class LinkStab { public: /** * \brief Constructor */ - LinkStab (); + LinkStab (Time linkStab = Simulator::Now ()); /** * \brief Destructor */ @@ -188,6 +134,7 @@ } void Print () const; + private: /* * The link stability lifetime expected, when the time is due, the link expires the expiration happens @@ -196,6 +143,31 @@ Time m_linkStability; }; +class NodeStab +{ +public: + /** + * \brief Constructor + */ +// NodeStab (); + NodeStab (Time nodeStab = Simulator::Now ()); + /** + * \brief Destructor + */ + virtual ~NodeStab (); + + void SetNodeStability (Time nodeStab) + { + m_nodeStability = nodeStab + Simulator::Now (); + } + Time GetNodeStability () const + { + return m_nodeStability - Simulator::Now (); + } +private: + Time m_nodeStability; +}; + class RouteCacheEntry { public: @@ -266,36 +238,37 @@ bool operator== (RouteCacheEntry const & o) const { if (m_path.size () != o.m_path.size ()) - { - NS_ASSERT (false); - return false; - } + { + NS_ASSERT (false); + return false; + } IP_VECTOR::const_iterator j = o.m_path.begin (); for (IP_VECTOR::const_iterator i = m_path.begin (); i != m_path.end (); i++, j++) + { + /* + * Verify if neither the entry are not 0 and they equal to each other + */ + if (((*i) == 0) || ((*j) == 0)) { - /* - * Verify if neither the entry are not 0 and they equal to each other - */ - if (((*i) == 0) || ((*j) == 0)) - { - return false; - } - else if (!((*i) == (*j)) ) - { - return false; - } - else - { - return true; - } + return false; + } + else if (!((*i) == (*j)) ) + { + return false; } + else + { + return true; + } + } return false; } // \} + +private: // / RREP_ACK timer Timer m_ackTimer; -private: // / The destination Ip address Ipv4Address m_dst; // / brief The IP address constructed route @@ -389,43 +362,43 @@ { m_badLinkLifetime = t; } - double GetStabilityDecrFactor () const + uint64_t GetStabilityDecrFactor () const { return m_stabilityDecrFactor; } - void SetStabilityDecrFactor (double decrFactor) + void SetStabilityDecrFactor (uint64_t decrFactor) { m_stabilityDecrFactor = decrFactor; } - double GetStabilityIncrFactor () const + uint64_t GetStabilityIncrFactor () const { return m_stabilityIncrFactor; } - void SetStabilityIncrFactor (double incrFactor) + void SetStabilityIncrFactor (uint64_t incrFactor) { m_stabilityIncrFactor = incrFactor; } - double GetInitStability () const + Time GetInitStability () const { return m_initStability; } - void SetInitStability (double initStability) + void SetInitStability (Time initStability) { m_initStability = initStability; } - double GetMinLifeTime () const + Time GetMinLifeTime () const { return m_minLifeTime; } - void SetMinLifeTime (double minLifeTime) + void SetMinLifeTime (Time minLifeTime) { m_minLifeTime = minLifeTime; } - double GetUseExtends () const + Time GetUseExtends () const { return m_useExtends; } - void SetUseExtends (double useExtends) + void SetUseExtends (Time useExtends) { m_useExtends = useExtends; } @@ -566,11 +539,11 @@ /* * Define the parameters for link cache type */ - double m_stabilityDecrFactor; - double m_stabilityIncrFactor; - double m_initStability; - double m_minLifeTime; - double m_useExtends; + uint64_t m_stabilityDecrFactor; + uint64_t m_stabilityIncrFactor; + Time m_initStability; + Time m_minLifeTime; + Time m_useExtends; /* * Define the route cache data structure */ @@ -587,12 +560,12 @@ bool m_isLinkCache; // / Check if save the sub route entries or not bool m_subRoute; - /* + /** * The link cache to update all the link status, bi-link is two link for link is a struct * when the weight is calculated we normalized them: 100*weight/max of Weight */ #define MAXWEIGHT 0xFFFF; - /* + /** * Current network graph state for this node, double is weight, which is calculated by the node information * and link information, any time some changes of link cache and node cache * change the weight and then recompute the best choice for each node @@ -602,23 +575,27 @@ std::map m_bestRoutesTable_link; std::map m_linkCache; std::map m_nodeCache; - //used by LookupRoute when LinkCache + // used by LookupRoute when LinkCache bool LookupRoute_Link (Ipv4Address id, RouteCacheEntry & rt); + + bool IncStability (Ipv4Address node); + + bool DecStability (Ipv4Address node); + public: /** * \brief dijsktra algorithm to get the best route from m_netGraph and update the m_bestRoutesTable_link * \when current graph information has changed - * */ void SetCacheType (std::string type); bool IsLinkCache (); bool AddRoute_Link (RouteCacheEntry::IP_VECTOR nodelist, Ipv4Address node); - /* - * USE MAXWEIGHT TO REPRESENT MAX; USE BROADCAST ADDRESS TO REPRESENT NULL PRECEEDING ADDRESS + /** + * \brief USE MAXWEIGHT TO REPRESENT MAX; USE BROADCAST ADDRESS TO REPRESENT NULL PRECEEDING ADDRESS */ void RebuildBestRouteTable (Ipv4Address source); void PurgeLinkNode (); - /* + /** * When a link from the Route Cache is used in routing a packet originated or salvaged * by that node, the stability metric for each of the two endpoint nodes of that link is incremented by the * amount of time since that link was last used. When a link is used in a route chosen for a packet originated or @@ -630,7 +607,7 @@ */ void UpdateNetGraph (); //--------------------------------------------------------------------------------------- - /* + /** * The following code handles link-layer acks */ // / link failure callback diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-routing.cc --- a/src/dsr/model/dsr-routing.cc Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-routing.cc Sun May 06 20:52:24 2012 -0700 @@ -39,11 +39,17 @@ #include #include +#include "ns3/enum.h" #include "ns3/string.h" #include "ns3/ptr.h" #include "ns3/log.h" #include "ns3/assert.h" #include "ns3/uinteger.h" +#include "ns3/packet.h" +#include "ns3/boolean.h" +#include "ns3/node-list.h" +#include "ns3/double.h" +#include "ns3/pointer.h" #include "ns3/object-vector.h" #include "ns3/ipv4-address.h" #include "ns3/ipv4-header.h" @@ -53,17 +59,12 @@ #include "ns3/trace-source-accessor.h" #include "ns3/random-variable.h" #include "ns3/icmpv4-l4-protocol.h" -#include "ns3/pointer.h" #include "ns3/adhoc-wifi-mac.h" #include "ns3/wifi-net-device.h" -#include "ns3/packet.h" -#include "ns3/boolean.h" #include "ns3/inet-socket-address.h" #include "ns3/udp-l4-protocol.h" #include "ns3/udp-socket-factory.h" #include "ns3/tcp-socket-factory.h" -#include "ns3/node-list.h" -#include "ns3/double.h" #include "dsr-rreq-table.h" #include "dsr-rcache.h" @@ -138,20 +139,16 @@ TimeValue (Seconds (300)), MakeTimeAccessor (&DsrRouting::m_maxCacheTime), MakeTimeChecker ()) - .AddAttribute ("RreqEntryTimeout","Maximum time for the route request entry to time out.", - TimeValue (Seconds (30)), - MakeTimeAccessor (&DsrRouting::m_maxRreqTime), - MakeTimeChecker ()) .AddAttribute ("MaxEntriesEachDst","Maximum number of route entries for a single destination to respond.", UintegerValue (20), MakeUintegerAccessor (&DsrRouting::m_maxEntriesEachDst), MakeUintegerChecker ()) .AddAttribute ("SendBuffInterval","How often to check send buffer for packet with route.", - TimeValue (Seconds (50)), + TimeValue (Seconds (500)), MakeTimeAccessor (&DsrRouting::m_sendBuffInterval), MakeTimeChecker ()) .AddAttribute ("NodeTraversalTime","The time it takes to traverse two neighboring nodes.", - TimeValue (MicroSeconds (2)), + TimeValue (MilliSeconds (40)), MakeTimeAccessor (&DsrRouting::m_nodeTraversalTime), MakeTimeChecker ()) .AddAttribute ("RreqRetries","Maximum number of retransmissions for request discovery of a route.", @@ -159,9 +156,9 @@ MakeUintegerAccessor (&DsrRouting::m_rreqRetries), MakeUintegerChecker ()) .AddAttribute ("MaintenanceRetries","Maximum number of retransmissions for data packets from maintenance buffer.", - UintegerValue (3), - MakeUintegerAccessor (&DsrRouting::m_maxMaintRexmt), - MakeUintegerChecker ()) + DoubleValue (2), + MakeDoubleAccessor (&DsrRouting::m_maxMaintRexmt), + MakeDoubleChecker ()) .AddAttribute ("RequestTableSize","Maximum number of request entries in the request table.", UintegerValue (64), MakeUintegerAccessor (&DsrRouting::m_requestTableSize), @@ -169,7 +166,7 @@ .AddAttribute ("RequestIdSize","Maximum number of request source Ids in the request table.", UintegerValue (16), MakeUintegerAccessor (&DsrRouting::m_requestTableIds), - MakeUintegerChecker ()) + MakeUintegerChecker ()) .AddAttribute ("UniqueRequestIdSize","Maximum number of request Ids in the request table for a single destination.", UintegerValue (256), MakeUintegerAccessor (&DsrRouting::m_maxRreqId), @@ -179,9 +176,9 @@ MakeTimeAccessor (&DsrRouting::m_nonpropRequestTimeout), MakeTimeChecker ()) .AddAttribute ("DiscoveryHopLimit","The max discovery hop limit for route requests.", - UintegerValue (255), - MakeUintegerAccessor (&DsrRouting::m_discoveryHopLimit), - MakeUintegerChecker ()) + DoubleValue (255), + MakeDoubleAccessor (&DsrRouting::m_discoveryHopLimit), + MakeDoubleChecker ()) .AddAttribute ("MaxSalvageCount","The max salvage count for a single data packet.", UintegerValue (15), MakeUintegerAccessor (&DsrRouting::m_maxSalvageCount), @@ -199,7 +196,7 @@ MakeUintegerAccessor (&DsrRouting::m_broadcastJitter), MakeUintegerChecker ()) .AddAttribute ("PassiveAckTimeout","The time a packet in maintenance buffer wait for passive acknowledgment.", - TimeValue (MicroSeconds (4)), + TimeValue (MilliSeconds (100)), MakeTimeAccessor (&DsrRouting::m_passiveAckTimeout), MakeTimeChecker ()) .AddAttribute ("TryPassiveAcks","The number of passive acknowledgment to use.", @@ -223,29 +220,45 @@ MakeStringAccessor (&DsrRouting::m_cacheType), MakeStringChecker ()) .AddAttribute ("StabilityDecrFactor","The stability decrease factor for link cache", - DoubleValue (2.0), - MakeDoubleAccessor (&DsrRouting::m_stabilityDecrFactor), - MakeDoubleChecker ()) + UintegerValue (2), + MakeUintegerAccessor (&DsrRouting::m_stabilityDecrFactor), + MakeUintegerChecker ()) .AddAttribute ("StabilityIncrFactor","The stability increase factor for link cache", - DoubleValue (4.0), - MakeDoubleAccessor (&DsrRouting::m_stabilityIncrFactor), - MakeDoubleChecker ()) + UintegerValue (4), + MakeUintegerAccessor (&DsrRouting::m_stabilityIncrFactor), + MakeUintegerChecker ()) .AddAttribute ("InitStability","The initial stability factor for link cache", - DoubleValue (25.0), - MakeDoubleAccessor (&DsrRouting::m_initStability), - MakeDoubleChecker ()) + TimeValue (Seconds (25)), + MakeTimeAccessor (&DsrRouting::m_initStability), + MakeTimeChecker ()) .AddAttribute ("MinLifeTime","The minimal life time for link cache", - DoubleValue (1.0), - MakeDoubleAccessor (&DsrRouting::m_minLifeTime), - MakeDoubleChecker ()) + TimeValue (Seconds (1)), + MakeTimeAccessor (&DsrRouting::m_minLifeTime), + MakeTimeChecker ()) .AddAttribute ("UseExtends","The extension time for link cache", - DoubleValue (120.0), - MakeDoubleAccessor (&DsrRouting::m_useExtends), - MakeDoubleChecker ()) + TimeValue (Seconds (120)), + MakeTimeAccessor (&DsrRouting::m_useExtends), + MakeTimeChecker ()) .AddAttribute ("EnableSubRoute","Enables saving of sub route when receiving route error messages, only available when using path route cache", BooleanValue (true), MakeBooleanAccessor (&DsrRouting::m_subRoute), MakeBooleanChecker ()) + .AddAttribute ("RetransIncr","The increase time for retransmission timer when facing network congestion", + TimeValue (MilliSeconds (20)), + MakeTimeAccessor (&DsrRouting::m_retransIncr), + MakeTimeChecker ()) + .AddAttribute ("MaxNetworkQueueSize","The max number of packet to save in the network queue.", + UintegerValue (400), + MakeUintegerAccessor (&DsrRouting::m_maxNetworkSize), + MakeUintegerChecker ()) + .AddAttribute ("MaxNetworkQueueDelay","The max time for a packet to stay in the network queue.", + TimeValue (Seconds (30.0)), + MakeTimeAccessor (&DsrRouting::m_maxNetworkDelay), + MakeTimeChecker ()) + .AddAttribute ("NumPriorityQueues","The max number of packet to save in the network queue.", + UintegerValue (2), + MakeUintegerAccessor (&DsrRouting::m_numPriorityQueues), + MakeUintegerChecker ()) .AddTraceSource ("Tx", "Send DSR packet.", MakeTraceSourceAccessor (&DsrRouting::m_txPacketTrace)) .AddTraceSource ("Drop", "Drop DSR packet", @@ -283,7 +296,7 @@ // Check the send buffer for sending packets m_sendBuffTimer.SetFunction (&DsrRouting::SendBuffTimerExpire, this); - m_sendBuffTimer.Schedule (Seconds (0)); + m_sendBuffTimer.Schedule (Seconds (100)); } DsrRouting::~DsrRouting () @@ -322,6 +335,24 @@ void DsrRouting::Start () { NS_LOG_FUNCTION (this << "Start DSR Routing protocol"); + Ptr routeCache = CreateObject (); + // Configure the path cache parameters + routeCache->SetCacheType (m_cacheType); + routeCache->SetSubRoute (m_subRoute); + routeCache->SetMaxCacheLen (m_maxCacheLen); + routeCache->SetCacheTimeout (m_maxCacheTime); + routeCache->SetMaxEntriesEachDst (m_maxEntriesEachDst); + // Parameters for link cache + routeCache->SetStabilityDecrFactor (m_stabilityDecrFactor); + routeCache->SetStabilityIncrFactor (m_stabilityIncrFactor); + routeCache->SetInitStability (m_initStability); + routeCache->SetMinLifeTime (m_minLifeTime); + routeCache->SetUseExtends (m_useExtends); + routeCache->ScheduleTimer (); + // The call back to handle link error and send error message to appropriate nodes + routeCache->SetCallback (MakeCallback (&DsrRouting::SendRerrWhenBreaksLinkToNextHop, this)); + SetRouteCache (routeCache); + if (m_mainAddress == Ipv4Address ()) { Ipv4Address loopback ("127.0.0.1"); @@ -329,7 +360,7 @@ { // Use primary address, if multiple Ipv4Address addr = m_ipv4->GetAddress (i, 0).GetLocal (); - m_broadcast = m_ipv4->GetAddress (i, 0).GetBroadcast (); + m_broadcast = m_ipv4->GetAddress (i, 0).GetBroadcast(); NS_LOG_DEBUG ("The addr " << addr); if (addr != loopback) { @@ -352,47 +383,70 @@ } // trace back to link mac drop event to process tx error call back - mac->TraceConnectWithoutContext ("TxErrHeader", m_routeCache->GetTxErrorCallback ()); - m_routeCache->AddArpCache (m_ipv4->GetInterface (i)->GetArpCache ()); + mac->TraceConnectWithoutContext ("TxErrHeader", routeCache->GetTxErrorCallback ()); + routeCache->AddArpCache (m_ipv4->GetInterface (i)->GetArpCache ()); break; } } + NS_ASSERT (m_mainAddress != Ipv4Address () && m_broadcast != Ipv4Address()); } + NS_LOG_DEBUG ("The number queues " << m_numPriorityQueues); + for (uint32_t i = 0; i < m_numPriorityQueues; i++) + { + // Set the network queue max size and the delay + NS_LOG_DEBUG ("The network size " << m_maxNetworkSize << " and the network delay " << m_maxNetworkDelay.GetSeconds()); + Ptr queue_i = CreateObject (m_maxNetworkSize,m_maxNetworkDelay); + std::pair >::iterator, bool> result_i = m_priorityQueue.insert (std::make_pair (i, queue_i)); + NS_ASSERT_MSG (result_i.second, "Error in creating queues"); + } + Ptr rreqTable = CreateObject (); // Set the initial hop limit - m_rreqTable->SetInitHopLimit (m_discoveryHopLimit); + rreqTable->SetInitHopLimit (m_discoveryHopLimit); // Configure the request table parameters - m_rreqTable->SetRreqTableSize (m_requestTableSize); - m_rreqTable->SetRreqIdSize (m_requestTableIds); - m_rreqTable->SetUniqueRreqIdSize (m_maxRreqId); - m_rreqTable->SetRreqExpire (m_maxRreqTime); + rreqTable->SetRreqTableSize (m_requestTableSize); + rreqTable->SetRreqIdSize (m_requestTableIds); + rreqTable->SetUniqueRreqIdSize (m_maxRreqId); + SetRequestTable (rreqTable); // Set the send buffer parameters m_sendBuffer.SetMaxQueueLen (m_maxSendBuffLen); m_sendBuffer.SetSendBufferTimeout (m_sendBufferTimeout); + // Set the error buffer parameters using just the send buffer parameters + m_errorBuffer.SetMaxQueueLen (m_maxSendBuffLen); + m_errorBuffer.SetErrorBufferTimeout (m_sendBufferTimeout); // Set the maintenance buffer parameters m_maintainBuffer.SetMaxQueueLen (m_maxMaintainLen); m_maintainBuffer.SetMaintainBufferTimeout (m_maxMaintainTime); // Set the gratuitous reply table size m_graReply.SetGraTableSize (m_graReplyTableSize); - // Configure the path cache parameters - m_routeCache->SetCacheType (m_cacheType); - m_routeCache->SetSubRoute (m_subRoute); - m_routeCache->SetMaxCacheLen (m_maxCacheLen); - m_routeCache->SetCacheTimeout (m_maxCacheTime); - m_routeCache->SetMaxEntriesEachDst (m_maxEntriesEachDst); - // parameters for link cache - m_routeCache->SetStabilityDecrFactor (m_stabilityDecrFactor); - m_routeCache->SetStabilityIncrFactor (m_stabilityIncrFactor); - m_routeCache->SetInitStability (m_initStability); - m_routeCache->SetMinLifeTime (m_minLifeTime); - m_routeCache->SetUseExtends (m_useExtends); - m_routeCache->ScheduleTimer (); - // The call back to handle link error and send error message to appropriate nodes - m_routeCache->SetCallback (MakeCallback (&DsrRouting::SendRerrWhenBreaksLinkToNextHop, this)); NS_LOG_DEBUG ("Starting DSR on node " << m_mainAddress); } void +DsrRouting::DoDispose (void) +{ + NS_LOG_FUNCTION_NOARGS (); + m_node = 0; + for (uint32_t i = 0; i < m_ipv4->GetNInterfaces (); i++) + { + // Disable layer 2 link state monitoring (if possible) + Ptr dev = m_ipv4->GetNetDevice (i); + Ptr wifi = dev->GetObject (); + if (wifi != 0) + { + Ptr mac = wifi->GetMac ()->GetObject (); + if (mac != 0) + { + mac->TraceDisconnectWithoutContext ("TxErrHeader", + m_routeCache->GetTxErrorCallback ()); + m_routeCache->DelArpCache (m_ipv4->GetInterface (i)->GetArpCache ()); + } + } + } + Ipv4L4Protocol::DoDispose (); +} + +void DsrRouting::SetNode (Ptr node) { m_node = node; @@ -431,9 +485,50 @@ return m_rreqTable; } +bool DsrRouting::IsLinkCache () +{ + return m_routeCache->IsLinkCache (); +} + +void DsrRouting::UseExtends (RouteCacheEntry::IP_VECTOR rt) +{ + m_routeCache->UseExtends (rt); +} + +bool DsrRouting::LookupRoute (Ipv4Address id, RouteCacheEntry & rt) +{ + return m_routeCache->LookupRoute (id, rt); +} + +bool DsrRouting::AddRoute_Link (RouteCacheEntry::IP_VECTOR nodelist, Ipv4Address source) +{ + Ipv4Address nextHop = SearchNextHop (source, nodelist); + m_errorBuffer.DropPacketForErrLink (source, nextHop); + return m_routeCache->AddRoute_Link (nodelist, source); +} + +bool DsrRouting::AddRoute (RouteCacheEntry & rt) +{ + std::vector nodelist = rt.GetVector (); + Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodelist); + m_errorBuffer.DropPacketForErrLink (m_mainAddress, nextHop); + return m_routeCache->AddRoute (rt); +} + +void DsrRouting::DeleteAllRoutesIncludeLink (Ipv4Address errorSrc, Ipv4Address unreachNode, Ipv4Address node) +{ + m_routeCache->DeleteAllRoutesIncludeLink (errorSrc, unreachNode, node); +} + +bool DsrRouting::UpdateRouteEntry (Ipv4Address dst) +{ + return m_routeCache->UpdateRouteEntry (dst); +} + Ipv4Address DsrRouting::GetIPfromMAC (Mac48Address address) { + NS_LOG_FUNCTION (this << address); int32_t nNodes = NodeList::GetNNodes (); for (int32_t i = 0; i < nNodes; ++i) { @@ -451,6 +546,7 @@ void DsrRouting::PrintVector (std::vector& vec) { + NS_LOG_FUNCTION (this); /* * Check elements in a route vector */ @@ -470,7 +566,9 @@ Ipv4Address DsrRouting::SearchNextHop (Ipv4Address ipv4Address, std::vector& vec) { + NS_LOG_FUNCTION (this << ipv4Address); Ipv4Address nextHop; + NS_LOG_DEBUG ("the vector size " << vec.size ()); if (vec.size () == 2) { NS_LOG_DEBUG ("The two nodes are neighbors"); @@ -484,10 +582,11 @@ NS_LOG_DEBUG ("We have reached to the final destination " << ipv4Address << " " << vec.back ()); return ipv4Address; } - for (std::vector::iterator i = vec.begin (); i != vec.end (); ++i) + for (std::vector::const_iterator i = vec.begin (); i != vec.end (); ++i) { if (ipv4Address == (*i)) { + NS_LOG_DEBUG (ipv4Address << " and " << *i); nextHop = *(++i); return nextHop; } @@ -509,21 +608,6 @@ return m_ipv4Route; } -void -DsrRouting::CutRoute (Ipv4Address ourAdd, std::vector& nodeList) -{ - NS_LOG_FUNCTION (this << ourAdd); - std::vector newRoute = nodeList; - nodeList.clear (); - - std::vector::iterator it = find (newRoute.begin (), newRoute.end (), ourAdd); - - for (std::vector::iterator i = it; i != newRoute.end (); ++i) - { - nodeList.push_back (*i); - } -} - int DsrRouting::GetProtocolNumber (void) const { @@ -531,15 +615,7 @@ return PROT_NUMBER; } -void -DsrRouting::DoDispose (void) -{ - NS_LOG_FUNCTION_NOARGS (); - m_node = 0; - Ipv4L4Protocol::DoDispose (); -} - -uint32_t +uint16_t DsrRouting::GetIDfromIP (Ipv4Address address) { int32_t nNodes = NodeList::GetNNodes (); @@ -549,28 +625,41 @@ Ptr ipv4 = node->GetObject (); if (ipv4->GetAddress (1, 0).GetLocal () == address) { - return i; + return uint16_t(i); } } - return 255; + return 256; } Ipv4Address -DsrRouting::GetIPfromID (uint32_t id) +DsrRouting::GetIPfromID (uint16_t id) { - if (id >= 255) + if (id >= 256) { NS_LOG_DEBUG ("Exceed the node range"); return "0.0.0.0"; } else { - Ptr node = NodeList::GetNode (id); + Ptr node = NodeList::GetNode (uint32_t (id)); Ptr ipv4 = node->GetObject (); return ipv4->GetAddress (1, 0).GetLocal (); } } +uint32_t +DsrRouting::GetPriority (DsrMessageType messageType) +{ + if (messageType == DSR_CONTROL_PACKET) + { + return 0; + } + else + { + return 1; + } +} + void DsrRouting::SendRerrWhenBreaksLinkToNextHop (Ipv4Address nextHop, uint8_t protocol) { NS_LOG_FUNCTION (this << nextHop << (uint32_t)protocol); @@ -585,7 +674,7 @@ NS_LOG_DEBUG ("creating new packet"); /* * Copy the packet and save a copy to the send buffer. - * For some reason, when queue the original packet to the buffer, + * if only queue the original packet to the buffer, * when dequeue the packet, it turns to be empty. */ Ptr dequeP = ConstCast (entry.GetPacket ()); @@ -595,8 +684,12 @@ Ipv4Address source = entry.GetSrc (); Ipv4Address destination = entry.GetDst (); + // Send the data packet out before schedule the next packet transmission + SendPacket (dequeP, source, nextHop, protocol); + DsrRoutingHeader dsrRoutingHeader; p->RemoveHeader (dsrRoutingHeader); + Ptr cleanP = p->Copy (); uint8_t offset = dsrRoutingHeader.GetDsrOptionsOffset (); newPacket->RemoveAtStart (offset); @@ -610,17 +703,19 @@ newPacket->RemoveHeader (sourceRoute); uint8_t salvage = sourceRoute.GetSalvage (); + // TODO DsrOptionAckReqHeader ackReq; newPacket->RemoveHeader (ackReq); /* * Get the node list address */ std::vector nodeList = sourceRoute.GetNodesAddress (); - Ipv4Address address1 = nodeList.front (); + Ipv4Address address1 = nodeList[1]; Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodeList); NS_LOG_DEBUG ("The next hop address" << nextHop); if (nextHop == "0.0.0.0") { + PacketNewRoute (cleanP, m_mainAddress, destination, protocol); return; } RouteCacheEntry salvageRoute; @@ -639,14 +734,32 @@ { m_routeCache->UseExtends (nodeList); } - PacketKey packetKey; - packetKey.m_ackId = entry.GetAckId (); - packetKey.m_ourAdd = entry.GetOurAdd (); - packetKey.m_nextHop = entry.GetNextHop (); - packetKey.m_source = entry.GetSrc (); - packetKey.m_destination = entry.GetDst (); - packetKey.m_segsLeft = entry.GetSegsLeft (); - SchedulePacketRetry (entry, packetKey, protocol); + + NetworkKey networkKey; + networkKey.m_ackId = entry.GetAckId (); + networkKey.m_ourAdd = entry.GetOurAdd (); + networkKey.m_nextHop = entry.GetNextHop (); + networkKey.m_source = entry.GetSrc (); + networkKey.m_destination = entry.GetDst (); + + PassiveKey passiveKey; + passiveKey.m_ackId = 0; + passiveKey.m_source = entry.GetSrc (); + passiveKey.m_destination = entry.GetDst (); + passiveKey.m_segsLeft = entry.GetSegsLeft (); + + m_addressForwardCnt[networkKey] = 0; + m_passiveCnt[passiveKey] = 0; + + if (nextHop != destination) + { + SchedulePassivePacketRetry (entry, false, protocol); + } + else + { + // This is the first network retry + ScheduleNetworkPacketRetry (entry, true, protocol); + } } else { @@ -654,45 +767,24 @@ * This code block create a packet and attach a route error option to it */ m_routeCache->DeleteAllRoutesIncludeLink (source, nextHop, m_mainAddress); - /* * If the salvage is not 0, use the first address in the route as the error dst in error header * otherwise use the source of packet as the error destination */ + Ipv4Address errorDst; if (salvage) { - if (address1 == m_mainAddress) - { - DsrOptionRerrUnreachHeader rerr; - rerr.SetErrorType (1); - rerr.SetErrorSrc (address1); - rerr.SetUnreachNode (nextHop); - rerr.SetErrorDst (address1); - rerr.SetSalvage (salvage); // Set the value about whether to salvage a packet or not - SendErrorRequest (rerr, protocol); - } - else - { - SendUnreachError (nextHop, address1, salvage, protocol); - } + errorDst = address1; } else { - if (source == m_mainAddress) - { - DsrOptionRerrUnreachHeader rerr; - rerr.SetErrorType (1); - rerr.SetErrorSrc (source); - rerr.SetUnreachNode (nextHop); - rerr.SetErrorDst (source); - rerr.SetSalvage (salvage); // Set the value about whether to salvage a packet or not - SendErrorRequest (rerr, protocol); - } - else - { - SendUnreachError (nextHop, source, salvage, protocol); - } + errorDst = source; } + SendUnreachError (nextHop, errorDst, destination, salvage, protocol); + /* + * here we cancel the packet retransmission time for all the packets have next hop address + * as nextHop + */ } if (m_maintainBuffer.GetSize () != 0 && m_maintainBuffer.Find (nextHop)) { @@ -735,6 +827,8 @@ DsrRoutingHeader dsrRoutingHeader; Ptr copyP = packet->Copy (); + Ptr dsrPacket = packet->Copy (); + dsrPacket->RemoveHeader (dsrRoutingHeader); uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset (); copyP->RemoveAtStart (offset); // Here the processed size is 8 bytes, which is the fixed sized extension header // The packet to get ipv4 header @@ -782,6 +876,7 @@ if (nextHop == "0.0.0.0") { + PacketNewRoute (dsrPacket, m_mainAddress, destination, protocol); return; } @@ -791,7 +886,7 @@ dsrRoutingHeader.SetMessageType (1); dsrRoutingHeader.SetSourceId (GetIDfromIP (m_mainAddress)); dsrRoutingHeader.SetDestId (255); - dsrRoutingHeader.SetPayloadLength (length + 4); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 4); dsrRoutingHeader.AddDsrOption (newUnreach); dsrRoutingHeader.AddDsrOption (sourceRoute); @@ -799,7 +894,22 @@ newPacket->AddHeader (dsrRoutingHeader); // Add the routing header with rerr and sourceRoute attached to it Ptr dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress)); m_ipv4Route->SetOutputDevice (dev); - m_downTarget (newPacket, m_mainAddress, nextHop, GetProtocolNumber (), m_ipv4Route); + + uint32_t priority = GetPriority (DSR_CONTROL_PACKET); + std::map >::iterator i = m_priorityQueue.find (priority); + Ptr dsrNetworkQueue = i->second; + NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority); + + DsrNetworkQueueEntry newEntry (newPacket, m_mainAddress, nextHop, Simulator::Now (), m_ipv4Route); + + if (dsrNetworkQueue->Enqueue (newEntry)) + { + Scheduler (priority); + } + else + { + NS_LOG_INFO ("Packet dropped as dsr network queue is full"); + } } } else @@ -814,7 +924,7 @@ Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodeList); // Get the next hop address for the route if (nextHop == "0.0.0.0") { - PacketNewRoute (cleanP, m_mainAddress, destination, protocol); + PacketNewRoute (dsrPacket, m_mainAddress, destination, protocol); return; } uint8_t salvage = 0; @@ -822,43 +932,52 @@ sourceRoute.SetSegmentsLeft ((nodeList.size () - 2)); // The segmentsLeft field will indicate the hops to go sourceRoute.SetSalvage (salvage); - DsrOptionAckReqHeader ackReq; - m_ackId = m_routeCache->CheckUniqueAckId (nextHop); - ackReq.SetAckId (m_ackId); - - uint8_t length = (sourceRoute.GetLength () + ackReq.GetLength ()); - NS_LOG_DEBUG ("the length of source route header " << (uint32_t)(sourceRoute.GetLength ())); - NS_LOG_DEBUG ("the length of ack request header " << (uint32_t)(ackReq.GetLength ())); - - dsrRoutingHeader.SetPayloadLength (length + 4); + uint8_t length = sourceRoute.GetLength (); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2); dsrRoutingHeader.AddDsrOption (sourceRoute); - dsrRoutingHeader.AddDsrOption (ackReq); cleanP->AddHeader (dsrRoutingHeader); + // Send the data packet out before schedule the next packet transmission + SendPacket (cleanP, m_mainAddress, nextHop, protocol); Ptr mtP = cleanP->Copy (); // Put the data packet in the maintenance queue for data packet retransmission MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*Ipv4Address=*/ m_mainAddress, /*nextHop=*/ nextHop, - /*source=*/ m_mainAddress, /*destination=*/ destination, /*ackId=*/ m_ackId, - /*SegsLeft=*/ nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime); + /*source=*/ m_mainAddress, /*destination=*/ destination, /*ackId=*/ 0, + /*SegsLeft=*/nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime); bool result = m_maintainBuffer.Enqueue (newEntry); // Enqueue the packet the the maintenance buffer if (result) { - Ptr newPacket = cleanP->Copy (); - PacketKey packetKey; - packetKey.m_ackId = newEntry.GetAckId (); - packetKey.m_ourAdd = newEntry.GetOurAdd (); - packetKey.m_nextHop = newEntry.GetNextHop (); - packetKey.m_source = newEntry.GetSrc (); - packetKey.m_destination = newEntry.GetDst (); - packetKey.m_segsLeft = newEntry.GetSegsLeft (); - SchedulePacketRetry (newEntry, packetKey, protocol); + NetworkKey networkKey; + networkKey.m_ackId = newEntry.GetAckId (); + networkKey.m_ourAdd = newEntry.GetOurAdd (); + networkKey.m_nextHop = newEntry.GetNextHop (); + networkKey.m_source = newEntry.GetSrc (); + networkKey.m_destination = newEntry.GetDst (); + + PassiveKey passiveKey; + passiveKey.m_ackId = 0; + passiveKey.m_source = newEntry.GetSrc (); + passiveKey.m_destination = newEntry.GetDst (); + passiveKey.m_segsLeft = newEntry.GetSegsLeft (); + + m_addressForwardCnt[networkKey] = 0; + m_passiveCnt[passiveKey] = 0; + if (nextHop != destination) + { + SchedulePassivePacketRetry (newEntry, false, protocol); + } + else + { + // This is the first network retry + ScheduleNetworkPacketRetry (newEntry, true, protocol); + } } - //we need to suspend the normal timer that checks the send buffer - //until we are done sending packets + // we need to suspend the normal timer that checks the send buffer + // until we are done sending packets if (!m_sendBuffTimer.IsSuspended ()) { m_sendBuffTimer.Suspend (); } - Simulator::Schedule (m_sendBuffInterval, &DsrRouting::CheckSendBuffer, this); + Simulator::Schedule (m_sendBuffInterval, &DsrRouting::SendBuffTimerExpire, this); return; } } @@ -996,41 +1115,54 @@ sourceRoute.SetSegmentsLeft ((nodeList.size () - 2)); // The segmentsLeft field will indicate the hops to go sourceRoute.SetSalvage (salvage); - DsrOptionAckReqHeader ackReq; - m_ackId = m_routeCache->CheckUniqueAckId (nextHop); - ackReq.SetAckId (m_ackId); - - uint8_t length = (sourceRoute.GetLength () + ackReq.GetLength ()); - dsrRoutingHeader.SetPayloadLength (length + 4); + uint8_t length = sourceRoute.GetLength (); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2); dsrRoutingHeader.AddDsrOption (sourceRoute); - dsrRoutingHeader.AddDsrOption (ackReq); cleanP->AddHeader (dsrRoutingHeader); + // Send the data packet out before schedule the next packet transmission + SendPacket (cleanP, source, nextHop, protocol); Ptr mtP = cleanP->Copy (); SetRoute (nextHop, m_mainAddress); // Put the data packet in the maintenance queue for data packet retransmission MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*Ipv4Address=*/ m_mainAddress, /*nextHop=*/ nextHop, - /*source=*/ source, /*destination=*/ destination, /*ackId=*/ m_ackId, - /*SegsLeft=*/ nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime); + /*source=*/ source, /*destination=*/ destination, /*ackId=*/ 0, + /*SegsLeft=*/nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime); bool result = m_maintainBuffer.Enqueue (newEntry); // Enqueue the packet the the maintenance buffer if (result) { - PacketKey packetKey; - packetKey.m_ackId = newEntry.GetAckId (); - packetKey.m_ourAdd = newEntry.GetOurAdd (); - packetKey.m_nextHop = newEntry.GetNextHop (); - packetKey.m_source = newEntry.GetSrc (); - packetKey.m_destination = newEntry.GetDst (); - packetKey.m_segsLeft = newEntry.GetSegsLeft (); - SchedulePacketRetry (newEntry, packetKey, protocol); + NetworkKey networkKey; + networkKey.m_ackId = newEntry.GetAckId (); + networkKey.m_ourAdd = newEntry.GetOurAdd (); + networkKey.m_nextHop = newEntry.GetNextHop (); + networkKey.m_source = newEntry.GetSrc (); + networkKey.m_destination = newEntry.GetDst (); + + PassiveKey passiveKey; + passiveKey.m_ackId = 0; + passiveKey.m_source = newEntry.GetSrc (); + passiveKey.m_destination = newEntry.GetDst (); + passiveKey.m_segsLeft = newEntry.GetSegsLeft (); + + m_addressForwardCnt[networkKey] = 0; + m_passiveCnt[passiveKey] = 0; + if (nextHop != destination) + { + SchedulePassivePacketRetry (newEntry, false, protocol); + } + else + { + // This is the first network retry + ScheduleNetworkPacketRetry (newEntry, true, protocol); + } } } } void -DsrRouting::SendUnreachError (Ipv4Address errorHop, Ipv4Address destination, uint8_t salvage, uint8_t protocol) +DsrRouting::SendUnreachError (Ipv4Address errorHop, Ipv4Address destination, Ipv4Address originalDst, uint8_t salvage, uint8_t protocol) { - NS_LOG_FUNCTION (this << errorHop << destination << (uint32_t)salvage << (uint32_t)protocol); + NS_LOG_FUNCTION (this << errorHop << destination << originalDst << (uint32_t)salvage << (uint32_t)protocol); DsrRoutingHeader dsrRoutingHeader; dsrRoutingHeader.SetNextHeader (protocol); dsrRoutingHeader.SetMessageType (1); @@ -1042,12 +1174,14 @@ rerrUnreachHeader.SetErrorSrc (m_mainAddress); rerrUnreachHeader.SetUnreachNode (errorHop); rerrUnreachHeader.SetErrorDst (destination); - rerrUnreachHeader.SetSalvage (salvage); // Set the value about whether to salvage a packet or not + rerrUnreachHeader.SetOriginalDst (originalDst); + rerrUnreachHeader.SetSalvage (salvage); // Set the value about whether to salvage a packet or not uint8_t rerrLength = rerrUnreachHeader.GetLength (); RouteCacheEntry toDst; bool findRoute = m_routeCache->LookupRoute (destination, toDst); // Queue the packet if there is no route pre-existing + Ptr newPacket = Create (); if (!findRoute) { NS_LOG_INFO (Simulator::Now ().GetSeconds () @@ -1055,12 +1189,11 @@ dsrRoutingHeader.SetPayloadLength (rerrLength + 2); dsrRoutingHeader.AddDsrOption (rerrUnreachHeader); - Ptr newPacket = Create (); newPacket->AddHeader (dsrRoutingHeader); Ptr p = newPacket->Copy (); - SendBuffEntry newEntry (p, destination, m_sendBufferTimeout); - newEntry.SetErrHeader (true); // Note it as an error packet - bool result = m_sendBuffer.Enqueue (newEntry); // Enqueue the packet in send buffer + // Save the error packet in the error buffer + ErrorBuffEntry newEntry (p, destination, m_mainAddress, errorHop, m_sendBufferTimeout, protocol); + bool result = m_errorBuffer.Enqueue (newEntry); // Enqueue the packet in send buffer if (result) { NS_LOG_INFO (Simulator::Now ().GetSeconds () @@ -1082,6 +1215,8 @@ Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodeList); if (nextHop == "0.0.0.0") { + NS_LOG_DEBUG ("The route is not right"); + PacketNewRoute (newPacket, m_mainAddress, destination, protocol); return; } DsrOptionSRHeader sourceRoute; @@ -1094,17 +1229,31 @@ uint8_t srLength = sourceRoute.GetLength (); uint8_t length = (srLength + rerrLength); - dsrRoutingHeader.SetNextHeader (protocol); - dsrRoutingHeader.SetPayloadLength (length + 4); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 4); dsrRoutingHeader.AddDsrOption (rerrUnreachHeader); dsrRoutingHeader.AddDsrOption (sourceRoute); - Ptr newPacket = Create (); newPacket->AddHeader (dsrRoutingHeader); SetRoute (nextHop, m_mainAddress); Ptr dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress)); m_ipv4Route->SetOutputDevice (dev); - m_downTarget (newPacket, m_mainAddress, nextHop, protocol, m_ipv4Route); + NS_LOG_INFO ("Send the packet to the next hop address " << nextHop << " from " << m_mainAddress << " with the size " << newPacket->GetSize()); + + uint32_t priority = GetPriority (DSR_CONTROL_PACKET); + std::map >::iterator i = m_priorityQueue.find (priority); + Ptr dsrNetworkQueue = i->second; + NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority); + + DsrNetworkQueueEntry newEntry (newPacket, m_mainAddress, nextHop, Simulator::Now (), m_ipv4Route); + + if (dsrNetworkQueue->Enqueue (newEntry)) + { + Scheduler (priority); + } + else + { + NS_LOG_INFO ("Packet dropped as dsr network queue is full"); + } } } @@ -1124,14 +1273,29 @@ dsrRoutingHeader.SetDestId (GetIDfromIP (rerr.GetErrorDst ())); uint8_t length = (sourceRoute.GetLength () + rerr.GetLength ()); - dsrRoutingHeader.SetPayloadLength (length + 4); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 4); dsrRoutingHeader.AddDsrOption (rerr); dsrRoutingHeader.AddDsrOption (sourceRoute); Ptr packet = Create (); packet->AddHeader (dsrRoutingHeader); Ptr dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress)); route->SetOutputDevice (dev); - m_downTarget (packet, m_mainAddress, nextHop, GetProtocolNumber (), route); + + uint32_t priority = GetPriority (DSR_CONTROL_PACKET); + std::map >::iterator i = m_priorityQueue.find (priority); + Ptr dsrNetworkQueue = i->second; + NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority); + + DsrNetworkQueueEntry newEntry (packet, m_mainAddress, nextHop, Simulator::Now (), route); + + if (dsrNetworkQueue->Enqueue (newEntry)) + { + Scheduler (priority); + } + else + { + NS_LOG_INFO ("Packet dropped as dsr network queue is full"); + } } void @@ -1160,7 +1324,6 @@ << "s " << m_mainAddress << " there is no route for this packet, queue the packet"); Ptr p = packet->Copy (); - m_newPacketSize = packet->GetSize (); SendBuffEntry newEntry (p, destination, m_sendBufferTimeout, protocol); // Create a new entry for send buffer bool result = m_sendBuffer.Enqueue (newEntry); // Enqueue the packet in send buffer if (result) @@ -1177,6 +1340,10 @@ */ SendInitialRequest (source, destination, protocol); } + else + { + NS_LOG_DEBUG ("There is existing route request timer and the request count here " << m_rreqTable->GetRreqCnt (destination)); + } } } else @@ -1205,53 +1372,245 @@ sourceRoute.SetSegmentsLeft ((nodeList.size () - 2)); // The segmentsLeft field will indicate the hops to go sourceRoute.SetSalvage (salvage); - DsrOptionAckReqHeader ackReq; - m_ackId = m_routeCache->CheckUniqueAckId (nextHop); - ackReq.SetAckId (m_ackId); + uint8_t length = sourceRoute.GetLength (); - uint8_t length = (sourceRoute.GetLength () + ackReq.GetLength ()); - - dsrRoutingHeader.SetPayloadLength (length + 4); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2); dsrRoutingHeader.AddDsrOption (sourceRoute); - dsrRoutingHeader.AddDsrOption (ackReq); cleanP->AddHeader (dsrRoutingHeader); + // Send the data packet out before schedule the next packet transmission + SendPacket (cleanP, source, nextHop, protocol); Ptr mtP = cleanP->Copy (); + NS_LOG_DEBUG ("maintain packet size " << cleanP->GetSize()); // Put the data packet in the maintenance queue for data packet retransmission MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*ourAddress=*/ m_mainAddress, /*nextHop=*/ nextHop, - /*source=*/ source, /*destination=*/ destination, /*ackId=*/ m_ackId, - /*SegsLeft=*/ nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime); + /*source=*/ source, /*destination=*/ destination, /*ackId=*/ 0, + /*SegsLeft=*/nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime); bool result = m_maintainBuffer.Enqueue (newEntry); // Enqueue the packet the the maintenance buffer if (result) { - Ptr newPacket = cleanP->Copy (); - /* - * Schedule the packet retransmission - */ - PacketKey packetKey; - packetKey.m_ackId = newEntry.GetAckId (); - packetKey.m_ourAdd = newEntry.GetOurAdd (); - packetKey.m_nextHop = newEntry.GetNextHop (); - packetKey.m_source = newEntry.GetSrc (); - packetKey.m_destination = newEntry.GetDst (); - packetKey.m_segsLeft = newEntry.GetSegsLeft (); - PacketKey networkKey = packetKey; - networkKey.m_segsLeft = 0; + NetworkKey networkKey; + networkKey.m_ackId = newEntry.GetAckId (); + networkKey.m_ourAdd = newEntry.GetOurAdd (); + networkKey.m_nextHop = newEntry.GetNextHop (); + networkKey.m_source = newEntry.GetSrc (); + networkKey.m_destination = newEntry.GetDst (); + + PassiveKey passiveKey; + passiveKey.m_ackId = 0; + passiveKey.m_source = newEntry.GetSrc (); + passiveKey.m_destination = newEntry.GetDst (); + passiveKey.m_segsLeft = newEntry.GetSegsLeft (); + m_addressForwardCnt[networkKey] = 0; - SchedulePacketRetry (newEntry, packetKey, protocol); + m_passiveCnt[passiveKey] = 0; + if (nextHop != destination) + { + SchedulePassivePacketRetry (newEntry, false, protocol); + } + else + { + // This is the first network retry + ScheduleNetworkPacketRetry (newEntry, true, protocol); + } } // Try to send packet from *previously* queued entries from send buffer if any - SendPacket (sourceRoute, nextHop, protocol); + Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0,100)), + &DsrRouting::SendPacketFromBuffer,this,sourceRoute,nextHop,protocol); } } } +uint16_t +DsrRouting::AddAckReqHeader (Ptr& packet, Ipv4Address nextHop) +{ + NS_LOG_FUNCTION (this << packet << nextHop); + // This packet is used to peek option type + Ptr dsrP = packet->Copy (); + Ptr tmpP = packet->Copy (); + + DsrRoutingHeader dsrRoutingHeader; + dsrP->RemoveHeader (dsrRoutingHeader); // Remove the DSR header in whole + uint8_t protocol = dsrRoutingHeader.GetNextHeader (); + uint32_t sourceId = dsrRoutingHeader.GetSourceId (); + uint32_t destinationId = dsrRoutingHeader.GetDestId (); + uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset (); + tmpP->RemoveAtStart (offset); // Here the processed size is 8 bytes, which is the fixed sized extension header + + // Get the number of routers' address field + uint8_t buf[2]; + tmpP->CopyData (buf, sizeof(buf)); + uint8_t numberAddress = (buf[1] - 2) / 4; + DsrOptionSRHeader sourceRoute; + sourceRoute.SetNumberAddress (numberAddress); + tmpP->RemoveHeader (sourceRoute); // this is a clean packet without any dsr involved headers + + DsrOptionAckReqHeader ackReq; + m_ackId = m_routeCache->CheckUniqueAckId (nextHop); + ackReq.SetAckId (m_ackId); + + uint8_t length = (sourceRoute.GetLength () + ackReq.GetLength ()); + DsrRoutingHeader newDsrRoutingHeader; + newDsrRoutingHeader.SetNextHeader (protocol); + newDsrRoutingHeader.SetMessageType (2); + newDsrRoutingHeader.SetSourceId (sourceId); + newDsrRoutingHeader.SetDestId (destinationId); + newDsrRoutingHeader.SetPayloadLength (length + 4); + newDsrRoutingHeader.AddDsrOption (sourceRoute); + newDsrRoutingHeader.AddDsrOption (ackReq); + dsrP->AddHeader (newDsrRoutingHeader); + // give the dsrP value to packet and then return + packet = dsrP; + return m_ackId; +} + void -DsrRouting::SendPacket (DsrOptionSRHeader const &sourceRoute, - Ipv4Address nextHop, - uint8_t protocol) +DsrRouting::SendPacket (Ptr packet, Ipv4Address source, Ipv4Address nextHop, uint8_t protocol) +{ + NS_LOG_FUNCTION (this << packet << source << nextHop << (uint32_t)protocol); + // Send out the data packet + m_ipv4Route = SetRoute (nextHop, m_mainAddress); + Ptr dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress)); + m_ipv4Route->SetOutputDevice (dev); + + uint32_t priority = GetPriority (DSR_DATA_PACKET); + std::map >::iterator i = m_priorityQueue.find (priority); + Ptr dsrNetworkQueue = i->second; + NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority); + + DsrNetworkQueueEntry newEntry (packet, source, nextHop, Simulator::Now (), m_ipv4Route); + + if (dsrNetworkQueue->Enqueue (newEntry)) + { + Scheduler (priority); + } + else + { + NS_LOG_INFO ("Packet dropped as dsr network queue is full"); + } +} + +void +DsrRouting::Scheduler (uint32_t priority) +{ + NS_LOG_FUNCTION (this); + PriorityScheduler (priority, true); +} + +void +DsrRouting::PriorityScheduler (uint32_t priority, bool continueWithFirst) { - NS_LOG_FUNCTION (this << (uint32_t)protocol); + NS_LOG_FUNCTION (this << priority << continueWithFirst); + NS_LOG_DEBUG ("Scheduler looking for packets in network queue"); + uint32_t numPriorities; + if (continueWithFirst) + { + numPriorities = 0; + } + else + { + numPriorities = priority; + } + // priorities range from 0 to m_numPriorityQueues, with 0 as the highest priority + for (uint32_t i = priority; numPriorities < m_numPriorityQueues; numPriorities++) + { + std::map >::iterator q = m_priorityQueue.find (i); + Ptr dsrNetworkQueue = q->second; + uint32_t queueSize = dsrNetworkQueue->GetSize (); + if (queueSize == 0) + { + if ((i == (m_numPriorityQueues - 1)) && continueWithFirst) + { + i = 0; + } + else + { + i++; + } + } + else + { + uint32_t totalQueueSize; + for (std::map >::iterator j = m_priorityQueue.begin (); j != m_priorityQueue.end (); j++) + { + NS_LOG_DEBUG ("The size of the network queue for " << j->first << " is " << j->second->GetSize()); + totalQueueSize += j->second->GetSize (); + NS_LOG_DEBUG ("And the total size is " << totalQueueSize); + } + if (totalQueueSize > 5) + { + // Here the queue size is larger than 5, we need to increase the retransmission timer for each packet in the network queue + IncreaseRetransTimer (); + } + DsrNetworkQueueEntry newEntry; + dsrNetworkQueue->Dequeue (newEntry); + if (SendRealDown (newEntry)) + { + NS_LOG_DEBUG("Packet sent by Dsr. Calling PriorityScheduler after some time"); + //packet was successfully sent down. call scheduler after some time + Simulator::Schedule (MicroSeconds (UniformVariable ().GetInteger (0, 1000)), + &DsrRouting::PriorityScheduler,this, i, false); + } + else + { + // packet was dropped by Dsr. Call scheduler immediately so that we can + // send another packet immediately. + NS_LOG_DEBUG("Packet dropped by Dsr. Calling PriorityScheduler immediately"); + Simulator::Schedule (Seconds (0), &DsrRouting::PriorityScheduler, this, i, false); + } + if ((i == (m_numPriorityQueues - 1)) && continueWithFirst) + { + i = 0; + } + else + { + i++; + } + } + } +} + +void +DsrRouting::IncreaseRetransTimer () +{ + NS_LOG_FUNCTION (this); + // We may want to get the queue first and then we need to save a vector of the entries here and then find + uint32_t priority = GetPriority (DSR_DATA_PACKET); + std::map >::iterator i = m_priorityQueue.find (priority); + Ptr dsrNetworkQueue = i->second; + + std::vector newNetworkQueue = dsrNetworkQueue->GetQueue (); + for (std::vector::iterator i = newNetworkQueue.begin (); i != newNetworkQueue.end (); i++) + { + Ipv4Address nextHop = i->GetNextHopAddress (); + for (std::map::iterator j = m_addressForwardTimer.begin (); j != m_addressForwardTimer.end (); j++) + { + if (nextHop == j->first.m_nextHop) + { + NS_LOG_DEBUG ("The network delay left is " << j->second.GetDelayLeft()); + j->second.SetDelay (j->second.GetDelayLeft () + m_retransIncr); + NS_LOG_DEBUG ("The new network delay time is " << j->second.GetDelayLeft ()); + } + } + } +} + +bool +DsrRouting::SendRealDown (DsrNetworkQueueEntry & newEntry) +{ + NS_LOG_FUNCTION (this); + Ipv4Address source = newEntry.GetSourceAddress (); + Ipv4Address nextHop = newEntry.GetNextHopAddress (); + Ptr packet = newEntry.GetPacket ()->Copy (); + Ptr route = newEntry.GetIpv4Route (); + m_downTarget (packet, source, nextHop, GetProtocolNumber(), route); + return true; +} + +void +DsrRouting::SendPacketFromBuffer (DsrOptionSRHeader const &sourceRoute, Ipv4Address nextHop, uint8_t protocol) +{ + NS_LOG_FUNCTION (this << nextHop << (uint32_t)protocol); NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward"); // Reconstruct the route and Retransmit the data packet @@ -1261,6 +1620,9 @@ NS_LOG_INFO ("The nexthop address " << nextHop << " the source " << source << " the destination " << destination); + /* + * Here we try to find data packet from send buffer, if packet with this destiantion found, send it out + */ if (m_sendBuffer.Find (destination)) { SendBuffEntry entry; @@ -1269,8 +1631,86 @@ Ptr packet = entry.GetPacket ()->Copy (); NS_LOG_DEBUG ("The queued packet size " << packet->GetSize ()); + NS_LOG_DEBUG ("This is the data packet"); + Ptr p = packet->Copy (); // get a copy of the packet + // Set the source route option + DsrRoutingHeader dsrRoutingHeader; + dsrRoutingHeader.SetNextHeader (protocol); + dsrRoutingHeader.SetMessageType (2); + dsrRoutingHeader.SetSourceId (GetIDfromIP (source)); + dsrRoutingHeader.SetDestId (GetIDfromIP (destination)); + + uint8_t length = sourceRoute.GetLength (); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2); + dsrRoutingHeader.AddDsrOption (sourceRoute); + + p->AddHeader (dsrRoutingHeader); + // Send the data packet out before schedule the next packet transmission + NS_LOG_DEBUG ("Send out the data packet"); + SendPacket (p, source, nextHop, protocol); + + Ptr mtP = p->Copy (); + // Put the data packet in the maintenance queue for data packet retransmission + MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*ourAddress=*/ m_mainAddress, /*nextHop=*/ nextHop, + /*source=*/ source, /*destination=*/ destination, /*ackId=*/ 0, + /*SegsLeft=*/nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime); + bool result = m_maintainBuffer.Enqueue (newEntry); // Enqueue the packet the the maintenance buffer + + if (result) + { + NetworkKey networkKey; + networkKey.m_ackId = newEntry.GetAckId (); + networkKey.m_ourAdd = newEntry.GetOurAdd (); + networkKey.m_nextHop = newEntry.GetNextHop (); + networkKey.m_source = newEntry.GetSrc (); + networkKey.m_destination = newEntry.GetDst (); + + PassiveKey passiveKey; + passiveKey.m_ackId = 0; + passiveKey.m_source = newEntry.GetSrc (); + passiveKey.m_destination = newEntry.GetDst (); + passiveKey.m_segsLeft = newEntry.GetSegsLeft (); + + m_addressForwardCnt[networkKey] = 0; + m_passiveCnt[passiveKey] = 0; + if (nextHop != destination) + { + SchedulePassivePacketRetry (newEntry, false, protocol); + } + else + { + // This is the first network retry + ScheduleNetworkPacketRetry (newEntry, true, protocol); + } + } + + if (m_sendBuffer.GetSize () != 0 && m_sendBuffer.Find (destination)) + { + NS_LOG_DEBUG ("Schedule sending the next packet in send buffer"); + Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0,100)), + &DsrRouting::SendPacketFromBuffer,this,sourceRoute,nextHop,protocol); + } + } + else + { + NS_LOG_DEBUG ("All queued packets are out-dated for the destination in send buffer"); + } + } + /* + * Here we try to find data packet from send buffer, if packet with this destiantion found, send it out + */ + else if (m_errorBuffer.Find (destination)) + { + ErrorBuffEntry entry; + if (m_errorBuffer.Dequeue (destination, entry)) + { + Ptr packet = entry.GetPacket ()->Copy (); + NS_LOG_DEBUG ("The queued packet size " << packet->GetSize ()); + DsrRoutingHeader dsrRoutingHeader; Ptr copyP = packet->Copy (); + Ptr dsrPacket = packet->Copy (); + dsrPacket->RemoveHeader (dsrRoutingHeader); uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset (); copyP->RemoveAtStart (offset); // Here the processed size is 8 bytes, which is the fixed sized extension header /* @@ -1282,14 +1722,18 @@ uint8_t optionType = 0; optionType = *(data); + NS_LOG_DEBUG ("The option type value in send packet " << (uint32_t)optionType); if (optionType == 3) { + NS_LOG_DEBUG ("The packet is error packet"); Ptr dsrOption; DsrOptionHeader dsrOptionHeader; uint8_t errorType = *(data + 2); + NS_LOG_DEBUG ("The error type"); if (errorType == 1) { + NS_LOG_DEBUG ("The packet is route error unreach packet"); DsrOptionRerrUnreachHeader rerr; copyP->RemoveHeader (rerr); NS_ASSERT (copyP->GetSize () == 0); @@ -1300,6 +1744,7 @@ newUnreach.SetErrorSrc (rerr.GetErrorSrc ()); newUnreach.SetUnreachNode (rerr.GetUnreachNode ()); newUnreach.SetErrorDst (rerr.GetErrorDst ()); + newUnreach.SetOriginalDst (rerr.GetOriginalDst ()); newUnreach.SetSalvage (rerr.GetSalvage ()); // Set the value about whether to salvage a packet or not std::vector nodeList = sourceRoute.GetNodesAddress (); @@ -1308,7 +1753,7 @@ newRoutingHeader.SetMessageType (1); newRoutingHeader.SetSourceId (GetIDfromIP (rerr.GetErrorSrc ())); newRoutingHeader.SetDestId (GetIDfromIP (rerr.GetErrorDst ())); - newRoutingHeader.SetPayloadLength (length + 4); + newRoutingHeader.SetPayloadLength (uint16_t(length) + 4); newRoutingHeader.AddDsrOption (newUnreach); newRoutingHeader.AddDsrOption (sourceRoute); if (m_routeCache->IsLinkCache ()) @@ -1320,90 +1765,62 @@ newPacket->AddHeader (newRoutingHeader); // Add the extension header with rerr and sourceRoute attached to it Ptr dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress)); m_ipv4Route->SetOutputDevice (dev); - m_downTarget (newPacket, m_mainAddress, nextHop, GetProtocolNumber (), m_ipv4Route); - } - } - else - { - Ptr p = packet->Copy (); // get a copy of the packet - // Set the source route option - dsrRoutingHeader.SetNextHeader (protocol); - dsrRoutingHeader.SetMessageType (2); - dsrRoutingHeader.SetSourceId (GetIDfromIP (source)); - dsrRoutingHeader.SetDestId (GetIDfromIP (destination)); - DsrOptionAckReqHeader ackReq; - m_ackId = m_routeCache->CheckUniqueAckId (nextHop); - ackReq.SetAckId (m_ackId); + uint32_t priority = GetPriority (DSR_CONTROL_PACKET); + std::map >::iterator i = m_priorityQueue.find (priority); + Ptr dsrNetworkQueue = i->second; + NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority); - uint8_t length = (sourceRoute.GetLength () + ackReq.GetLength ()); - dsrRoutingHeader.SetPayloadLength (length + 4); - dsrRoutingHeader.AddDsrOption (sourceRoute); - dsrRoutingHeader.AddDsrOption (ackReq); + DsrNetworkQueueEntry newEntry (newPacket, m_mainAddress, nextHop, Simulator::Now (), m_ipv4Route); - p->AddHeader (dsrRoutingHeader); - Ptr mtP = p->Copy (); - // Put the data packet in the maintenance queue for data packet retransmission - MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*ourAddress=*/ m_mainAddress, /*nextHop=*/ nextHop, - /*source=*/ source, /*destination=*/ destination, /*ackId=*/ m_ackId, - /*SegsLeft=*/ nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime); - bool result = m_maintainBuffer.Enqueue (newEntry); // Enqueue the packet the the maintenance buffer - - if (result) - { - // Send out data packet - NS_LOG_DEBUG ("Send out packet with ack id " << m_ackId); - // Schedule the packet retry timer - PacketKey packetKey; - packetKey.m_ackId = newEntry.GetAckId (); - packetKey.m_ourAdd = newEntry.GetOurAdd (); - packetKey.m_nextHop = newEntry.GetNextHop (); - packetKey.m_source = newEntry.GetSrc (); - packetKey.m_destination = newEntry.GetDst (); - packetKey.m_segsLeft = newEntry.GetSegsLeft (); - PacketKey networkKey = packetKey; - networkKey.m_segsLeft = 0; - m_addressForwardCnt[networkKey] = 0; - SchedulePacketRetry (newEntry, packetKey, protocol); + if (dsrNetworkQueue->Enqueue (newEntry)) + { + Scheduler (priority); + } + else + { + NS_LOG_INFO ("Packet dropped as dsr network queue is full"); + } } } - if (m_sendBuffer.GetSize () != 0 && m_sendBuffer.Find (destination)) - { - NS_LOG_DEBUG ("Schedule sending the next packet in send buffer"); - Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0,100)), - &DsrRouting::SendPacket,this,sourceRoute,nextHop,protocol); - } - } - else - { - NS_LOG_DEBUG ("All queued packets are out-dated for the destination"); + if (m_errorBuffer.GetSize () != 0 && m_errorBuffer.Find (destination)) + { + NS_LOG_DEBUG ("Schedule sending the next packet in send buffer"); + Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0,100)), + &DsrRouting::SendPacketFromBuffer,this,sourceRoute,nextHop,protocol); + } } } else { - NS_LOG_DEBUG ("Packet not found in send buffer"); + NS_LOG_DEBUG ("Packet not found in either the send or error buffer"); } } bool -DsrRouting::FindSamePackets (Ptr packet, Ipv4Header const& ipv4Header, Ipv4Address source, Ipv4Address destination, +DsrRouting::FindSamePackets (Ptr packet, Ipv4Address source, Ipv4Address destination, uint8_t segsLeft) { - NS_LOG_FUNCTION (this << packet << ipv4Header << source << destination << (uint32_t)segsLeft); - /* - * Get the source and destination address from ipv4 header - */ - Ipv4Address ourAdd = ipv4Header.GetSource (); - Ipv4Address nextHop = ipv4Header.GetDestination (); + NS_LOG_FUNCTION (this << packet << source << destination << (uint32_t)segsLeft); Ptr p = packet->Copy (); - MaintainBuffEntry newEntry (/*Packet=*/ p, /*Ipv4Address=*/ ourAdd, /*nextHop=*/ nextHop, - /*source=*/ source, /*destination=*/ destination, /*ackId=*/ 0, - /*SegsLeft=*/ segsLeft, /*expire time=*/ m_maxMaintainTime); - // Temporarily disable passive acknowledgment -// CancelPassivePacketTimer (newEntry); - return true; + // Here the segments left value need to plus one to check the earlier hop maintain buffer entry + MaintainBuffEntry newEntry; + newEntry.SetPacket (p); + newEntry.SetSrc (source); + newEntry.SetDst (destination); + newEntry.SetAckId (0); + newEntry.SetSegsLeft (segsLeft + 1); + + if (m_maintainBuffer.PromiscEqual (newEntry)) + { + // The PromiscEqual function will remove the maintain buffer entry if equal value found + // It only compares the source and destination address, ackId, and the segments left value + CancelPassivePacketTimer (newEntry); + return true; + } + return false; } void @@ -1418,8 +1835,8 @@ */ Ptr mainP = Create (); MaintainBuffEntry newEntry (/*Packet=*/ mainP, /*ourAddress=*/ sender, /*nextHop=*/ receiver, - /*source=*/ realSrc, /*destination=*/ realDst, /*ackId=*/ ackId, - /*SegsLeft=*/ 0, /*expire time=*/ Simulator::Now ()); + /*source=*/ realSrc, /*destination=*/ realDst, /*ackId=*/ ackId, + /*SegsLeft=*/0, /*expire time=*/ Simulator::Now ()); CancelNetworkPacketTimer (newEntry); } @@ -1427,77 +1844,75 @@ DsrRouting::CancelNetworkPacketTimer (MaintainBuffEntry & mb) { NS_LOG_FUNCTION (this); - PacketKey packetKey; - packetKey.m_ackId = mb.GetAckId (); - packetKey.m_ourAdd = mb.GetOurAdd (); - packetKey.m_nextHop = mb.GetNextHop (); - packetKey.m_source = mb.GetSrc (); - packetKey.m_destination = mb.GetDst (); - packetKey.m_segsLeft = 0; + NetworkKey networkKey; + networkKey.m_ackId = mb.GetAckId (); + networkKey.m_ourAdd = mb.GetOurAdd (); + networkKey.m_nextHop = mb.GetNextHop (); + networkKey.m_source = mb.GetSrc (); + networkKey.m_destination = mb.GetDst (); /* * Here we have found the entry for send retries, so we get the value and increase it by one */ - m_addressForwardCnt[packetKey] = 0; - m_addressForwardCnt.erase (packetKey); + m_addressForwardCnt[networkKey] = 0; + m_addressForwardCnt.erase (networkKey); NS_LOG_INFO ("ackId " << mb.GetAckId () << " ourAdd " << mb.GetOurAdd () << " nextHop " << mb.GetNextHop () << " source " << mb.GetSrc () << " destination " << mb.GetDst () << " segsLeft " << (uint32_t)mb.GetSegsLeft () - ); + ); // Find the network acknowledgment timer - std::map::const_iterator i = - m_addressForwardTimer.find (packetKey); + std::map::const_iterator i = + m_addressForwardTimer.find (networkKey); if (i == m_addressForwardTimer.end ()) { - NS_LOG_DEBUG ("did not find the packet timer"); + NS_LOG_INFO ("did not find the packet timer"); } else { - NS_LOG_DEBUG ("did find the packet timer"); + NS_LOG_INFO ("did find the packet timer"); /* * Schedule the packet retry * Push back the nextHop, source, destination address */ - m_addressForwardTimer[packetKey].Cancel (); - m_addressForwardTimer[packetKey].Remove (); - if (m_addressForwardTimer[packetKey].IsRunning ()) + m_addressForwardTimer[networkKey].Cancel (); + m_addressForwardTimer[networkKey].Remove (); + if (m_addressForwardTimer[networkKey].IsRunning ()) { - NS_LOG_DEBUG ("Timer not canceled"); + NS_LOG_INFO ("Timer not canceled"); } - m_addressForwardTimer.erase (packetKey); + m_addressForwardTimer.erase (networkKey); } - // Erase the maintenance entry - if (m_maintainBuffer.AllEqual (mb)) - { - NS_LOG_DEBUG ("Remove same maintenance buffer entry based on network acknowledgment"); - } + // Erase the maintenance entry + // yet this does not check the segments left value here + if (m_maintainBuffer.NetworkEqual (mb)) + { + NS_LOG_INFO ("Remove same maintenance buffer entry based on network acknowledgment"); + } } void DsrRouting::CancelPassivePacketTimer (MaintainBuffEntry & mb) { NS_LOG_FUNCTION (this); - PacketKey passiveKey; + PassiveKey passiveKey; passiveKey.m_ackId = 0; - passiveKey.m_ourAdd = mb.GetOurAdd (); - passiveKey.m_nextHop = mb.GetNextHop (); passiveKey.m_source = mb.GetSrc (); passiveKey.m_destination = mb.GetDst (); passiveKey.m_segsLeft = mb.GetSegsLeft (); - m_addressForwardCnt[passiveKey] = 0; - m_addressForwardCnt.erase (passiveKey); + m_passiveCnt[passiveKey] = 0; + m_passiveCnt.erase (passiveKey); // Find the passive acknowledgment timer - std::map::const_iterator j = - m_passiveAckTimer.find (passiveKey); + std::map::const_iterator j = + m_passiveAckTimer.find (passiveKey); if (j == m_passiveAckTimer.end ()) { - NS_LOG_DEBUG ("did not find the passive timer"); + NS_LOG_INFO ("did not find the passive timer"); } else { - NS_LOG_DEBUG ("find the passive timer"); + NS_LOG_INFO ("find the passive timer"); /* * Cancel passive acknowledgment timer */ @@ -1505,15 +1920,10 @@ m_passiveAckTimer[passiveKey].Remove (); if (m_passiveAckTimer[passiveKey].IsRunning ()) { - NS_LOG_DEBUG ("Timer not canceled"); + NS_LOG_INFO ("Timer not canceled"); } m_passiveAckTimer.erase (passiveKey); } - // Erase the maintenance entry - if (m_maintainBuffer.PromiscEqual (mb)) - { - NS_LOG_DEBUG ("Remove same maintenance buffer entry based on passive acknowledgment"); - } } void @@ -1534,15 +1944,14 @@ if (m_maintainBuffer.GetSize () && m_maintainBuffer.Find (nextHop)) { - NS_LOG_DEBUG ("Cancel the packet timer for next maintenance entry"); - + NS_LOG_INFO ("Cancel the packet timer for next maintenance entry"); Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0,100)), &DsrRouting::CancelPacketTimerNextHop,this,nextHop,protocol); } } else { - NS_LOG_DEBUG ("Maintenance buffer entry not found"); + NS_LOG_INFO ("Maintenance buffer entry not found"); } } @@ -1550,10 +1959,6 @@ DsrRouting::SalvagePacket (Ptr packet, Ipv4Address source, Ipv4Address dst, uint8_t protocol) { NS_LOG_FUNCTION (this << packet << source << dst << (uint32_t)protocol); - /* - * Look in the route cache for other routes for this destination - */ - RouteCacheEntry toDst; // Create two copies of packet Ptr p = packet->Copy (); Ptr newPacket = packet->Copy (); @@ -1573,9 +1978,10 @@ sourceRoute.SetNumberAddress (numberAddress); newPacket->RemoveHeader (sourceRoute); uint8_t salvage = sourceRoute.GetSalvage (); - - NS_LOG_DEBUG ("The salvage value get from remove headers " << (uint32_t)salvage); - + /* + * Look in the route cache for other routes for this destination + */ + RouteCacheEntry toDst; bool findRoute = m_routeCache->LookupRoute (dst, toDst); if (findRoute && (salvage < m_maxSalvageCount)) { @@ -1598,19 +2004,19 @@ DsrOptionSRHeader sourceRoute; sourceRoute.SetSalvage (salvage); sourceRoute.SetNodesAddress (nodeList); // Save the whole route in the source route header of the packet + sourceRoute.SetSegmentsLeft ((nodeList.size () - 2)); // The segmentsLeft field will indicate the hops to go + DsrOptionAckReqHeader ackReq; + m_ackId = m_routeCache->CheckUniqueAckId (nextHop); + ackReq.SetAckId (m_ackId); if (m_routeCache->IsLinkCache ()) { m_routeCache->UseExtends (nodeList); } - sourceRoute.SetSegmentsLeft ((nodeList.size () - 2)); // The segmentsLeft field will indicate the hops to go - DsrOptionAckReqHeader ackReq; - m_ackId = m_routeCache->CheckUniqueAckId (nextHop); - ackReq.SetAckId (m_ackId); uint8_t length = (sourceRoute.GetLength () + ackReq.GetLength ()); NS_LOG_INFO ("length of source route header " << (uint32_t)(sourceRoute.GetLength ()) << " length of ack request header " << (uint32_t)(ackReq.GetLength ())); - newDsrRoutingHeader.SetPayloadLength (length + 4); + newDsrRoutingHeader.SetPayloadLength (uint16_t(length) + 4); newDsrRoutingHeader.AddDsrOption (sourceRoute); newDsrRoutingHeader.AddDsrOption (ackReq); p->AddHeader (newDsrRoutingHeader); @@ -1619,7 +2025,22 @@ Ptr dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress)); m_ipv4Route->SetOutputDevice (dev); // Send out the data packet - m_downTarget (p, m_mainAddress, nextHop, GetProtocolNumber (), m_ipv4Route); + + uint32_t priority = GetPriority (DSR_DATA_PACKET); + std::map >::iterator i = m_priorityQueue.find (priority); + Ptr dsrNetworkQueue = i->second; + NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority); + + DsrNetworkQueueEntry newEntry (p, m_mainAddress, nextHop, Simulator::Now (), m_ipv4Route); + + if (dsrNetworkQueue->Enqueue (newEntry)) + { + Scheduler (priority); + } + else + { + NS_LOG_INFO ("Packet dropped as dsr network queue is full"); + } /* * Mark the next hop address in blacklist */ @@ -1633,66 +2054,106 @@ } void -DsrRouting::SchedulePacketRetry (MaintainBuffEntry & mb, - PacketKey const & packetKey, - uint8_t protocol) +DsrRouting::SchedulePassivePacketRetry (MaintainBuffEntry & mb, + bool onlyPassive, + uint8_t protocol) { - NS_LOG_FUNCTION (this << (uint32_t)protocol); + NS_LOG_FUNCTION (this << onlyPassive << (uint32_t)protocol); Ipv4Address nextHop = mb.GetNextHop (); Ipv4Address source = mb.GetSrc (); Ipv4Address dst = mb.GetDst (); - bool isPassive = mb.GetPassive (); - // Temporarily disable passive acknowledgment option - isPassive = false; - NS_LOG_DEBUG ("Sending passive packet retry or network one " << isPassive); - // Make two copies of the packet key - PacketKey networkKey = packetKey; - PacketKey passiveKey = packetKey; + PassiveKey passiveKey; + passiveKey.m_ackId = 0; + passiveKey.m_source = mb.GetSrc (); + passiveKey.m_destination = mb.GetDst (); + passiveKey.m_segsLeft = mb.GetSegsLeft (); - if (isPassive && nextHop != dst) + if (m_passiveAckTimer.find (passiveKey) == m_passiveAckTimer.end ()) { - // There is no ack id for passive key, so 0 it - passiveKey.m_ackId = 0; - if (m_addressForwardTimer.find (passiveKey) == m_addressForwardTimer.end ()) - { - Timer timer (Timer::CANCEL_ON_DESTROY); - m_addressForwardTimer[passiveKey] = timer; - } - m_sendRetries = 0; // initialize the send retry times to 0 - m_sendRetries++; - // decrease the passive acknowledgment count - m_tryPassiveAcks = (m_tryPassiveAcks - 1); - if (!m_tryPassiveAcks) - { - NS_LOG_DEBUG ("Passive acknowledgment is over"); - isPassive = false; - } - NS_LOG_DEBUG ("The passive acknowledgment option for data packet"); - m_addressForwardTimer[passiveKey].SetFunction (&DsrRouting::PacketScheduleTimerExpire, this); - m_addressForwardTimer[passiveKey].Remove (); - m_addressForwardTimer[passiveKey].SetArguments (mb, passiveKey, protocol, isPassive); - // forward count - m_addressForwardCnt[passiveKey] = m_sendRetries; - NS_LOG_DEBUG ("The packet retries time is " << m_sendRetries); - m_addressForwardTimer[passiveKey].Schedule (m_passiveAckTimeout); - return; + Timer timer (Timer::CANCEL_ON_DESTROY); + m_passiveAckTimer[passiveKey] = timer; } - else + NS_LOG_DEBUG ("The passive acknowledgment option for data packet"); + m_passiveAckTimer[passiveKey].SetFunction (&DsrRouting::PassiveScheduleTimerExpire, this); + m_passiveAckTimer[passiveKey].Remove (); + m_passiveAckTimer[passiveKey].SetArguments (mb, onlyPassive, protocol); + m_passiveAckTimer[passiveKey].Schedule (m_passiveAckTimeout); +} + +void +DsrRouting::ScheduleNetworkPacketRetry (MaintainBuffEntry & mb, + bool isFirst, + uint8_t protocol) +{ + Ptr p = Create (); + Ptr dsrP = Create (); + // The new entry will be used for retransmission + NetworkKey networkKey; + Ipv4Address nextHop = mb.GetNextHop (); + Ipv4Address source = mb.GetSrc (); + Ipv4Address dst = mb.GetDst (); + NS_LOG_DEBUG ("is the first retry or not " << isFirst); + if (isFirst) { - // There is no segments left value for network key, so 0 it - networkKey.m_segsLeft = 0; + // This is the very first network packet retry + p = mb.GetPacket ()->Copy (); + // Here we add the ack request header to the data packet for network acknowledgement + uint16_t ackId = AddAckReqHeader (p, nextHop); + dsrP = p->Copy (); + MaintainBuffEntry newEntry = mb; + // The function AllEqual will find the exact entry and delete it if found + m_maintainBuffer.AllEqual (mb); + newEntry.SetPacket (dsrP); + newEntry.SetAckId (ackId); + newEntry.SetExpireTime (m_maxMaintainTime); + + networkKey.m_ackId = newEntry.GetAckId (); + networkKey.m_ourAdd = newEntry.GetOurAdd (); + networkKey.m_nextHop = newEntry.GetNextHop (); + networkKey.m_source = newEntry.GetSrc (); + networkKey.m_destination = newEntry.GetDst (); + + m_addressForwardCnt[networkKey] = 0; + m_maintainBuffer.Enqueue (newEntry); if (m_addressForwardTimer.find (networkKey) == m_addressForwardTimer.end ()) { Timer timer (Timer::CANCEL_ON_DESTROY); m_addressForwardTimer[networkKey] = timer; } + + // After m_tryPassiveAcks, schedule the packet retransmission using network acknowledgment option + m_addressForwardTimer[networkKey].SetFunction (&DsrRouting::NetworkScheduleTimerExpire, this); + m_addressForwardTimer[networkKey].Remove (); + m_addressForwardTimer[networkKey].SetArguments (newEntry, protocol); + NS_LOG_DEBUG ("The packet retries time for " << newEntry.GetAckId() << " is " << m_sendRetries + << " and the delay time is " << Time (2 * m_nodeTraversalTime)); + // Back-off mechanism + m_addressForwardTimer[networkKey].Schedule (Time (2 * m_nodeTraversalTime)); + } + else + { + networkKey.m_ackId = mb.GetAckId (); + networkKey.m_ourAdd = mb.GetOurAdd (); + networkKey.m_nextHop = mb.GetNextHop (); + networkKey.m_source = mb.GetSrc (); + networkKey.m_destination = mb.GetDst (); /* * Here we have found the entry for send retries, so we get the value and increase it by one */ m_sendRetries = m_addressForwardCnt[networkKey]; NS_LOG_DEBUG ("The packet retry we have done " << m_sendRetries); + + p = mb.GetPacket ()->Copy (); + dsrP = mb.GetPacket ()->Copy (); + + NS_LOG_DEBUG ("The packet with dsr header " << dsrP->GetSize()); + networkKey.m_ackId = mb.GetAckId (); + networkKey.m_ourAdd = mb.GetOurAdd (); + networkKey.m_nextHop = mb.GetNextHop (); + networkKey.m_source = mb.GetSrc (); + networkKey.m_destination = mb.GetDst (); /* * If a data packet has been attempted SendRetries times at the maximum TTL without * receiving any ACK, all data packets destined for the corresponding destination SHOULD be @@ -1700,162 +2161,146 @@ * * The maxMaintRexmt also needs to decrease one for the passive ack packet */ - Ptr p = mb.GetPacket ()->Copy (); - Ptr dsrP = p->Copy (); - Ptr salP = p->Copy (); - Ptr retransP = p->Copy (); - // The packet retries time has exceed the max maintenance retransmission times - if (m_sendRetries > m_maxMaintRexmt) - { - NS_LOG_LOGIC ("Packet transmissions to " << nextHop << " has been attempted SendRetries times for " << networkKey.m_ackId); - DsrRoutingHeader dsrRoutingHeader; - dsrP->RemoveHeader (dsrRoutingHeader); // Remove the dsr header in whole - uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset (); - p->RemoveAtStart (offset); - - // Get the number of routers' address field - uint8_t buf[2]; - p->CopyData (buf, sizeof(buf)); - uint8_t numberAddress = (buf[1] - 2) / 4; - NS_LOG_DEBUG ("The number of addresses " << (uint32_t)numberAddress); - DsrOptionSRHeader sourceRoute; - sourceRoute.SetNumberAddress (numberAddress); - p->RemoveHeader (sourceRoute); - std::vector nodeList = sourceRoute.GetNodesAddress (); - uint8_t salvage = sourceRoute.GetSalvage (); - Ipv4Address address1 = nodeList.front (); - NS_LOG_DEBUG ("address1 " << address1); + /* + * Check if the send retry time for a certain packet has already passed max maintenance retransmission + * time or not + */ - CutRoute (m_mainAddress, nodeList); - NS_LOG_DEBUG ("The route vector after cut and the route source " << nodeList.front ()); -// PrintVector (nodeList); - // Delete the route cache entry - RouteCacheEntry toDst; - // Cancel the packet timer for maintenance buffer entry - CancelNetworkPacketTimer (mb); - /* - * Mark the next hop address in blacklist - */ -// NS_LOG_DEBUG ("Save the next hop node in blacklist"); -// m_rreqTable->MarkLinkAsUnidirectional (nextHop, m_blacklistTimeout); - // Delete all the routes including the links - m_routeCache->DeleteAllRoutesIncludeLink (m_mainAddress, nextHop, m_mainAddress); - // After deleting the broken link from all routes, need to salvage the packet right after dropping it - SalvagePacket (salP, source, dst, protocol); - /* - * If the salvage is not 0, use the first address in the route as the error dst in error header - * otherwise use the source of packet as the error destination - */ - if (salvage) - { - if (address1 == m_mainAddress) - { - DsrOptionRerrUnreachHeader rerr; - rerr.SetErrorType (1); - rerr.SetErrorSrc (address1); - rerr.SetUnreachNode (nextHop); - rerr.SetErrorDst (address1); - rerr.SetSalvage (salvage); // Set the value about whether to salvage a packet or not - SendErrorRequest (rerr, protocol); - } - else - { - SendUnreachError (nextHop, address1, salvage, protocol); - } - } - else - { - if (source == m_mainAddress) - { - DsrOptionRerrUnreachHeader rerr; - rerr.SetErrorType (1); - rerr.SetErrorSrc (source); - rerr.SetUnreachNode (nextHop); - rerr.SetErrorDst (source); - rerr.SetSalvage (salvage); // Set the value about whether to salvage a packet or not - SendErrorRequest (rerr, protocol); - } - else - { - SendUnreachError (nextHop, source, salvage, protocol); - } - } - CancelPacketTimerNextHop (nextHop, protocol); - } - else - { - m_sendRetries++; - // Send out the retransmission packet - m_ipv4Route = SetRoute (nextHop, m_mainAddress); - Ptr dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress)); - m_ipv4Route->SetOutputDevice (dev); - m_downTarget (retransP, source, nextHop, GetProtocolNumber (), m_ipv4Route); - // After m_tryPassiveAcks, schedule the packet retransmission using network acknowledgment option - m_addressForwardTimer[networkKey].SetFunction (&DsrRouting::PacketScheduleTimerExpire, this); - m_addressForwardTimer[networkKey].Remove (); - m_addressForwardTimer[networkKey].SetArguments (mb, networkKey, protocol, false); - // forward count - m_addressForwardCnt[networkKey] = m_sendRetries; - NS_LOG_DEBUG ("The packet retries time for " << mb.GetAckId () << " is " << m_sendRetries); - // Back-off mechanism - m_addressForwardTimer[networkKey].Schedule (Time (2 * m_sendRetries * m_nodeTraversalTime)); - } + // After m_tryPassiveAcks, schedule the packet retransmission using network acknowledgment option + m_addressForwardTimer[networkKey].SetFunction (&DsrRouting::NetworkScheduleTimerExpire, this); + m_addressForwardTimer[networkKey].Remove (); + m_addressForwardTimer[networkKey].SetArguments (mb, protocol); + NS_LOG_DEBUG ("The packet retries time for " << mb.GetAckId() << " is " << m_sendRetries + << " and the delay time is " << Time (2 * m_sendRetries * m_nodeTraversalTime)); + // Back-off mechanism + m_addressForwardTimer[networkKey].Schedule (Time (2 * m_sendRetries * m_nodeTraversalTime)); } - return; } void -DsrRouting::AddAckReqHeader (Ptr packet, DsrOptionSRHeader const &sourceRoute, Ipv4Address nextHop) +DsrRouting::PassiveScheduleTimerExpire (MaintainBuffEntry & mb, + bool onlyPassive, + uint8_t protocol) { - NS_LOG_FUNCTION (this << packet << nextHop); - // This packet is used to peek option type - Ptr cleanP = packet->Copy (); - - DsrOptionAckReqHeader ackReq; - m_ackId = m_routeCache->CheckUniqueAckId (nextHop); - ackReq.SetAckId (m_ackId); - - uint8_t length = (sourceRoute.GetLength () + ackReq.GetLength ()); - DsrRoutingHeader dsrRoutingHeader; - dsrRoutingHeader.SetPayloadLength (length + 4); - dsrRoutingHeader.AddDsrOption (sourceRoute); - dsrRoutingHeader.AddDsrOption (ackReq); - cleanP->AddHeader (dsrRoutingHeader); -} - -void -DsrRouting::PacketScheduleTimerExpire (MaintainBuffEntry & mb, - PacketKey const & pk, - uint8_t protocol, - bool isPassive) -{ - NS_LOG_FUNCTION (this << (uint32_t)protocol << isPassive); + NS_LOG_FUNCTION (this << onlyPassive << (uint32_t)protocol); Ipv4Address nextHop = mb.GetNextHop (); Ipv4Address source = mb.GetSrc (); Ipv4Address dst = mb.GetDst (); Ptr packet = mb.GetPacket (); SetRoute (nextHop, m_mainAddress); Ptr p = packet->Copy (); - if (isPassive) + + PassiveKey pk; + pk.m_ackId = 0; + pk.m_source = mb.GetSrc (); + pk.m_destination = mb.GetDst (); + pk.m_segsLeft = mb.GetSegsLeft (); + + // Cancel passive ack timer + m_passiveAckTimer[pk].Cancel (); + m_passiveAckTimer[pk].Remove (); + if (m_passiveAckTimer[pk].IsRunning ()) { - // Cancel passive ack timer - m_passiveAckTimer[pk].Cancel (); - m_passiveAckTimer[pk].Remove (); - if (m_passiveAckTimer[pk].IsRunning ()) - { - NS_LOG_DEBUG ("Timer not canceled"); - } - m_passiveAckTimer.erase (pk); - isPassive = false; - mb.SetPassive (false); - SchedulePacketRetry (mb, pk, protocol); + NS_LOG_DEBUG ("Timer not canceled"); + } + m_passiveAckTimer.erase (pk); + // Send the data packet out before schedule the next packet transmission + SendPacket (p, source, nextHop, protocol); + // Increase the send retry times + m_passiveRetries = m_passiveCnt[pk]; + if (m_passiveRetries < m_tryPassiveAcks) + { + m_passiveCnt[pk] = ++m_passiveRetries; + SchedulePassivePacketRetry (mb, onlyPassive, protocol); + } + else if (!onlyPassive) + { + // This is the first network acknowledgement retry + // Cancel the passive packet timer now and remove maintenance buffer entry for it + CancelPassivePacketTimer (mb); + ScheduleNetworkPacketRetry (mb, true, protocol); } else { - mb.SetPassive (false); - SchedulePacketRetry (mb, pk, protocol); + // This is the end of the data retransmission retries + CancelPassivePacketTimer (mb); + // The function AllEqual will find the exact entry and delete it if found + m_maintainBuffer.AllEqual (mb); } - return; +} + +void +DsrRouting::NetworkScheduleTimerExpire (MaintainBuffEntry & mb, + uint8_t protocol) +{ + Ptr p = mb.GetPacket ()->Copy (); + Ipv4Address source = mb.GetSrc (); + Ipv4Address nextHop = mb.GetNextHop (); + Ipv4Address dst = mb.GetDst (); + + NetworkKey networkKey; + networkKey.m_ackId = mb.GetAckId (); + networkKey.m_ourAdd = mb.GetOurAdd (); + networkKey.m_nextHop = nextHop; + networkKey.m_source = source; + networkKey.m_destination = dst; + + // Send the data packet out before schedule the next packet transmission + SendPacket (p, source, nextHop, protocol); + // Increase the send retry times + m_sendRetries = m_addressForwardCnt[networkKey]; + NS_LOG_DEBUG ("The send retry time is " << m_sendRetries); + if (m_sendRetries >= m_maxMaintRexmt) + { + Ptr dsrP = mb.GetPacket ()->Copy (); + // The packet retries time has exceed the max maintenance retransmission times + NS_LOG_LOGIC ("Packet transmissions to " << nextHop << " has been attempted SendRetries times for " << networkKey.m_ackId); + DsrRoutingHeader dsrRoutingHeader; + dsrP->RemoveHeader (dsrRoutingHeader); // Remove the dsr header in whole + uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset (); + p->RemoveAtStart (offset); + + // Get the number of routers' address field + uint8_t buf[2]; + p->CopyData (buf, sizeof(buf)); + uint8_t numberAddress = (buf[1] - 2) / 4; + NS_LOG_DEBUG ("The number of addresses " << (uint32_t)numberAddress); + DsrOptionSRHeader sourceRoute; + sourceRoute.SetNumberAddress (numberAddress); + p->RemoveHeader (sourceRoute); + std::vector nodeList = sourceRoute.GetNodesAddress (); + uint8_t salvage = sourceRoute.GetSalvage (); + Ipv4Address address1 = nodeList[1]; + NS_LOG_DEBUG ("address1 " << address1); + PrintVector (nodeList); + + // Delete all the routes including the links + m_routeCache->DeleteAllRoutesIncludeLink (m_mainAddress, nextHop, m_mainAddress); + /* + * If the salvage is not 0, use the first address in the route as the error dst in error header + * otherwise use the source of packet as the error destination + */ + Ipv4Address errorDst; + if (salvage) + { + errorDst = address1; + } + else + { + errorDst = source; + } + SendUnreachError (nextHop, errorDst, dst, salvage, protocol); + /* + * here we cancel the packet retransmission time for all the packets have next hop address as nextHop + * Also salvage the packet for the all the packet destined for the nextHop address + */ + CancelPacketTimerNextHop (nextHop, protocol); + } + else + { + m_addressForwardCnt[networkKey] = ++m_sendRetries; + ScheduleNetworkPacketRetry (mb, false, protocol); + } } void @@ -1879,36 +2324,47 @@ // We get the salvage value in sourceRoute header and set it to route error header if triggered error Ptr p = packet->Copy (); - DsrOptionAckReqHeader ackReq; - m_ackId = m_routeCache->CheckUniqueAckId (nextHop); - ackReq.SetAckId (m_ackId); + uint8_t length = sourceRoute.GetLength (); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2); + dsrRoutingHeader.AddDsrOption (sourceRoute); + p->AddHeader (dsrRoutingHeader); - uint8_t length = (sourceRoute.GetLength () + ackReq.GetLength ()); - dsrRoutingHeader.SetPayloadLength (length + 4); - dsrRoutingHeader.AddDsrOption (sourceRoute); - dsrRoutingHeader.AddDsrOption (ackReq); - p->AddHeader (dsrRoutingHeader); + // Send the data packet out before schedule the next packet transmission + SendPacket (p, source, nextHop, protocol); + Ptr mtP = p->Copy (); MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*ourAddress=*/ m_mainAddress, /*nextHop=*/ nextHop, /*source=*/ source, /*destination=*/ targetAddress, - /*ackId=*/ m_ackId, /*SegsLeft=*/ sourceRoute.GetSegmentsLeft (), /*expire time=*/ m_maxMaintainTime); + /*ackId=*/ m_ackId, /*SegsLeft=*/sourceRoute.GetSegmentsLeft(), /*expire time=*/ m_maxMaintainTime); bool result = m_maintainBuffer.Enqueue (newEntry); if (result) { - Ptr newPacket = p->Copy (); - PacketKey packetKey; - packetKey.m_ackId = newEntry.GetAckId (); - packetKey.m_ourAdd = newEntry.GetOurAdd (); - packetKey.m_nextHop = newEntry.GetNextHop (); - packetKey.m_source = newEntry.GetSrc (); - packetKey.m_destination = newEntry.GetDst (); - packetKey.m_segsLeft = newEntry.GetSegsLeft (); - PacketKey networkKey = packetKey; - networkKey.m_segsLeft = 0; + NetworkKey networkKey; + networkKey.m_ackId = newEntry.GetAckId (); + networkKey.m_ourAdd = newEntry.GetOurAdd (); + networkKey.m_nextHop = newEntry.GetNextHop (); + networkKey.m_source = newEntry.GetSrc (); + networkKey.m_destination = newEntry.GetDst (); + + PassiveKey passiveKey; + passiveKey.m_ackId = 0; + passiveKey.m_source = newEntry.GetSrc (); + passiveKey.m_destination = newEntry.GetDst (); + passiveKey.m_segsLeft = newEntry.GetSegsLeft (); + m_addressForwardCnt[networkKey] = 0; - SchedulePacketRetry (newEntry, packetKey, protocol); + m_passiveCnt[passiveKey] = 0; + if (nextHop != targetAddress) + { + SchedulePassivePacketRetry (newEntry, false, protocol); + } + else + { + // This is the first network retry + ScheduleNetworkPacketRetry (newEntry, true, protocol); + } } } @@ -1931,24 +2387,32 @@ dsrRoutingHeader.SetSourceId (GetIDfromIP (source)); dsrRoutingHeader.SetDestId (255); - DsrOptionRreqHeader rreqHeader; // has an alignment of 4n+0 - rreqHeader.AddNodeAddress (m_mainAddress); // Add our own address in the header + DsrOptionRreqHeader rreqHeader; // has an alignment of 4n+0 + rreqHeader.AddNodeAddress (m_mainAddress); // Add our own address in the header rreqHeader.SetTarget (destination); - m_requestId = m_rreqTable->CheckUniqueRreqId (destination); // Check the Id cache for duplicate ones + m_requestId = m_rreqTable->CheckUniqueRreqId (destination); // Check the Id cache for duplicate ones rreqHeader.SetId (m_requestId); - // Increment the route request count, if entry not found, the function will create a new one - m_rreqTable->FindAndUpdate (destination); - dsrRoutingHeader.AddDsrOption (rreqHeader); // Add the rreqHeader to the dsr extension header + dsrRoutingHeader.AddDsrOption (rreqHeader); // Add the rreqHeader to the dsr extension header uint8_t length = rreqHeader.GetLength (); - dsrRoutingHeader.SetPayloadLength (length + 2); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2); packet->AddHeader (dsrRoutingHeader); - // This function will increase the request count if found the entry, will create the entry if not found - m_rreqTable->FindAndUpdate (destination); // Schedule the route requests retry with non-propagation set true bool nonProp = true; - ScheduleRreqRetry (packet, source, destination, nonProp, protocol); + std::vector address; + address.push_back (source); + address.push_back (destination); + /* + * Add the socket ip ttl tag to the packet to limit the scope of route requests + */ + SocketIpTtlTag tag; + tag.SetTtl (0); + Ptr nonPropPacket = packet->Copy (); + nonPropPacket->AddPacketTag (tag); + SendRequest (nonPropPacket, source); + // Schedule the next route request + ScheduleRreqRetry (packet, address, nonProp, m_requestId, protocol); } void @@ -1956,80 +2420,106 @@ { NS_LOG_FUNCTION (this << (uint32_t)protocol); NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward"); - Ptr packet = Create (); - Ipv4Address destination = rerr.GetErrorSrc (); - Ipv4Address unreachAddress = rerr.GetUnreachNode (); - // Create an empty route ptr - Ptr route = 0; - /* - * Construct the route request option header - */ - DsrRoutingHeader dsrRoutingHeader; - dsrRoutingHeader.SetNextHeader (protocol); - dsrRoutingHeader.SetMessageType (1); - dsrRoutingHeader.SetSourceId (GetIDfromIP (m_mainAddress)); - dsrRoutingHeader.SetDestId (255); - - if (m_mainAddress != destination) + uint8_t salvage = rerr.GetSalvage (); + Ipv4Address dst = rerr.GetOriginalDst (); + NS_LOG_DEBUG ("our own address here " << m_mainAddress << " error source " << rerr.GetErrorSrc () << " error destination " << rerr.GetErrorDst () + << " error next hop " << rerr.GetUnreachNode () << " original dst " << rerr.GetOriginalDst () + ); + RouteCacheEntry toDst; + if (m_routeCache->LookupRoute (dst, toDst)) { /* - * Send error request to the error source + * Found a route the dst, construct the source route option header */ - NS_LOG_DEBUG ("Send error packet to the error source"); + DsrOptionSRHeader sourceRoute; + std::vector ip = toDst.GetVector (); + sourceRoute.SetNodesAddress (ip); + if (m_routeCache->IsLinkCache ()) + { + m_routeCache->UseExtends (ip); + } + sourceRoute.SetSegmentsLeft ((ip.size () - 2)); + sourceRoute.SetSalvage (salvage); + Ipv4Address nextHop = SearchNextHop (m_mainAddress, ip); // Get the next hop address + NS_LOG_DEBUG ("The nextHop address " << nextHop); + Ptr packet = Create (); + if (nextHop == "0.0.0.0") + { + NS_LOG_DEBUG ("Error next hop address"); + PacketNewRoute (packet, m_mainAddress, dst, protocol); + return; + } + SetRoute (nextHop, m_mainAddress); + CancelRreqTimer (dst, true); + SendPacketFromBuffer (sourceRoute, nextHop, protocol); + NS_LOG_LOGIC ("Route to " << dst << " found"); + return; + } + else + { + NS_LOG_INFO ("No route found, initiate route error request"); + Ptr packet = Create (); + Ipv4Address unreachAddress = rerr.GetUnreachNode (); + Ipv4Address originalDst = rerr.GetOriginalDst (); + // Create an empty route ptr + Ptr route = 0; + /* + * Construct the route request option header + */ + DsrRoutingHeader dsrRoutingHeader; + dsrRoutingHeader.SetNextHeader (protocol); + dsrRoutingHeader.SetMessageType (1); + dsrRoutingHeader.SetSourceId (GetIDfromIP (m_mainAddress)); + dsrRoutingHeader.SetDestId (255); + Ptr dstP = Create (); DsrOptionRreqHeader rreqHeader; // has an alignment of 4n+0 rreqHeader.AddNodeAddress (m_mainAddress); // Add our own address in the header - rreqHeader.SetTarget (destination); - m_requestId = m_rreqTable->CheckUniqueRreqId (destination); // Check the Id cache for duplicate ones + rreqHeader.SetTarget (originalDst); + m_requestId = m_rreqTable->CheckUniqueRreqId (originalDst); // Check the Id cache for duplicate ones rreqHeader.SetId (m_requestId); - // This function will increase the request count if found the entry, will create the entry if not found - m_rreqTable->FindAndUpdate (destination); dsrRoutingHeader.AddDsrOption (rreqHeader); // Add the rreqHeader to the dsr extension header dsrRoutingHeader.AddDsrOption (rerr); uint8_t length = rreqHeader.GetLength () + rerr.GetLength (); - dsrRoutingHeader.SetPayloadLength (length + 4); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 4); dstP->AddHeader (dsrRoutingHeader); // Schedule the route requests retry, propagate the route request message as it contains error bool nonProp = false; - if ((m_addressReqTimer.find (destination) == m_addressReqTimer.end ()) && (m_nonPropReqTimer.find (destination) == m_nonPropReqTimer.end ())) - { - NS_LOG_DEBUG ("Only when there is no existing route request time when this one is triggered"); - ScheduleRreqRetry (dstP, m_mainAddress, destination, nonProp, protocol); - } - } - else - { + std::vector address; + address.push_back (m_mainAddress); + address.push_back (originalDst); /* - * Send error request to the unreachable node + * Add the socket ip ttl tag to the packet to limit the scope of route requests */ - DsrOptionRreqHeader rreqHeader; // has an alignment of 4n+0 - rreqHeader.AddNodeAddress (m_mainAddress); // Add our own address in the header - rreqHeader.SetTarget (unreachAddress); - m_requestId = m_rreqTable->CheckUniqueRreqId (unreachAddress); // Check the Id cache for duplicate ones - rreqHeader.SetId (m_requestId); - // This function will increase the request count if found the entry, will create the entry if not found - m_rreqTable->FindAndUpdate (unreachAddress); + SocketIpTtlTag tag; + tag.SetTtl ((uint8_t)m_discoveryHopLimit); + Ptr propPacket = dstP->Copy (); + propPacket->AddPacketTag (tag); - dsrRoutingHeader.AddDsrOption (rreqHeader); // Add the rreqHeader to the dsr extension header - dsrRoutingHeader.AddDsrOption (rerr); - uint8_t length = rreqHeader.GetLength () + rerr.GetLength (); - dsrRoutingHeader.SetPayloadLength (length + 4); - packet->AddHeader (dsrRoutingHeader); - // Schedule the route requests retry, propagate the route request message as it contains error - bool nonProp = false; - if ((m_addressReqTimer.find (unreachAddress) == m_addressReqTimer.end ()) && (m_nonPropReqTimer.find (unreachAddress) == m_nonPropReqTimer.end ())) + if ((m_addressReqTimer.find (originalDst) == m_addressReqTimer.end ()) && (m_nonPropReqTimer.find (originalDst) == m_nonPropReqTimer.end ())) + { + NS_LOG_INFO ("Only when there is no existing route request time when the initial route request is scheduled"); + SendRequest (propPacket, m_mainAddress); + ScheduleRreqRetry (dstP, address, nonProp, m_requestId, protocol); + } + else { - NS_LOG_DEBUG ("Only when there is no existing route request time when this one is triggered"); - ScheduleRreqRetry (packet, m_mainAddress, unreachAddress, nonProp, protocol); + NS_LOG_INFO ("There is existing route request, find the existing route request entry"); + /* + * Cancel the route request timer first before scheduling the route request + * in this case, we do not want to remove the route request entry, so the isRemove value is false + */ + CancelRreqTimer (originalDst, false); + ScheduleRreqRetry (dstP, address, nonProp, m_requestId, protocol); } } } void -DsrRouting::CancelRreqTimer (Ipv4Address dst) +DsrRouting::CancelRreqTimer (Ipv4Address dst, bool isRemove) { - NS_LOG_FUNCTION (this << dst); + NS_LOG_FUNCTION (this << dst << isRemove); // Cancel the non propagation request timer if found if (m_nonPropReqTimer.find (dst) == m_nonPropReqTimer.end ()) { @@ -2064,35 +2554,37 @@ NS_LOG_DEBUG ("Timer not canceled"); } m_addressReqTimer.erase (dst); - - // remove the route request entry from route request table - m_rreqTable->RemoveRreqEntry (dst); + /* + * If the route request is scheduled to remove the route request entry + * Remove the route request entry with the route retry times done for certain destination + */ + if (isRemove) + { + // remove the route request entry from route request table + m_rreqTable->RemoveRreqEntry (dst); + } } void -DsrRouting::ScheduleRreqRetry (Ptr packet, Ipv4Address source, Ipv4Address dst, bool nonProp, uint8_t protocol) +DsrRouting::ScheduleRreqRetry (Ptr packet, std::vector address, bool nonProp, uint32_t requestId, uint8_t protocol) { - NS_LOG_FUNCTION (this << packet << source << dst << nonProp << (uint32_t)protocol); + NS_LOG_FUNCTION (this << packet << nonProp << requestId << (uint32_t)protocol); + Ipv4Address source = address[0]; + Ipv4Address dst = address[1]; if (nonProp) { - nonProp = false; + // The nonProp route request is only sent out only and is already used if (m_nonPropReqTimer.find (dst) == m_nonPropReqTimer.end ()) { Timer timer (Timer::CANCEL_ON_DESTROY); m_nonPropReqTimer[dst] = timer; } - /* - * Add the socket ip ttl tag to the packet to limit the scope of route requests - */ - SocketIpTtlTag tag; - tag.SetTtl (0); - Ptr nonPropPacket = packet->Copy (); - nonPropPacket->AddPacketTag (tag); - SendRequest (nonPropPacket, source); - NS_LOG_DEBUG ("Check the route request entry3 " << source << " " << dst); - m_nonPropReqTimer[dst].SetFunction (&DsrRouting::ScheduleRreqRetry, this); + std::vector address; + address.push_back (source); + address.push_back (dst); + m_nonPropReqTimer[dst].SetFunction (&DsrRouting::RouteRequestTimerExpire, this); m_nonPropReqTimer[dst].Remove (); - m_nonPropReqTimer[dst].SetArguments (packet, source, dst, nonProp, protocol); + m_nonPropReqTimer[dst].SetArguments (packet, address, requestId, protocol); m_nonPropReqTimer[dst].Schedule (m_nonpropRequestTimeout); } else @@ -2105,43 +2597,57 @@ NS_LOG_DEBUG ("Timer not canceled"); } m_nonPropReqTimer.erase (dst); - /* - * Add the socket ip ttl tag to the packet to limit the scope of route requests - */ - SocketIpTtlTag tag; - tag.SetTtl (m_discoveryHopLimit); - packet->AddPacketTag (tag); + if (m_addressReqTimer.find (dst) == m_addressReqTimer.end ()) { Timer timer (Timer::CANCEL_ON_DESTROY); m_addressReqTimer[dst] = timer; } + std::vector address; + address.push_back (source); + address.push_back (dst); m_addressReqTimer[dst].SetFunction (&DsrRouting::RouteRequestTimerExpire, this); m_addressReqTimer[dst].Remove (); - m_addressReqTimer[dst].SetArguments (packet, source, dst, protocol); - // Increase the request count - m_rreqTable->FindAndUpdate (dst); + m_addressReqTimer[dst].SetArguments (packet, address, requestId, protocol); + Time rreqDelay; // back off mechanism for sending route requests - Time rreqDelay = Time (pow (m_rreqTable->GetRreqCnt (dst), 2) * m_requestPeriod); + if (m_rreqTable->GetRreqCnt (dst)) + { + // When the route request count is larger than 0 + rreqDelay = Time (pow (m_rreqTable->GetRreqCnt (dst), 2) * m_requestPeriod); + } + else + { + // This is the first route request retry + rreqDelay = m_requestPeriod; + } NS_LOG_DEBUG ("The request count for the destination " << dst << " " << m_rreqTable->GetRreqCnt (dst) << " with time value " << rreqDelay); if (rreqDelay > m_maxRequestPeriod) { // use the max request period - NS_LOG_DEBUG ("The max request delay time " << m_maxRequestPeriod.GetSeconds ()); + NS_LOG_DEBUG ("The max request delay time " << m_maxRequestPeriod.GetSeconds()); m_addressReqTimer[dst].Schedule (m_maxRequestPeriod); } else { - NS_LOG_DEBUG ("The request delay time " << rreqDelay.GetSeconds ()); + NS_LOG_DEBUG ("The request delay time " << rreqDelay.GetSeconds()); m_addressReqTimer[dst].Schedule (rreqDelay); } + } } void -DsrRouting::RouteRequestTimerExpire (Ptr packet, Ipv4Address source, Ipv4Address dst, uint8_t protocol) +DsrRouting::RouteRequestTimerExpire (Ptr packet, std::vector address, uint32_t requestId, uint8_t protocol) { - NS_LOG_FUNCTION (this << packet << source << dst << (uint32_t)protocol); + NS_LOG_FUNCTION (this << packet << requestId << (uint32_t)protocol); + // Get a clean packet without dsr header + Ptr dsrP = packet->Copy (); + DsrRoutingHeader dsrRoutingHeader; + dsrP->RemoveHeader (dsrRoutingHeader); // Remove the dsr header in whole + + Ipv4Address source = address[0]; + Ipv4Address dst = address[1]; RouteCacheEntry toDst; if (m_routeCache->LookupRoute (dst, toDst)) { @@ -2150,7 +2656,6 @@ */ DsrOptionSRHeader sourceRoute; std::vector ip = toDst.GetVector (); -// PrintVector (ip); sourceRoute.SetNodesAddress (ip); if (m_routeCache->IsLinkCache ()) { @@ -2163,11 +2668,13 @@ NS_LOG_DEBUG ("The nextHop address " << nextHop); if (nextHop == "0.0.0.0") { + NS_LOG_DEBUG ("Error next hop address"); + PacketNewRoute (dsrP, source, dst, protocol); return; } SetRoute (nextHop, m_mainAddress); - CancelRreqTimer (dst); - SendPacket (sourceRoute, nextHop, protocol); + CancelRreqTimer (dst, true); + SendPacketFromBuffer (sourceRoute, nextHop, protocol); NS_LOG_LOGIC ("Route to " << dst << " found"); return; } @@ -2180,15 +2687,21 @@ if (m_rreqTable->GetRreqCnt (dst) >= m_rreqRetries) { NS_LOG_LOGIC ("Route discovery to " << dst << " has been attempted " << m_rreqRetries << " times"); - CancelRreqTimer (dst); + CancelRreqTimer (dst, true); NS_LOG_DEBUG ("Route not found. Drop packet with dst " << dst); m_sendBuffer.DropPacketWithDst (dst); } else { - SendRequest (packet, source); - NS_LOG_DEBUG ("Check the route request entry1 " << source << " " << dst); - ScheduleRreqRetry (packet, source, dst, false, protocol); + SocketIpTtlTag tag; + tag.SetTtl ((uint8_t)m_discoveryHopLimit); + Ptr propPacket = packet->Copy (); + propPacket->AddPacketTag (tag); + // Increase the request count + m_rreqTable->FindAndUpdate (dst); + SendRequest (propPacket, source); + NS_LOG_DEBUG ("Check the route request entry " << source << " " << dst); + ScheduleRreqRetry (packet, address, false, requestId, protocol); } return; } @@ -2202,7 +2715,21 @@ /* * The destination address here is directed broadcast address */ - m_downTarget (packet, source, m_broadcast, GetProtocolNumber (), 0); + uint32_t priority = GetPriority (DSR_CONTROL_PACKET); + std::map >::iterator i = m_priorityQueue.find (priority); + Ptr dsrNetworkQueue = i->second; + NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority); + + DsrNetworkQueueEntry newEntry (packet, source, m_broadcast, Simulator::Now (), 0); + + if (dsrNetworkQueue->Enqueue (newEntry)) + { + Scheduler (priority); + } + else + { + NS_LOG_INFO ("Packet dropped as dsr network queue is full"); + } } void @@ -2210,7 +2737,7 @@ { NS_LOG_FUNCTION (this << packet); /* - * this is a forwarding case when sending route requests, a random delay time [0, m_broadcastJitter] + * This is a forwarding case when sending route requests, a random delay time [0, m_broadcastJitter] * used before forwarding as link-layer broadcast */ Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0, m_broadcastJitter)), &DsrRouting::SendRequest, this, @@ -2233,7 +2760,6 @@ /** * Push back the node addresses other than those between srcAddress and our own ip address */ -// PrintVector (nodeList); std::vector::iterator before = find (nodeList.begin (), nodeList.end (), srcAddress); for (std::vector::iterator i = nodeList.begin (); i != before; ++i) { @@ -2245,7 +2771,6 @@ { m_finalRoute.push_back (*j); } -// PrintVector (m_finalRoute); DsrOptionRrepHeader rrep; rrep.SetNodesAddress (m_finalRoute); // Set the node addresses in the route reply header // Get the real reply source and destination @@ -2265,7 +2790,7 @@ dsrRoutingHeader.SetDestId (GetIDfromIP (replyDst)); uint8_t length = rrep.GetLength (); // Get the length of the rrep header excluding the type header - dsrRoutingHeader.SetPayloadLength (length + 2); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2); dsrRoutingHeader.AddDsrOption (rrep); Ptr newPacket = Create (); newPacket->AddHeader (dsrRoutingHeader); @@ -2292,7 +2817,22 @@ Ptr dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (m_mainAddress)); route->SetOutputDevice (dev); NS_LOG_INFO ("The output device " << dev << " packet is: " << *packet); - m_downTarget (packet, source, nextHop, GetProtocolNumber (), route); + + uint32_t priority = GetPriority (DSR_CONTROL_PACKET); + std::map >::iterator i = m_priorityQueue.find (priority); + Ptr dsrNetworkQueue = i->second; + NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority); + + DsrNetworkQueueEntry newEntry (packet, source, nextHop, Simulator::Now (), route); + + if (dsrNetworkQueue->Enqueue (newEntry)) + { + Scheduler (priority); + } + else + { + NS_LOG_INFO ("Packet dropped as dsr network queue is full"); + } } void @@ -2311,7 +2851,7 @@ Ipv4Address source, Ipv4Address destination, Ptr route, - uint16_t hops) + double hops) { NS_LOG_FUNCTION (this << packet << source << destination); Simulator::Schedule (Time (2 * m_nodeTraversalTime * (hops - 1 + UniformVariable ().GetValue (0,1))), &DsrRouting::SendReply, this, packet, source, destination, route); @@ -2344,7 +2884,7 @@ ack.SetRealDst (realDst); uint8_t length = ack.GetLength (); - dsrRoutingHeader.SetPayloadLength (length + 2); + dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2); dsrRoutingHeader.AddDsrOption (ack); Ptr packet = Create (); @@ -2352,7 +2892,22 @@ Ptr dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress)); route->SetOutputDevice (dev); NS_LOG_DEBUG ("Send out the ACK"); - m_downTarget (packet, m_mainAddress, destination, GetProtocolNumber (), route); + + uint32_t priority = GetPriority (DSR_CONTROL_PACKET); + std::map >::iterator i = m_priorityQueue.find (priority); + Ptr dsrNetworkQueue = i->second; + NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority); + + DsrNetworkQueueEntry newEntry (packet, m_mainAddress, destination, Simulator::Now (), route); + + if (dsrNetworkQueue->Enqueue (newEntry)) + { + Scheduler (priority); + } + else + { + NS_LOG_INFO ("Packet dropped as dsr network queue is full"); + } } enum Ipv4L4Protocol::RxStatus @@ -2374,12 +2929,11 @@ uint8_t protocol = dsrRoutingHeader.GetNextHeader (); uint32_t sourceId = dsrRoutingHeader.GetSourceId (); Ipv4Address source = GetIPfromID (sourceId); - NS_LOG_DEBUG ("The source address " << source); + NS_LOG_DEBUG ("The source address " << source << " with source id " << sourceId); /* * Get the IP source and destination address */ Ipv4Address src = ip.GetSource (); - Ipv4Address dst = ip.GetDestination (); bool isPromisc = false; uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset (); // Get the offset for option header, 8 bytes in this case @@ -2401,7 +2955,7 @@ uint8_t segmentsLeft = 0; optionType = *(data); - NS_LOG_LOGIC ("The option type value " << (uint32_t)optionType); + NS_LOG_LOGIC ("The option type value " << (uint32_t)optionType << " with packet size " << p->GetSize()); dsrOption = GetOption (optionType); // Get the relative dsr option and demux to the process function if (optionType == 1) // This is the request option @@ -2478,9 +3032,9 @@ } else { - if (segmentsLeft != 0) + if (segmentsLeft == 0) { - // / get the next header + // / Get the next header uint8_t nextHeader = dsrRoutingHeader.GetNextHeader (); Ptr l3proto = m_node->GetObject (); Ptr nextProto = l3proto->GetProtocol (nextHeader); @@ -2489,6 +3043,7 @@ // we need to make a copy in the unlikely event we hit the // RX_ENDPOINT_UNREACH code path // Here we can use the packet that has been get off whole DSR header + NS_LOG_DEBUG ("The packet size here " << copy->GetSize()); NS_LOG_DEBUG ("The packet received " << *copy); enum Ipv4L4Protocol::RxStatus status = nextProto->Receive (copy, ip, incomingInterface); @@ -2502,16 +3057,20 @@ case Ipv4L4Protocol::RX_CSUM_FAILED: break; case Ipv4L4Protocol::RX_ENDPOINT_UNREACH: - if (ip.GetDestination ().IsBroadcast () == true - || ip.GetDestination ().IsMulticast () == true) - { - break; // Do not reply to broadcast or multicast - } + if (ip.GetDestination ().IsBroadcast () == true + || ip.GetDestination ().IsMulticast () == true) + { + break; // Do not reply to broadcast or multicast + } + // Another case to suppress ICMP is a subnet-directed broadcast } - // Another case to suppress ICMP is a subnet-directed broadcast - return status; + return status; } } + else + { + NS_LOG_INFO ("This is not the final destination, the packet has already been forward to next hop"); + } } } else @@ -2535,7 +3094,7 @@ */ // SendError (rerrUnsupportHeader, 0, protocol); // Send the error packet } - return Ipv4L4Protocol::RX_ENDPOINT_UNREACH; + return Ipv4L4Protocol::RX_OK; } void diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-routing.h --- a/src/dsr/model/dsr-routing.h Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-routing.h Sun May 06 20:52:24 2012 -0700 @@ -62,12 +62,14 @@ #include "ns3/event-garbage-collector.h" #include "ns3/test.h" +#include "dsr-network-queue.h" #include "dsr-rcache.h" #include "dsr-rreq-table.h" #include "dsr-maintain-buff.h" #include "dsr-option-header.h" #include "dsr-fs-header.h" #include "dsr-rsendbuff.h" +#include "dsr-errorbuff.h" #include "dsr-gratuitous-reply-table.h" namespace ns3 { @@ -138,16 +140,28 @@ * \return the request table */ Ptr GetRequestTable () const; + + ///\functions used to direct to route cache + //\{ + bool IsLinkCache (); + void UseExtends (RouteCacheEntry::IP_VECTOR rt); + bool LookupRoute (Ipv4Address id, RouteCacheEntry & rt); + bool AddRoute_Link (RouteCacheEntry::IP_VECTOR nodelist, Ipv4Address source); + bool AddRoute (RouteCacheEntry & rt); + void DeleteAllRoutesIncludeLink (Ipv4Address errorSrc, Ipv4Address unreachNode, Ipv4Address node); + bool UpdateRouteEntry (Ipv4Address dst); + //\} + /** * \brief Get the node id from ip address. * \return the node id */ - uint32_t GetIDfromIP (Ipv4Address address); + uint16_t GetIDfromIP (Ipv4Address address); /** * \brief Get the ip address from id. * \return the ip address for the id */ - Ipv4Address GetIPfromID (uint32_t id); + Ipv4Address GetIPfromID (uint16_t id); /** * \brief Get the Ip address from mac address. * \return the ip address @@ -163,10 +177,6 @@ */ Ipv4Address SearchNextHop (Ipv4Address ipv4Address, std::vector& vec); /** - * \brief Cut the route before our own ip address - */ - void CutRoute (Ipv4Address ourAdd, std::vector& nodeList); - /** * \brief Get the dsr protocol number. * \return protocol number */ @@ -193,9 +203,14 @@ */ Ptr SetRoute (Ipv4Address nextHop, Ipv4Address srcAddress); /* + * \brief Set the priority of the packet in network queue + * \return the priority value + */ + uint32_t GetPriority (DsrMessageType messageType); + /* * \brief This function is responsible for sending error packets in case of break link to next hop */ - void SendUnreachError (Ipv4Address errorHop, Ipv4Address destination, uint8_t salvage, uint8_t protocol); + void SendUnreachError (Ipv4Address errorHop, Ipv4Address destination, Ipv4Address originalDst, uint8_t salvage, uint8_t protocol); /* * \brief This function is responsible for forwarding error packets along the route */ @@ -210,17 +225,40 @@ void Send (Ptr packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol, Ptr route); /* + * \brief This function is called to add ack request header for network acknowledgement + */ + uint16_t AddAckReqHeader (Ptr &packet, Ipv4Address nextHop); + /* + * \brief This function is called by when really sending out the packet + */ + void SendPacket (Ptr packet, Ipv4Address source, Ipv4Address nextHop, uint8_t protocol); + /* + * \brief This function is called to schedule sending packets from the network queue + */ + void Scheduler (uint32_t priority); + /* + * \brief This function is called to schedule sending packets from the network queue by priority + */ + void PriorityScheduler (uint32_t priority, bool continueWithFirst); + /* + * \brief This function is called to increase the retransmission timer for data packet in the network queue + */ + void IncreaseRetransTimer (); + /* + * \brief This function is called to send packets down stack + */ + bool SendRealDown (DsrNetworkQueueEntry & newEntry); + /* * This function is responsible for sending out data packets when have route, if no route found, it will * cache the packet and send out route requests */ - void SendPacket (DsrOptionSRHeader const &sourceRoute, - Ipv4Address nextHop, - uint8_t protocol); + void SendPacketFromBuffer (DsrOptionSRHeader const &sourceRoute, + Ipv4Address nextHop, + uint8_t protocol); /* * \brief Find the similar entries in the maintenance buffer */ - bool FindSamePackets (Ptr packet, Ipv4Header const& ipv4Header, Ipv4Address source, Ipv4Address destination, - uint8_t segsLeft); + bool FindSamePackets (Ptr packet, Ipv4Address source, Ipv4Address destination, uint8_t segsLeft); /* * Call the cancel packet retransmission timer function */ @@ -242,22 +280,28 @@ */ void SalvagePacket (Ptr packet, Ipv4Address source, Ipv4Address dst, uint8_t protocol); /* - * Add ack request header to the data packet when need to use network acknowledgment + * Schedule the packet retransmission when the packet has not reached to the next hop address */ - void AddAckReqHeader (Ptr packet, DsrOptionSRHeader const &sourceRoute, Ipv4Address nextHop); + void SchedulePassivePacketRetry (MaintainBuffEntry & mb, + bool onlyPassive, + uint8_t protocol); /* * Schedule the packet retransmission when the packet has not reached to the next hop address */ - void SchedulePacketRetry (MaintainBuffEntry & mb, - PacketKey const & packetKey, - uint8_t protocol); + void ScheduleNetworkPacketRetry (MaintainBuffEntry & mb, + bool isFirst, + uint8_t protocol); /* * This function deals with packet retransmission timer expire */ - void PacketScheduleTimerExpire (MaintainBuffEntry & mb, - PacketKey const & pk, - uint8_t protocol, - bool isPassive); + void NetworkScheduleTimerExpire (MaintainBuffEntry & mb, + uint8_t protocol); + /* + * This function deals with packet retransmission timer expire + */ + void PassiveScheduleTimerExpire (MaintainBuffEntry & mb, + bool onlyPassive, + uint8_t protocol); /* * Forward the packet using the route saved in the source route option header */ @@ -335,7 +379,7 @@ Ipv4Address source, Ipv4Address destination, Ptr route, - uint16_t hops); + double hops); /* * Send network layer acknowledgment back to the earlier hop to notify the receipt of data packet */ @@ -394,15 +438,16 @@ /** * \brief Cancel the route request timer. * \param dst The dst address of the route request timer + * \param isRemove whether to remove the route request entry or not */ - void CancelRreqTimer (Ipv4Address dst); + void CancelRreqTimer (Ipv4Address dst, bool isRemove); /** * \brief Schedule the route request retry. * \param dst The dst address of the route request */ - void ScheduleRreqRetry (Ptr packet, Ipv4Address source, Ipv4Address dst, bool nonProp, uint8_t protocol); + void ScheduleRreqRetry (Ptr packet, std::vector address, bool nonProp, uint32_t requestId, uint8_t protocol); // / Handle route discovery timer - void RouteRequestTimerExpire (Ptr packet, Ipv4Address source, Ipv4Address dst, uint8_t protocol); + void RouteRequestTimerExpire (Ptr packet, std::vector address, uint32_t requestId, uint8_t protocol); protected: /* @@ -454,7 +499,11 @@ Ipv4L4Protocol::DownTargetCallback m_downTarget; // The callback for down layer - uint8_t m_discoveryHopLimit; // / Maximum hops to go for route request + uint32_t m_maxNetworkSize; // / Maximum network queue size + + Time m_maxNetworkDelay; // / Maximum network delay + + uint32_t m_discoveryHopLimit; // / Maximum hops to go for route request uint8_t m_maxSalvageCount; // / Maximum # times to salvage a packet @@ -462,7 +511,9 @@ Time m_nonpropRequestTimeout; // / The non-propagation request timeout - uint32_t m_sendRetries; // / # of retries have been sent for data packet + uint32_t m_sendRetries; // / # of retries have been sent for network acknowledgment + + uint32_t m_passiveRetries; // / # of retries have been sent for passive acknowledgment uint32_t m_rreqRetries; // /< Maximum number of retransmissions of RREQ with TTL = NetDiameter to discover a route @@ -476,6 +527,8 @@ SendBuffer m_sendBuffer; // / The send buffer + ErrorBuffer m_errorBuffer; // / The error buffer to save the error messages + uint32_t m_maxMaintainLen; // / Max # of entries for maintainance buffer Time m_maxMaintainTime; // / Time out for maintainance buffer @@ -490,7 +543,7 @@ MaintainBuffer m_maintainBuffer; // / The declaration of maintain buffer - uint16_t m_requestId; // / The id assigned to each route request + uint32_t m_requestId; // / The id assigned to each route request uint16_t m_ackId; // / The ack id assigned to each acknowledge @@ -504,7 +557,7 @@ Ipv4Address m_broadcast; // / The broadcast IP address - uint16_t m_broadcastJitter; // / The max time to delay route request broadcast. + uint32_t m_broadcastJitter; // / The max time to delay route request broadcast. Time m_passiveAckTimeout; // / The timeout value for passive acknowledge @@ -522,42 +575,51 @@ std::string m_cacheType; // / The type of route cache - double m_stabilityDecrFactor; // / The initial decrease factor for link cache + std::string m_routeSortType; // / The type of route sort methods - double m_stabilityIncrFactor; // / The initial increase factor for link cache + uint64_t m_stabilityDecrFactor; // / The initial decrease factor for link cache + + uint64_t m_stabilityIncrFactor; // / The initial increase factor for link cache - double m_initStability; // / The initial stability value for link cache + Time m_initStability; // / The initial stability value for link cache - double m_minLifeTime; // / The min life time + Time m_minLifeTime; // / The min life time - double m_useExtends; // / The use extension of the life time for link cache + Time m_useExtends; // / The use extension of the life time for link cache bool m_subRoute; // / Whether to save sub route or not - std::vector m_finalRoute; // / The route cache + Time m_retransIncr; // / the increase time for retransmission timer when face network congestion + + std::vector m_finalRoute; // / The route cache std::map m_addressReqTimer; // / Map IP address + RREQ timer. std::map m_nonPropReqTimer; // / Map IP address + RREQ timer. - std::map m_addressForwardTimer; // / Map packet key + forward timer. + std::map m_addressForwardTimer; // / Map network key + forward timer. + + std::map m_addressForwardCnt; // / Map network key + forward counts. - std::map m_addressForwardCnt; // / Map packet key + forward counts. + std::map m_passiveCnt; // / Map packet key + passive forward counts. - std::map m_passiveAckTimer; // / The timer for passive acknowledgment + std::map m_passiveAckTimer; // / The timer for passive acknowledgment Ptr m_routeCache; // / A "drop-front" queue used by the routing layer to cache routes found. Ptr m_rreqTable; // / A "drop-front" queue used by the routing layer to cache route request sent. + uint32_t m_numPriorityQueues; + + std::map > m_priorityQueue; // / priority queueus + GraReply m_graReply; // / The gratuitous route reply. std::vector m_clearList; // / The node that is clear to send packet to - uint32_t m_newPacketSize; // / The packet size of a newly created packet - std::vector m_addresses; // / The bind ipv4 addresses with next hop, src, destination address in sequence }; } /* namespace dsr */ } /* namespace ns3 */ + #endif /* DSR_ROUTING_H */ diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-rreq-table.cc --- a/src/dsr/model/dsr-rreq-table.cc Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-rreq-table.cc Sun May 06 20:52:24 2012 -0700 @@ -67,7 +67,7 @@ Ipv4Address firstExpire; Time max = Seconds (0.0); for (std::map::const_iterator i = - rreqDstMap.begin (); i != rreqDstMap.end (); ++i) + rreqDstMap.begin (); i != rreqDstMap.end (); ++i) { Ipv4Address dst = i->first; RreqTableEntry rreqTableEntry = i->second; @@ -83,33 +83,33 @@ void RreqTable::FindAndUpdate (Ipv4Address dst) { - NS_LOG_LOGIC ("Find and update the route request entry for " << dst); + NS_LOG_FUNCTION (this << dst); std::map::const_iterator i = m_rreqDstMap.find (dst); if (i == m_rreqDstMap.end ()) { - NS_LOG_DEBUG ("The request table entry not found"); + NS_LOG_DEBUG ("The request table entry for " << dst << " not found"); /* * Drop the most aged packet when buffer reaches to max */ if (m_rreqDstMap.size () >= m_requestTableSize) { RemoveLeastExpire (m_rreqDstMap); - NS_LOG_DEBUG ("The request table size after erase "); + NS_LOG_DEBUG ("The request table size after erase " << (uint32_t)m_rreqDstMap.size ()); } RreqTableEntry rreqTableEntry; - rreqTableEntry.m_reqNo = 0; - rreqTableEntry.m_expire = Simulator::Now (); + rreqTableEntry.m_reqNo = 1; + rreqTableEntry.m_expire = Simulator::Now(); m_rreqDstMap [dst] = rreqTableEntry; } else { - NS_LOG_DEBUG ("Find the request table entry, increment the request count"); + NS_LOG_INFO ("Find the request table entry for " << dst << ", increment the request count"); Ipv4Address dst = i->first; RreqTableEntry rreqTableEntry = i->second; NS_LOG_DEBUG ("The request count before incrementing " << rreqTableEntry.m_reqNo); rreqTableEntry.m_reqNo = (rreqTableEntry.m_reqNo + 1); - rreqTableEntry.m_expire = Simulator::Now (); + rreqTableEntry.m_expire = Simulator::Now(); m_rreqDstMap [dst] = rreqTableEntry; } } @@ -117,6 +117,7 @@ void RreqTable::RemoveRreqEntry (Ipv4Address dst) { + NS_LOG_FUNCTION (this << dst); NS_LOG_DEBUG ("Remove rreq entry with index dst"); std::map::const_iterator i = m_rreqDstMap.find (dst); @@ -131,16 +132,15 @@ } } -uint16_t +uint32_t RreqTable::GetRreqCnt (Ipv4Address dst) { - NS_LOG_DEBUG ("Get the request count for a certain dst"); + NS_LOG_FUNCTION (this << dst); std::map::const_iterator i = m_rreqDstMap.find (dst); if (i == m_rreqDstMap.end ()) { NS_LOG_DEBUG ("The request table entry not found"); - FindAndUpdate (dst); return 0; } else @@ -153,140 +153,14 @@ // ---------------------------------------------------------------------------------------------------------- /** - * This part takes care of the route request from a specific source - * need to ignore future route requests from same source for same destination with same identification - */ -bool -RreqTable::FindSrc (Ipv4Address source, Ipv4Address target, uint16_t id) -{ - Purge (); - std::map >::const_iterator i = - m_rreqMap.find (source); - if (i == m_rreqMap.end ()) - { - NS_LOG_LOGIC ("No Request entry for " << source << " found"); - SourceRreqEntry sourceRreqEntry; - sourceRreqEntry.m_dst = target; - sourceRreqEntry.m_identification = id; - sourceRreqEntry.m_expire = m_rreqEntryExpire + Simulator::Now (); - NS_LOG_DEBUG ("The src rreq expire time " << sourceRreqEntry.m_expire); - std::list rqVector; - rqVector.push_back (sourceRreqEntry); - m_rreqMap[source] = rqVector; - return false; - } - else - { - NS_LOG_LOGIC ("Request entry for " << source << " found in the cache"); - std::list rqVector = i->second; - for (std::list::iterator j = rqVector.begin (); j != rqVector.end (); ++j) - { - SourceRreqEntry rreqEntry = *j; - if ((rreqEntry.m_dst == target) && (rreqEntry.m_identification == id)) - { - NS_LOG_DEBUG ("Found the request entry for source node with address " << source); -// j = rqVector.erase (j); -// rqVector.push_back(*j); -// m_rreqMap[source] = rqVector; - return true; - } - } - - SourceRreqEntry rreqEntry; - rreqEntry.m_dst = target; - rreqEntry.m_identification = id; - rreqEntry.m_expire = m_rreqEntryExpire + Simulator::Now (); - if (rqVector.size () >= m_requestIdSize) - { - // erase the first element when the size is larger than the request id size (default: 16) - rqVector.pop_front (); - } - // May need to check the size of the entry - rqVector.push_back (rreqEntry); - m_rreqMap[source] = rqVector; - return false; - } - return false; -} - -void -RreqTable::Purge () -{ - //Trying to purge the rreq table - if (m_rreqMap.empty ()) - { - NS_LOG_DEBUG ("The rreq table is empty"); - return; - } - - for (std::map >::iterator i = - m_rreqMap.begin (); i != m_rreqMap.end (); ) - { - // Loop of rreq table entry with the source entries - std::map >::iterator itmp = i; - /* - * The rreq table entries - */ - Ipv4Address dst = i->first; - std::list rqVector = i->second; - NS_LOG_DEBUG ("The rqVector size for " << dst << " is " << rqVector.size ()); - if (rqVector.size ()) - { - for (std::list::iterator j = rqVector.begin (); j != rqVector.end (); ) - { - NS_LOG_DEBUG ("The expire time of every entry with expire time " << j->m_expire - Simulator::Now ()); - /* - * First verify if the rreq table entry has expired or not - */ - if (j->m_expire - Simulator::Now () <= Seconds (0)) - { - /* - * When the expire time has passed, erase the certain rreq table entry - */ - NS_LOG_DEBUG ("Erase the expired rreq table entry for " << dst << " with expire time " << j->m_expire - Simulator::Now ()); - j = rqVector.erase (j); - } - else - { - ++j; - } - } - NS_LOG_DEBUG ("The rreq table entry for " << dst << " " << rqVector.size ()); - if (rqVector.size ()) - { - ++i; - m_rreqMap.erase (itmp); // erase the entry first - /* - * Save the new rreq table entry along with the destination address in map - */ - std::pair >::iterator, bool> result = - m_rreqMap.insert (std::make_pair (dst, rqVector)); - } - else - { - ++i; - m_rreqMap.erase (itmp); - } - } - else - { - ++i; - m_rreqMap.erase (itmp); - } - } - return; -} - -// ---------------------------------------------------------------------------------------------------------- -/** * This part takes care of the route request ID initialized from a specific source to one destination * Essentially a counter */ -uint16_t +uint32_t RreqTable::CheckUniqueRreqId (Ipv4Address dst) { NS_LOG_DEBUG ("The size of id cache " << m_rreqIdCache.size ()); - std::map::const_iterator i = + std::map::const_iterator i = m_rreqIdCache.find (dst); if (i == m_rreqIdCache.end ()) { @@ -297,10 +171,10 @@ else { NS_LOG_LOGIC ("Request id for " << dst << " found in the cache"); - uint16_t rreqId = m_rreqIdCache[dst]; + uint32_t rreqId = m_rreqIdCache[dst]; if (rreqId >= m_maxRreqId) { - NS_LOG_DEBUG ("The request id increase past the max value, so reset it to 0"); + NS_LOG_DEBUG ("The request id increase past the max value, " << m_maxRreqId << " so reset it to 0"); rreqId = 0; m_rreqIdCache[dst] = rreqId; } @@ -314,7 +188,7 @@ } } -uint16_t +uint32_t RreqTable::GetRreqSize () { return m_rreqIdCache.size (); diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-rreq-table.h --- a/src/dsr/model/dsr-rreq-table.h Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-rreq-table.h Sun May 06 20:52:24 2012 -0700 @@ -67,7 +67,7 @@ */ struct RreqTableEntry { - uint16_t m_reqNo; + uint32_t m_reqNo; Time m_expire; }; /* @@ -76,8 +76,9 @@ */ struct SourceRreqEntry { - uint16_t m_identification; + uint32_t m_identification; Ipv4Address m_dst; + bool m_isError; Time m_expire; }; /** @@ -104,11 +105,11 @@ // /\name Fields // \{ - void SetInitHopLimit (uint8_t hl) + void SetInitHopLimit (uint32_t hl) { m_initHopLimit = hl; } - uint8_t GetInitHopLimit () const + uint32_t GetInitHopLimit () const { return m_initHopLimit; } @@ -128,11 +129,11 @@ { return m_requestIdSize; } - void SetUniqueRreqIdSize (uint16_t uid) + void SetUniqueRreqIdSize (uint32_t uid) { m_maxRreqId = uid; } - uint16_t GetUniqueRreqIdSize () const + uint32_t GetUniqueRreqIdSize () const { return m_maxRreqId; } @@ -145,29 +146,16 @@ // / Remove route request entry for dst void RemoveRreqEntry (Ipv4Address dst); // / Get the request count number for one destination address - uint16_t GetRreqCnt (Ipv4Address dst); - - //---------------------------------------------------------------------------------------------------------- - /* - * The following code deals with duplicate request ids - */ - bool FindSrc (Ipv4Address source, Ipv4Address target, uint16_t id); - // / Purge the rreq table - void Purge (); - // / Set the source rreq expire time to the time of max route expire time - void SetRreqExpire (Time expire) - { - m_rreqEntryExpire = expire; - } + uint32_t GetRreqCnt (Ipv4Address dst); //---------------------------------------------------------------------------------------------------------- /* * The following code generates new request id for each destination */ // / Check for duplicate ids and save new entries if the id is not present in the table - uint16_t CheckUniqueRreqId (Ipv4Address dst); + uint32_t CheckUniqueRreqId (Ipv4Address dst); // / Get the request id size - uint16_t GetRreqSize (); + uint32_t GetRreqSize (); // --------------------------------------------------------------------------------------------------------- /* @@ -189,6 +177,7 @@ void PurgeNeighbor (); private: + // / Timer for neighbor's list. Schedule Purge(). Timer m_ntimer; // / The max # of requests to retransmit @@ -202,19 +191,19 @@ // / The source route entry expire time Time m_rreqEntryExpire; // / The initial hop limit - uint8_t m_initHopLimit; + uint32_t m_initHopLimit; // / The request table size uint32_t m_requestTableSize; // / The request source id size uint32_t m_requestIdSize; // / The unique request id for any destination - uint16_t m_maxRreqId; + uint32_t m_maxRreqId; // / The state of the unidirectional link LinkStates m_linkStates; // / Map of entries std::list m_sourceRreq; // / The id cache to ensure all the ids are unique - std::map m_rreqIdCache; + std::map m_rreqIdCache; // / The cache to save route request table entries indexed with destination address std::map m_rreqDstMap; // / The cache to ensure all the route request from unique source diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-rsendbuff.cc --- a/src/dsr/model/dsr-rsendbuff.cc Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-rsendbuff.cc Sun May 06 20:52:24 2012 -0700 @@ -56,7 +56,7 @@ != m_sendBuffer.end (); ++i) { NS_LOG_INFO ("packet id " << i->GetPacket ()->GetUid () << " " << entry.GetPacket ()->GetUid () - << " dst " << i->GetDestination () << " " << entry.GetDestination ()); + << " dst " << i->GetDestination () << " " << entry.GetDestination ()); if ((i->GetPacket ()->GetUid () == entry.GetPacket ()->GetUid ()) && (i->GetDestination () == entry.GetDestination ())) diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/model/dsr-rsendbuff.h --- a/src/dsr/model/dsr-rsendbuff.h Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/model/dsr-rsendbuff.h Sun May 06 20:52:24 2012 -0700 @@ -51,8 +51,7 @@ : m_packet (pa), m_dst (d), m_expire (exp + Simulator::Now ()), - m_protocol (p), - m_errHeader (false) + m_protocol (p) { } /** @@ -97,14 +96,6 @@ { return m_protocol; } - void SetErrHeader (bool e) - { - m_errHeader = e; - } - bool IsErrHeader () const - { - return m_errHeader; - } // \} private: // / Data packet @@ -115,8 +106,6 @@ Time m_expire; // / The protocol number uint8_t m_protocol; - // / bool value to test the error header - bool m_errHeader; }; /** diff -r efad81f3cb47 -r 2da1fab73114 src/dsr/wscript --- a/src/dsr/wscript Fri Jan 27 15:15:48 2012 -0800 +++ b/src/dsr/wscript Sun May 06 20:52:24 2012 -0700 @@ -13,6 +13,8 @@ 'model/dsr-rcache.cc', 'model/dsr-rreq-table.cc', 'model/dsr-gratuitous-reply-table.cc', + 'model/dsr-errorbuff.cc', + 'model/dsr-network-queue.cc', 'helper/dsr-helper.cc', 'helper/dsr-main-helper.cc', ] @@ -34,6 +36,8 @@ 'model/dsr-rcache.h', 'model/dsr-rreq-table.h', 'model/dsr-gratuitous-reply-table.h', + 'model/dsr-errorbuff.h', + 'model/dsr-network-queue.h', 'helper/dsr-helper.h', 'helper/dsr-main-helper.h', ]