|
41 |
#include "ns3/random-variable.h" |
41 |
#include "ns3/random-variable.h" |
42 |
#include "ns3/inet-socket-address.h" |
42 |
#include "ns3/inet-socket-address.h" |
43 |
#include "ns3/ipv4-routing-protocol.h" |
43 |
#include "ns3/ipv4-routing-protocol.h" |
|
|
44 |
#include "ns3/ipv4-routing-table-entry.h" |
44 |
#include "ns3/ipv4-route.h" |
45 |
#include "ns3/ipv4-route.h" |
45 |
#include "ns3/boolean.h" |
46 |
#include "ns3/boolean.h" |
46 |
#include "ns3/uinteger.h" |
47 |
#include "ns3/uinteger.h" |
|
79 |
#define OLSR_DUP_HOLD_TIME Seconds (30) |
80 |
#define OLSR_DUP_HOLD_TIME Seconds (30) |
80 |
/// MID holding time. |
81 |
/// MID holding time. |
81 |
#define OLSR_MID_HOLD_TIME (Scalar (3) * m_midInterval) |
82 |
#define OLSR_MID_HOLD_TIME (Scalar (3) * m_midInterval) |
82 |
|
83 |
/// HNA holding time. |
|
|
84 |
#define OLSR_HNA_HOLD_TIME (Scalar (3) * m_hnaInterval) |
83 |
|
85 |
|
84 |
/********** Link types **********/ |
86 |
/********** Link types **********/ |
85 |
|
87 |
|
|
165 |
TimeValue (Seconds (5)), |
167 |
TimeValue (Seconds (5)), |
166 |
MakeTimeAccessor (&RoutingProtocol::m_midInterval), |
168 |
MakeTimeAccessor (&RoutingProtocol::m_midInterval), |
167 |
MakeTimeChecker ()) |
169 |
MakeTimeChecker ()) |
|
|
170 |
.AddAttribute ("HnaInterval", "HNA messages emission interval. Normally it is equal to TcInterval.", |
171 |
TimeValue (Seconds (5)), |
172 |
MakeTimeAccessor (&RoutingProtocol::m_hnaInterval), |
173 |
MakeTimeChecker ()) |
168 |
.AddAttribute ("Willingness", "Willingness of a node to carry and forward traffic for other nodes.", |
174 |
.AddAttribute ("Willingness", "Willingness of a node to carry and forward traffic for other nodes.", |
169 |
EnumValue (OLSR_WILL_DEFAULT), |
175 |
EnumValue (OLSR_WILL_DEFAULT), |
170 |
MakeEnumAccessor (&RoutingProtocol::m_willingness), |
176 |
MakeEnumAccessor (&RoutingProtocol::m_willingness), |
|
185 |
|
191 |
|
186 |
|
192 |
|
187 |
RoutingProtocol::RoutingProtocol () |
193 |
RoutingProtocol::RoutingProtocol () |
188 |
: m_ipv4 (0), |
194 |
: m_routingTableAssociation (0), |
|
|
195 |
m_ipv4 (0), |
189 |
m_helloTimer (Timer::CANCEL_ON_DESTROY), |
196 |
m_helloTimer (Timer::CANCEL_ON_DESTROY), |
190 |
m_tcTimer (Timer::CANCEL_ON_DESTROY), |
197 |
m_tcTimer (Timer::CANCEL_ON_DESTROY), |
191 |
m_midTimer (Timer::CANCEL_ON_DESTROY), |
198 |
m_midTimer (Timer::CANCEL_ON_DESTROY), |
|
|
199 |
m_hnaTimer (Timer::CANCEL_ON_DESTROY), |
192 |
m_queuedMessagesTimer (Timer::CANCEL_ON_DESTROY) |
200 |
m_queuedMessagesTimer (Timer::CANCEL_ON_DESTROY) |
193 |
{} |
201 |
{ |
|
|
202 |
m_hnaRoutingTable = Create<Ipv4StaticRouting> (); |
203 |
} |
194 |
|
204 |
|
195 |
RoutingProtocol::~RoutingProtocol () |
205 |
RoutingProtocol::~RoutingProtocol () |
196 |
{} |
206 |
{} |
|
204 |
m_helloTimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this); |
214 |
m_helloTimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this); |
205 |
m_tcTimer.SetFunction (&RoutingProtocol::TcTimerExpire, this); |
215 |
m_tcTimer.SetFunction (&RoutingProtocol::TcTimerExpire, this); |
206 |
m_midTimer.SetFunction (&RoutingProtocol::MidTimerExpire, this); |
216 |
m_midTimer.SetFunction (&RoutingProtocol::MidTimerExpire, this); |
|
|
217 |
m_hnaTimer.SetFunction (&RoutingProtocol::HnaTimerExpire, this); |
207 |
m_queuedMessagesTimer.SetFunction (&RoutingProtocol::SendQueuedMessages, this); |
218 |
m_queuedMessagesTimer.SetFunction (&RoutingProtocol::SendQueuedMessages, this); |
208 |
|
219 |
|
209 |
m_packetSequenceNumber = OLSR_MAX_SEQ_NUM; |
220 |
m_packetSequenceNumber = OLSR_MAX_SEQ_NUM; |
|
213 |
m_linkTupleTimerFirstTime = true; |
224 |
m_linkTupleTimerFirstTime = true; |
214 |
|
225 |
|
215 |
m_ipv4 = ipv4; |
226 |
m_ipv4 = ipv4; |
|
|
227 |
|
228 |
m_hnaRoutingTable->SetIpv4 (ipv4); |
216 |
} |
229 |
} |
217 |
|
230 |
|
218 |
void RoutingProtocol::DoDispose () |
231 |
void RoutingProtocol::DoDispose () |
219 |
{ |
232 |
{ |
220 |
m_ipv4 = 0; |
233 |
m_ipv4 = 0; |
|
|
234 |
m_hnaRoutingTable = 0; |
235 |
m_routingTableAssociation = 0; |
221 |
|
236 |
|
222 |
for (std::map< Ptr<Socket>, Ipv4InterfaceAddress >::iterator iter = m_socketAddresses.begin (); |
237 |
for (std::map< Ptr<Socket>, Ipv4InterfaceAddress >::iterator iter = m_socketAddresses.begin (); |
223 |
iter != m_socketAddresses.end (); iter++) |
238 |
iter != m_socketAddresses.end (); iter++) |
|
251 |
NS_LOG_DEBUG ("Starting OLSR on node " << m_mainAddress); |
266 |
NS_LOG_DEBUG ("Starting OLSR on node " << m_mainAddress); |
252 |
|
267 |
|
253 |
Ipv4Address loopback ("127.0.0.1"); |
268 |
Ipv4Address loopback ("127.0.0.1"); |
|
|
269 |
|
270 |
bool canRunOlsr = false; |
254 |
for (uint32_t i = 0; i < m_ipv4->GetNInterfaces (); i++) |
271 |
for (uint32_t i = 0; i < m_ipv4->GetNInterfaces (); i++) |
255 |
{ |
272 |
{ |
256 |
Ipv4Address addr = m_ipv4->GetAddress (i, 0).GetLocal (); |
273 |
Ipv4Address addr = m_ipv4->GetAddress (i, 0).GetLocal (); |
|
269 |
NS_ASSERT (GetMainAddress (addr) == m_mainAddress); |
286 |
NS_ASSERT (GetMainAddress (addr) == m_mainAddress); |
270 |
} |
287 |
} |
271 |
|
288 |
|
|
|
289 |
if(m_interfaceExclusions.find (i) != m_interfaceExclusions.end ()) |
290 |
continue; |
291 |
|
272 |
// Create a socket to listen only on this interface |
292 |
// Create a socket to listen only on this interface |
273 |
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), |
293 |
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), |
274 |
UdpSocketFactory::GetTypeId()); |
294 |
UdpSocketFactory::GetTypeId()); |
|
279 |
} |
299 |
} |
280 |
socket->Connect (InetSocketAddress (Ipv4Address (0xffffffff), OLSR_PORT_NUMBER)); |
300 |
socket->Connect (InetSocketAddress (Ipv4Address (0xffffffff), OLSR_PORT_NUMBER)); |
281 |
m_socketAddresses[socket] = m_ipv4->GetAddress (i, 0); |
301 |
m_socketAddresses[socket] = m_ipv4->GetAddress (i, 0); |
|
|
302 |
|
303 |
canRunOlsr = true; |
282 |
} |
304 |
} |
283 |
|
305 |
|
284 |
HelloTimerExpire (); |
306 |
if(canRunOlsr) |
285 |
TcTimerExpire (); |
307 |
{ |
286 |
MidTimerExpire (); |
308 |
HelloTimerExpire (); |
|
|
309 |
TcTimerExpire (); |
310 |
MidTimerExpire (); |
311 |
HnaTimerExpire (); |
287 |
|
312 |
|
288 |
NS_LOG_DEBUG ("OLSR on node " << m_mainAddress << " started"); |
313 |
NS_LOG_DEBUG ("OLSR on node " << m_mainAddress << " started"); |
|
|
314 |
} |
289 |
} |
315 |
} |
290 |
|
316 |
|
291 |
void RoutingProtocol::SetMainInterface (uint32_t interface) |
317 |
void RoutingProtocol::SetMainInterface (uint32_t interface) |
|
293 |
m_mainAddress = m_ipv4->GetAddress (interface, 0).GetLocal (); |
319 |
m_mainAddress = m_ipv4->GetAddress (interface, 0).GetLocal (); |
294 |
} |
320 |
} |
295 |
|
321 |
|
|
|
322 |
void RoutingProtocol::SetInterfaceExclusions (std::set<uint32_t> exceptions) |
323 |
{ |
324 |
m_interfaceExclusions = exceptions; |
325 |
} |
296 |
|
326 |
|
297 |
// |
327 |
// |
298 |
// \brief Processes an incoming %OLSR packet following RFC 3626 specification. |
328 |
// \brief Processes an incoming %OLSR packet following RFC 3626 specification. |
|
397 |
<< " received MID message of size " << messageHeader.GetSerializedSize ()); |
427 |
<< " received MID message of size " << messageHeader.GetSerializedSize ()); |
398 |
ProcessMid (messageHeader, senderIfaceAddr); |
428 |
ProcessMid (messageHeader, senderIfaceAddr); |
399 |
break; |
429 |
break; |
|
|
430 |
case olsr::MessageHeader::HNA_MESSAGE: |
431 |
NS_LOG_DEBUG (Simulator::Now ().GetSeconds () |
432 |
<< "s OLSR node " << m_mainAddress |
433 |
<< " received HNA message of size " << messageHeader.GetSerializedSize ()); |
434 |
ProcessHna (messageHeader, senderIfaceAddr); |
435 |
break; |
400 |
|
436 |
|
401 |
default: |
437 |
default: |
402 |
NS_LOG_DEBUG ("OLSR message type " << |
438 |
NS_LOG_DEBUG ("OLSR message type " << |
|
1039 |
} |
1075 |
} |
1040 |
} |
1076 |
} |
1041 |
|
1077 |
|
|
|
1078 |
// 5. For each tuple in the association set, |
1079 |
// If there is no entry in the routing table with: |
1080 |
// R_dest_addr == A_network_addr/A_netmask |
1081 |
// then a new routing entry is created. |
1082 |
const AssociationSet &associationSet = m_state.GetAssociationSet (); |
1083 |
for (AssociationSet::const_iterator it = associationSet.begin (); |
1084 |
it != associationSet.end (); it++) |
1085 |
{ |
1086 |
AssociationTuple const &tuple = *it; |
1087 |
RoutingTableEntry gatewayEntry; |
1088 |
|
1089 |
bool gatewayEntryExists = Lookup (tuple.gatewayAddr, gatewayEntry); |
1090 |
bool addRoute = false; |
1091 |
|
1092 |
uint32_t routeIndex = 0; |
1093 |
|
1094 |
for (routeIndex = 0; routeIndex < m_hnaRoutingTable->GetNRoutes (); routeIndex++) |
1095 |
{ |
1096 |
Ipv4RoutingTableEntry route = m_hnaRoutingTable->GetRoute (routeIndex); |
1097 |
if (route.GetDestNetwork () == tuple.networkAddr && |
1098 |
route.GetDestNetworkMask () == tuple.netmask) |
1099 |
{ |
1100 |
break; |
1101 |
} |
1102 |
} |
1103 |
|
1104 |
if (routeIndex == m_hnaRoutingTable->GetNRoutes ()) |
1105 |
{ |
1106 |
addRoute = true; |
1107 |
} |
1108 |
else if(gatewayEntryExists && m_hnaRoutingTable->GetMetric (routeIndex) > gatewayEntry.distance) |
1109 |
{ |
1110 |
m_hnaRoutingTable->RemoveRoute(routeIndex); |
1111 |
addRoute = true; |
1112 |
} |
1113 |
|
1114 |
if(addRoute && gatewayEntryExists) |
1115 |
{ |
1116 |
m_hnaRoutingTable->AddNetworkRouteTo (tuple.networkAddr, |
1117 |
tuple.netmask, |
1118 |
gatewayEntry.nextAddr, |
1119 |
gatewayEntry.interface, |
1120 |
gatewayEntry.distance); |
1121 |
|
1122 |
} |
1123 |
} |
1124 |
|
1042 |
NS_LOG_DEBUG ("Node " << m_mainAddress << ": RoutingTableComputation end."); |
1125 |
NS_LOG_DEBUG ("Node " << m_mainAddress << ": RoutingTableComputation end."); |
1043 |
m_routingTableChanged (GetSize ()); |
1126 |
m_routingTableChanged (GetSize ()); |
1044 |
} |
1127 |
} |
|
1280 |
NS_LOG_DEBUG ("Node " << m_mainAddress << " ProcessMid from " << senderIface << " -> END."); |
1363 |
NS_LOG_DEBUG ("Node " << m_mainAddress << " ProcessMid from " << senderIface << " -> END."); |
1281 |
} |
1364 |
} |
1282 |
|
1365 |
|
|
|
1366 |
/// |
1367 |
/// \brief Processes a HNA message following RFC 3626 specification. |
1368 |
/// |
1369 |
/// The Host Network Association Set is updated (if needed) with the information |
1370 |
/// of the received HNA message. |
1371 |
/// |
1372 |
/// \param msg the %OLSR message which contains the HNA message. |
1373 |
/// \param sender_iface the address of the interface where the message was sent from. |
1374 |
/// |
1375 |
void |
1376 |
RoutingProtocol::ProcessHna (const olsr::MessageHeader &msg, |
1377 |
const Ipv4Address &senderIface) |
1378 |
{ |
1379 |
|
1380 |
const olsr::MessageHeader::Hna &hna = msg.GetHna (); |
1381 |
Time now = Simulator::Now (); |
1382 |
|
1383 |
// 1. If the sender interface of this message is not in the symmetric |
1384 |
// 1-hop neighborhood of this node, the message MUST be discarded. |
1385 |
const LinkTuple *link_tuple = m_state.FindSymLinkTuple (senderIface, now); |
1386 |
if (link_tuple == NULL) |
1387 |
return; |
1388 |
|
1389 |
// 2. Otherwise, for each (network address, netmask) pair in the |
1390 |
// message: |
1391 |
|
1392 |
for (std::vector<olsr::MessageHeader::Hna::Association>::const_iterator it = hna.associations.begin(); |
1393 |
it != hna.associations.end() ; it++) |
1394 |
{ |
1395 |
AssociationTuple *tuple = m_state.FindAssociationTuple(msg.GetOriginatorAddress(),it->address,it->mask); |
1396 |
|
1397 |
// 2.1 if an entry in the association set already exists, where: |
1398 |
// A_gateway_addr == originator address |
1399 |
// A_network_addr == network address |
1400 |
// A_netmask == netmask |
1401 |
// then the holding time for that tuple MUST be set to: |
1402 |
// A_time = current time + validity time |
1403 |
if(tuple != NULL) |
1404 |
{ |
1405 |
tuple->expirationTime = now + msg.GetVTime (); |
1406 |
} |
1407 |
|
1408 |
// 2.2 otherwise, a new tuple MUST be recorded with: |
1409 |
// A_gateway_addr = originator address |
1410 |
// A_network_addr = network address |
1411 |
// A_netmask = netmask |
1412 |
// A_time = current time + validity time |
1413 |
else |
1414 |
{ |
1415 |
const AssociationTuple &assocTuple = (AssociationTuple){msg.GetOriginatorAddress(),it->address,it->mask,now + msg.GetVTime ()}; |
1416 |
|
1417 |
AddAssociationTuple (assocTuple); |
1418 |
|
1419 |
//Schedule Association Tuple deletion |
1420 |
Simulator::Schedule (DELAY (assocTuple.expirationTime), |
1421 |
&RoutingProtocol::AssociationTupleTimerExpire, this, |
1422 |
assocTuple.gatewayAddr,assocTuple.networkAddr,assocTuple.netmask); |
1423 |
} |
1424 |
|
1425 |
} |
1426 |
} |
1283 |
|
1427 |
|
1284 |
/// |
1428 |
/// |
1285 |
/// \brief OLSR's default forwarding algorithm. |
1429 |
/// \brief OLSR's default forwarding algorithm. |
|
1447 |
RoutingProtocol::SendHello () |
1591 |
RoutingProtocol::SendHello () |
1448 |
{ |
1592 |
{ |
1449 |
NS_LOG_FUNCTION (this); |
1593 |
NS_LOG_FUNCTION (this); |
1450 |
|
1594 |
|
1451 |
olsr::MessageHeader msg; |
1595 |
olsr::MessageHeader msg; |
1452 |
Time now = Simulator::Now (); |
1596 |
Time now = Simulator::Now (); |
1453 |
|
1597 |
|
|
1569 |
|
1713 |
|
1570 |
olsr::MessageHeader::Tc &tc = msg.GetTc (); |
1714 |
olsr::MessageHeader::Tc &tc = msg.GetTc (); |
1571 |
tc.ansn = m_ansn; |
1715 |
tc.ansn = m_ansn; |
|
|
1716 |
|
1572 |
for (MprSelectorSet::const_iterator mprsel_tuple = m_state.GetMprSelectors ().begin(); |
1717 |
for (MprSelectorSet::const_iterator mprsel_tuple = m_state.GetMprSelectors ().begin(); |
1573 |
mprsel_tuple != m_state.GetMprSelectors ().end(); mprsel_tuple++) |
1718 |
mprsel_tuple != m_state.GetMprSelectors ().end(); mprsel_tuple++) |
1574 |
{ |
1719 |
{ |
|
1622 |
} |
1767 |
} |
1623 |
|
1768 |
|
1624 |
/// |
1769 |
/// |
|
|
1770 |
/// \brief Creates a new %OLSR HNA message which is buffered for being sent later on. |
1771 |
/// |
1772 |
void |
1773 |
RoutingProtocol::SendHna () |
1774 |
{ |
1775 |
|
1776 |
olsr::MessageHeader msg; |
1777 |
|
1778 |
msg.SetVTime (OLSR_HNA_HOLD_TIME); |
1779 |
msg.SetOriginatorAddress (m_mainAddress); |
1780 |
msg.SetTimeToLive (255); |
1781 |
msg.SetHopCount (0); |
1782 |
msg.SetMessageSequenceNumber (GetMessageSequenceNumber ()); |
1783 |
olsr::MessageHeader::Hna &hna = msg.GetHna (); |
1784 |
|
1785 |
std::vector<olsr::MessageHeader::Hna::Association> |
1786 |
&associations = hna.associations; |
1787 |
|
1788 |
if (m_routingTableAssociation != 0) |
1789 |
{ |
1790 |
// Add (NetworkAddr, Netmask) entries from Associated Routing Table to HNA message. |
1791 |
for (uint32_t i = 0; i < m_routingTableAssociation->GetNRoutes (); i++) |
1792 |
{ |
1793 |
Ipv4RoutingTableEntry route = m_routingTableAssociation->GetRoute (i); |
1794 |
|
1795 |
std::set<uint32_t>::const_iterator ci = m_interfaceExclusions.find (route.GetInterface ()); |
1796 |
|
1797 |
if (ci != m_interfaceExclusions.end ()) |
1798 |
{ |
1799 |
olsr::MessageHeader::Hna::Association assoc = {route.GetDestNetwork (), route.GetDestNetworkMask ()}; |
1800 |
associations.push_back(assoc); |
1801 |
} |
1802 |
} |
1803 |
} |
1804 |
|
1805 |
int size = associations.size (); |
1806 |
|
1807 |
// Add (NetworkAddr, Netmask) entries specified using AddHostNetworkAssociation () to HNA message. |
1808 |
for (Associations::const_iterator it = m_state.GetAssociations ().begin (); |
1809 |
it != m_state.GetAssociations ().end (); it++) |
1810 |
{ |
1811 |
// Check if the entry has already been added from the Associated Routing Table |
1812 |
std::vector<olsr::MessageHeader::Hna::Association>::const_iterator ci = associations.begin (); |
1813 |
bool found = false; |
1814 |
for (int i = 0; i < size; i++) |
1815 |
{ |
1816 |
if (it->networkAddr == ci->address && it->netmask == ci->mask) |
1817 |
{ |
1818 |
found = true; |
1819 |
break; |
1820 |
} |
1821 |
ci++; |
1822 |
} |
1823 |
|
1824 |
if(!found) |
1825 |
{ |
1826 |
olsr::MessageHeader::Hna::Association assoc = {it->networkAddr,it->netmask}; |
1827 |
associations.push_back(assoc); |
1828 |
} |
1829 |
} |
1830 |
|
1831 |
if(associations.size () == 0) |
1832 |
return; |
1833 |
|
1834 |
QueueMessage (msg, JITTER); |
1835 |
} |
1836 |
|
1837 |
/// |
1838 |
/// \brief Injects a (networkAddr, netmask) tuple for which the node |
1839 |
/// can generate an HNA message for |
1840 |
/// |
1841 |
void |
1842 |
RoutingProtocol::AddHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask netmask) |
1843 |
{ |
1844 |
m_state.InsertAssociation ((Association) {networkAddr, netmask}); |
1845 |
} |
1846 |
|
1847 |
/// |
1848 |
/// \brief Adds an Ipv4StaticRouting protocol Association |
1849 |
/// can generate an HNA message for |
1850 |
/// |
1851 |
void |
1852 |
RoutingProtocol::SetRoutingTableAssociation (Ptr<Ipv4StaticRouting> routingTable) |
1853 |
{ |
1854 |
m_routingTableAssociation = routingTable; |
1855 |
} |
1856 |
|
1857 |
/// |
1625 |
/// \brief Updates Link Set according to a new received HELLO message (following RFC 3626 |
1858 |
/// \brief Updates Link Set according to a new received HELLO message (following RFC 3626 |
1626 |
/// specification). Neighbor Set is also updated if needed. |
1859 |
/// specification). Neighbor Set is also updated if needed. |
1627 |
void |
1860 |
void |
|
2301 |
m_state.EraseIfaceAssocTuple (tuple); |
2534 |
m_state.EraseIfaceAssocTuple (tuple); |
2302 |
} |
2535 |
} |
2303 |
|
2536 |
|
|
|
2537 |
/// |
2538 |
/// \brief Adds a host network association tuple to the Association Set. |
2539 |
/// |
2540 |
/// \param tuple the host network association tuple to be added. |
2541 |
/// |
2542 |
void |
2543 |
RoutingProtocol::AddAssociationTuple (const AssociationTuple &tuple) |
2544 |
{ |
2545 |
m_state.InsertAssociationTuple (tuple); |
2546 |
} |
2547 |
|
2548 |
/// |
2549 |
/// \brief Removes a host network association tuple from the Association Set. |
2550 |
/// |
2551 |
/// \param tuple the host network association tuple to be removed. |
2552 |
/// |
2553 |
void |
2554 |
RoutingProtocol::RemoveAssociationTuple (const AssociationTuple &tuple) |
2555 |
{ |
2556 |
m_state.EraseAssociationTuple (tuple); |
2557 |
} |
2558 |
|
2559 |
|
2304 |
|
2560 |
|
2305 |
uint16_t RoutingProtocol::GetPacketSequenceNumber () |
2561 |
uint16_t RoutingProtocol::GetPacketSequenceNumber () |
2306 |
{ |
2562 |
{ |
|
2358 |
} |
2614 |
} |
2359 |
|
2615 |
|
2360 |
/// |
2616 |
/// |
|
|
2617 |
/// \brief Sends an HNA message (if the node has associated hosts/networks) and reschedules the HNA timer. |
2618 |
/// \param e The event which has expired. |
2619 |
/// |
2620 |
void |
2621 |
RoutingProtocol::HnaTimerExpire () |
2622 |
{ |
2623 |
if (m_state.GetAssociations ().size () > 0 || m_routingTableAssociation !=0) |
2624 |
{ |
2625 |
SendHna (); |
2626 |
} |
2627 |
else |
2628 |
{ |
2629 |
NS_LOG_DEBUG ("Not sending any HNA, no associations to advertise."); |
2630 |
} |
2631 |
m_hnaTimer.Schedule (m_hnaInterval); |
2632 |
} |
2633 |
|
2634 |
/// |
2361 |
/// \brief Removes tuple if expired. Else timer is rescheduled to expire at tuple.expirationTime. |
2635 |
/// \brief Removes tuple if expired. Else timer is rescheduled to expire at tuple.expirationTime. |
2362 |
/// |
2636 |
/// |
2363 |
/// The task of actually removing the tuple is left to the OLSR agent. |
2637 |
/// The task of actually removing the tuple is left to the OLSR agent. |
|
2537 |
} |
2811 |
} |
2538 |
} |
2812 |
} |
2539 |
|
2813 |
|
|
|
2814 |
/// \brief Removes tuple_ if expired. Else timer is rescheduled to expire at tuple_->time(). |
2815 |
/// \param e The event which has expired. |
2816 |
/// |
2817 |
void |
2818 |
RoutingProtocol::AssociationTupleTimerExpire (Ipv4Address gatewayAddr, Ipv4Address networkAddr, Ipv4Mask netmask) |
2819 |
{ |
2820 |
AssociationTuple *tuple = m_state.FindAssociationTuple (gatewayAddr, networkAddr, netmask); |
2821 |
if (tuple == NULL) |
2822 |
{ |
2823 |
return; |
2824 |
} |
2825 |
if (tuple->expirationTime < Simulator::Now ()) |
2826 |
{ |
2827 |
RemoveAssociationTuple (*tuple); |
2828 |
} |
2829 |
else |
2830 |
{ |
2831 |
m_events.Track (Simulator::Schedule (DELAY (tuple->expirationTime), |
2832 |
&RoutingProtocol::AssociationTupleTimerExpire, |
2833 |
this, gatewayAddr, networkAddr, netmask)); |
2834 |
} |
2835 |
} |
2836 |
|
2540 |
/// |
2837 |
/// |
2541 |
/// \brief Clears the routing table and frees the memory assigned to each one of its entries. |
2838 |
/// \brief Clears the routing table and frees the memory assigned to each one of its entries. |
2542 |
/// |
2839 |
/// |
|
2612 |
NS_LOG_FUNCTION (this << " " << m_ipv4->GetObject<Node> ()->GetId() << " " << header.GetDestination () << " " << oif); |
2909 |
NS_LOG_FUNCTION (this << " " << m_ipv4->GetObject<Node> ()->GetId() << " " << header.GetDestination () << " " << oif); |
2613 |
Ptr<Ipv4Route> rtentry; |
2910 |
Ptr<Ipv4Route> rtentry; |
2614 |
RoutingTableEntry entry1, entry2; |
2911 |
RoutingTableEntry entry1, entry2; |
|
|
2912 |
bool found = false; |
2913 |
|
2615 |
if (Lookup (header.GetDestination (), entry1) != 0) |
2914 |
if (Lookup (header.GetDestination (), entry1) != 0) |
2616 |
{ |
2915 |
{ |
2617 |
bool foundSendEntry = FindSendEntry (entry1, entry2); |
2916 |
bool foundSendEntry = FindSendEntry (entry1, entry2); |
|
2654 |
NS_LOG_DEBUG ("Olsr node " << m_mainAddress |
2953 |
NS_LOG_DEBUG ("Olsr node " << m_mainAddress |
2655 |
<< ": RouteOutput for dest=" << header.GetDestination () |
2954 |
<< ": RouteOutput for dest=" << header.GetDestination () |
2656 |
<< " --> nextHop=" << entry2.nextAddr |
2955 |
<< " --> nextHop=" << entry2.nextAddr |
2657 |
<< " interface=" << entry2.interface); NS_LOG_DEBUG ("Found route to " << rtentry->GetDestination () << " via nh " << rtentry->GetGateway () << " with source addr " << rtentry->GetSource () << " and output dev " << rtentry->GetOutputDevice()); |
2956 |
<< " interface=" << entry2.interface); |
|
|
2957 |
NS_LOG_DEBUG ("Found route to " << rtentry->GetDestination () << " via nh " << rtentry->GetGateway () << " with source addr " << rtentry->GetSource () << " and output dev " << rtentry->GetOutputDevice()); |
2958 |
found = true; |
2658 |
} |
2959 |
} |
2659 |
else |
2960 |
else |
2660 |
{ |
2961 |
{ |
|
|
2962 |
rtentry = m_hnaRoutingTable->RouteOutput (p, header, oif, sockerr); |
2963 |
|
2964 |
if (rtentry) |
2965 |
{ |
2966 |
found = true; |
2967 |
NS_LOG_DEBUG ("Found route to " << rtentry->GetDestination () << " via nh " << rtentry->GetGateway () << " with source addr " << rtentry->GetSource () << " and output dev " << rtentry->GetOutputDevice()); |
2968 |
} |
2969 |
} |
2970 |
|
2971 |
if (!found) |
2972 |
{ |
2661 |
NS_LOG_DEBUG ("Olsr node " << m_mainAddress |
2973 |
NS_LOG_DEBUG ("Olsr node " << m_mainAddress |
2662 |
<< ": RouteOutput for dest=" << header.GetDestination () |
2974 |
<< ": RouteOutput for dest=" << header.GetDestination () |
2663 |
<< " No route to host"); |
2975 |
<< " No route to host"); |
|
2729 |
} |
3041 |
} |
2730 |
else |
3042 |
else |
2731 |
{ |
3043 |
{ |
|
|
3044 |
if(m_hnaRoutingTable->RouteInput (p, header, idev, ucb, mcb, lcb, ecb)) |
3045 |
{ |
3046 |
return true; |
3047 |
} |
3048 |
else |
3049 |
{ |
3050 |
|
2732 |
#ifdef NS3_LOG_ENABLE |
3051 |
#ifdef NS3_LOG_ENABLE |
2733 |
NS_LOG_DEBUG ("Olsr node " << m_mainAddress |
3052 |
NS_LOG_DEBUG ("Olsr node " << m_mainAddress |
2734 |
<< ": RouteInput for dest=" << header.GetDestination () |
3053 |
<< ": RouteInput for dest=" << header.GetDestination () |
2735 |
<< " --> NOT FOUND; ** Dumping routing table..."); for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter = m_table.begin (); |
3054 |
<< " --> NOT FOUND; ** Dumping routing table..."); |
2736 |
iter != m_table.end (); iter++) |
3055 |
|
2737 |
{ NS_LOG_DEBUG ("dest=" << iter->first << " --> next=" << iter->second.nextAddr |
3056 |
for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter = m_table.begin (); |
|
|
3057 |
iter != m_table.end (); iter++) |
3058 |
{ |
3059 |
NS_LOG_DEBUG ("dest=" << iter->first << " --> next=" << iter->second.nextAddr |
2738 |
<< " via interface " << iter->second.interface); |
3060 |
<< " via interface " << iter->second.interface); |
|
|
3061 |
} |
3062 |
|
3063 |
NS_LOG_DEBUG ("** Routing table dump end."); |
3064 |
#endif // NS3_LOG_ENABLE |
3065 |
|
3066 |
return false; |
2739 |
} |
3067 |
} |
2740 |
|
|
|
2741 |
NS_LOG_DEBUG ("** Routing table dump end."); |
2742 |
#endif // NS3_LOG_ENABLE |
2743 |
return false; |
2744 |
} |
3068 |
} |
2745 |
} |
3069 |
} |
2746 |
void |
3070 |
void |