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"    50 #include "ns3/ipv4-packet-info-tag.h"    60 #define DELAY(time) (((time) < (Simulator::Now ())) ? Seconds (0.000001) : \    61                      (time - Simulator::Now () + Seconds (0.000001)))    70 #define OLSR_REFRESH_INTERVAL   m_helloInterval    76 #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)    89 #define OLSR_UNSPEC_LINK        0    90 #define OLSR_ASYM_LINK          1    92 #define OLSR_SYM_LINK           2    94 #define OLSR_LOST_LINK          3   100 #define OLSR_NOT_NEIGH          0   101 #define OLSR_SYM_NEIGH          1   103 #define OLSR_MPR_NEIGH          2   110 #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   124 #define OLSR_MAXJITTER          (m_helloInterval.GetSeconds () / 4)   125 #define OLSR_MAX_SEQ_NUM        65535   127 #define JITTER (Seconds (m_uniformRandomVariable->GetValue (0, OLSR_MAXJITTER)))   131 #define OLSR_PORT_NUMBER 698   132 #define OLSR_MAX_MSGS           64   136 #define OLSR_MAX_HELLOS         12   139 #define OLSR_MAX_ADDRS          64   155   static TypeId tid = 
TypeId (
"ns3::olsr::RoutingProtocol")
   157     .SetGroupName (
"Olsr")
   159     .AddAttribute (
"HelloInterval", 
"HELLO messages emission interval.",
   163     .AddAttribute (
"TcInterval", 
"TC messages emission interval.",
   167     .AddAttribute (
"MidInterval", 
"MID messages emission interval.  Normally it is equal to TcInterval.",
   171     .AddAttribute (
"HnaInterval", 
"HNA messages emission interval.  Normally it is equal to TcInterval.",
   175     .AddAttribute (
"Willingness", 
"Willingness of a node to carry and forward traffic for other nodes.",
   183     .AddTraceSource (
"Rx", 
"Receive OLSR packet.",
   185                      "ns3::olsr::RoutingProtocol::PacketTxRxTracedCallback")
   186     .AddTraceSource (
"Tx", 
"Send OLSR packet.",
   188                      "ns3::olsr::RoutingProtocol::PacketTxRxTracedCallback")
   189     .AddTraceSource (
"RoutingTableChanged", 
"The OLSR routing table has changed.",
   191                      "ns3::olsr::RoutingProtocol::TableChangeTracedCallback")
   198   : m_routingTableAssociation (0),
   200   m_helloTimer (
Timer::CANCEL_ON_DESTROY),
   201   m_tcTimer (
Timer::CANCEL_ON_DESTROY),
   202   m_midTimer (
Timer::CANCEL_ON_DESTROY),
   203   m_hnaTimer (
Timer::CANCEL_ON_DESTROY),
   204   m_queuedMessagesTimer (
Timer::CANCEL_ON_DESTROY)
   253       iter->first->
Close ();
   266   *os << 
"Node: " << 
m_ipv4->GetObject<
Node> ()->GetId ()
   267       << 
", Time: " << 
Now ().
As (unit)
   268       << 
", Local time: " << GetObject<Node> ()->GetLocalTime ().As (unit)
   269       << 
", OLSR Routing table" << std::endl;
   271   *os << 
"Destination\t\tNextHop\t\tInterface\tDistance\n";
   273   for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter = 
m_table.begin ();
   274        iter != 
m_table.end (); iter++)
   276       *os << iter->first << 
"\t\t";
   277       *os << iter->second.nextAddr << 
"\t\t";
   284           *os << iter->second.interface << 
"\t\t";
   286       *os << iter->second.distance << 
"\t";
   293       *os << 
" HNA Routing Table: ";
   298       *os << 
" HNA Routing Table: empty" << std::endl;
   307       for (uint32_t i = 0; i < 
m_ipv4->GetNInterfaces (); i++)
   311           if (addr != loopback)
   325   bool canRunOlsr = 
false;
   326   for (uint32_t i = 0; i < 
m_ipv4->GetNInterfaces (); i++)
   329       if (addr == loopback)
   374       if (socket->
Bind (inetAddr))
   412   receivedPacket = socket->
RecvFrom (sourceAddress);
   417       NS_ABORT_MSG (
"No incoming interface on OLSR message, aborting.");
   419   uint32_t incomingIf = interfaceInfo.
GetRecvIf ();
   420   Ptr<Node> node = this->GetObject<Node> ();
   422   uint32_t recvInterfaceIndex = 
m_ipv4->GetInterfaceForDevice (dev);
   433   int32_t interfaceForAddress = 
m_ipv4->GetInterfaceForAddress (senderIfaceAddr);
   434   if (interfaceForAddress != -1)
   440   Ipv4Address receiverIfaceAddr = 
m_ipv4->GetAddress (recvInterfaceIndex, 0).GetLocal ();
   443                              << senderIfaceAddr << 
" to " << receiverIfaceAddr);
   452   packet->RemoveHeader (olsrPacketHeader);
   461       if (packet->RemoveHeader (messageHeader) == 0)
   472       messages.push_back (messageHeader);
   477   for (MessageList::const_iterator messageIter = messages.begin ();
   478        messageIter != messages.end (); messageIter++)
   493       bool do_forwarding = 
true;
   510       if (duplicated == NULL)
   518               ProcessHello (messageHeader, receiverIfaceAddr, senderIfaceAddr);
   525               ProcessTc (messageHeader, senderIfaceAddr);
   549           NS_LOG_DEBUG (
"OLSR message is duplicated, not reading it.");
   553           for (std::vector<Ipv4Address>::const_iterator it = duplicated->
ifaceList.begin ();
   554                it != duplicated->
ifaceList.end (); it++)
   556               if (*it == receiverIfaceAddr)
   558                   do_forwarding = 
false;
   572                               receiverIfaceAddr, inetSourceAddr.
GetIpv4 ());
   599           if (nb_tuple == NULL)
   620   std::set<Ipv4Address> toRemove;
   621   for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); twoHopNeigh++)
   623       if (twoHopNeigh->neighborMainAddr == neighborMainAddr)
   625           toRemove.insert (twoHopNeigh->twoHopNeighborAddr);
   629   for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); )
   631       if (toRemove.find (twoHopNeigh->twoHopNeighborAddr) != toRemove.end ())
   633           twoHopNeigh = N2.erase (twoHopNeigh);
   660           N.push_back (*neighbor);
   684       for (NeighborSet::const_iterator neigh = N.begin ();
   685            neigh != N.end (); neigh++)
   687           if (neigh->neighborMainAddr == twoHopNeigh->neighborMainAddr)
   709       for (NeighborSet::const_iterator neigh = N.begin ();
   710            neigh != N.end (); neigh++)
   712           if (neigh->neighborMainAddr == twoHopNeigh->twoHopNeighborAddr)
   721           N2.push_back (*twoHopNeigh);
   725 #ifdef NS3_LOG_ENABLE   727     std::ostringstream os;
   729     for (TwoHopNeighborSet::const_iterator iter = N2.begin ();
   730          iter != N2.end (); iter++)
   732         TwoHopNeighborSet::const_iterator next = iter;
   734         os << iter->neighborMainAddr << 
