31 #define NS_LOG_APPEND_CONTEXT \
32 if (GetObject<Node> ()) { std::clog << "[node " << GetObject<Node> ()->GetId () << "] "; }
36 #include "ns3/socket-factory.h"
37 #include "ns3/udp-socket-factory.h"
38 #include "ns3/simulator.h"
40 #include "ns3/names.h"
41 #include "ns3/inet-socket-address.h"
42 #include "ns3/ipv4-routing-protocol.h"
43 #include "ns3/ipv4-routing-table-entry.h"
44 #include "ns3/ipv4-route.h"
45 #include "ns3/boolean.h"
46 #include "ns3/uinteger.h"
48 #include "ns3/trace-source-accessor.h"
49 #include "ns3/ipv4-header.h"
59 #define DELAY(time) (((time) < (Simulator::Now ())) ? Seconds (0.000001) : \
60 (time - Simulator::Now () + Seconds (0.000001)))
69 #define OLSR_REFRESH_INTERVAL m_helloInterval
75 #define OLSR_NEIGHB_HOLD_TIME Time (3 * OLSR_REFRESH_INTERVAL)
77 #define OLSR_TOP_HOLD_TIME Time (3 * m_tcInterval)
79 #define OLSR_DUP_HOLD_TIME Seconds (30)
81 #define OLSR_MID_HOLD_TIME Time (3 * m_midInterval)
83 #define OLSR_HNA_HOLD_TIME Time (3 * m_hnaInterval)
88 #define OLSR_UNSPEC_LINK 0
90 #define OLSR_ASYM_LINK 1
92 #define OLSR_SYM_LINK 2
94 #define OLSR_LOST_LINK 3
99 #define OLSR_NOT_NEIGH 0
101 #define OLSR_SYM_NEIGH 1
103 #define OLSR_MPR_NEIGH 2
109 #define OLSR_WILL_NEVER 0
111 #define OLSR_WILL_LOW 1
113 #define OLSR_WILL_DEFAULT 3
115 #define OLSR_WILL_HIGH 6
117 #define OLSR_WILL_ALWAYS 7
123 #define OLSR_MAXJITTER (m_helloInterval.GetSeconds () / 4)
125 #define OLSR_MAX_SEQ_NUM 65535
127 #define JITTER (Seconds (m_uniformRandomVariable->GetValue (0, OLSR_MAXJITTER)))
130 #define OLSR_PORT_NUMBER 698
132 #define OLSR_MAX_MSGS 64
135 #define OLSR_MAX_HELLOS 12
138 #define OLSR_MAX_ADDRS 64
154 static TypeId tid =
TypeId (
"ns3::olsr::RoutingProtocol")
156 .AddConstructor<RoutingProtocol> ()
157 .AddAttribute (
"HelloInterval",
"HELLO messages emission interval.",
161 .AddAttribute (
"TcInterval",
"TC messages emission interval.",
165 .AddAttribute (
"MidInterval",
"MID messages emission interval. Normally it is equal to TcInterval.",
169 .AddAttribute (
"HnaInterval",
"HNA messages emission interval. Normally it is equal to TcInterval.",
173 .AddAttribute (
"Willingness",
"Willingness of a node to carry and forward traffic for other nodes.",
181 .AddTraceSource (
"Rx",
"Receive OLSR packet.",
183 .AddTraceSource (
"Tx",
"Send OLSR packet.",
185 .AddTraceSource (
"RoutingTableChanged",
"The OLSR routing table has changed.",
193 : m_routingTableAssociation (0),
195 m_helloTimer (
Timer::CANCEL_ON_DESTROY),
196 m_tcTimer (
Timer::CANCEL_ON_DESTROY),
197 m_midTimer (
Timer::CANCEL_ON_DESTROY),
198 m_hnaTimer (
Timer::CANCEL_ON_DESTROY),
199 m_queuedMessagesTimer (
Timer::CANCEL_ON_DESTROY)
242 iter->first->Close ();
253 *os <<
"Destination\t\tNextHop\t\tInterface\tDistance\n";
255 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter =
m_table.begin ();
256 iter !=
m_table.end (); iter++)
258 *os << iter->first <<
"\t\t";
259 *os << iter->second.nextAddr <<
"\t\t";
266 *os << iter->second.interface <<
"\t\t";
268 *os << iter->second.distance <<
"\t";
272 *os <<
" HNA Routing Table:\n";
285 if (addr != loopback)
299 bool canRunOlsr =
false;
303 if (addr == loopback)
327 if (socket->
Bind (inetAddr))
365 receivedPacket = socket->
RecvFrom (sourceAddress);
372 << senderIfaceAddr <<
" to " << receiverIfaceAddr);
381 packet->RemoveHeader (olsrPacketHeader);
390 if (packet->RemoveHeader (messageHeader) == 0)
399 messages.push_back (messageHeader);
404 for (MessageList::const_iterator messageIter = messages.begin ();
405 messageIter != messages.end (); messageIter++)
420 bool do_forwarding =
true;
437 if (duplicated == NULL)
445 ProcessHello (messageHeader, receiverIfaceAddr, senderIfaceAddr);
452 ProcessTc (messageHeader, senderIfaceAddr);
476 NS_LOG_DEBUG (
"OLSR message is duplicated, not reading it.");
480 for (std::vector<Ipv4Address>::const_iterator it = duplicated->
ifaceList.begin ();
481 it != duplicated->
ifaceList.end (); it++)
483 if (*it == receiverIfaceAddr)
485 do_forwarding =
false;
499 receiverIfaceAddr, inetSourceAddr.
GetIpv4 ());
526 if (nb_tuple == NULL)
541 std::set<Ipv4Address> toRemove;
542 for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); twoHopNeigh++)
544 if (twoHopNeigh->neighborMainAddr == neighborMainAddr)
546 toRemove.insert (twoHopNeigh->twoHopNeighborAddr);
550 for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); )
552 if (toRemove.find (twoHopNeigh->twoHopNeighborAddr) != toRemove.end ())
554 twoHopNeigh = N2.erase (twoHopNeigh);
584 N.push_back (*neighbor);
608 for (NeighborSet::const_iterator neigh = N.begin ();
609 neigh != N.end (); neigh++)
611 if (neigh->neighborMainAddr == twoHopNeigh->neighborMainAddr)
633 for (NeighborSet::const_iterator neigh = N.begin ();
634 neigh != N.end (); neigh++)
636 if (neigh->neighborMainAddr == twoHopNeigh->twoHopNeighborAddr)
645 N2.push_back (*twoHopNeigh);
649 #ifdef NS3_LOG_ENABLE
651 std::ostringstream os;
653 for (TwoHopNeighborSet::const_iterator iter = N2.begin ();
654 iter != N2.end (); iter++)
656 TwoHopNeighborSet::const_iterator next = iter;
658 os << iter->neighborMainAddr <<
"->" << iter->twoHopNeighborAddr;
659 if (next != N2.end ())
665 #endif //NS3_LOG_ENABLE
669 for (NeighborSet::const_iterator neighbor = N.begin (); neighbor != N.end (); neighbor++)
673 mprSet.insert (neighbor->neighborMainAddr);
685 std::set<Ipv4Address> coveredTwoHopNeighbors;
686 for (TwoHopNeighborSet::const_iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); twoHopNeigh++)
690 for (TwoHopNeighborSet::const_iterator otherTwoHopNeigh = N2.begin (); otherTwoHopNeigh != N2.end (); otherTwoHopNeigh++)
692 if (otherTwoHopNeigh->twoHopNeighborAddr == twoHopNeigh->twoHopNeighborAddr
693 && otherTwoHopNeigh->neighborMainAddr != twoHopNeigh->neighborMainAddr)
701 NS_LOG_LOGIC (
"Neighbor " << twoHopNeigh->neighborMainAddr
702 <<
" is the only that can reach 2-hop neigh. "
703 << twoHopNeigh->twoHopNeighborAddr
704 <<
" => select as MPR.");
706 mprSet.insert (twoHopNeigh->neighborMainAddr);
709 for (TwoHopNeighborSet::const_iterator otherTwoHopNeigh = N2.begin ();
710 otherTwoHopNeigh != N2.end (); otherTwoHopNeigh++)
712 if (otherTwoHopNeigh->neighborMainAddr == twoHopNeigh->neighborMainAddr)
714 coveredTwoHopNeighbors.insert (otherTwoHopNeigh->twoHopNeighborAddr);
720 for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin ();
721 twoHopNeigh != N2.end (); )
723 if (coveredTwoHopNeighbors.find (twoHopNeigh->twoHopNeighborAddr) != coveredTwoHopNeighbors.end ())
727 NS_LOG_LOGIC (
"2-hop neigh. " << twoHopNeigh->twoHopNeighborAddr <<
" is already covered by an MPR.");
728 twoHopNeigh = N2.erase (twoHopNeigh);
738 while (N2.begin () != N2.end ())
741 #ifdef NS3_LOG_ENABLE
743 std::ostringstream os;
745 for (TwoHopNeighborSet::const_iterator iter = N2.begin ();
746 iter != N2.end (); iter++)
748 TwoHopNeighborSet::const_iterator next = iter;
750 os << iter->neighborMainAddr <<
"->" << iter->twoHopNeighborAddr;
751 if (next != N2.end ())
757 #endif //NS3_LOG_ENABLE
764 std::map<int, std::vector<const NeighborTuple *> > reachability;
766 for (NeighborSet::iterator it = N.begin (); it != N.end (); it++)
770 for (TwoHopNeighborSet::iterator it2 = N2.begin (); it2 != N2.end (); it2++)
777 reachability[r].push_back (&nb_tuple);
790 for (std::set<int>::iterator it = rs.begin (); it != rs.end (); it++)
797 for (std::vector<const NeighborTuple *>::iterator it2 = reachability[r].begin ();
798 it2 != reachability[r].end (); it2++)
829 NS_LOG_LOGIC (N2.size () <<
" 2-hop neighbors left to cover!");
833 #ifdef NS3_LOG_ENABLE
835 std::ostringstream os;
837 for (MprSet::const_iterator iter = mprSet.begin ();
838 iter != mprSet.end (); iter++)
840 MprSet::const_iterator next = iter;
843 if (next != mprSet.end ())
849 #endif //NS3_LOG_ENABLE
879 <<
": RoutingTableComputation begin...");
887 for (NeighborSet::const_iterator it = neighborSet.begin ();
888 it != neighborSet.end (); it++)
891 NS_LOG_DEBUG (
"Looking at neighbor tuple: " << nb_tuple);
894 bool nb_main_addr =
false;
897 for (LinkSet::const_iterator it2 = linkSet.begin ();
898 it2 != linkSet.end (); it2++)
907 <<
" => adding routing table entry to neighbor");
936 if (!nb_main_addr && lt != NULL)
938 NS_LOG_LOGIC (
"no R_dest_addr is equal to the main address of the neighbor "
939 "=> adding additional routing entry");
954 for (TwoHopNeighborSet::const_iterator it = twoHopNeighbors.begin ();
955 it != twoHopNeighbors.end (); it++)
959 NS_LOG_LOGIC (
"Looking at two-hop neighbor tuple: " << nb2hop_tuple);
964 NS_LOG_LOGIC (
"Two-hop neighbor tuple is also neighbor; skipped.");
977 bool nb2hopOk =
false;
978 for (NeighborSet::const_iterator neighbor = neighborSet.begin ();
979 neighbor != neighborSet.end (); neighbor++)
990 NS_LOG_LOGIC (
"Two-hop neighbor tuple skipped: 2-hop neighbor "
993 <<
", which was not found in the Neighbor Set.");
1012 NS_LOG_LOGIC (
"Adding routing entry for two-hop neighbor.");
1020 NS_LOG_LOGIC (
"NOT adding routing entry for two-hop neighbor ("
1022 <<
" not found in the routing table)");
1026 for (uint32_t h = 2;; h++)
1037 for (TopologySet::const_iterator it = topology.begin ();
1038 it != topology.end (); it++)
1041 NS_LOG_LOGIC (
"Looking at topology tuple: " << topology_tuple);
1044 bool have_destAddrEntry =
Lookup (topology_tuple.
destAddr, destAddrEntry);
1045 bool have_lastAddrEntry =
Lookup (topology_tuple.
lastAddr, lastAddrEntry);
1046 if (!have_destAddrEntry && have_lastAddrEntry && lastAddrEntry.
distance == h)
1048 NS_LOG_LOGIC (
"Adding routing table entry based on the topology tuple.");
1067 NS_LOG_LOGIC (
"NOT adding routing table entry based on the topology tuple: "
1068 "have_destAddrEntry=" << have_destAddrEntry
1069 <<
" have_lastAddrEntry=" << have_lastAddrEntry
1070 <<
" lastAddrEntry.distance=" << (
int) lastAddrEntry.
distance
1071 <<
" (h=" << h <<
")");
1085 for (IfaceAssocSet::const_iterator it = ifaceAssocSet.begin ();
1086 it != ifaceAssocSet.end (); it++)
1092 if (have_entry1 && !have_entry2)
1120 for (AssociationSet::const_iterator it = associationSet.begin ();
1121 it != associationSet.end (); it++)
1128 bool goToNextAssociationTuple =
false;
1130 NS_LOG_DEBUG (
"Nb local associations: " << localHnaAssociations.size ());
1131 for (Associations::const_iterator assocIterator = localHnaAssociations.begin ();
1132 assocIterator != localHnaAssociations.end (); assocIterator++)
1134 Association const &localHnaAssoc = *assocIterator;
1137 NS_LOG_DEBUG (
"HNA association received from another GW is part of local HNA associations: no route added for network "
1139 goToNextAssociationTuple =
true;
1142 if (goToNextAssociationTuple)
1150 bool addRoute =
false;
1152 uint32_t routeIndex = 0;
1174 if(addRoute && gatewayEntryExists)
1209 LinkSensing (msg, hello, receiverIface, senderIface);
1211 #ifdef NS3_LOG_ENABLE
1215 <<
"s ** BEGIN dump Link Set for OLSR Node " <<
m_mainAddress);
1216 for (LinkSet::const_iterator link = links.begin (); link != links.end (); link++)
1224 <<
"s ** BEGIN dump Neighbor Set for OLSR Node " <<
m_mainAddress);
1225 for (NeighborSet::const_iterator neighbor = neighbors.begin (); neighbor != neighbors.end (); neighbor++)
1231 #endif // NS3_LOG_ENABLE
1236 #ifdef NS3_LOG_ENABLE
1240 <<
"s ** BEGIN dump TwoHopNeighbor Set for OLSR Node " <<
m_mainAddress);
1241 for (TwoHopNeighborSet::const_iterator tuple = twoHopNeighbors.begin ();
1242 tuple != twoHopNeighbors.end (); tuple++)
1248 #endif // NS3_LOG_ENABLE
1273 if (link_tuple == NULL)
1283 if (topologyTuple != NULL)
1294 for (std::vector<Ipv4Address>::const_iterator i = tc.
neighborAddresses.begin ();
1306 if (topologyTuple != NULL)
1334 #ifdef NS3_LOG_ENABLE
1338 <<
"s ** BEGIN dump TopologySet for OLSR Node " <<
m_mainAddress);
1339 for (TopologySet::const_iterator tuple = topology.begin ();
1340 tuple != topology.end (); tuple++)
1346 #endif // NS3_LOG_ENABLE
1369 if (linkTuple == NULL)
1372 ": the sender interface of this message is not in the "
1373 "symmetric 1-hop neighborhood of this node,"
1374 " the message MUST be discarded.");
1382 bool updated =
false;
1384 for (IfaceAssocSet::iterator tuple = ifaceAssoc.begin ();
1385 tuple != ifaceAssoc.end (); tuple++)
1387 if (tuple->ifaceAddr == *i
1391 tuple->time = now + msg.
GetVTime ();
1413 for (NeighborSet::iterator neighbor = neighbors.begin (); neighbor != neighbors.end (); neighbor++)
1415 neighbor->neighborMainAddr =
GetMainAddress (neighbor->neighborMainAddr);
1419 for (TwoHopNeighborSet::iterator twoHopNeighbor = twoHopNeighbors.begin ();
1420 twoHopNeighbor != twoHopNeighbors.end (); twoHopNeighbor++)
1422 twoHopNeighbor->neighborMainAddr =
GetMainAddress (twoHopNeighbor->neighborMainAddr);
1423 twoHopNeighbor->twoHopNeighborAddr =
GetMainAddress (twoHopNeighbor->twoHopNeighborAddr);
1448 if (link_tuple == NULL)
1454 for (std::vector<olsr::MessageHeader::Hna::Association>::const_iterator it = hna.
associations.begin ();
1516 if (linkTuple == NULL)
1531 bool retransmitted =
false;
1536 if (mprselTuple != NULL)
1543 retransmitted =
true;
1548 if (duplicated != NULL)
1552 duplicated->
ifaceList.push_back (localIface);
1562 newDup.
ifaceList.push_back (localIface);
1626 int numMessages = 0;
1632 for (std::vector<olsr::MessageHeader>::const_iterator message =
m_queuedMessages.begin ();
1639 msglist.push_back (*message);
1646 packet = Create<Packet> ();
1679 std::vector<olsr::MessageHeader::Hello::LinkMessage>
1683 for (LinkSet::const_iterator link_tuple = links.begin ();
1684 link_tuple != links.end (); link_tuple++)
1687 && link_tuple->time >= now))
1692 uint8_t link_type, nb_type = 0xff;
1695 if (link_tuple->symTime >= now)
1699 else if (link_tuple->asymTime >= now)
1712 <<
" to be MPR_NEIGH.");
1721 if (nb_tuple->neighborMainAddr ==
GetMainAddress (link_tuple->neighborIfaceAddr))
1726 <<
" to be SYM_NEIGH.");
1733 <<
" to be NOT_NEIGH.");
1737 NS_FATAL_ERROR (
"There is a neighbor tuple with an unknown status!\n");
1751 linkMessage.
linkCode = (link_type & 0x03) | ((nb_type << 2) & 0x0f);
1753 (link_tuple->neighborIfaceAddr);
1755 std::vector<Ipv4Address> interfaces =
1760 interfaces.begin (), interfaces.end ());
1762 linkMessages.push_back (linkMessage);
1765 <<
" (with " <<
int (linkMessages.size ()) <<
" link messages)");
1856 std::vector<olsr::MessageHeader::Hna::Association> &associations = hna.
associations;
1860 for (Associations::const_iterator it = localHnaAssociations.begin ();
1861 it != localHnaAssociations.end (); it++)
1864 associations.push_back (assoc);
1867 if (associations.size () == 0)
1887 for (Associations::const_iterator assocIterator = localHnaAssociations.begin ();
1888 assocIterator != localHnaAssociations.end (); assocIterator++)
1890 Association const &localHnaAssoc = *assocIterator;
1893 NS_LOG_INFO (
"HNA association for network " << networkAddr <<
"/" << netmask <<
" already exists.");
1898 NS_LOG_INFO (
"Adding HNA association for network " << networkAddr <<
"/" << netmask <<
".");
1910 NS_LOG_INFO (
"Removing HNA association for network " << networkAddr <<
"/" << netmask <<
".");
1931 NS_LOG_INFO (
"Removing HNA entries coming from the old routing table association.");
1950 NS_LOG_DEBUG (
"Nb local associations before adding some entries from"
1965 NS_LOG_DEBUG (
"Nb local associations after having added some entries from "
1993 bool updated =
false;
1994 bool created =
false;
1996 <<
": LinkSensing(receiverIface=" << receiverIface
1997 <<
", senderIface=" << senderIface <<
") BEGIN");
2001 if (link_tuple == NULL)
2011 NS_LOG_LOGIC (
"Existing link tuple did not exist => creating new one");
2015 NS_LOG_LOGIC (
"Existing link tuple already exists => will update it");
2019 link_tuple->asymTime = now + msg.
GetVTime ();
2020 for (std::vector<olsr::MessageHeader::Hello::LinkMessage>::const_iterator linkMessage =
2025 int lt = linkMessage->linkCode & 0x03;
2026 int nt = (linkMessage->linkCode >> 2) & 0x03;
2028 #ifdef NS3_LOG_ENABLE
2029 const char *linkTypeName;
2036 default: linkTypeName =
"(invalid value!)";
2039 const char *neighborTypeName;
2045 default: neighborTypeName =
"(invalid value!)";
2048 NS_LOG_DEBUG (
"Looking at HELLO link messages with Link Type "
2049 << lt <<
" (" << linkTypeName
2050 <<
") and Neighbor Type " << nt
2051 <<
" (" << neighborTypeName <<
")");
2052 #endif // NS3_LOG_ENABLE
2059 NS_LOG_LOGIC (
"HELLO link code is invalid => IGNORING");
2063 for (std::vector<Ipv4Address>::const_iterator neighIfaceAddr =
2064 linkMessage->neighborInterfaceAddresses.begin ();
2065 neighIfaceAddr != linkMessage->neighborInterfaceAddresses.end ();
2069 if (*neighIfaceAddr == receiverIface)
2074 link_tuple->symTime = now -
Seconds (1);
2079 NS_LOG_DEBUG (*link_tuple <<
": link is SYM or ASYM => should become SYM now"
2080 " (symTime being increased to " << now + msg.
GetVTime ());
2081 link_tuple->symTime = now + msg.
GetVTime ();
2093 NS_LOG_DEBUG (
" \\-> *neighIfaceAddr (" << *neighIfaceAddr
2094 <<
" != receiverIface (" << receiverIface <<
") => IGNORING!");
2097 NS_LOG_DEBUG (
"Link tuple updated: " <<
int (updated));
2099 link_tuple->time = std::max (link_tuple->time, link_tuple->asymTime);
2107 if (created && link_tuple != NULL)
2112 link_tuple->neighborIfaceAddr));
2115 <<
": LinkSensing END");
2126 if (nb_tuple != NULL)
2144 for (LinkSet::const_iterator link_tuple =
m_state.
GetLinks ().begin ();
2147 NS_LOG_LOGIC (
"Looking at link tuple: " << *link_tuple);
2151 "GetMainAddress (link_tuple->neighborIfaceAddr) != msg.GetOriginatorAddress ()");
2152 NS_LOG_LOGIC (
"(GetMainAddress(" << link_tuple->neighborIfaceAddr <<
"): "
2158 if (link_tuple->symTime < now)
2164 typedef std::vector<olsr::MessageHeader::Hello::LinkMessage> LinkMessageVec;
2165 for (LinkMessageVec::const_iterator linkMessage = hello.
linkMessages.begin ();
2166 linkMessage != hello.
linkMessages.end (); linkMessage++)
2168 int neighborType = (linkMessage->linkCode >> 2) & 0x3;
2169 #ifdef NS3_LOG_ENABLE
2170 const char *neighborTypeNames[3] = {
"NOT_NEIGH",
"SYM_NEIGH",
"MPR_NEIGH" };
2171 const char *neighborTypeName = ((neighborType < 3) ?
2172 neighborTypeNames[neighborType]
2173 :
"(invalid value)");
2174 NS_LOG_DEBUG (
"Looking at Link Message from HELLO message: neighborType="
2175 << neighborType <<
" (" << neighborTypeName <<
")");
2176 #endif // NS3_LOG_ENABLE
2178 for (std::vector<Ipv4Address>::const_iterator nb2hop_addr_iter =
2179 linkMessage->neighborInterfaceAddresses.begin ();
2180 nb2hop_addr_iter != linkMessage->neighborInterfaceAddresses.end ();
2184 NS_LOG_DEBUG (
"Looking at 2-hop neighbor address from HELLO message: "
2185 << *nb2hop_addr_iter
2186 <<
" (main address is " << nb2hop_addr <<
")");
2194 NS_LOG_LOGIC (
"Ignoring 2-hop neighbor (it is the node itself)");
2202 << (nb2hop_tuple ?
" (refreshing existing entry)" :
""));
2203 if (nb2hop_tuple == NULL)
2228 NS_LOG_LOGIC (
"2-hop neighbor is NOT_NEIGH => deleting matching 2-hop neighbor state");
2233 NS_LOG_LOGIC (
"*** WARNING *** Ignoring link message (inside HELLO) with bad"
2234 " neighbor type value: " << neighborType);
2256 typedef std::vector<olsr::MessageHeader::Hello::LinkMessage> LinkMessageVec;
2257 for (LinkMessageVec::const_iterator linkMessage = hello.
linkMessages.begin ();
2261 int nt = linkMessage->linkCode >> 2;
2264 NS_LOG_DEBUG (
"Processing a link message with neighbor type MPR_NEIGH");
2266 for (std::vector<Ipv4Address>::const_iterator nb_iface_addr =
2267 linkMessage->neighborInterfaceAddresses.begin ();
2268 nb_iface_addr != linkMessage->neighborInterfaceAddresses.end ();
2273 NS_LOG_DEBUG (
"Adding entry to mpr selector set for neighbor " << *nb_iface_addr);
2278 if (existing_mprsel_tuple == NULL)
2315 struct hdr_ip* ih = HDR_IP (p);
2316 struct hdr_cmn* ch = HDR_CMN (p);
2318 debug (
"%f: Node %d MAC Layer detects a breakage on link to %d\n",
2320 OLSR::node_id (ra_addr ()),
2321 OLSR::node_id (ch->next_hop ()));
2323 if ((u_int32_t)ih->daddr () == IP_BROADCAST) {
2324 drop (p, DROP_RTR_MAC_CALLBACK);
2328 OLSR_link_tuple* link_tuple = state_.find_link_tuple (ch->next_hop ());
2329 if (link_tuple != NULL) {
2332 nb_loss (link_tuple);
2334 drop (p, DROP_RTR_MAC_CALLBACK);
2424 <<
" LinkTuple " << tuple <<
" REMOVED.");
2444 <<
" LinkTuple " << tuple <<
" UPDATED.");
2449 if (nb_tuple == NULL)
2455 if (nb_tuple != NULL)
2457 #ifdef NS3_LOG_ENABLE
2458 int statusBefore = nb_tuple->
status;
2459 #endif // NS3_LOG_ENABLE
2461 bool hasSymmetricLink =
false;
2464 for (LinkSet::const_iterator it = linkSet.begin ();
2465 it != linkSet.end (); it++)
2471 hasSymmetricLink =
true;
2476 if (hasSymmetricLink)
2479 NS_LOG_DEBUG (*nb_tuple <<
"->status = STATUS_SYM; changed:"
2480 <<
int (statusBefore != nb_tuple->
status));
2485 NS_LOG_DEBUG (*nb_tuple <<
"->status = STATUS_NOT_SYM; changed:"
2486 <<
int (statusBefore != nb_tuple->
status));
2491 NS_LOG_WARN (
"ERROR! Wanted to update a NeighborTuple but none was found!");
2741 NS_LOG_DEBUG (
"Not sending any TC, no one selected me as MPR.");
2769 NS_LOG_DEBUG (
"Not sending any HNA, no associations to advertise.");
2798 address, sequenceNumber));
2824 if (tuple->
time < now)
2828 else if (tuple->
symTime < now)
2837 neighborIfaceAddr));
2843 neighborIfaceAddr));
2871 this, neighborMainAddr, twoHopNeighborAddr));
2972 this, gatewayAddr, networkAddr, netmask));
3007 std::map<Ipv4Address, RoutingTableEntry>::const_iterator it =
3012 outEntry = it->second;
3056 if (!foundSendEntry)
3060 uint32_t interfaceIdx = entry2.
interface;
3068 <<
" Route interface " << interfaceIdx
3069 <<
" does not match requested output interface "
3074 rtentry = Create<Ipv4Route> ();
3083 if (numOifAddresses == 1) {
3086 NS_FATAL_ERROR (
"XXX Not implemented yet: IP aliasing and OLSR");
3088 rtentry->SetSource (ifAddr.
GetLocal ());
3089 rtentry->SetGateway (entry2.
nextAddr);
3094 <<
" --> nextHop=" << entry2.
nextAddr
3096 NS_LOG_DEBUG (
"Found route to " << rtentry->GetDestination () <<
" via nh " << rtentry->GetGateway () <<
" with source addr " << rtentry->GetSource () <<
" and output dev " << rtentry->GetOutputDevice ());
3106 NS_LOG_DEBUG (
"Found route to " << rtentry->GetDestination () <<
" via nh " << rtentry->GetGateway () <<
" with source addr " << rtentry->GetSource () <<
" and output dev " << rtentry->GetOutputDevice ());
3114 <<
" No route to host");
3144 lcb (p, header, iif);
3164 if (!foundSendEntry)
3166 rtentry = Create<Ipv4Route> ();
3168 uint32_t interfaceIdx = entry2.
interface;
3176 if (numOifAddresses == 1) {
3179 NS_FATAL_ERROR (
"XXX Not implemented yet: IP aliasing and OLSR");
3187 <<
" --> nextHop=" << entry2.
nextAddr
3190 ucb (rtentry, p, header);
3202 #ifdef NS3_LOG_ENABLE
3205 <<
" --> NOT FOUND; ** Dumping routing table...");
3207 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter =
m_table.begin ();
3208 iter !=
m_table.end (); iter++)
3210 NS_LOG_DEBUG (
"dest=" << iter->first <<
" --> next=" << iter->second.nextAddr
3211 <<
" via interface " << iter->second.interface);
3215 #endif // NS3_LOG_ENABLE
3282 AddEntry (dest, next, i, distance);
3288 AddEntry (dest, next, 0, distance);
3292 std::vector<RoutingTableEntry>
3295 std::vector<RoutingTableEntry> retval;
3296 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter =
m_table.begin ();
3297 iter !=
m_table.end (); iter++)
3299 retval.push_back (iter->second);
3330 #ifdef NS3_LOG_ENABLE
3343 if (now < iter->expirationTime)
3349 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter =
m_table.begin (); iter !=
m_table.end (); iter++)
3351 NS_LOG_DEBUG (
" dest=" << iter->first <<
" --> next=" << iter->second.nextAddr <<
" via interface " << iter->second.interface);
3354 #endif //NS3_LOG_ENABLE