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)
76 #define OLSR_TOP_HOLD_TIME Time (3 * m_tcInterval)
78 #define OLSR_DUP_HOLD_TIME Seconds (30)
80 #define OLSR_MID_HOLD_TIME Time (3 * m_midInterval)
82 #define OLSR_HNA_HOLD_TIME Time (3 * m_hnaInterval)
88 #define OLSR_UNSPEC_LINK 0
89 #define OLSR_ASYM_LINK 1
91 #define OLSR_SYM_LINK 2
93 #define OLSR_LOST_LINK 3
99 #define OLSR_NOT_NEIGH 0
100 #define OLSR_SYM_NEIGH 1
102 #define OLSR_MPR_NEIGH 2
109 #define OLSR_WILL_NEVER 0
110 #define OLSR_WILL_LOW 1
112 #define OLSR_WILL_DEFAULT 3
114 #define OLSR_WILL_HIGH 6
116 #define OLSR_WILL_ALWAYS 7
123 #define OLSR_MAXJITTER (m_helloInterval.GetSeconds () / 4)
124 #define OLSR_MAX_SEQ_NUM 65535
126 #define JITTER (Seconds (m_uniformRandomVariable->GetValue (0, OLSR_MAXJITTER)))
130 #define OLSR_PORT_NUMBER 698
131 #define OLSR_MAX_MSGS 64
135 #define OLSR_MAX_HELLOS 12
138 #define OLSR_MAX_ADDRS 64
155 static TypeId tid =
TypeId (
"ns3::olsr::RoutingProtocol")
157 .AddConstructor<RoutingProtocol> ()
158 .AddAttribute (
"HelloInterval",
"HELLO messages emission interval.",
162 .AddAttribute (
"TcInterval",
"TC messages emission interval.",
166 .AddAttribute (
"MidInterval",
"MID messages emission interval. Normally it is equal to TcInterval.",
170 .AddAttribute (
"HnaInterval",
"HNA messages emission interval. Normally it is equal to TcInterval.",
174 .AddAttribute (
"Willingness",
"Willingness of a node to carry and forward traffic for other nodes.",
182 .AddTraceSource (
"Rx",
"Receive OLSR packet.",
184 .AddTraceSource (
"Tx",
"Send OLSR packet.",
186 .AddTraceSource (
"RoutingTableChanged",
"The OLSR routing table has changed.",
194 : m_routingTableAssociation (0),
196 m_helloTimer (
Timer::CANCEL_ON_DESTROY),
197 m_tcTimer (
Timer::CANCEL_ON_DESTROY),
198 m_midTimer (
Timer::CANCEL_ON_DESTROY),
199 m_hnaTimer (
Timer::CANCEL_ON_DESTROY),
200 m_queuedMessagesTimer (
Timer::CANCEL_ON_DESTROY)
243 iter->first->Close ();
254 *os <<
"Destination\t\tNextHop\t\tInterface\tDistance\n";
256 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter =
m_table.begin ();
257 iter !=
m_table.end (); iter++)
259 *os << iter->first <<
"\t\t";
260 *os << iter->second.nextAddr <<
"\t\t";
267 *os << iter->second.interface <<
"\t\t";
269 *os << iter->second.distance <<
"\t";
273 *os <<
" HNA Routing Table:\n";
282 for (uint32_t i = 0; i <
m_ipv4->GetNInterfaces (); i++)
286 if (addr != loopback)
300 bool canRunOlsr =
false;
301 for (uint32_t i = 0; i <
m_ipv4->GetNInterfaces (); i++)
304 if (addr == loopback)
328 if (socket->
Bind (inetAddr))
366 receivedPacket = socket->
RecvFrom (sourceAddress);
373 << senderIfaceAddr <<
" to " << receiverIfaceAddr);
382 packet->RemoveHeader (olsrPacketHeader);
391 if (packet->RemoveHeader (messageHeader) == 0)
400 messages.push_back (messageHeader);
405 for (MessageList::const_iterator messageIter = messages.begin ();
406 messageIter != messages.end (); messageIter++)
421 bool do_forwarding =
true;
438 if (duplicated == NULL)
446 ProcessHello (messageHeader, receiverIfaceAddr, senderIfaceAddr);
453 ProcessTc (messageHeader, senderIfaceAddr);
477 NS_LOG_DEBUG (
"OLSR message is duplicated, not reading it.");
481 for (std::vector<Ipv4Address>::const_iterator it = duplicated->
ifaceList.begin ();
482 it != duplicated->
ifaceList.end (); it++)
484 if (*it == receiverIfaceAddr)
486 do_forwarding =
false;
500 receiverIfaceAddr, inetSourceAddr.
GetIpv4 ());
527 if (nb_tuple == NULL)
542 std::set<Ipv4Address> toRemove;
543 for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); twoHopNeigh++)
545 if (twoHopNeigh->neighborMainAddr == neighborMainAddr)
547 toRemove.insert (twoHopNeigh->twoHopNeighborAddr);
551 for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); )
553 if (toRemove.find (twoHopNeigh->twoHopNeighborAddr) != toRemove.end ())
555 twoHopNeigh = N2.erase (twoHopNeigh);
585 N.push_back (*neighbor);
609 for (NeighborSet::const_iterator neigh = N.begin ();
610 neigh != N.end (); neigh++)
612 if (neigh->neighborMainAddr == twoHopNeigh->neighborMainAddr)
634 for (NeighborSet::const_iterator neigh = N.begin ();
635 neigh != N.end (); neigh++)
637 if (neigh->neighborMainAddr == twoHopNeigh->twoHopNeighborAddr)
646 N2.push_back (*twoHopNeigh);
650 #ifdef NS3_LOG_ENABLE
652 std::ostringstream os;
654 for (TwoHopNeighborSet::const_iterator iter = N2.begin ();
655 iter != N2.end (); iter++)
657 TwoHopNeighborSet::const_iterator next = iter;
659 os << iter->neighborMainAddr <<
"->" << iter->twoHopNeighborAddr;
660 if (next != N2.end ())
666 #endif //NS3_LOG_ENABLE
670 for (NeighborSet::const_iterator neighbor = N.begin (); neighbor != N.end (); neighbor++)
674 mprSet.insert (neighbor->neighborMainAddr);
686 std::set<Ipv4Address> coveredTwoHopNeighbors;
687 for (TwoHopNeighborSet::const_iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); twoHopNeigh++)
691 for (TwoHopNeighborSet::const_iterator otherTwoHopNeigh = N2.begin (); otherTwoHopNeigh != N2.end (); otherTwoHopNeigh++)
693 if (otherTwoHopNeigh->twoHopNeighborAddr == twoHopNeigh->twoHopNeighborAddr
694 && otherTwoHopNeigh->neighborMainAddr != twoHopNeigh->neighborMainAddr)
702 NS_LOG_LOGIC (
"Neighbor " << twoHopNeigh->neighborMainAddr
703 <<
" is the only that can reach 2-hop neigh. "
704 << twoHopNeigh->twoHopNeighborAddr
705 <<
" => select as MPR.");
707 mprSet.insert (twoHopNeigh->neighborMainAddr);
710 for (TwoHopNeighborSet::const_iterator otherTwoHopNeigh = N2.begin ();
711 otherTwoHopNeigh != N2.end (); otherTwoHopNeigh++)
713 if (otherTwoHopNeigh->neighborMainAddr == twoHopNeigh->neighborMainAddr)
715 coveredTwoHopNeighbors.insert (otherTwoHopNeigh->twoHopNeighborAddr);
721 for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin ();
722 twoHopNeigh != N2.end (); )
724 if (coveredTwoHopNeighbors.find (twoHopNeigh->twoHopNeighborAddr) != coveredTwoHopNeighbors.end ())
728 NS_LOG_LOGIC (
"2-hop neigh. " << twoHopNeigh->twoHopNeighborAddr <<
" is already covered by an MPR.");
729 twoHopNeigh = N2.erase (twoHopNeigh);
739 while (N2.begin () != N2.end ())
742 #ifdef NS3_LOG_ENABLE
744 std::ostringstream os;
746 for (TwoHopNeighborSet::const_iterator iter = N2.begin ();
747 iter != N2.end (); iter++)
749 TwoHopNeighborSet::const_iterator next = iter;
751 os << iter->neighborMainAddr <<
"->" << iter->twoHopNeighborAddr;
752 if (next != N2.end ())
758 #endif //NS3_LOG_ENABLE
765 std::map<int, std::vector<const NeighborTuple *> > reachability;
767 for (NeighborSet::iterator it = N.begin (); it != N.end (); it++)
771 for (TwoHopNeighborSet::iterator it2 = N2.begin (); it2 != N2.end (); it2++)
778 reachability[r].push_back (&nb_tuple);
791 for (std::set<int>::iterator it = rs.begin (); it != rs.end (); it++)
798 for (std::vector<const NeighborTuple *>::iterator it2 = reachability[r].begin ();
799 it2 != reachability[r].end (); it2++)
830 NS_LOG_LOGIC (N2.size () <<
" 2-hop neighbors left to cover!");
834 #ifdef NS3_LOG_ENABLE
836 std::ostringstream os;
838 for (MprSet::const_iterator iter = mprSet.begin ();
839 iter != mprSet.end (); iter++)
841 MprSet::const_iterator next = iter;
844 if (next != mprSet.end ())
850 #endif //NS3_LOG_ENABLE
880 <<
": RoutingTableComputation begin...");
888 for (NeighborSet::const_iterator it = neighborSet.begin ();
889 it != neighborSet.end (); it++)
892 NS_LOG_DEBUG (
"Looking at neighbor tuple: " << nb_tuple);
895 bool nb_main_addr =
false;
898 for (LinkSet::const_iterator it2 = linkSet.begin ();
899 it2 != linkSet.end (); it2++)
908 <<
" => adding routing table entry to neighbor");
937 if (!nb_main_addr && lt != NULL)
939 NS_LOG_LOGIC (
"no R_dest_addr is equal to the main address of the neighbor "
940 "=> adding additional routing entry");
955 for (TwoHopNeighborSet::const_iterator it = twoHopNeighbors.begin ();
956 it != twoHopNeighbors.end (); it++)
960 NS_LOG_LOGIC (
"Looking at two-hop neighbor tuple: " << nb2hop_tuple);
965 NS_LOG_LOGIC (
"Two-hop neighbor tuple is also neighbor; skipped.");
978 bool nb2hopOk =
false;
979 for (NeighborSet::const_iterator neighbor = neighborSet.begin ();
980 neighbor != neighborSet.end (); neighbor++)
991 NS_LOG_LOGIC (
"Two-hop neighbor tuple skipped: 2-hop neighbor "
994 <<
", which was not found in the Neighbor Set.");
1013 NS_LOG_LOGIC (
"Adding routing entry for two-hop neighbor.");
1021 NS_LOG_LOGIC (
"NOT adding routing entry for two-hop neighbor ("
1023 <<
" not found in the routing table)");
1027 for (uint32_t h = 2;; h++)
1038 for (TopologySet::const_iterator it = topology.begin ();
1039 it != topology.end (); it++)
1042 NS_LOG_LOGIC (
"Looking at topology tuple: " << topology_tuple);
1045 bool have_destAddrEntry =
Lookup (topology_tuple.
destAddr, destAddrEntry);
1046 bool have_lastAddrEntry =
Lookup (topology_tuple.
lastAddr, lastAddrEntry);
1047 if (!have_destAddrEntry && have_lastAddrEntry && lastAddrEntry.
distance == h)
1049 NS_LOG_LOGIC (
"Adding routing table entry based on the topology tuple.");
1068 NS_LOG_LOGIC (
"NOT adding routing table entry based on the topology tuple: "
1069 "have_destAddrEntry=" << have_destAddrEntry
1070 <<
" have_lastAddrEntry=" << have_lastAddrEntry
1071 <<
" lastAddrEntry.distance=" << (
int) lastAddrEntry.
distance
1072 <<
" (h=" << h <<
")");
1086 for (IfaceAssocSet::const_iterator it = ifaceAssocSet.begin ();
1087 it != ifaceAssocSet.end (); it++)
1093 if (have_entry1 && !have_entry2)
1121 for (AssociationSet::const_iterator it = associationSet.begin ();
1122 it != associationSet.end (); it++)
1129 bool goToNextAssociationTuple =
false;
1131 NS_LOG_DEBUG (
"Nb local associations: " << localHnaAssociations.size ());
1132 for (Associations::const_iterator assocIterator = localHnaAssociations.begin ();
1133 assocIterator != localHnaAssociations.end (); assocIterator++)
1135 Association const &localHnaAssoc = *assocIterator;
1138 NS_LOG_DEBUG (
"HNA association received from another GW is part of local HNA associations: no route added for network "
1140 goToNextAssociationTuple =
true;
1143 if (goToNextAssociationTuple)
1151 bool addRoute =
false;
1153 uint32_t routeIndex = 0;
1155 for (routeIndex = 0; routeIndex <
m_hnaRoutingTable->GetNRoutes (); routeIndex++)
1175 if(addRoute && gatewayEntryExists)
1210 LinkSensing (msg, hello, receiverIface, senderIface);
1212 #ifdef NS3_LOG_ENABLE
1216 <<
"s ** BEGIN dump Link Set for OLSR Node " <<
m_mainAddress);
1217 for (LinkSet::const_iterator link = links.begin (); link != links.end (); link++)
1225 <<
"s ** BEGIN dump Neighbor Set for OLSR Node " <<
m_mainAddress);
1226 for (NeighborSet::const_iterator neighbor = neighbors.begin (); neighbor != neighbors.end (); neighbor++)
1232 #endif // NS3_LOG_ENABLE
1237 #ifdef NS3_LOG_ENABLE
1241 <<
"s ** BEGIN dump TwoHopNeighbor Set for OLSR Node " <<
m_mainAddress);
1242 for (TwoHopNeighborSet::const_iterator tuple = twoHopNeighbors.begin ();
1243 tuple != twoHopNeighbors.end (); tuple++)
1249 #endif // NS3_LOG_ENABLE
1274 if (link_tuple == NULL)
1284 if (topologyTuple != NULL)
1295 for (std::vector<Ipv4Address>::const_iterator i = tc.
neighborAddresses.begin ();
1307 if (topologyTuple != NULL)
1335 #ifdef NS3_LOG_ENABLE
1339 <<
"s ** BEGIN dump TopologySet for OLSR Node " <<
m_mainAddress);
1340 for (TopologySet::const_iterator tuple = topology.begin ();
1341 tuple != topology.end (); tuple++)
1347 #endif // NS3_LOG_ENABLE
1370 if (linkTuple == NULL)
1373 ": the sender interface of this message is not in the "
1374 "symmetric 1-hop neighborhood of this node,"
1375 " the message MUST be discarded.");
1383 bool updated =
false;
1385 for (IfaceAssocSet::iterator tuple = ifaceAssoc.begin ();
1386 tuple != ifaceAssoc.end (); tuple++)
1388 if (tuple->ifaceAddr == *i
1392 tuple->time = now + msg.
GetVTime ();
1414 for (NeighborSet::iterator neighbor = neighbors.begin (); neighbor != neighbors.end (); neighbor++)
1416 neighbor->neighborMainAddr =
GetMainAddress (neighbor->neighborMainAddr);
1420 for (TwoHopNeighborSet::iterator twoHopNeighbor = twoHopNeighbors.begin ();
1421 twoHopNeighbor != twoHopNeighbors.end (); twoHopNeighbor++)
1423 twoHopNeighbor->neighborMainAddr =
GetMainAddress (twoHopNeighbor->neighborMainAddr);
1424 twoHopNeighbor->twoHopNeighborAddr =
GetMainAddress (twoHopNeighbor->twoHopNeighborAddr);
1449 if (link_tuple == NULL)
1455 for (std::vector<olsr::MessageHeader::Hna::Association>::const_iterator it = hna.
associations.begin ();
1517 if (linkTuple == NULL)
1532 bool retransmitted =
false;
1537 if (mprselTuple != NULL)
1544 retransmitted =
true;
1549 if (duplicated != NULL)
1553 duplicated->
ifaceList.push_back (localIface);
1563 newDup.
ifaceList.push_back (localIface);
1627 int numMessages = 0;
1633 for (std::vector<olsr::MessageHeader>::const_iterator message =
m_queuedMessages.begin ();
1640 msglist.push_back (*message);
1647 packet = Create<Packet> ();
1680 std::vector<olsr::MessageHeader::Hello::LinkMessage>
1684 for (LinkSet::const_iterator link_tuple = links.begin ();
1685 link_tuple != links.end (); link_tuple++)
1688 && link_tuple->time >= now))
1693 uint8_t link_type, nb_type = 0xff;
1696 if (link_tuple->symTime >= now)
1700 else if (link_tuple->asymTime >= now)
1713 <<
" to be MPR_NEIGH.");
1722 if (nb_tuple->neighborMainAddr ==
GetMainAddress (link_tuple->neighborIfaceAddr))
1727 <<
" to be SYM_NEIGH.");
1734 <<
" to be NOT_NEIGH.");
1738 NS_FATAL_ERROR (
"There is a neighbor tuple with an unknown status!\n");
1752 linkMessage.
linkCode = (link_type & 0x03) | ((nb_type << 2) & 0x0f);
1754 (link_tuple->neighborIfaceAddr);
1761 interfaces.begin (), interfaces.end ());
1763 linkMessages.push_back (linkMessage);
1766 <<
" (with " <<
int (linkMessages.size ()) <<
" link messages)");
1823 for (uint32_t i = 0; i <
m_ipv4->GetNInterfaces (); i++)
1857 std::vector<olsr::MessageHeader::Hna::Association> &associations = hna.
associations;
1861 for (Associations::const_iterator it = localHnaAssociations.begin ();
1862 it != localHnaAssociations.end (); it++)
1865 associations.push_back (assoc);
1868 if (associations.size () == 0)
1888 for (Associations::const_iterator assocIterator = localHnaAssociations.begin ();
1889 assocIterator != localHnaAssociations.end (); assocIterator++)
1891 Association const &localHnaAssoc = *assocIterator;
1894 NS_LOG_INFO (
"HNA association for network " << networkAddr <<
"/" << netmask <<
" already exists.");
1899 NS_LOG_INFO (
"Adding HNA association for network " << networkAddr <<
"/" << netmask <<
".");
1911 NS_LOG_INFO (
"Removing HNA association for network " << networkAddr <<
"/" << netmask <<
".");
1932 NS_LOG_INFO (
"Removing HNA entries coming from the old routing table association.");
1951 NS_LOG_DEBUG (
"Nb local associations before adding some entries from"
1966 NS_LOG_DEBUG (
"Nb local associations after having added some entries from "
1994 bool updated =
false;
1995 bool created =
false;
1997 <<
": LinkSensing(receiverIface=" << receiverIface
1998 <<
", senderIface=" << senderIface <<
") BEGIN");
2002 if (link_tuple == NULL)
2008 newLinkTuple.
symTime = now - Seconds (1);
2012 NS_LOG_LOGIC (
"Existing link tuple did not exist => creating new one");
2016 NS_LOG_LOGIC (
"Existing link tuple already exists => will update it");
2020 link_tuple->asymTime = now + msg.
GetVTime ();
2021 for (std::vector<olsr::MessageHeader::Hello::LinkMessage>::const_iterator linkMessage =
2026 int lt = linkMessage->linkCode & 0x03;
2027 int nt = (linkMessage->linkCode >> 2) & 0x03;
2029 #ifdef NS3_LOG_ENABLE
2030 const char *linkTypeName;
2042 const char *neighborTypeName;
2048 default: neighborTypeName =
"(invalid value!)";
2051 NS_LOG_DEBUG (
"Looking at HELLO link messages with Link Type "
2052 << lt <<
" (" << linkTypeName
2053 <<
") and Neighbor Type " << nt
2054 <<
" (" << neighborTypeName <<
")");
2055 #endif // NS3_LOG_ENABLE
2062 NS_LOG_LOGIC (
"HELLO link code is invalid => IGNORING");
2066 for (std::vector<Ipv4Address>::const_iterator neighIfaceAddr =
2067 linkMessage->neighborInterfaceAddresses.begin ();
2068 neighIfaceAddr != linkMessage->neighborInterfaceAddresses.end ();
2072 if (*neighIfaceAddr == receiverIface)
2077 link_tuple->symTime = now - Seconds (1);
2082 NS_LOG_DEBUG (*link_tuple <<
": link is SYM or ASYM => should become SYM now"
2083 " (symTime being increased to " << now + msg.
GetVTime ());
2084 link_tuple->symTime = now + msg.
GetVTime ();
2096 NS_LOG_DEBUG (
" \\-> *neighIfaceAddr (" << *neighIfaceAddr
2097 <<
" != receiverIface (" << receiverIface <<
") => IGNORING!");
2100 NS_LOG_DEBUG (
"Link tuple updated: " <<
int (updated));
2102 link_tuple->time = std::max (link_tuple->time, link_tuple->asymTime);
2115 link_tuple->neighborIfaceAddr));
2118 <<
": LinkSensing END");
2129 if (nb_tuple != NULL)
2147 for (LinkSet::const_iterator link_tuple =
m_state.
GetLinks ().begin ();
2150 NS_LOG_LOGIC (
"Looking at link tuple: " << *link_tuple);
2154 "GetMainAddress (link_tuple->neighborIfaceAddr) != msg.GetOriginatorAddress ()");
2155 NS_LOG_LOGIC (
"(GetMainAddress(" << link_tuple->neighborIfaceAddr <<
"): "
2161 if (link_tuple->symTime < now)
2167 typedef std::vector<olsr::MessageHeader::Hello::LinkMessage> LinkMessageVec;
2168 for (LinkMessageVec::const_iterator linkMessage = hello.
linkMessages.begin ();
2169 linkMessage != hello.
linkMessages.end (); linkMessage++)
2171 int neighborType = (linkMessage->linkCode >> 2) & 0x3;
2172 #ifdef NS3_LOG_ENABLE
2173 const char *neighborTypeNames[3] = {
"NOT_NEIGH",
"SYM_NEIGH",
"MPR_NEIGH" };
2174 const char *neighborTypeName = ((neighborType < 3) ?
2175 neighborTypeNames[neighborType]
2176 :
"(invalid value)");
2177 NS_LOG_DEBUG (
"Looking at Link Message from HELLO message: neighborType="
2178 << neighborType <<
" (" << neighborTypeName <<
")");
2179 #endif // NS3_LOG_ENABLE
2181 for (std::vector<Ipv4Address>::const_iterator nb2hop_addr_iter =
2182 linkMessage->neighborInterfaceAddresses.begin ();
2183 nb2hop_addr_iter != linkMessage->neighborInterfaceAddresses.end ();
2187 NS_LOG_DEBUG (
"Looking at 2-hop neighbor address from HELLO message: "
2188 << *nb2hop_addr_iter
2189 <<
" (main address is " << nb2hop_addr <<
")");
2197 NS_LOG_LOGIC (
"Ignoring 2-hop neighbor (it is the node itself)");
2205 << (nb2hop_tuple ?
" (refreshing existing entry)" :
""));
2206 if (nb2hop_tuple == NULL)
2231 NS_LOG_LOGIC (
"2-hop neighbor is NOT_NEIGH => deleting matching 2-hop neighbor state");
2236 NS_LOG_LOGIC (
"*** WARNING *** Ignoring link message (inside HELLO) with bad"
2237 " neighbor type value: " << neighborType);
2259 typedef std::vector<olsr::MessageHeader::Hello::LinkMessage> LinkMessageVec;
2260 for (LinkMessageVec::const_iterator linkMessage = hello.
linkMessages.begin ();
2264 int nt = linkMessage->linkCode >> 2;
2267 NS_LOG_DEBUG (
"Processing a link message with neighbor type MPR_NEIGH");
2269 for (std::vector<Ipv4Address>::const_iterator nb_iface_addr =
2270 linkMessage->neighborInterfaceAddresses.begin ();
2271 nb_iface_addr != linkMessage->neighborInterfaceAddresses.end ();
2276 NS_LOG_DEBUG (
"Adding entry to mpr selector set for neighbor " << *nb_iface_addr);
2281 if (existing_mprsel_tuple == NULL)
2318 struct hdr_ip* ih = HDR_IP (p);
2319 struct hdr_cmn* ch = HDR_CMN (p);
2321 debug (
"%f: Node %d MAC Layer detects a breakage on link to %d\n",
2323 OLSR::node_id (ra_addr ()),
2324 OLSR::node_id (ch->next_hop ()));
2326 if ((u_int32_t)ih->daddr () == IP_BROADCAST) {
2327 drop (p, DROP_RTR_MAC_CALLBACK);
2331 OLSR_link_tuple* link_tuple = state_.find_link_tuple (ch->next_hop ());
2332 if (link_tuple != NULL) {
2335 nb_loss (link_tuple);
2337 drop (p, DROP_RTR_MAC_CALLBACK);
2427 <<
" LinkTuple " << tuple <<
" REMOVED.");
2447 <<
" LinkTuple " << tuple <<
" UPDATED.");
2452 if (nb_tuple == NULL)
2458 if (nb_tuple != NULL)
2460 #ifdef NS3_LOG_ENABLE
2461 int statusBefore = nb_tuple->
status;
2462 #endif // NS3_LOG_ENABLE
2464 bool hasSymmetricLink =
false;
2467 for (LinkSet::const_iterator it = linkSet.begin ();
2468 it != linkSet.end (); it++)
2474 hasSymmetricLink =
true;
2479 if (hasSymmetricLink)
2482 NS_LOG_DEBUG (*nb_tuple <<
"->status = STATUS_SYM; changed:"
2483 <<
int (statusBefore != nb_tuple->
status));
2488 NS_LOG_DEBUG (*nb_tuple <<
"->status = STATUS_NOT_SYM; changed:"
2489 <<
int (statusBefore != nb_tuple->
status));
2494 NS_LOG_WARN (
"ERROR! Wanted to update a NeighborTuple but none was found!");
2744 NS_LOG_DEBUG (
"Not sending any TC, no one selected me as MPR.");
2772 NS_LOG_DEBUG (
"Not sending any HNA, no associations to advertise.");
2801 address, sequenceNumber));
2827 if (tuple->
time < now)
2831 else if (tuple->
symTime < now)
2840 neighborIfaceAddr));
2846 neighborIfaceAddr));
2874 this, neighborMainAddr, twoHopNeighborAddr));
2975 this, gatewayAddr, networkAddr, netmask));
3010 std::map<Ipv4Address, RoutingTableEntry>::const_iterator it =
3015 outEntry = it->second;
3059 if (!foundSendEntry)
3063 uint32_t interfaceIdx = entry2.
interface;
3064 if (oif &&
m_ipv4->GetInterfaceForDevice (oif) !=
static_cast<int> (interfaceIdx))
3071 <<
" Route interface " << interfaceIdx
3072 <<
" does not match requested output interface "
3073 <<
m_ipv4->GetInterfaceForDevice (oif));
3077 rtentry = Create<Ipv4Route> ();
3083 uint32_t numOifAddresses =
m_ipv4->GetNAddresses (interfaceIdx);
3086 if (numOifAddresses == 1) {
3087 ifAddr =
m_ipv4->GetAddress (interfaceIdx, 0);
3090 NS_FATAL_ERROR (
"XXX Not implemented yet: IP aliasing and OLSR");
3092 rtentry->SetSource (ifAddr.
GetLocal ());
3093 rtentry->SetGateway (entry2.
nextAddr);
3094 rtentry->SetOutputDevice (
m_ipv4->GetNetDevice (interfaceIdx));
3098 <<
" --> nextHop=" << entry2.
nextAddr
3100 NS_LOG_DEBUG (
"Found route to " << rtentry->GetDestination () <<
" via nh " << rtentry->GetGateway () <<
" with source addr " << rtentry->GetSource () <<
" and output dev " << rtentry->GetOutputDevice ());
3110 NS_LOG_DEBUG (
"Found route to " << rtentry->GetDestination () <<
" via nh " << rtentry->GetGateway () <<
" with source addr " << rtentry->GetSource () <<
" and output dev " << rtentry->GetOutputDevice ());
3118 <<
" No route to host");
3142 uint32_t iif =
m_ipv4->GetInterfaceForDevice (idev);
3143 if (
m_ipv4->IsDestinationAddress (dst, iif))
3148 lcb (p, header, iif);
3168 if (!foundSendEntry)
3170 rtentry = Create<Ipv4Route> ();
3172 uint32_t interfaceIdx = entry2.
interface;
3177 uint32_t numOifAddresses =
m_ipv4->GetNAddresses (interfaceIdx);
3180 if (numOifAddresses == 1) {
3181 ifAddr =
m_ipv4->GetAddress (interfaceIdx, 0);
3184 NS_FATAL_ERROR (
"XXX Not implemented yet: IP aliasing and OLSR");
3192 <<
" --> nextHop=" << entry2.
nextAddr
3195 ucb (rtentry, p, header);
3207 #ifdef NS3_LOG_ENABLE
3210 <<
" --> NOT FOUND; ** Dumping routing table...");
3212 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter =
m_table.begin ();
3213 iter !=
m_table.end (); iter++)
3215 NS_LOG_DEBUG (
"dest=" << iter->first <<
" --> next=" << iter->second.nextAddr
3216 <<
" via interface " << iter->second.interface);
3220 #endif // NS3_LOG_ENABLE
3281 for (uint32_t i = 0; i <
m_ipv4->GetNInterfaces (); i++)
3283 for (uint32_t j = 0; j <
m_ipv4->GetNAddresses (i); j++)
3285 if (
m_ipv4->GetAddress (i,j).GetLocal () == interfaceAddress)
3287 AddEntry (dest, next, i, distance);
3293 AddEntry (dest, next, 0, distance);
3297 std::vector<RoutingTableEntry>
3300 std::vector<RoutingTableEntry> retval;
3301 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter =
m_table.begin ();
3302 iter !=
m_table.end (); iter++)
3304 retval.push_back (iter->second);
3335 #ifdef NS3_LOG_ENABLE
3348 if (now < iter->expirationTime)
3354 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter =
m_table.begin (); iter !=
m_table.end (); iter++)
3356 NS_LOG_DEBUG (
" dest=" << iter->first <<
" --> next=" << iter->second.nextAddr <<
" via interface " << iter->second.interface);
3359 #endif //NS3_LOG_ENABLE
std::vector< TopologyTuple > TopologySet
Topology Set type.
Ipv4Address networkAddr
Network Address of network reachable through gatewayAddr.
static TypeId GetTypeId(void)
Get the type ID.
std::set< uint32_t > m_interfaceExclusions
#define JITTER
Random number between [0-OLSR_MAXJITTER] used to jitter OLSR packet transmission. ...
An OLSR's routing table entry.
uint32_t distance
Distance in hops to the destination.
#define OLSR_MPR_NEIGH
Asymmetric neighbor type.
keep track of time values and allow control of global simulation resolution
void HelloTimerExpire()
Sends a HELLO message and reschedules the HELLO timer.
void AddTopologyTuple(const TopologyTuple &tuple)
Adds a topology tuple to the Topology Set.
void EraseDuplicateTuple(const DuplicateTuple &tuple)
Ipv4Address GetIpv4(void) const
#define OLSR_MAX_SEQ_NUM
Maximum allowed sequence number.
smart pointer class similar to boost::intrusive_ptr
void DoDispose()
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
#define NS_LOG_FUNCTION(parameters)
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
Ptr< const AttributeChecker > MakeEnumChecker(int v1, std::string n1, int v2, std::string n2, int v3, std::string n3, int v4, std::string n4, int v5, std::string n5, int v6, std::string n6, int v7, std::string n7, int v8, std::string n8, int v9, std::string n9, int v10, std::string n10, int v11, std::string n11, int v12, std::string n12, int v13, std::string n13, int v14, std::string n14, int v15, std::string n15, int v16, std::string n16, int v17, std::string n17, int v18, std::string n18, int v19, std::string n19, int v20, std::string n20, int v21, std::string n21, int v22, std::string n22)
void IfaceAssocTupleTimerExpire(Ipv4Address ifaceAddr)
Removes tuple_ if expired.
uint16_t sequenceNumber
Sequence number.
void RemoveMprSelectorTuple(const MprSelectorTuple &tuple)
Removes an MPR selector tuple from the MPR Selector Set.
#define OLSR_WILL_DEFAULT
Willingness for forwarding packets from other nodes: medium.
uint16_t GetPacketSequenceNumber()
Increments packet sequence number and returns the new value.
std::vector< Association > Associations
Association Set type.
Time m_midInterval
MID messages' emission interval.
#define OLSR_DUP_HOLD_TIME
Dup holding time.
void Clear()
Clears the routing table and frees the memory assigned to each one of its entries.
Ipv4Address GetLocal(void) const
Get the local address.
uint16_t m_messageSequenceNumber
Messages sequence number counter.
virtual bool SetAllowBroadcast(bool allowBroadcast)=0
Configure whether broadcast datagram transmissions are allowed.
void InsertAssociation(const Association &tuple)
LinkTuple * FindSymLinkTuple(const Ipv4Address &ifaceAddr, Time time)
Ipv4Address destAddr
Address of the destination node.
a class to represent an Ipv4 address mask
NS_LOG_COMPONENT_DEFINE("OlsrHeader")
void HnaTimerExpire()
Sends an HNA message (if the node has associated hosts/networks) and reschedules the HNA timer...
#define OLSR_TOP_HOLD_TIME
Top holding time.
void LinkTupleUpdated(const LinkTuple &tuple, uint8_t willingness)
This function is invoked when a link tuple is updated.
void LinkSensing(const olsr::MessageHeader &msg, const olsr::MessageHeader::Hello &hello, const Ipv4Address &receiverIface, const Ipv4Address &sender_iface)
Updates Link Set according to a new received HELLO message (following RFC 3626 specification).
uint16_t m_ansn
Advertised Neighbor Set sequence number.
bool IsNull(void) const
Check for null implementation.
#define NS_ASSERT(condition)
Ipv4Address GetDestNetwork(void) const
#define OLSR_WILL_ALWAYS
Willingness for forwarding packets from other nodes: always.
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
void AddEntry(const Ipv4Address &dest, const Ipv4Address &next, uint32_t interface, uint32_t distance)
Adds a new entry into the routing table.
bool m_linkTupleTimerFirstTime
uint32_t GetSize(void) const
virtual void NotifyInterfaceUp(uint32_t interface)
void SendTc()
Creates a new OLSR TC message which is buffered for being sent later on.
void EraseAssociationTuple(const AssociationTuple &tuple)
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
virtual void DoDispose(void)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
void DupTupleTimerExpire(Ipv4Address address, uint16_t sequenceNumber)
Removes tuple if expired.
Time time
Time at which this tuple expires and must be removed.
IfaceAssocTuple * FindIfaceAssocTuple(const Ipv4Address &ifaceAddr)
enum ns3::olsr::NeighborTuple::Status status
Timer m_queuedMessagesTimer
void AddHostNetworkAssociation(Ipv4Address networkAddr, Ipv4Mask netmask)
Inject Association to be sent in HNA message.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
Ipv4Address m_mainAddress
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
Time expirationTime
Time at which this tuple expires and must be removed.
#define OLSR_WILL_LOW
Willingness for forwarding packets from other nodes: low.
void EraseOlderTopologyTuples(const Ipv4Address &lastAddr, uint16_t ansn)
void LinkTupleTimerExpire(Ipv4Address neighborIfaceAddr)
Removes tuple_ if expired.
void SetMainInterface(uint32_t interface)
Set the OLSR main address to the first address on the indicated interface.
SocketErrno
Enumeration of the possible errors returned by a socket.
Ipv4Mask netmask
Netmask of network reachable through gatewayAddr.
void InsertTopologyTuple(const TopologyTuple &tuple)
void EraseTopologyTuple(const TopologyTuple &tuple)
const LinkSet & GetLinks() const
void Nb2hopTupleTimerExpire(Ipv4Address neighborMainAddr, Ipv4Address twoHopNeighborAddr)
Removes tuple_ if expired.
void RemoveAssociationTuple(const AssociationTuple &tuple)
Removes a host network association tuple from the Association Set.
DuplicateTuple * FindDuplicateTuple(const Ipv4Address &address, uint16_t sequenceNumber)
#define NS_FATAL_ERROR(msg)
fatal error handling
void ProcessTc(const olsr::MessageHeader &msg, const Ipv4Address &senderIface)
Processes a TC message following RFC 3626 specification.
Ipv4Address GetSubnetDirectedBroadcast(Ipv4Mask const &mask) const
Generate subnet-directed broadcast address corresponding to mask.
#define OLSR_NEIGHB_HOLD_TIME
Neighbor holding time.
a polymophic address class
bool IsRunning(void) const
void MprSelTupleTimerExpire(Ipv4Address mainAddr)
Removes tuple_ if expired.
#define OLSR_SYM_LINK
Symmetric link type.
void SetSource(Ipv4Address src)
std::map< Ipv4Address, RoutingTableEntry > m_table
Data structure for the routing table.
TracedCallback< const PacketHeader &, const MessageList & > m_rxPacketTrace
void RemoveIfaceAssocTuple(const IfaceAssocTuple &tuple)
Removes an interface association tuple from the Interface Association Set.
uint32_t GetInterface(void) const
EventGarbageCollector m_events
double GetSeconds(void) const
void AddAtEnd(Ptr< const Packet > packet)
Concatenate the input packet at the end of the current packet.
virtual ~RoutingProtocol()
Ipv4Address lastAddr
Main address of a node which is a neighbor of the destination.
A record of an IPv4 routing table entry for Ipv4GlobalRouting and Ipv4StaticRouting.
void EraseTwoHopNeighborTuples(const Ipv4Address &neighbor)
uint8_t m_willingness
Willingness for forwarding packets on behalf of other nodes.
void PopulateNeighborSet(const olsr::MessageHeader &msg, const olsr::MessageHeader::Hello &hello)
Updates the Neighbor Set according to the information contained in a new received HELLO message (foll...
Time expirationTime
Time at which this tuple expires and must be removed.
void RemoveHostNetworkAssociation(Ipv4Address networkAddr, Ipv4Mask netmask)
Removes Association sent in HNA message.
hold variables of type 'enum'
Ipv4Address mainAddr
Main address of the node.
void AddIfaceAssocTuple(const IfaceAssocTuple &tuple)
Adds an interface association tuple to the Interface Association Set.
void QueueMessage(const olsr::MessageHeader &message, Time delay)
Enques an OLSR message which will be sent with a delay of (0, delay].
hold objects of type ns3::Time
Ipv4Address mainAddr
Main address of a node which have selected this node as a MPR.
void SendPacket(Ptr< Packet > packet, const MessageList &containedMessages)
void Schedule(void)
Schedule a new event using the currently-configured delay, function, and arguments.
TopologyTuple * FindTopologyTuple(const Ipv4Address &destAddr, const Ipv4Address &lastAddr)
void SetGateway(Ipv4Address gw)
void ProcessHello(const olsr::MessageHeader &msg, const Ipv4Address &receiverIface, const Ipv4Address &senderIface)
Processes a HELLO message following RFC 3626 specification.
#define DELAY(time)
Gets the delay between a given time and the current time.
void InsertTwoHopNeighborTuple(const TwoHopNeighborTuple &tuple)
void AddAssociationTuple(const AssociationTuple &tuple)
Adds a host network association tuple to the Association Set.
Ptr< Ipv4StaticRouting > m_hnaRoutingTable
Time expirationTime
Time at which this tuple expires and must be removed.
virtual bool RouteInput(Ptr< const Packet > p, const Ipv4Header &header, Ptr< const NetDevice > idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb)
Route an input packet (to be forwarded or locally delivered)
void MprComputation()
Computates MPR set of a node following RFC 3626 hints.
std::vector< LinkTuple > LinkSet
Link Set type.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
void RemoveDuplicateTuple(const DuplicateTuple &tuple)
Removes a duplicate tuple from the Duplicate Set.
Time symTime
The link is considered bidirectional until this time.
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
void EraseAssociation(const Association &tuple)
const Associations & GetAssociations() const
void CoverTwoHopNeighbors(Ipv4Address neighborMainAddr, TwoHopNeighborSet &N2)
Remove all covered 2-hop neighbors from N2 set.
Time m_helloInterval
HELLO messages' emission interval.
LinkTuple & InsertLinkTuple(const LinkTuple &tuple)
void SetDelay(const Time &delay)
#define NS_LOG_LOGIC(msg)
#define OLSR_UNSPEC_LINK
Unspecified link type.
#define OLSR_NOT_NEIGH
Not neighbor type.
#define OLSR_ASYM_LINK
Asymmetric link type.
void SetRoutingTableAssociation(Ptr< Ipv4StaticRouting > routingTable)
Inject Associations from an Ipv4StaticRouting instance.
Ipv4Address destAddr
Main address of the destination.
std::vector< IfaceAssocTuple > IfaceAssocSet
Interface Association Set type.
void SetMprSet(MprSet mprSet)
MprSet is set by routing protocol after MprCompute.
std::map< Ptr< Socket >, Ipv4InterfaceAddress > m_socketAddresses
void TopologyTupleTimerExpire(Ipv4Address destAddr, Ipv4Address lastAddr)
Removes tuple_ if expired.
Time m_tcInterval
TC messages' emission interval.
const IfaceAssocSet & GetIfaceAssocSet() const
void AddTwoHopNeighborTuple(const TwoHopNeighborTuple &tuple)
Adds a 2-hop neighbor tuple to the 2-hop Neighbor Set.
void AssociationTupleTimerExpire(Ipv4Address gatewayAddr, Ipv4Address networkAddr, Ipv4Mask netmask)
Removes tuple_ if expired.
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream) const
Print the Routing Table entries.
void NeighborLoss(const LinkTuple &tuple)
Performs all actions needed when a neighbor loss occurs.
void RemoveTopologyTuple(const TopologyTuple &tuple)
Removes a topology tuple from the Topology Set.
uint8_t willingness
A value between 0 and 7 specifying the node's willingness to carry traffic on behalf of other nodes...
Time expirationTime
Time at which this tuple expires and must be removed.
void SendMid()
Creates a new OLSR MID message which is buffered for being sent later on.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
void InsertDuplicateTuple(const DuplicateTuple &tuple)
static InetSocketAddress ConvertFrom(const Address &address)
void RecvOlsr(Ptr< Socket > socket)
Ipv4Address neighborMainAddr
Main address of a neighbor node.
Ipv4Address twoHopNeighborAddr
Main address of a 2-hop neighbor with a symmetric link to nb_main_addr.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
static TypeId GetTypeId(void)
TopologyTuple * FindNewerTopologyTuple(const Ipv4Address &lastAddr, uint16_t ansn)
AssociationTuple * FindAssociationTuple(const Ipv4Address &gatewayAddr, const Ipv4Address &networkAddr, const Ipv4Mask &netmask)
void MidTimerExpire()
Sends a MID message (if the node has more than one interface) and resets the MID timer.
Ptr< Ipv4StaticRouting > m_routingTableAssociation
void EraseTwoHopNeighborTuple(const TwoHopNeighborTuple &tuple)
void AddNeighborTuple(const NeighborTuple &tuple)
Adds a neighbor tuple to the Neighbor Set.
void SendHello()
Creates a new OLSR HELLO message which is buffered for being sent later on.
std::vector< Ipv4Address > FindNeighborInterfaces(const Ipv4Address &neighborMainAddr) const
void RemoveLinkTuple(const LinkTuple &tuple)
Removes a link tuple from the Link Set.
bool UsesNonOlsrOutgoingInterface(const Ipv4RoutingTableEntry &route)
Tests whether or not the specified route uses a non-OLSR outgoing interface.
LinkTuple * FindLinkTuple(const Ipv4Address &ifaceAddr)
bool Lookup(const Ipv4Address &dest, RoutingTableEntry &outEntry) const
Looks up an entry for the specified destination address.
std::vector< MessageHeader > MessageList
Ipv4Address localIfaceAddr
Interface address of the local node.
static Time Now(void)
Return the "current simulation time".
void SetOutputDevice(Ptr< NetDevice > outputDevice)
Equivalent in Linux to dst_entry.dev.
Time time
Time at which this tuple expires and must be removed.
virtual void NotifyInterfaceDown(uint32_t interface)
uint16_t m_packetSequenceNumber
Packets sequence number counter.
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
void PopulateTwoHopNeighborSet(const olsr::MessageHeader &msg, const olsr::MessageHeader::Hello &hello)
Updates the 2-hop Neighbor Set according to the information contained in a new received HELLO message...
void InsertMprSelectorTuple(const MprSelectorTuple &tuple)
Ipv4Address GetMainAddress(Ipv4Address iface_addr) const
Gets the main address associated with a given interface address.
void RoutingTableComputation()
Creates the routing table of the node following RFC 3626 hints.
void RemoveTwoHopNeighborTuple(const TwoHopNeighborTuple &tuple)
Removes a 2-hop neighbor tuple from the 2-hop Neighbor Set.
void EraseIfaceAssocTuple(const IfaceAssocTuple &tuple)
void RemoveEntry(const Ipv4Address &dest)
Deletes the entry whose destination address is given.
void ForwardDefault(olsr::MessageHeader olsrMessage, DuplicateTuple *duplicated, const Ipv4Address &localIface, const Ipv4Address &senderAddress)
OLSR's default forwarding algorithm.
void ProcessHna(const olsr::MessageHeader &msg, const Ipv4Address &senderIface)
Processes a HNA message following RFC 3626 specification.
virtual Ptr< Ipv4Route > RouteOutput(Ptr< Packet > p, const Ipv4Header &header, Ptr< NetDevice > oif, Socket::SocketErrno &sockerr)
Query routing cache for an existing route, for an outbound packet.
int Degree(NeighborTuple const &tuple)
This auxiliary function (defined in RFC 3626) is used for calculating the MPR Set.
#define OLSR_WILL_HIGH
Willingness for forwarding packets from other nodes: high.
uint32_t interface
Interface index.
Ipv4 addresses are stored in host order in this class.
std::vector< NeighborTuple > NeighborSet
Neighbor Set type.
bool IsMyOwnAddress(const Ipv4Address &a) const
Check that address is one of my interfaces.
uint32_t GetId(void) const
void EraseLinkTuple(const LinkTuple &tuple)
a class to store IPv4 address information on an interface
virtual void SetIpv4(Ptr< Ipv4 > ipv4)
void PopulateMprSelectorSet(const olsr::MessageHeader &msg, const olsr::MessageHeader::Hello &hello)
Updates the MPR Selector Set according to the information contained in a new received HELLO message (...
void SendQueuedMessages()
Creates as many OLSR packets as needed in order to send all buffered OLSR messages.
Ipv4Address ifaceAddr
Interface address of a node.
#define OLSR_LOST_LINK
Lost link type.
Ipv4Address nextAddr
Address of the next hop.
TracedCallback< const PacketHeader &, const MessageList & > m_txPacketTrace
void EraseMprSelectorTuple(const MprSelectorTuple &tuple)
std::set< Ipv4Address > MprSet
MPR Set type.
#define OLSR_SYM_NEIGH
Symmetric neighbor type.
#define NS_LOG_DEBUG(msg)
bool FindMprAddress(const Ipv4Address &address)
void SendHna()
Creates a new OLSR HNA message which is buffered for being sent later on.
const TwoHopNeighborSet & GetTwoHopNeighbors() const
#define OLSR_MID_HOLD_TIME
MID holding time.
std::vector< TwoHopNeighborTuple > TwoHopNeighborSet
2-hop Neighbor Set type.
void Track(EventId event)
Tracks a new event.
const AssociationSet & GetAssociationSet() const
static std::string FindName(Ptr< Object > object)
Given a pointer to an object, look to see if that object has a name associated with it and...
MprSelectorTuple * FindMprSelectorTuple(const Ipv4Address &mainAddr)
Abstract base class for IPv4 routing protocols.
#define OLSR_WILL_NEVER
Willingness for forwarding packets from other nodes: never.
#define OLSR_MAX_MSGS
Maximum number of messages per packet.
TwoHopNeighborTuple * FindTwoHopNeighborTuple(const Ipv4Address &neighbor, const Ipv4Address &twoHopNeighbor)
void LinkTupleAdded(const LinkTuple &tuple, uint8_t willingness)
void SetInterfaceExclusions(std::set< uint32_t > exceptions)
Time m_hnaInterval
HNA messages' emission interval.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
const NeighborSet & GetNeighbors() const
void Dump(void)
Dump the neighbor table, two-hop neighbor table, and routing table to logging output (NS_LOG_DEBUG lo...
void EraseMprSelectorTuples(const Ipv4Address &mainAddr)
uint16_t GetPort(void) const
Ipv4Address neighborMainAddr
Main address of a neighbor.
virtual void DoInitialize(void)
This method is called only once by Object::Initialize.
std::vector< RoutingTableEntry > GetRoutingTableEntries() const
Return the list of routing table entries discovered by OLSR.
void InsertNeighborTuple(const NeighborTuple &tuple)
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)=0
Read a single packet from the socket and retrieve the sender address.
void AddDuplicateTuple(const DuplicateTuple &tuple)
Adds a duplicate tuple to the Duplicate Set.
void TcTimerExpire()
Sends a TC message (if there exists any MPR selector) and reschedules the TC timer.
Ipv4Address address
Originator address of the message.
const MprSelectorSet & GetMprSelectors() const
void RemoveNeighborTuple(const NeighborTuple &tuple)
Removes a neighbor tuple from the Neighbor Set.
uint16_t GetMessageSequenceNumber()
Increments message sequence number and returns the new value.
IfaceAssocSet & GetIfaceAssocSetMutable()
void EraseNeighborTuple(const NeighborTuple &neighborTuple)
Ipv4Address gatewayAddr
Main address of the gateway.
OlsrState m_state
Internal state with all needed data structs.
void AddMprSelectorTuple(const MprSelectorTuple &tuple)
Adds an MPR selector tuple to the MPR Selector Set.
TracedCallback< uint32_t > m_routingTableChanged
NeighborTuple * FindNeighborTuple(const Ipv4Address &mainAddr)
Ipv4Address neighborIfaceAddr
Interface address of the neighbor node.
#define OLSR_HNA_HOLD_TIME
HNA holding time.
std::string PrintMprSelectorSet() const
Ipv4Mask GetDestNetworkMask(void) const
a unique identifier for an interface.
An Interface Association Tuple.
bool retransmitted
Indicates whether the message has been retransmitted or not.
TypeId SetParent(TypeId tid)
The type "list of interface addresses".
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
uint16_t sequenceNumber
Message sequence number.
std::vector< AssociationTuple > AssociationSet
Association Set type.
void AddHeader(const Header &header)
Add header to this packet.
olsr::MessageList m_queuedMessages
A list of pending messages which are buffered awaiting for being sent.
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
void SetDestination(Ipv4Address dest)
const NeighborTuple * FindSymNeighborTuple(const Ipv4Address &mainAddr) const
bool FindSendEntry(const RoutingTableEntry &entry, RoutingTableEntry &outEntry) const
Finds the appropiate entry which must be used in order to forward a data packet to a next hop (given ...
const TopologySet & GetTopologySet() const
void InsertIfaceAssocTuple(const IfaceAssocTuple &tuple)
Time expirationTime
Time at which this tuple expires and must be removed.
std::vector< Ipv4Address > ifaceList
List of interfaces which the message has been received on.
void InsertAssociationTuple(const AssociationTuple &tuple)
void ProcessMid(const olsr::MessageHeader &msg, const Ipv4Address &senderIface)
Processes a MID message following RFC 3626 specification.