"->" << iter->twoHopNeighborAddr;
   735         if (next != N2.end ())
   743 #endif  //NS3_LOG_ENABLE   747   for (NeighborSet::const_iterator neighbor = N.begin (); neighbor != N.end (); neighbor++)
   751           mprSet.insert (neighbor->neighborMainAddr);
   763   std::set<Ipv4Address> coveredTwoHopNeighbors;
   764   for (TwoHopNeighborSet::const_iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); twoHopNeigh++)
   768       for (TwoHopNeighborSet::const_iterator otherTwoHopNeigh = N2.begin (); otherTwoHopNeigh != N2.end (); otherTwoHopNeigh++)
   770           if (otherTwoHopNeigh->twoHopNeighborAddr == twoHopNeigh->twoHopNeighborAddr
   771               && otherTwoHopNeigh->neighborMainAddr != twoHopNeigh->neighborMainAddr)
   779           NS_LOG_LOGIC (
"Neighbor " << twoHopNeigh->neighborMainAddr
   780                                     << 
" is the only that can reach 2-hop neigh. "   781                                     << twoHopNeigh->twoHopNeighborAddr
   782                                     << 
" => select as MPR.");
   784           mprSet.insert (twoHopNeigh->neighborMainAddr);
   787           for (TwoHopNeighborSet::const_iterator otherTwoHopNeigh = N2.begin ();
   788                otherTwoHopNeigh != N2.end (); otherTwoHopNeigh++)
   790               if (otherTwoHopNeigh->neighborMainAddr == twoHopNeigh->neighborMainAddr)
   792                   coveredTwoHopNeighbors.insert (otherTwoHopNeigh->twoHopNeighborAddr);
   798   for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin ();
   799        twoHopNeigh != N2.end (); )
   801       if (coveredTwoHopNeighbors.find (twoHopNeigh->twoHopNeighborAddr) != coveredTwoHopNeighbors.end ())
   805           NS_LOG_LOGIC (
"2-hop neigh. " << twoHopNeigh->twoHopNeighborAddr << 
" is already covered by an MPR.");
   806           twoHopNeigh = N2.erase (twoHopNeigh);
   816   while (N2.begin () != N2.end ())
   819 #ifdef NS3_LOG_ENABLE   821         std::ostringstream os;
   823         for (TwoHopNeighborSet::const_iterator iter = N2.begin ();
   824              iter != N2.end (); iter++)
   826             TwoHopNeighborSet::const_iterator next = iter;
   828             os << iter->neighborMainAddr << 
"->" << iter->twoHopNeighborAddr;
   829             if (next != N2.end ())
   837 #endif  //NS3_LOG_ENABLE   844       std::map<int, std::vector<const NeighborTuple *> > reachability;
   846       for (NeighborSet::iterator it = N.begin (); it != N.end (); it++)
   850           for (TwoHopNeighborSet::iterator it2 = N2.begin (); it2 != N2.end (); it2++)
   859           reachability[r].push_back (&nb_tuple);
   872       for (std::set<int>::iterator it = rs.begin (); it != rs.end (); it++)
   879           for (std::vector<const NeighborTuple *>::iterator it2 = reachability[r].begin ();
   880                it2 != reachability[r].end (); it2++)
   909           mprSet.insert (
max->neighborMainAddr);
   911           NS_LOG_LOGIC (N2.size () << 
" 2-hop neighbors left to cover!");
   915 #ifdef NS3_LOG_ENABLE   917     std::ostringstream os;
   919     for (MprSet::const_iterator iter = mprSet.begin ();
   920          iter != mprSet.end (); iter++)
   922         MprSet::const_iterator next = iter;
   925         if (next != mprSet.end ())
   933 #endif  //NS3_LOG_ENABLE   958                                                 << 
": RoutingTableComputation begin...");
   966   for (NeighborSet::const_iterator it = neighborSet.begin ();
   967        it != neighborSet.end (); it++)
   970       NS_LOG_DEBUG (
"Looking at neighbor tuple: " << nb_tuple);
   973           bool nb_main_addr = 
false;
   976           for (LinkSet::const_iterator it2 = linkSet.begin ();
   977                it2 != linkSet.end (); it2++)
   986                                                                << 
" => adding routing table entry to neighbor");
  1015           if (!nb_main_addr && lt != NULL)
  1017               NS_LOG_LOGIC (
"no R_dest_addr is equal to the main address of the neighbor "  1018                             "=> adding additional routing entry");
  1033   for (TwoHopNeighborSet::const_iterator it = twoHopNeighbors.begin ();
  1034        it != twoHopNeighbors.end (); it++)
  1038       NS_LOG_LOGIC (
"Looking at two-hop neighbor tuple: " << nb2hop_tuple);
  1043           NS_LOG_LOGIC (
"Two-hop neighbor tuple is also neighbor; skipped.");
  1056       bool nb2hopOk = 
false;
  1057       for (NeighborSet::const_iterator neighbor = neighborSet.begin ();
  1058            neighbor != neighborSet.end (); neighbor++)
  1069           NS_LOG_LOGIC (
"Two-hop neighbor tuple skipped: 2-hop neighbor "  1072                         << 
", which was not found in the Neighbor Set.");
  1091           NS_LOG_LOGIC (
"Adding routing entry for two-hop neighbor.");
  1099           NS_LOG_LOGIC (
"NOT adding routing entry for two-hop neighbor ("  1101                         << 
" not found in the routing table)");
  1105   for (uint32_t h = 2;; h++)
  1116       for (TopologySet::const_iterator it = topology.begin ();
  1117            it != topology.end (); it++)
  1120           NS_LOG_LOGIC (
"Looking at topology tuple: " << topology_tuple);
  1123           bool have_destAddrEntry = 
Lookup (topology_tuple.
destAddr, destAddrEntry);
  1124           bool have_lastAddrEntry = 
Lookup (topology_tuple.
lastAddr, lastAddrEntry);
  1125           if (!have_destAddrEntry && have_lastAddrEntry && lastAddrEntry.
distance == h)
  1127               NS_LOG_LOGIC (
"Adding routing table entry based on the topology tuple.");
  1146               NS_LOG_LOGIC (
"NOT adding routing table entry based on the topology tuple: "  1147                             "have_destAddrEntry=" << have_destAddrEntry
  1148                                                   << 
" have_lastAddrEntry=" << have_lastAddrEntry
  1149                                                   << 
" lastAddrEntry.distance=" << (
int) lastAddrEntry.
distance  1150                                                   << 
" (h=" << h << 
")");
  1166   for (IfaceAssocSet::const_iterator it = ifaceAssocSet.begin ();
  1167        it != ifaceAssocSet.end (); it++)
  1173       if (have_entry1 && !have_entry2)
  1201   for (AssociationSet::const_iterator it = associationSet.begin ();
  1202        it != associationSet.end (); it++)
  1209       bool goToNextAssociationTuple = 
false;
  1211       NS_LOG_DEBUG (
"Nb local associations: " << localHnaAssociations.size ());
  1212       for (Associations::const_iterator assocIterator = localHnaAssociations.begin ();
  1213            assocIterator != localHnaAssociations.end (); assocIterator++)
  1215           Association const &localHnaAssoc = *assocIterator;
  1218               NS_LOG_DEBUG (
"HNA association received from another GW is part of local HNA associations: no route added for network "  1220               goToNextAssociationTuple = 
true;
  1223       if (goToNextAssociationTuple)
  1231       bool addRoute = 
false;
  1233       uint32_t routeIndex = 0;
  1235       for (routeIndex = 0; routeIndex < 
m_hnaRoutingTable->GetNRoutes (); routeIndex++)
  1255       if (addRoute && gatewayEntryExists)
  1280   LinkSensing (msg, hello, receiverIface, senderIface);
  1282 #ifdef NS3_LOG_ENABLE  1286                   << 
"s ** BEGIN dump Link Set for OLSR Node " << 
m_mainAddress);
  1287     for (LinkSet::const_iterator link = links.begin (); link != links.end (); link++)
  1295                   << 
"s ** BEGIN dump Neighbor Set for OLSR Node " << 
m_mainAddress);
  1296     for (NeighborSet::const_iterator neighbor = neighbors.begin (); neighbor != neighbors.end (); neighbor++)
  1302 #endif // NS3_LOG_ENABLE  1307 #ifdef NS3_LOG_ENABLE  1311                   << 
"s ** BEGIN dump TwoHopNeighbor Set for OLSR Node " << 
m_mainAddress);
  1312     for (TwoHopNeighborSet::const_iterator tuple = twoHopNeighbors.begin ();
  1313          tuple != twoHopNeighbors.end (); tuple++)
  1319 #endif // NS3_LOG_ENABLE  1335   if (link_tuple == NULL)
  1347   if (topologyTuple != NULL)
  1360   for (std::vector<Ipv4Address>::const_iterator i = tc.
neighborAddresses.begin ();
  1372       if (topologyTuple != NULL)
  1400 #ifdef NS3_LOG_ENABLE  1404                   << 
"s ** BEGIN dump TopologySet for OLSR Node " << 
m_mainAddress);
  1405     for (TopologySet::const_iterator tuple = topology.begin ();
  1406          tuple != topology.end (); tuple++)
  1412 #endif // NS3_LOG_ENABLE  1426   if (linkTuple == NULL)
  1429                     ": the sender interface of this message is not in the "  1430                     "symmetric 1-hop neighborhood of this node,"  1431                     " the message MUST be discarded.");
  1439       bool updated = 
false;
  1441       for (IfaceAssocSet::iterator tuple = ifaceAssoc.begin ();
  1442            tuple != ifaceAssoc.end (); tuple++)
  1444           if (tuple->ifaceAddr == *i
  1448               tuple->time = now + msg.
GetVTime ();
  1470   for (NeighborSet::iterator neighbor = neighbors.begin (); neighbor != neighbors.end (); neighbor++)
  1472       neighbor->neighborMainAddr = 
GetMainAddress (neighbor->neighborMainAddr);
  1476   for (TwoHopNeighborSet::iterator twoHopNeighbor = twoHopNeighbors.begin ();
  1477        twoHopNeighbor != twoHopNeighbors.end (); twoHopNeighbor++)
  1479       twoHopNeighbor->neighborMainAddr = 
GetMainAddress (twoHopNeighbor->neighborMainAddr);
  1480       twoHopNeighbor->twoHopNeighborAddr = 
GetMainAddress (twoHopNeighbor->twoHopNeighborAddr);
  1496   if (link_tuple == NULL)
  1504   for (std::vector<olsr::MessageHeader::Hna::Association>::const_iterator it = hna.
associations.begin ();
  1555   if (linkTuple == NULL)
  1572   bool retransmitted = 
false;
  1577       if (mprselTuple != NULL)
  1584           retransmitted = 
true;
  1589   if (duplicated != NULL)
  1593       duplicated->
ifaceList.push_back (localIface);
  1603       newDup.
ifaceList.push_back (localIface);
  1652   int numMessages = 0;
  1658   for (std::vector<olsr::MessageHeader>::const_iterator message = 
m_queuedMessages.begin ();
  1665       msglist.push_back (*message);
  1672           packet = Create<Packet> ();
  1702   std::vector<olsr::MessageHeader::Hello::LinkMessage>
  1706   for (LinkSet::const_iterator link_tuple = links.begin ();
  1707        link_tuple != links.end (); link_tuple++)
  1710             && link_tuple->time >= now))
  1715       uint8_t link_type, nb_type = 0xff;
  1718       if (link_tuple->symTime >= now)
  1722       else if (link_tuple->asymTime >= now)
  1735                                                << 
" to be MPR_NEIGH.");
  1744               if (nb_tuple->neighborMainAddr == 
GetMainAddress (link_tuple->neighborIfaceAddr))
  1749                                                            << 
" to be SYM_NEIGH.");
  1756                                                            << 
" to be NOT_NEIGH.");
  1760                       NS_FATAL_ERROR (
"There is a neighbor tuple with an unknown status!\n");
  1774       linkMessage.
linkCode = (link_type & 0x03) | ((nb_type << 2) & 0x0f);
  1776         (link_tuple->neighborIfaceAddr);
  1785       linkMessages.push_back (linkMessage);
  1788                                             << 
" (with " << 
int (linkMessages.size ()) << 
" link messages)");
  1839   for (uint32_t i = 0; i < 
m_ipv4->GetNInterfaces (); i++)
  1874   std::vector<olsr::MessageHeader::Hna::Association> &associations = hna.
associations;
  1878   for (Associations::const_iterator it = localHnaAssociations.begin ();
  1879        it != localHnaAssociations.end (); it++)
  1882       associations.push_back (assoc);
  1885   if (associations.size () == 0)
  1900   for (Associations::const_iterator assocIterator = localHnaAssociations.begin ();
  1901        assocIterator != localHnaAssociations.end (); assocIterator++)
  1903       Association const &localHnaAssoc = *assocIterator;
  1906           NS_LOG_INFO (
"HNA association for network " << networkAddr << 
"/" << netmask << 
" already exists.");
  1911   NS_LOG_INFO (
"Adding HNA association for network " << networkAddr << 
"/" << netmask << 
".");
  1918   NS_LOG_INFO (
"Removing HNA association for network " << networkAddr << 
"/" << netmask << 
".");
  1929       NS_LOG_INFO (
"Removing HNA entries coming from the old routing table association.");
  1948   NS_LOG_DEBUG (
"Nb local associations before adding some entries from"  1963   NS_LOG_DEBUG (
"Nb local associations after having added some entries from "  1983   bool updated = 
false;
  1984   bool created = 
false;
  1986                     << 
": LinkSensing(receiverIface=" << receiverIface
  1987                     << 
", senderIface=" << senderIface << 
") BEGIN");
  1991   if (link_tuple == NULL)
  2001       NS_LOG_LOGIC (
"Existing link tuple did not exist => creating new one");
  2005       NS_LOG_LOGIC (
"Existing link tuple already exists => will update it");
  2009   link_tuple->asymTime = now + msg.
GetVTime ();
  2010   for (std::vector<olsr::MessageHeader::Hello::LinkMessage>::const_iterator linkMessage =
  2015       int lt = linkMessage->linkCode & 0x03; 
  2016       int nt = (linkMessage->linkCode >> 2) & 0x03; 
  2018 #ifdef NS3_LOG_ENABLE  2019       const char *linkTypeName;
  2023           linkTypeName = 
"UNSPEC_LINK";
  2026           linkTypeName = 
"ASYM_LINK";
  2029           linkTypeName = 
"SYM_LINK";
  2032           linkTypeName = 
"LOST_LINK";
  2034         default: linkTypeName = 
"(invalid value!)";
  2038       const char *neighborTypeName;
  2042           neighborTypeName = 
"NOT_NEIGH";
  2045           neighborTypeName = 
"SYM_NEIGH";
  2048           neighborTypeName = 
"MPR_NEIGH";
  2051           neighborTypeName = 
"(invalid value!)";
  2054       NS_LOG_DEBUG (
"Looking at HELLO link messages with Link Type "  2055                     << lt << 
" (" << linkTypeName
  2056                     << 
") and Neighbor Type " << nt
  2057                     << 
" (" << neighborTypeName << 
")");
  2058 #endif // NS3_LOG_ENABLE  2065           NS_LOG_LOGIC (
"HELLO link code is invalid => IGNORING");
  2069       for (std::vector<Ipv4Address>::const_iterator neighIfaceAddr =
  2070              linkMessage->neighborInterfaceAddresses.begin ();
  2071            neighIfaceAddr != linkMessage->neighborInterfaceAddresses.end ();
  2075           if (*neighIfaceAddr == receiverIface)
  2080                   link_tuple->symTime = now - 
Seconds (1);
  2085                   NS_LOG_DEBUG (*link_tuple << 
": link is SYM or ASYM => should become SYM now"  2086                                 " (symTime being increased to " << now + msg.
GetVTime ());
  2087                   link_tuple->symTime = now + msg.
GetVTime ();
  2099               NS_LOG_DEBUG (
"     \\-> *neighIfaceAddr (" << *neighIfaceAddr
  2100                                                           << 
" != receiverIface (" << receiverIface << 
") => IGNORING!");
  2103       NS_LOG_DEBUG (
"Link tuple updated: " << 
int (updated));
  2105   link_tuple->time = 
std::max (link_tuple->time, link_tuple->asymTime);
  2118                                            link_tuple->neighborIfaceAddr));
  2121                     << 
": LinkSensing END");
  2129   if (nb_tuple != NULL)
  2143   for (LinkSet::const_iterator link_tuple = 
m_state.
GetLinks ().begin ();
  2146       NS_LOG_LOGIC (
"Looking at link tuple: " << *link_tuple);
  2150                         "GetMainAddress (link_tuple->neighborIfaceAddr) != msg.GetOriginatorAddress ()");
  2151           NS_LOG_LOGIC (
"(GetMainAddress(" << link_tuple->neighborIfaceAddr << 
"): "  2157       if (link_tuple->symTime < now)
  2163       typedef std::vector<olsr::MessageHeader::Hello::LinkMessage> LinkMessageVec;
  2164       for (LinkMessageVec::const_iterator linkMessage = hello.
linkMessages.begin ();
  2165            linkMessage != hello.
linkMessages.end (); linkMessage++)
  2167           int neighborType = (linkMessage->linkCode >> 2) & 0x3;
  2168 #ifdef NS3_LOG_ENABLE  2169           const char *neighborTypeNames[3] = { 
"NOT_NEIGH", 
"SYM_NEIGH", 
"MPR_NEIGH" };
  2170           const char *neighborTypeName = ((neighborType < 3) ?
  2171                                           neighborTypeNames[neighborType]
  2172                                           : 
"(invalid value)");
  2173           NS_LOG_DEBUG (
"Looking at Link Message from HELLO message: neighborType="  2174                         << neighborType << 
" (" << neighborTypeName << 
")");
  2175 #endif // NS3_LOG_ENABLE  2177           for (std::vector<Ipv4Address>::const_iterator nb2hop_addr_iter =
  2178                  linkMessage->neighborInterfaceAddresses.begin ();
  2179                nb2hop_addr_iter != linkMessage->neighborInterfaceAddresses.end ();
  2183               NS_LOG_DEBUG (
"Looking at 2-hop neighbor address from HELLO message: "  2184                             << *nb2hop_addr_iter
  2185                             << 
" (main address is " << nb2hop_addr << 
")");
  2193                       NS_LOG_LOGIC (
"Ignoring 2-hop neighbor (it is the node itself)");
  2201                                 << (nb2hop_tuple ? 
" (refreshing existing entry)" : 
""));
  2202                   if (nb2hop_tuple == NULL)
  2227                   NS_LOG_LOGIC (
"2-hop neighbor is NOT_NEIGH => deleting matching 2-hop neighbor state");
  2232                   NS_LOG_LOGIC (
"*** WARNING *** Ignoring link message (inside HELLO) with bad"  2233                                 " neighbor type value: " << neighborType);
  2250   typedef std::vector<olsr::MessageHeader::Hello::LinkMessage> LinkMessageVec;
  2251   for (LinkMessageVec::const_iterator linkMessage = hello.
linkMessages.begin ();
  2255       int nt = linkMessage->linkCode >> 2;
  2258           NS_LOG_DEBUG (
"Processing a link message with neighbor type MPR_NEIGH");
  2260           for (std::vector<Ipv4Address>::const_iterator nb_iface_addr =
  2261                  linkMessage->neighborInterfaceAddresses.begin ();
  2262                nb_iface_addr != linkMessage->neighborInterfaceAddresses.end ();
  2267                   NS_LOG_DEBUG (
"Adding entry to mpr selector set for neighbor " << *nb_iface_addr);
  2272                   if (existing_mprsel_tuple == NULL)
  2310   struct hdr_ip* ih       = HDR_IP (p);
  2311   struct hdr_cmn* ch      = HDR_CMN (p);
  2313   debug (
"%f: Node %d MAC Layer detects a breakage on link to %d\n",
  2315          OLSR::node_id (ra_addr ()),
  2316          OLSR::node_id (ch->next_hop ()));
  2318   if ((u_int32_t)ih->daddr () == IP_BROADCAST)
  2320       drop (p, DROP_RTR_MAC_CALLBACK);
  2324   OLSR_link_tuple* link_tuple = state_.find_link_tuple (ch->next_hop ());
  2325   if (link_tuple != NULL)
  2329       nb_loss (link_tuple);
  2331   drop (p, DROP_RTR_MAC_CALLBACK);
  2399                 << 
" LinkTuple " << tuple << 
" REMOVED.");
  2412                 << 
" LinkTuple " << tuple << 
" UPDATED.");
  2417   if (nb_tuple == NULL)
  2423   if (nb_tuple != NULL)
  2425       int statusBefore = nb_tuple->
status;
  2427       bool hasSymmetricLink = 
false;
  2430       for (LinkSet::const_iterator it = linkSet.begin ();
  2431            it != linkSet.end (); it++)
  2437               hasSymmetricLink = 
true;
  2442       if (hasSymmetricLink)
  2445           NS_LOG_DEBUG (*nb_tuple << 
"->status = STATUS_SYM; changed:"  2446                                   << 
int (statusBefore != nb_tuple->
status));
  2451           NS_LOG_DEBUG (*nb_tuple << 
"->status = STATUS_NOT_SYM; changed:"  2452                                   << 
int (statusBefore != nb_tuple->
status));
  2457       NS_LOG_WARN (
"ERROR! Wanted to update a NeighborTuple but none was found!");
  2631       NS_LOG_DEBUG (
"Not sending any TC, no one selected me as MPR.");
  2652       NS_LOG_DEBUG (
"Not sending any HNA, no associations to advertise.");
  2689   if (tuple->
time < now)
  2693   else if (tuple->
symTime < now)
  2706                                            neighborIfaceAddr));
  2712                                            neighborIfaceAddr));
  2733                                            this, neighborMainAddr, twoHopNeighborAddr));
  2813                                            this, gatewayAddr, networkAddr, netmask));
  2835   std::map<Ipv4Address, RoutingTableEntry>::const_iterator it =
  2842   outEntry = it->second;
  2872       if (!foundSendEntry)
  2876       uint32_t interfaceIdx = entry2.
interface;
  2877       if (oif && 
m_ipv4->GetInterfaceForDevice (oif) != 
static_cast<int> (interfaceIdx))
  2884                                      << 
" Route interface " << interfaceIdx
  2885                                      << 
" does not match requested output interface "  2886                                      << 
m_ipv4->GetInterfaceForDevice (oif));
  2890       rtentry = Create<Ipv4Route> ();
  2896       uint32_t numOifAddresses = 
m_ipv4->GetNAddresses (interfaceIdx);
  2899       if (numOifAddresses == 1)
  2901           ifAddr = 
m_ipv4->GetAddress (interfaceIdx, 0);
  2906           NS_FATAL_ERROR (
"XXX Not implemented yet:  IP aliasing and OLSR");
  2908       rtentry->SetSource (ifAddr.
GetLocal ());
  2909       rtentry->SetGateway (entry2.
nextAddr);
  2910       rtentry->SetOutputDevice (
m_ipv4->GetNetDevice (interfaceIdx));
  2914                                  << 
" --> nextHop=" << entry2.
nextAddr  2916       NS_LOG_DEBUG (
"Found route to " << rtentry->GetDestination () << 
" via nh " << rtentry->GetGateway () << 
" with source addr " << rtentry->GetSource () << 
" and output dev " << rtentry->GetOutputDevice ());
  2926           NS_LOG_DEBUG (
"Found route to " << rtentry->GetDestination () << 
" via nh " << rtentry->GetGateway () << 
" with source addr " << rtentry->GetSource () << 
" and output dev " << rtentry->GetOutputDevice ());
  2934                                  << 
" No route to host");
  2958   uint32_t iif = 
m_ipv4->GetInterfaceForDevice (idev);
  2959   if (
m_ipv4->IsDestinationAddress (dst, iif))
  2964           lcb (p, header, iif);
  2984       if (!foundSendEntry)
  2988       rtentry = Create<Ipv4Route> ();
  2990       uint32_t interfaceIdx = entry2.
interface;
  2995       uint32_t numOifAddresses = 
m_ipv4->GetNAddresses (interfaceIdx);
  2998       if (numOifAddresses == 1)
  3000           ifAddr = 
m_ipv4->GetAddress (interfaceIdx, 0);
  3005           NS_FATAL_ERROR (
"XXX Not implemented yet:  IP aliasing and OLSR");
  3013                                  << 
" --> nextHop=" << entry2.
nextAddr  3016       ucb (rtentry, p, header);
  3028 #ifdef NS3_LOG_ENABLE  3031                                      << 
" --> NOT FOUND; ** Dumping routing table...");
  3033           for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter = 
m_table.begin ();
  3034                iter != 
m_table.end (); iter++)
  3036               NS_LOG_DEBUG (
"dest=" << iter->first << 
" --> next=" << iter->second.nextAddr
  3037                                     << 
" via interface " << iter->second.interface);
  3041 #endif // NS3_LOG_ENABLE  3096   for (uint32_t i = 0; i < 
m_ipv4->GetNInterfaces (); i++)
  3098       for (uint32_t j = 0; j < 
m_ipv4->GetNAddresses (i); j++)
  3100           if (
m_ipv4->GetAddress (i,j).GetLocal () == interfaceAddress)
  3102               AddEntry (dest, next, i, distance);
  3108   AddEntry (dest, next, 0, distance);
  3112 std::vector<RoutingTableEntry>
  3115   std::vector<RoutingTableEntry> retval;
  3116   for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter = 
m_table.begin ();
  3117        iter != 
m_table.end (); iter++)
  3119       retval.push_back (iter->second);
  3150 #ifdef NS3_LOG_ENABLE  3163       if (now < iter->expirationTime)
  3169   for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter = 
m_table.begin (); iter != 
m_table.end (); iter++)
  3171       NS_LOG_DEBUG (
"  dest=" << iter->first << 
" --> next=" << iter->second.nextAddr << 
" via interface " << iter->second.interface);
  3174 #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
Set of interfaces excluded by OSLR. 
#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. 
Simulation virtual time values and global simulation resolution. 
IfaceAssocSet & GetIfaceAssocSetMutable()
Gets a mutable reference to the interface association set. 
void HelloTimerExpire()
Sends a HELLO message and reschedules the HELLO timer. 
void AddTopologyTuple(const TopologyTuple &tuple)
Adds a topology tuple to the Topology Set. 
static Ipv4Address GetAny(void)
#define OLSR_MAX_SEQ_NUM
Maximum allowed sequence number. 
Smart pointer class similar to boost::intrusive_ptr. 
void DoDispose()
Destructor implementation. 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SetStream(int64_t stream)
Specifies the stream number for the RngStream. 
const TopologySet & GetTopologySet() const
Gets the topology set. 
TwoHopNeighborTuple * FindTwoHopNeighborTuple(const Ipv4Address &neighbor, const Ipv4Address &twoHopNeighbor)
Finds a 2-hop neighbor tuple. 
void IfaceAssocTupleTimerExpire(Ipv4Address ifaceAddr)
Removes interface association tuple_ if expired. 
uint16_t sequenceNumber
Sequence number. 
const TwoHopNeighborSet & GetTwoHopNeighbors() const
Gets the 2-hop neighbor set. 
void RemoveMprSelectorTuple(const MprSelectorTuple &tuple)
Removes an MPR selector tuple from the MPR Selector Set. 
Timer m_helloTimer
Timer for the HELLO message. 
#define OLSR_WILL_DEFAULT
Willingness for forwarding packets from other nodes: medium. 
uint16_t GetPacketSequenceNumber()
Increments packet sequence number and returns the new value. 
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message. 
std::vector< Association > Associations
Association Set type. 
Time m_midInterval
MID messages' emission interval. 
uint32_t GetId(void) const
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
#define OLSR_DUP_HOLD_TIME
Dup holding time. 
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload). 
void EraseMprSelectorTuples(const Ipv4Address &mainAddr)
Erases all MPR selector tuples belonging to the same address. 
void Clear()
Clears the routing table and frees the memory assigned to each one of its entries. 
uint16_t m_messageSequenceNumber
Messages sequence number counter. 
virtual bool SetAllowBroadcast(bool allowBroadcast)=0
Configure whether broadcast datagram transmissions are allowed. 
void InsertAssociationTuple(const AssociationTuple &tuple)
Inserts a known association tuple. 
Ipv4Address destAddr
Address of the destination node. 
a class to represent an Ipv4 address mask 
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. 
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node. 
virtual int ShutdownSend(void)=0
void LinkTupleUpdated(const LinkTuple &tuple, uint8_t willingness)
This function is invoked when a link tuple is updated. 
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
 Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
uint32_t GetRecvIf(void) const
Get the tag's receiving interface. 
void InsertNeighborTuple(const NeighborTuple &tuple)
Inserts a neighbor tuple. 
uint16_t m_ansn
Advertised Neighbor Set sequence number. 
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit. 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define OLSR_WILL_ALWAYS
Willingness for forwarding packets from other nodes: always. 
void SetMprSet(MprSet mprSet)
Sets the MPR set to the one specified. 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
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
Flag to indicate if it is the first time the LinkTupleTimer fires. 
virtual void NotifyInterfaceUp(uint32_t interface)
void SendTc()
Creates a new OLSR TC message which is buffered for being sent later on. 
const IfaceAssocSet & GetIfaceAssocSet() const
Gets the interface association set. 
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
void DupTupleTimerExpire(Ipv4Address address, uint16_t sequenceNumber)
Removes tuple if expired. 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate. 
bool FindMprAddress(const Ipv4Address &address)
Checks if there's an MPR with a specific address. 
Time time
Time at which this tuple expires and must be removed. 
enum ns3::olsr::NeighborTuple::Status status
Status of the link. 
Timer m_queuedMessagesTimer
timer for throttling outgoing messages 
virtual void DoDispose(void)
Destructor implementation. 
void InsertMprSelectorTuple(const MprSelectorTuple &tuple)
Inserts a MPR selector tuple. 
void AddHostNetworkAssociation(Ipv4Address networkAddr, Ipv4Mask netmask)
Injects the specified (networkAddr, netmask) tuple in the list of local HNA associations to be sent b...
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function. 
Ipv4Address m_mainAddress
the node main address. 
TimeWithUnit As(const enum Unit unit) const
Attach a unit to a Time, to facilitate output in a specific unit. 
Time expirationTime
Time at which this tuple expires and must be removed. 
Ipv4Address GetDestNetwork(void) const
NeighborTuple * FindNeighborTuple(const Ipv4Address &mainAddr)
Finds a neighbor tuple. 
#define OLSR_WILL_LOW
Willingness for forwarding packets from other nodes: low. 
Ipv4Mask netmask
IPv4 Network mask. 
void LinkTupleTimerExpire(Ipv4Address neighborIfaceAddr)
Removes tuple_ if expired. 
void EraseIfaceAssocTuple(const IfaceAssocTuple &tuple)
Erases a interface association tuple. 
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. 
uint32_t GetSize() const
Returns the routing table size. 
Ipv4Mask netmask
Netmask of network reachable through gatewayAddr. 
void Nb2hopTupleTimerExpire(Ipv4Address neighborMainAddr, Ipv4Address twoHopNeighborAddr)
Removes 2_hop neighbor tuple_ if expired. 
void RemoveAssociationTuple(const AssociationTuple &tuple)
Removes a host network association tuple to the Association Set. 
void ProcessTc(const olsr::MessageHeader &msg, const Ipv4Address &senderIface)
Processes a TC message following RFC 3626 specification. 
#define OLSR_NEIGHB_HOLD_TIME
Neighbor holding time. 
LinkTuple * FindSymLinkTuple(const Ipv4Address &ifaceAddr, Time time)
Finds a symmetrical link tuple. 
const NeighborSet & GetNeighbors() const
Gets the neighbor set. 
a polymophic address class 
LinkTuple * FindLinkTuple(const Ipv4Address &ifaceAddr)
Finds a link tuple. 
void LinkSensing(const olsr::MessageHeader &msg, const olsr::MessageHeader::Hello &hello, const Ipv4Address &receiverIface, const Ipv4Address &senderIface)
Updates Link Set according to a new received HELLO message (following RFC 3626 specification). 
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source. 
void EraseDuplicateTuple(const DuplicateTuple &tuple)
Erases a duplicate tuple. 
void EraseTopologyTuple(const TopologyTuple &tuple)
Erases a topology tuple. 
void MprSelTupleTimerExpire(Ipv4Address mainAddr)
Removes MPR selector tuple_ if expired. 
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range. 
#define OLSR_SYM_LINK
Symmetric link type. 
void SetSource(Ipv4Address src)
std::map< Ipv4Address, RoutingTableEntry > m_table
Data structure for the routing table. 
const NeighborTuple * FindSymNeighborTuple(const Ipv4Address &mainAddr) const
Finds a symmetrical neighbor tuple. 
TracedCallback< const PacketHeader &, const MessageList & > m_rxPacketTrace
Rx packet trace. 
void RemoveIfaceAssocTuple(const IfaceAssocTuple &tuple)
Removed an interface association tuple to the Interface Association Set. 
void SetRecvPktInfo(bool flag)
Enable/Disable receive packet information to socket. 
std::vector< RoutingTableEntry > GetRoutingTableEntries() const
Get the touting table entries. 
const LinkSet & GetLinks() const
Gets the Link set. 
EventGarbageCollector m_events
Running events. 
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const
Print the Routing Table entries. 
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. 
const MprSelectorSet & GetMprSelectors() const
Gets the MPR selectors. 
Ipv4Mask GetDestNetworkMask(void) const
A record of an IPv4 routing table entry for Ipv4GlobalRouting and Ipv4StaticRouting. 
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 EraseOlderTopologyTuples(const Ipv4Address &lastAddr, uint16_t ansn)
Erases a topology tuple. 
void RemoveHostNetworkAssociation(Ipv4Address networkAddr, Ipv4Mask netmask)
Removes the specified (networkAddr, netmask) tuple from the list of local HNA associations to be sent...
Hold variables of type enum. 
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay. 
std::map< Ptr< Socket >, Ipv4InterfaceAddress > m_sendSockets
Container of sockets and the interfaces they are opened onto. 
Ipv4Address mainAddr
Main address of the node. 
TopologyTuple * FindTopologyTuple(const Ipv4Address &destAddr, const Ipv4Address &lastAddr)
Finds a topology tuple. 
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]. 
  AttributeValue implementation for Time. 
Ipv4Address mainAddr
Main address of a node which have selected this node as a MPR. 
void SendPacket(Ptr< Packet > packet, const MessageList &containedMessages)
Send an OLSR message. 
void Schedule(void)
Schedule a new event using the currently-configured delay, function, and arguments. 
void SetGateway(Ipv4Address gw)
OLSR routing protocol for IPv4. 
bool FindSendEntry(const RoutingTableEntry &entry, RoutingTableEntry &outEntry) const
Finds the appropriate entry which must be used in order to forward a data packet to a next hop (given...
void ProcessHello(const olsr::MessageHeader &msg, const Ipv4Address &receiverIface, const Ipv4Address &senderIface)
Processes a HELLO message following RFC 3626 specification. 
std::string PrintMprSelectorSet() const
Prints the MPR selector sets. 
#define DELAY(time)
Gets the delay between a given time and the current time. 
Unit
The unit to use to interpret a number representing time. 
IfaceAssocTuple * FindIfaceAssocTuple(const Ipv4Address &ifaceAddr)
Finds a interface association tuple. 
void AddAssociationTuple(const AssociationTuple &tuple)
Adds a host network association tuple to the Association Set. 
Ptr< Ipv4StaticRouting > m_hnaRoutingTable
Routing table for HNA routes. 
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) 
Timer m_tcTimer
Timer for the TC message. 
Ptr< Socket > m_recvSocket
Receiving socket. 
void MprComputation()
Computates MPR set of a node following RFC 3626 hints. 
void InsertDuplicateTuple(const DuplicateTuple &tuple)
Inserts a duplicate tuple. 
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 EraseLinkTuple(const LinkTuple &tuple)
Erases a link tuple. 
void CoverTwoHopNeighbors(Ipv4Address neighborMainAddr, TwoHopNeighborSet &N2)
Remove all covered 2-hop neighbors from N2 set. 
Time m_helloInterval
HELLO messages' emission interval. 
const Associations & GetAssociations() const
Gets the association set the node has. 
void SetDelay(const Time &delay)
#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)
Associates the specified Ipv4StaticRouting routing table to the OLSR routing protocol. 
Ptr< const Ipv4StaticRouting > GetRoutingTableAssociation() const
Returns the internal HNA table. 
Ipv4Address destAddr
Main address of the destination. 
std::vector< IfaceAssocTuple > IfaceAssocSet
Interface Association Set type. 
AssociationTuple * FindAssociationTuple(const Ipv4Address &gatewayAddr, const Ipv4Address &networkAddr, const Ipv4Mask &netmask)
Finds an association tuple. 
void TopologyTupleTimerExpire(Ipv4Address destAddr, Ipv4Address lastAddr)
Removes topology tuple_ if expired. 
Time m_tcInterval
TC messages' emission interval. 
void AddTwoHopNeighborTuple(const TwoHopNeighborTuple &tuple)
Adds a 2-hop neighbor tuple to the 2-hop Neighbor Set. 
const AssociationSet & GetAssociationSet() const
Gets the association set known to the node. 
std::vector< Ipv4Address > FindNeighborInterfaces(const Ipv4Address &neighborMainAddr) const
Returns a vector of all interfaces of a given neighbor, with the exception of the "main" one...
void AssociationTupleTimerExpire(Ipv4Address gatewayAddr, Ipv4Address networkAddr, Ipv4Mask netmask)
Removes association tuple_ if expired. 
void NeighborLoss(const LinkTuple &tuple)
Performs all actions needed when a neighbor loss occurs. 
void RemoveTopologyTuple(const TopologyTuple &tuple)
Removes a topology tuple to 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. 
void InsertIfaceAssocTuple(const IfaceAssocTuple &tuple)
Inserts a interface association tuple. 
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket. 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address. 
void RecvOlsr(Ptr< Socket > socket)
Receive an OLSR message. 
Ipv4Address neighborMainAddr
Main address of a neighbor node. 
uint32_t GetInterface(void) const
Ipv4Address twoHopNeighborAddr
Main address of a 2-hop neighbor with a symmetric link to nb_main_addr. 
bool IsMyOwnAddress(const Ipv4Address &a) const
Check that address is one of my interfaces. 
bool Lookup(const Ipv4Address &dest, RoutingTableEntry &outEntry) const
Looks up an entry for the specified destination address. 
static TypeId GetTypeId(void)
Get the type ID. 
uint16_t GetPort(void) const
Ptr< Packet > Copy(void) const
performs a COW copy of the packet. 
void MidTimerExpire()
Sends a MID message (if the node has more than one interface) and resets the MID timer. 
Ptr< Ipv4StaticRouting > m_routingTableAssociation
Associations from an Ipv4StaticRouting instance. 
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. 
MprSelectorTuple * FindMprSelectorTuple(const Ipv4Address &mainAddr)
Finds a MPR selector tuple. 
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. 
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
 Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
std::vector< MessageHeader > MessageList
void EraseAssociationTuple(const AssociationTuple &tuple)
Erases a known association tuple. 
Ipv4Address localIfaceAddr
Interface address of the local node. 
static Time Now(void)
Return the current simulation virtual 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)
Ipv4Address GetSubnetDirectedBroadcast(Ipv4Mask const &mask) const
Generate subnet-directed broadcast address corresponding to mask. 
uint16_t m_packetSequenceNumber
Packets sequence number counter. 
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
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 RoutingTableComputation()
Creates the routing table of the node following RFC 3626 hints. 
This class implements Linux struct pktinfo in order to deliver ancillary information to the socket in...
void RemoveTwoHopNeighborTuple(const TwoHopNeighborTuple &tuple)
Removes a 2-hop neighbor tuple from the 2-hop Neighbor Set. 
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. 
bool IsRunning(void) const
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. 
double max(double x, double y)
int Degree(NeighborTuple const &tuple)
This auxiliary function (defined in RFC 3626) is used for calculating the MPR Set. 
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)
Make an EnumChecker pre-configured with a set of allowed values by name. 
#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. 
void EraseAssociation(const Association &tuple)
Erases an association. 
void IncrementAnsn()
Increments the ANSN counter. 
Ptr< Ipv4 > m_ipv4
IPv4 object the routing is linked to. 
a class to store IPv4 address information on an interface 
Ipv4Address GetMainAddress(Ipv4Address iface_addr) const
Gets the main address associated with a given interface address. 
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. 
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN. 
DuplicateTuple * FindDuplicateTuple(const Ipv4Address &address, uint16_t sequenceNumber)
Finds a duplicate tuple. 
void InsertTwoHopNeighborTuple(const TwoHopNeighborTuple &tuple)
Inserts a 2-hop neighbor tuple. 
Ipv4Address ifaceAddr
Interface address of a node. 
#define OLSR_LOST_LINK
Lost link type. 
bool RemovePacketTag(Tag &tag)
Remove a packet tag. 
Ipv4Address nextAddr
Address of the next hop. 
TracedCallback< const PacketHeader &, const MessageList & > m_txPacketTrace
Tx packet trace. 
std::set< Ipv4Address > MprSet
MPR Set type. 
#define OLSR_SYM_NEIGH
Symmetric neighbor type. 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
Timer m_midTimer
Timer for the MID message. 
Time Seconds(double value)
Construct a Time in the indicated unit. 
void SendHna()
Creates a new OLSR HNA message which is buffered for being sent later on. 
#define OLSR_MID_HOLD_TIME
MID holding time. 
std::vector< TwoHopNeighborTuple > TwoHopNeighborSet
2-hop Neighbor Set type. 
void EraseTwoHopNeighborTuple(const TwoHopNeighborTuple &tuple)
Erases a 2-hop neighbor tuple. 
void Track(EventId event)
Tracks a new event. 
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...
Ipv4Address GetLocal(void) const
Get the local address. 
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. 
void LinkTupleAdded(const LinkTuple &tuple, uint8_t willingness)
Adds a link tuple. 
void SetInterfaceExclusions(std::set< uint32_t > exceptions)
Set the interfaces to be excluded. 
LinkTuple & InsertLinkTuple(const LinkTuple &tuple)
Inserts a link tuple. 
Time m_hnaInterval
HNA messages' emission interval. 
void Dump(void)
Dump the neighbor table, two-hop neighbor table, and routing table to logging output (NS_LOG_DEBUG lo...
Time Now(void)
create an ns3::Time instance which contains the current simulation time. 
Ipv4Address neighborMainAddr
Main address of a neighbor. 
Timer m_hnaTimer
Timer for the HNA message. 
virtual void DoInitialize(void)
Initialize() implementation. 
void EraseNeighborTuple(const NeighborTuple &neighborTuple)
Erases a neighbor 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. 
TopologyTuple * FindNewerTopologyTuple(const Ipv4Address &lastAddr, uint16_t ansn)
Finds a topology tuple. 
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. 
virtual int Close(void)=0
Close a socket. 
bool IsNull(void) const
Check for null implementation. 
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
Routing table chanes challback. 
Ipv4Address neighborIfaceAddr
Interface address of the neighbor node. 
#define OLSR_HNA_HOLD_TIME
HNA holding time. 
Ipv4Address networkAddr
IPv4 Network address. 
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)
Set the parent TypeId. 
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
void EraseMprSelectorTuple(const MprSelectorTuple &tuple)
Erases a MPR selector tuple. 
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper. 
void InsertAssociation(const Association &tuple)
Inserts an association tuple. 
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)
Ipv4Address GetIpv4(void) const
Time expirationTime
Time at which this tuple expires and must be removed. 
void EraseTwoHopNeighborTuples(const Ipv4Address &neighbor)
Erases the 2-hop neighbor tuples with the same 1-hop neighbor. 
void InsertTopologyTuple(const TopologyTuple &tuple)
Inserts a topology tuple. 
std::vector< Ipv4Address > ifaceList
List of interfaces which the message has been received on. 
void ProcessMid(const olsr::MessageHeader &msg, const Ipv4Address &senderIface)
Processes a MID message following RFC 3626 specification.