olsr: add missing doxygen

This commit is contained in:
Tommaso Pecorella
2016-03-11 21:21:11 +01:00
parent fb767051a5
commit c7af99892b
7 changed files with 1430 additions and 787 deletions

View File

@@ -9,13 +9,16 @@ unicast routing protocol. It has been developed at the
University of Murcia (Spain) by Francisco J. Ros for NS-2, and was
ported to NS-3 by Gustavo Carneiro at INESC Porto (Portugal).
The implementation is based on OLSR Version 1 (:rfc:`3626`) and
it is *not* compliant with OLSR Version 2 (:rfc:`7181`) or any
of the Version 2 extensions.
Model Description
*****************
The source code for the OLSR model lives in the directory `src/olsr`.
Design
++++++
As stated before, the model is based on :rfc:`3626`. Moreover, many
design choices are based on the previous ns2 model.
Scope and Limitations
+++++++++++++++++++++
@@ -35,13 +38,23 @@ References
++++++++++
.. [rfc3626] :rfc:`3626` *Optimized Link State Routing*
.. [rfc7181] :rfc:`7181` *The Optimized Link State Routing Protocol Version 2*
Usage
*****
The usage pattern is the one of all the Internet routing protocols.
Since OLSR is not installed by default in the Internet stack, it is necessary to
set it in the Internet Stack helper by using ``InternetStackHelper::SetRoutingHelper``
Examples
++++++++
The examples are in the ``src/olsr/examples/`` directory. However, many other examples esists in the
general examples directory, e.g., ``examples/routing/manet-routing-compare.cc``.
For specific examples of the HNA feature, see the examples in ``src/olsr/examples/``.
Helpers
+++++++
@@ -61,21 +74,29 @@ to set OLSR attributes. These include HelloInterval, TcInterval,
MidInterval, Willingness. Other parameters are defined as macros
in ``olsr-routing-protocol.cc``.
The list of configurabel attributes is:
* HelloInterval (time, default 2s), HELLO messages emission interval.
* TcInterval (time, default 5s), TC messages emission interval.
* MidInterval (time, default 5s), MID messages emission interval.
* HnaInterval (time, default 5s), HNA messages emission interval.
* Willingness (enum, default OLSR_WILL_DEFAULT), Willingness of a node to carry and forward traffic for other nodes.
Tracing
+++++++
Logging
+++++++
The available traces are:
* Rx: Receive OLSR packet.
* Tx: Send OLSR packet.
* RoutingTableChanged: The OLSR routing table has changed.
Caveats
+++++++
The code does not present any known issue.
Validation
**********
Unit tests
++++++++++
Larger-scale performance tests
++++++++++++++++++++++++++++++
The code validationhas been done through Wireshark message compliance and unit testings.

View File

@@ -30,6 +30,8 @@
namespace ns3 {
/**
* \ingroup olsr
*
* \brief Helper class that adds OLSR routing to nodes.
*
* This class is expected to be used in conjunction with

View File

@@ -34,67 +34,95 @@ namespace olsr {
double EmfToSeconds (uint8_t emf);
uint8_t SecondsToEmf (double seconds);
// 3.3. Packet Format
//
// The basic layout of any packet in OLSR is as follows (omitting IP and
// UDP headers):
//
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Packet Length | Packet Sequence Number |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Message Type | Vtime | Message Size |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Originator Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Time To Live | Hop Count | Message Sequence Number |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | |
// : MESSAGE :
// | |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Message Type | Vtime | Message Size |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Originator Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Time To Live | Hop Count | Message Sequence Number |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | |
// : MESSAGE :
// | |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// : :
// (etc.)
/**
* \ingroup olsr
*
* The basic layout of any packet in OLSR is as follows (omitting IP and
* UDP headers):
\verbatim
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Packet Length | Packet Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type | Vtime | Message Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Originator Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time To Live | Hop Count | Message Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
: MESSAGE :
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type | Vtime | Message Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Originator Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time To Live | Hop Count | Message Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
: MESSAGE :
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: :
(etc.)
\endverbatim
*
* This header only holds the common part of a message group, i.e.,
* the first 4 bytes.
*/
class PacketHeader : public Header
{
public:
PacketHeader ();
virtual ~PacketHeader ();
/**
* Set the packet total length.
* \param length The packet length.
*/
void SetPacketLength (uint16_t length)
{
m_packetLength = length;
}
/**
* Get the packet total length.
* \return The packet length.
*/
uint16_t GetPacketLength () const
{
return m_packetLength;
}
/**
* Set the packet sequence number.
* \param seqnum The packet sequence number.
*/
void SetPacketSequenceNumber (uint16_t seqnum)
{
m_packetSequenceNumber = seqnum;
}
/**
* Get the packet sequence number.
* \returns The packet sequence number.
*/
uint16_t GetPacketSequenceNumber () const
{
return m_packetSequenceNumber;
}
private:
uint16_t m_packetLength;
uint16_t m_packetSequenceNumber;
uint16_t m_packetLength; //!< The packet length.
uint16_t m_packetSequenceNumber; //!< The packet sequence number.
public:
/**
* \brief Get the type ID.
* \return The object TypeId.
*/
static TypeId GetTypeId (void);
virtual TypeId GetInstanceTypeId (void) const;
virtual void Print (std::ostream &os) const;
@@ -103,20 +131,36 @@ public:
virtual uint32_t Deserialize (Buffer::Iterator start);
};
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Message Type | Vtime | Message Size |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Originator Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Time To Live | Hop Count | Message Sequence Number |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/**
* \ingroup olsr
*
* This header can store HELP, TC, MID and HNA messages.
* The header size is variable, and depends on the
* actual message type.
*
\verbatim
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type | Vtime | Message Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Originator Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time To Live | Hop Count | Message Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
: MESSAGE :
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\endverbatim
*/
class MessageHeader : public Header
{
public:
/**
* Message type
*/
enum MessageType {
HELLO_MESSAGE = 1,
TC_MESSAGE = 2,
@@ -127,79 +171,122 @@ public:
MessageHeader ();
virtual ~MessageHeader ();
/**
* Set the message type.
* \param messageType The message type.
*/
void SetMessageType (MessageType messageType)
{
m_messageType = messageType;
}
/**
* Get the message type.
* \return The message type.
*/
MessageType GetMessageType () const
{
return m_messageType;
}
/**
* Set the validity time.
* \param time The validity time.
*/
void SetVTime (Time time)
{
m_vTime = SecondsToEmf (time.GetSeconds ());
}
/**
* Get the validity time.
* \return The validity time.
*/
Time GetVTime () const
{
return Seconds (EmfToSeconds (m_vTime));
}
/**
* Set the originator address.
* \param originatorAddress The originator address.
*/
void SetOriginatorAddress (Ipv4Address originatorAddress)
{
m_originatorAddress = originatorAddress;
}
/**
* Get the originator address.
* \return The originator address.
*/
Ipv4Address GetOriginatorAddress () const
{
return m_originatorAddress;
}
/**
* Set the time to live.
* \param timeToLive The time to live.
*/
void SetTimeToLive (uint8_t timeToLive)
{
m_timeToLive = timeToLive;
}
/**
* Get the time to live.
* \return The time to live.
*/
uint8_t GetTimeToLive () const
{
return m_timeToLive;
}
/**
* Set the hop count.
* \param hopCount The hop count.
*/
void SetHopCount (uint8_t hopCount)
{
m_hopCount = hopCount;
}
/**
* Get the hop count.
* \return The hop count.
*/
uint8_t GetHopCount () const
{
return m_hopCount;
}
/**
* Set the message sequence number.
* \param messageSequenceNumber The message sequence number.
*/
void SetMessageSequenceNumber (uint16_t messageSequenceNumber)
{
m_messageSequenceNumber = messageSequenceNumber;
}
/**
* Get the message sequence number.
* \return The message sequence number.
*/
uint16_t GetMessageSequenceNumber () const
{
return m_messageSequenceNumber;
}
// void SetMessageSize (uint16_t messageSize)
// {
// m_messageSize = messageSize;
// }
// uint16_t GetMessageSize () const
// {
// return m_messageSize;
// }
private:
MessageType m_messageType;
uint8_t m_vTime;
Ipv4Address m_originatorAddress;
uint8_t m_timeToLive;
uint8_t m_hopCount;
uint16_t m_messageSequenceNumber;
uint16_t m_messageSize;
MessageType m_messageType; //!< The message type
uint8_t m_vTime; //!< The validity time.
Ipv4Address m_originatorAddress; //!< The originator address.
uint8_t m_timeToLive; //!< The time to live.
uint8_t m_hopCount; //!< The hop count.
uint16_t m_messageSequenceNumber; //!< The message sequence number.
uint16_t m_messageSize; //!< The message size.
public:
/**
* \brief Get the type ID.
* \return The object TypeId.
*/
static TypeId GetTypeId (void);
virtual TypeId GetInstanceTypeId (void) const;
virtual void Print (std::ostream &os) const;
@@ -207,153 +294,284 @@ public:
virtual void Serialize (Buffer::Iterator start) const;
virtual uint32_t Deserialize (Buffer::Iterator start);
// 5.1. MID Message Format
//
// The proposed format of a MID message is as follows:
//
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | OLSR Interface Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | OLSR Interface Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | ... |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/**
* \ingroup olsr
* MID Message Format
*
\verbatim
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| OLSR Interface Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| OLSR Interface Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\endverbatim
*/
struct Mid
{
std::vector<Ipv4Address> interfaceAddresses;
std::vector<Ipv4Address> interfaceAddresses; //!< Interface Address container.
/**
* This method is used to print the content of a MID message.
* \param os output stream
*/
void Print (std::ostream &os) const;
/**
* Returns the expected size of the header.
* \returns the expected size of the header.
*/
uint32_t GetSerializedSize (void) const;
/**
* This method is used by Packet::AddHeader to
* store a header into the byte buffer of a packet.
*
* \param start an iterator which points to where the header should
* be written.
*/
void Serialize (Buffer::Iterator start) const;
uint32_t Deserialize (Buffer::Iterator start, uint32_t messageSize);
/**
* This method is used by Packet::RemoveHeader to
* re-create a header from the byte buffer of a packet.
*
* \param start an iterator which points to where the header should
* read from.
* \param messageSize the message size.
* \returns the number of bytes read.
*/
uint32_t Deserialize (Buffer::Iterator start, uint32_t messageSize);
};
// 6.1. HELLO Message Format
//
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
//
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Reserved | Htime | Willingness |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Link Code | Reserved | Link Message Size |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Neighbor Interface Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Neighbor Interface Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// : . . . :
// : :
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Link Code | Reserved | Link Message Size |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Neighbor Interface Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Neighbor Interface Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// : :
// : :
// (etc.)
struct Hello
/**
* \ingroup olsr
* HELLO Message Format
*
\verbatim
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved | Htime | Willingness |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link Code | Reserved | Link Message Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor Interface Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor Interface Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: . . . :
: :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link Code | Reserved | Link Message Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor Interface Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor Interface Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: :
(etc.)
\endverbatim
*/
struct Hello
{
/**
* Link message item
*/
struct LinkMessage {
uint8_t linkCode;
std::vector<Ipv4Address> neighborInterfaceAddresses;
uint8_t linkCode; //!< Link code
std::vector<Ipv4Address> neighborInterfaceAddresses; //!< Neighbor interface address container.
};
uint8_t hTime;
uint8_t hTime; //!< HELLO emission interval (coded)
/**
* Set the HELLO emission interval.
* \param time The HELLO emission interval.
*/
void SetHTime (Time time)
{
this->hTime = SecondsToEmf (time.GetSeconds ());
}
/**
* Get the HELLO emission interval.
* \return The HELLO emission interval.
*/
Time GetHTime () const
{
return Seconds (EmfToSeconds (this->hTime));
}
uint8_t willingness;
std::vector<LinkMessage> linkMessages;
uint8_t willingness; //!< The willingness of a node to carry and forward traffic for other nodes.
std::vector<LinkMessage> linkMessages; //!< Link messages container.
/**
* This method is used to print the content of a MID message.
* \param os output stream
*/
void Print (std::ostream &os) const;
/**
* Returns the expected size of the header.
* \returns the expected size of the header.
*/
uint32_t GetSerializedSize (void) const;
/**
* This method is used by Packet::AddHeader to
* store a header into the byte buffer of a packet.
*
* \param start an iterator which points to where the header should
* be written.
*/
void Serialize (Buffer::Iterator start) const;
/**
* This method is used by Packet::RemoveHeader to
* re-create a header from the byte buffer of a packet.
*
* \param start an iterator which points to where the header should
* read from.
* \param messageSize the message size.
* \returns the number of bytes read.
*/
uint32_t Deserialize (Buffer::Iterator start, uint32_t messageSize);
};
// 9.1. TC Message Format
//
// The proposed format of a TC message is as follows:
//
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | ANSN | Reserved |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Advertised Neighbor Main Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Advertised Neighbor Main Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | ... |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
struct Tc
/**
* \ingroup olsr
* TC Message Format
*
\verbatim
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ANSN | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertised Neighbor Main Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertised Neighbor Main Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\endverbatim
*/
struct Tc
{
std::vector<Ipv4Address> neighborAddresses;
uint16_t ansn;
std::vector<Ipv4Address> neighborAddresses; //!< Neighbor address container.
uint16_t ansn; //!< Advertised Neighbor Sequence Number.
/**
* This method is used to print the content of a MID message.
* \param os output stream
*/
void Print (std::ostream &os) const;
/**
* Returns the expected size of the header.
* \returns the expected size of the header.
*/
uint32_t GetSerializedSize (void) const;
/**
* This method is used by Packet::AddHeader to
* store a header into the byte buffer of a packet.
*
* \param start an iterator which points to where the header should
* be written.
*/
void Serialize (Buffer::Iterator start) const;
uint32_t Deserialize (Buffer::Iterator start, uint32_t messageSize);
/**
* This method is used by Packet::RemoveHeader to
* re-create a header from the byte buffer of a packet.
*
* \param start an iterator which points to where the header should
* read from.
* \param messageSize the message size.
* \returns the number of bytes read.
*/
uint32_t Deserialize (Buffer::Iterator start, uint32_t messageSize);
};
// 12.1. HNA Message Format
//
// The proposed format of an HNA-message is:
//
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Network Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Netmask |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Network Address |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Netmask |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | ... |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Note: HNA stands for Host Network Association
/**
* \ingroup olsr
* HNA (Host Network Association) Message Format
*
\verbatim
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Network Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Netmask |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Network Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Netmask |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\endverbatim
*/
struct Hna
{
/**
* Association item structure.
*/
struct Association
{
Ipv4Address address;
Ipv4Mask mask;
Ipv4Address address; //!< IPv4 Address.
Ipv4Mask mask; //!< IPv4 netmask.
};
std::vector<Association> associations;
std::vector<Association> associations; //!< Association container.
/**
* This method is used to print the content of a MID message.
* \param os output stream
*/
void Print (std::ostream &os) const;
/**
* Returns the expected size of the header.
* \returns the expected size of the header.
*/
uint32_t GetSerializedSize (void) const;
/**
* This method is used by Packet::AddHeader to
* store a header into the byte buffer of a packet.
*
* \param start an iterator which points to where the header should
* be written.
*/
void Serialize (Buffer::Iterator start) const;
/**
* This method is used by Packet::RemoveHeader to
* re-create a header from the byte buffer of a packet.
*
* \param start an iterator which points to where the header should
* read from.
* \param messageSize the message size.
* \returns the number of bytes read.
*/
uint32_t Deserialize (Buffer::Iterator start, uint32_t messageSize);
};
private:
/**
* Structure holding the message content.
*/
struct
{
Mid mid;
Hello hello;
Tc tc;
Hna hna;
} m_message; // union not allowed
Mid mid; //!< MID message (optional).
Hello hello; //!< HELLO message (optional).
Tc tc; //!< TC message (optional).
Hna hna; //!< HNA message (optional).
} m_message; //!< The actual message being carried.
public:
/**
* Set the message type to MID and return the message content.
* \returns The MID message.
*/
Mid& GetMid ()
{
if (m_messageType == 0)
@@ -367,6 +585,10 @@ public:
return m_message.mid;
}
/**
* Set the message type to HELLO and return the message content.
* \returns The HELLO message.
*/
Hello& GetHello ()
{
if (m_messageType == 0)
@@ -380,6 +602,10 @@ public:
return m_message.hello;
}
/**
* Set the message type to TC and return the message content.
* \returns The TC message.
*/
Tc& GetTc ()
{
if (m_messageType == 0)
@@ -393,6 +619,10 @@ public:
return m_message.tc;
}
/**
* Set the message type to HNA and return the message content.
* \returns The HNA message.
*/
Hna& GetHna ()
{
if (m_messageType == 0)
@@ -407,24 +637,40 @@ public:
}
/**
* Get the MID message.
* \returns The MID message.
*/
const Mid& GetMid () const
{
NS_ASSERT (m_messageType == MID_MESSAGE);
return m_message.mid;
}
/**
* Get the HELLO message.
* \returns The HELLO message.
*/
const Hello& GetHello () const
{
NS_ASSERT (m_messageType == HELLO_MESSAGE);
return m_message.hello;
}
/**
* Get the TC message.
* \returns The TC message.
*/
const Tc& GetTc () const
{
NS_ASSERT (m_messageType == TC_MESSAGE);
return m_message.tc;
}
/**
* Get the HNA message.
* \returns The HNA message.
*/
const Hna& GetHna () const
{
NS_ASSERT (m_messageType == HNA_MESSAGE);

View File

@@ -36,268 +36,276 @@
namespace ns3 { namespace olsr {
/// \ingroup olsr
/// An Interface Association Tuple.
struct IfaceAssocTuple
{
/// Interface address of a node.
Ipv4Address ifaceAddr;
/// Main address of the node.
Ipv4Address mainAddr;
/// Time at which this tuple expires and must be removed.
Time time;
};
struct IfaceAssocTuple
{
/// Interface address of a node.
Ipv4Address ifaceAddr;
/// Main address of the node.
Ipv4Address mainAddr;
/// Time at which this tuple expires and must be removed.
Time time;
};
static inline bool
operator == (const IfaceAssocTuple &a, const IfaceAssocTuple &b)
{
return (a.ifaceAddr == b.ifaceAddr
&& a.mainAddr == b.mainAddr);
}
static inline bool
operator == (const IfaceAssocTuple &a, const IfaceAssocTuple &b)
{
return (a.ifaceAddr == b.ifaceAddr
&& a.mainAddr == b.mainAddr);
}
static inline std::ostream&
operator << (std::ostream &os, const IfaceAssocTuple &tuple)
{
os << "IfaceAssocTuple(ifaceAddr=" << tuple.ifaceAddr
<< ", mainAddr=" << tuple.mainAddr
<< ", time=" << tuple.time << ")";
return os;
}
static inline std::ostream&
operator << (std::ostream &os, const IfaceAssocTuple &tuple)
{
os << "IfaceAssocTuple(ifaceAddr=" << tuple.ifaceAddr
<< ", mainAddr=" << tuple.mainAddr
<< ", time=" << tuple.time << ")";
return os;
}
/// \ingroup olsr
/// A Link Tuple.
struct LinkTuple
{
/// Interface address of the local node.
Ipv4Address localIfaceAddr;
/// Interface address of the neighbor node.
Ipv4Address neighborIfaceAddr;
/// The link is considered bidirectional until this time.
Time symTime;
/// The link is considered unidirectional until this time.
Time asymTime;
/// Time at which this tuple expires and must be removed.
Time time;
};
struct LinkTuple
{
/// Interface address of the local node.
Ipv4Address localIfaceAddr;
/// Interface address of the neighbor node.
Ipv4Address neighborIfaceAddr;
/// The link is considered bidirectional until this time.
Time symTime;
/// The link is considered unidirectional until this time.
Time asymTime;
/// Time at which this tuple expires and must be removed.
Time time;
};
static inline bool
operator == (const LinkTuple &a, const LinkTuple &b)
{
return (a.localIfaceAddr == b.localIfaceAddr
&& a.neighborIfaceAddr == b.neighborIfaceAddr);
}
static inline bool
operator == (const LinkTuple &a, const LinkTuple &b)
{
return (a.localIfaceAddr == b.localIfaceAddr
&& a.neighborIfaceAddr == b.neighborIfaceAddr);
}
static inline std::ostream&
operator << (std::ostream &os, const LinkTuple &tuple)
{
os << "LinkTuple(localIfaceAddr=" << tuple.localIfaceAddr
<< ", neighborIfaceAddr=" << tuple.neighborIfaceAddr
<< ", symTime=" << tuple.symTime
<< ", asymTime=" << tuple.asymTime
<< ", expTime=" << tuple.time
<< ")";
return os;
}
static inline std::ostream&
operator << (std::ostream &os, const LinkTuple &tuple)
{
os << "LinkTuple(localIfaceAddr=" << tuple.localIfaceAddr
<< ", neighborIfaceAddr=" << tuple.neighborIfaceAddr
<< ", symTime=" << tuple.symTime
<< ", asymTime=" << tuple.asymTime
<< ", expTime=" << tuple.time
<< ")";
return os;
}
/// \ingroup olsr
/// A Neighbor Tuple.
struct NeighborTuple
{
/// Main address of a neighbor node.
Ipv4Address neighborMainAddr;
/// Neighbor Type and Link Type at the four less significative digits.
enum Status {
STATUS_NOT_SYM = 0, // "not symmetric"
STATUS_SYM = 1, // "symmetric"
} status;
/// A value between 0 and 7 specifying the node's willingness to carry traffic on behalf of other nodes.
uint8_t willingness;
};
struct NeighborTuple
{
/// Main address of a neighbor node.
Ipv4Address neighborMainAddr;
/// Status of the link (Symmetric or not Symmetric).
enum Status {
STATUS_NOT_SYM = 0, // "not symmetric"
STATUS_SYM = 1, // "symmetric"
} status; //!< Status of the link.
/// A value between 0 and 7 specifying the node's willingness to carry traffic on behalf of other nodes.
uint8_t willingness;
};
static inline bool
operator == (const NeighborTuple &a, const NeighborTuple &b)
{
return (a.neighborMainAddr == b.neighborMainAddr
&& a.status == b.status
&& a.willingness == b.willingness);
}
static inline bool
operator == (const NeighborTuple &a, const NeighborTuple &b)
{
return (a.neighborMainAddr == b.neighborMainAddr
&& a.status == b.status
&& a.willingness == b.willingness);
}
static inline std::ostream&
operator << (std::ostream &os, const NeighborTuple &tuple)
{
os << "NeighborTuple(neighborMainAddr=" << tuple.neighborMainAddr
<< ", status=" << (tuple.status == NeighborTuple::STATUS_SYM ? "SYM" : "NOT_SYM")
<< ", willingness=" << (int) tuple.willingness << ")";
return os;
}
static inline std::ostream&
operator << (std::ostream &os, const NeighborTuple &tuple)
{
os << "NeighborTuple(neighborMainAddr=" << tuple.neighborMainAddr
<< ", status=" << (tuple.status == NeighborTuple::STATUS_SYM ? "SYM" : "NOT_SYM")
<< ", willingness=" << (int) tuple.willingness << ")";
return os;
}
/// \ingroup olsr
/// A 2-hop Tuple.
struct TwoHopNeighborTuple
{
/// Main address of a neighbor.
Ipv4Address neighborMainAddr;
/// Main address of a 2-hop neighbor with a symmetric link to nb_main_addr.
Ipv4Address twoHopNeighborAddr;
/// Time at which this tuple expires and must be removed.
Time expirationTime; // previously called 'time_'
};
struct TwoHopNeighborTuple
{
/// Main address of a neighbor.
Ipv4Address neighborMainAddr;
/// Main address of a 2-hop neighbor with a symmetric link to nb_main_addr.
Ipv4Address twoHopNeighborAddr;
/// Time at which this tuple expires and must be removed.
Time expirationTime; // previously called 'time_'
};
static inline std::ostream&
operator << (std::ostream &os, const TwoHopNeighborTuple &tuple)
{
os << "TwoHopNeighborTuple(neighborMainAddr=" << tuple.neighborMainAddr
<< ", twoHopNeighborAddr=" << tuple.twoHopNeighborAddr
<< ", expirationTime=" << tuple.expirationTime
<< ")";
return os;
}
static inline std::ostream&
operator << (std::ostream &os, const TwoHopNeighborTuple &tuple)
{
os << "TwoHopNeighborTuple(neighborMainAddr=" << tuple.neighborMainAddr
<< ", twoHopNeighborAddr=" << tuple.twoHopNeighborAddr
<< ", expirationTime=" << tuple.expirationTime
<< ")";
return os;
}
static inline bool
operator == (const TwoHopNeighborTuple &a, const TwoHopNeighborTuple &b)
{
return (a.neighborMainAddr == b.neighborMainAddr
&& a.twoHopNeighborAddr == b.twoHopNeighborAddr);
}
static inline bool
operator == (const TwoHopNeighborTuple &a, const TwoHopNeighborTuple &b)
{
return (a.neighborMainAddr == b.neighborMainAddr
&& a.twoHopNeighborAddr == b.twoHopNeighborAddr);
}
/// \ingroup olsr
/// An MPR-Selector Tuple.
struct MprSelectorTuple
{
/// Main address of a node which have selected this node as a MPR.
Ipv4Address mainAddr;
/// Time at which this tuple expires and must be removed.
Time expirationTime; // previously called 'time_'
};
struct MprSelectorTuple
{
/// Main address of a node which have selected this node as a MPR.
Ipv4Address mainAddr;
/// Time at which this tuple expires and must be removed.
Time expirationTime; // previously called 'time_'
};
static inline bool
operator == (const MprSelectorTuple &a, const MprSelectorTuple &b)
{
return (a.mainAddr == b.mainAddr);
}
static inline bool
operator == (const MprSelectorTuple &a, const MprSelectorTuple &b)
{
return (a.mainAddr == b.mainAddr);
}
/// The type "list of interface addresses"
// The type "list of interface addresses"
//typedef std::vector<nsaddr_t> addr_list_t;
/// \ingroup olsr
/// A Duplicate Tuple
struct DuplicateTuple
{
/// Originator address of the message.
Ipv4Address address;
/// Message sequence number.
uint16_t sequenceNumber;
/// Indicates whether the message has been retransmitted or not.
bool retransmitted;
/// List of interfaces which the message has been received on.
std::vector<Ipv4Address> ifaceList;
/// Time at which this tuple expires and must be removed.
Time expirationTime;
};
struct DuplicateTuple
{
/// Originator address of the message.
Ipv4Address address;
/// Message sequence number.
uint16_t sequenceNumber;
/// Indicates whether the message has been retransmitted or not.
bool retransmitted;
/// List of interfaces which the message has been received on.
std::vector<Ipv4Address> ifaceList;
/// Time at which this tuple expires and must be removed.
Time expirationTime;
};
static inline bool
operator == (const DuplicateTuple &a, const DuplicateTuple &b)
{
return (a.address == b.address
&& a.sequenceNumber == b.sequenceNumber);
}
static inline bool
operator == (const DuplicateTuple &a, const DuplicateTuple &b)
{
return (a.address == b.address
&& a.sequenceNumber == b.sequenceNumber);
}
/// \ingroup olsr
/// A Topology Tuple
struct TopologyTuple
{
/// Main address of the destination.
Ipv4Address destAddr;
/// Main address of a node which is a neighbor of the destination.
Ipv4Address lastAddr;
/// Sequence number.
uint16_t sequenceNumber;
/// Time at which this tuple expires and must be removed.
Time expirationTime;
};
struct TopologyTuple
{
/// Main address of the destination.
Ipv4Address destAddr;
/// Main address of a node which is a neighbor of the destination.
Ipv4Address lastAddr;
/// Sequence number.
uint16_t sequenceNumber;
/// Time at which this tuple expires and must be removed.
Time expirationTime;
};
static inline bool
operator == (const TopologyTuple &a, const TopologyTuple &b)
{
return (a.destAddr == b.destAddr
&& a.lastAddr == b.lastAddr
&& a.sequenceNumber == b.sequenceNumber);
}
static inline bool
operator == (const TopologyTuple &a, const TopologyTuple &b)
{
return (a.destAddr == b.destAddr
&& a.lastAddr == b.lastAddr
&& a.sequenceNumber == b.sequenceNumber);
}
static inline std::ostream&
operator << (std::ostream &os, const TopologyTuple &tuple)
{
os << "TopologyTuple(destAddr=" << tuple.destAddr
<< ", lastAddr=" << tuple.lastAddr
<< ", sequenceNumber=" << (int) tuple.sequenceNumber
<< ", expirationTime=" << tuple.expirationTime
<< ")";
return os;
}
static inline std::ostream&
operator << (std::ostream &os, const TopologyTuple &tuple)
{
os << "TopologyTuple(destAddr=" << tuple.destAddr
<< ", lastAddr=" << tuple.lastAddr
<< ", sequenceNumber=" << (int) tuple.sequenceNumber
<< ", expirationTime=" << tuple.expirationTime
<< ")";
return os;
}
/// \ingroup olsr
/// Association
struct Association
{
Ipv4Address networkAddr;
Ipv4Mask netmask;
};
struct Association
{
Ipv4Address networkAddr; //!< IPv4 Network address.
Ipv4Mask netmask; //!< IPv4 Network mask.
};
static inline bool
operator == (const Association &a, const Association &b)
{
return (a.networkAddr == b.networkAddr
&& a.netmask == b.netmask);
}
static inline bool
operator == (const Association &a, const Association &b)
{
return (a.networkAddr == b.networkAddr
&& a.netmask == b.netmask);
}
static inline std::ostream&
operator << (std::ostream &os, const Association &tuple)
{
os << "Association(networkAddr=" << tuple.networkAddr
<< ", netmask=" << tuple.netmask
<< ")";
return os;
}
static inline std::ostream&
operator << (std::ostream &os, const Association &tuple)
{
os << "Association(networkAddr=" << tuple.networkAddr
<< ", netmask=" << tuple.netmask
<< ")";
return os;
}
/// \ingroup olsr
/// An Association Tuple
struct AssociationTuple
{
/// Main address of the gateway.
Ipv4Address gatewayAddr;
/// Network Address of network reachable through gatewayAddr
Ipv4Address networkAddr;
/// Netmask of network reachable through gatewayAddr
Ipv4Mask netmask;
/// Time at which this tuple expires and must be removed
Time expirationTime;
};
struct AssociationTuple
{
/// Main address of the gateway.
Ipv4Address gatewayAddr;
/// Network Address of network reachable through gatewayAddr
Ipv4Address networkAddr;
/// Netmask of network reachable through gatewayAddr
Ipv4Mask netmask;
/// Time at which this tuple expires and must be removed
Time expirationTime;
};
static inline bool
operator == (const AssociationTuple &a, const AssociationTuple &b)
{
return (a.gatewayAddr == b.gatewayAddr
&& a.networkAddr == b.networkAddr
&& a.netmask == b.netmask);
}
static inline bool
operator == (const AssociationTuple &a, const AssociationTuple &b)
{
return (a.gatewayAddr == b.gatewayAddr
&& a.networkAddr == b.networkAddr
&& a.netmask == b.netmask);
}
static inline std::ostream&
operator << (std::ostream &os, const AssociationTuple &tuple)
{
os << "AssociationTuple(gatewayAddr=" << tuple.gatewayAddr
<< ", networkAddr=" << tuple.networkAddr
<< ", netmask=" << tuple.netmask
<< ", expirationTime=" << tuple.expirationTime
<< ")";
return os;
}
static inline std::ostream&
operator << (std::ostream &os, const AssociationTuple &tuple)
{
os << "AssociationTuple(gatewayAddr=" << tuple.gatewayAddr
<< ", networkAddr=" << tuple.networkAddr
<< ", netmask=" << tuple.netmask
<< ", expirationTime=" << tuple.expirationTime
<< ")";
return os;
}
typedef std::set<Ipv4Address> MprSet; ///< MPR Set type.
typedef std::vector<MprSelectorTuple> MprSelectorSet; ///< MPR Selector Set type.
typedef std::vector<LinkTuple> LinkSet; ///< Link Set type.
typedef std::vector<NeighborTuple> NeighborSet; ///< Neighbor Set type.
typedef std::vector<TwoHopNeighborTuple> TwoHopNeighborSet; ///< 2-hop Neighbor Set type.
typedef std::vector<TopologyTuple> TopologySet; ///< Topology Set type.
typedef std::vector<DuplicateTuple> DuplicateSet; ///< Duplicate Set type.
typedef std::vector<IfaceAssocTuple> IfaceAssocSet; ///< Interface Association Set type.
typedef std::vector<AssociationTuple> AssociationSet; ///< Association Set type.
typedef std::vector<Association> Associations; ///< Association Set type.
typedef std::set<Ipv4Address> MprSet; //!< MPR Set type.
typedef std::vector<MprSelectorTuple> MprSelectorSet; //!< MPR Selector Set type.
typedef std::vector<LinkTuple> LinkSet; //!< Link Set type.
typedef std::vector<NeighborTuple> NeighborSet; //!< Neighbor Set type.
typedef std::vector<TwoHopNeighborTuple> TwoHopNeighborSet; //!< 2-hop Neighbor Set type.
typedef std::vector<TopologyTuple> TopologySet; //!< Topology Set type.
typedef std::vector<DuplicateTuple> DuplicateSet; //!< Duplicate Set type.
typedef std::vector<IfaceAssocTuple> IfaceAssocSet; //!< Interface Association Set type.
typedef std::vector<AssociationTuple> AssociationSet; //!< Association Set type.
typedef std::vector<Association> Associations; //!< Association Set type.
}} // namespace ns3, olsr
}} // namespace ns3, olsr
#endif /* OLSR_REPOSITORIES_H */

View File

@@ -550,7 +550,11 @@ RoutingProtocol::Degree (NeighborTuple const &tuple)
namespace {
///
/// \brief Remove all covered 2-hop neighbors from N2 set. This is a helper function used by MprComputation algorithm.
/// \brief Remove all covered 2-hop neighbors from N2 set.
/// This is a helper function used by MprComputation algorithm.
///
/// \param neighborMainAddr Neighbor main address.
/// \param N2 Reference to the 2-hop neighbor set.
///
void
CoverTwoHopNeighbors (Ipv4Address neighborMainAddr, TwoHopNeighborSet & N2)
@@ -579,9 +583,6 @@ CoverTwoHopNeighbors (Ipv4Address neighborMainAddr, TwoHopNeighborSet & N2)
}
} // anonymous namespace
///
/// \brief Computates MPR set of a node following \RFC{3626} hints.
///
void
RoutingProtocol::MprComputation ()
{
@@ -869,12 +870,6 @@ RoutingProtocol::MprComputation ()
m_state.SetMprSet (mprSet);
}
///
/// \brief Gets the main address associated with a given interface address.
///
/// \param iface_addr the interface address.
/// \return the corresponding main address.
///
Ipv4Address
RoutingProtocol::GetMainAddress (Ipv4Address iface_addr) const
{
@@ -887,9 +882,6 @@ RoutingProtocol::GetMainAddress (Ipv4Address iface_addr) const
return iface_addr;
}
///
/// \brief Creates the routing table of the node following \RFC{3626} hints.
///
void
RoutingProtocol::RoutingTableComputation ()
{
@@ -1205,16 +1197,6 @@ RoutingProtocol::RoutingTableComputation ()
}
///
/// \brief Processes a HELLO message following \RFC{3626} specification.
///
/// Link sensing and population of the Neighbor Set, 2-hop Neighbor Set and MPR
/// Selector Set are performed.
///
/// \param msg the %OLSR message which contains the HELLO message.
/// \param receiver_iface the address of the interface where the message was received from.
/// \param sender_iface the address of the interface where the message was sent from.
///
void
RoutingProtocol::ProcessHello (const olsr::MessageHeader &msg,
const Ipv4Address &receiverIface,
@@ -1269,15 +1251,6 @@ RoutingProtocol::ProcessHello (const olsr::MessageHeader &msg,
PopulateMprSelectorSet (msg, hello);
}
///
/// \brief Processes a TC message following \RFC{3626} specification.
///
/// The Topology Set is updated (if needed) with the information of
/// the received TC message.
///
/// \param msg the %OLSR message which contains the TC message.
/// \param sender_iface the address of the interface where the message was sent from.
///
void
RoutingProtocol::ProcessTc (const olsr::MessageHeader &msg,
const Ipv4Address &senderIface)
@@ -1364,15 +1337,6 @@ RoutingProtocol::ProcessTc (const olsr::MessageHeader &msg,
#endif // NS3_LOG_ENABLE
}
///
/// \brief Processes a MID message following \RFC{3626} specification.
///
/// The Interface Association Set is updated (if needed) with the information
/// of the received MID message.
///
/// \param msg the %OLSR message which contains the MID message.
/// \param sender_iface the address of the interface where the message was sent from.
///
void
RoutingProtocol::ProcessMid (const olsr::MessageHeader &msg,
const Ipv4Address &senderIface)
@@ -1443,15 +1407,6 @@ RoutingProtocol::ProcessMid (const olsr::MessageHeader &msg,
NS_LOG_DEBUG ("Node " << m_mainAddress << " ProcessMid from " << senderIface << " -> END.");
}
///
/// \brief Processes a HNA message following \RFC{3626} specification.
///
/// The Host Network Association Set is updated (if needed) with the information
/// of the received HNA message.
///
/// \param msg the %OLSR message which contains the HNA message.
/// \param sender_iface the address of the interface where the message was sent from.
///
void
RoutingProtocol::ProcessHna (const olsr::MessageHeader &msg,
const Ipv4Address &senderIface)
@@ -1509,17 +1464,6 @@ RoutingProtocol::ProcessHna (const olsr::MessageHeader &msg,
}
}
///
/// \brief OLSR's default forwarding algorithm.
///
/// See \RFC{3626} for details.
///
/// \param p the %OLSR packet which has been received.
/// \param msg the %OLSR message which must be forwarded.
/// \param dup_tuple NULL if the message has never been considered for forwarding,
/// or a duplicate tuple in other case.
/// \param local_iface the address of the interface where the message was received from.
///
void
RoutingProtocol::ForwardDefault (olsr::MessageHeader olsrMessage,
DuplicateTuple *duplicated,
@@ -1586,15 +1530,6 @@ RoutingProtocol::ForwardDefault (olsr::MessageHeader olsrMessage,
}
}
///
/// \brief Enques an %OLSR message which will be sent with a delay of (0, delay].
///
/// This buffering system is used in order to piggyback several %OLSR messages in
/// a same %OLSR packet.
///
/// \param msg the %OLSR message which must be sent.
/// \param delay maximum delay the %OLSR message is going to be buffered.
///
void
RoutingProtocol::QueueMessage (const olsr::MessageHeader &message, Time delay)
{
@@ -1630,13 +1565,6 @@ RoutingProtocol::SendPacket (Ptr<Packet> packet,
}
}
///
/// \brief Creates as many %OLSR packets as needed in order to send all buffered
/// %OLSR messages.
///
/// Maximum number of messages which can be contained in an %OLSR packet is
/// dictated by OLSR_MAX_MSGS constant.
///
void
RoutingProtocol::SendQueuedMessages ()
{
@@ -1673,9 +1601,6 @@ RoutingProtocol::SendQueuedMessages ()
m_queuedMessages.clear ();
}
///
/// \brief Creates a new %OLSR HELLO message which is buffered for being sent later on.
///
void
RoutingProtocol::SendHello ()
{
@@ -1784,9 +1709,6 @@ RoutingProtocol::SendHello ()
QueueMessage (msg, JITTER);
}
///
/// \brief Creates a new %OLSR TC message which is buffered for being sent later on.
///
void
RoutingProtocol::SendTc ()
{
@@ -1811,9 +1733,6 @@ RoutingProtocol::SendTc ()
QueueMessage (msg, JITTER);
}
///
/// \brief Creates a new %OLSR MID message which is buffered for being sent later on.
///
void
RoutingProtocol::SendMid ()
{
@@ -1855,9 +1774,6 @@ RoutingProtocol::SendMid ()
QueueMessage (msg, JITTER);
}
///
/// \brief Creates a new %OLSR HNA message which is buffered for being sent later on.
///
void
RoutingProtocol::SendHna ()
{
@@ -1891,11 +1807,6 @@ RoutingProtocol::SendHna ()
QueueMessage (msg, JITTER);
}
///
/// \brief Injects the specified (networkAddr, netmask) tuple in the list of
/// local HNA associations to be sent by the node via HNA messages.
/// If this tuple already exists, nothing is done.
///
void
RoutingProtocol::AddHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask netmask)
{
@@ -1917,11 +1828,6 @@ RoutingProtocol::AddHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask ne
m_state.InsertAssociation ( (Association) { networkAddr, netmask} );
}
///
/// \brief Removes the specified (networkAddr, netmask) tuple from the list of
/// local HNA associations to be sent by the node via HNA messages.
/// If this tuple does not exist, nothing is done (see "OlsrState::EraseAssociation()").
///
void
RoutingProtocol::RemoveHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask netmask)
{
@@ -1929,16 +1835,6 @@ RoutingProtocol::RemoveHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask
m_state.EraseAssociation ( (Association) { networkAddr, netmask} );
}
///
/// \brief Associates the specified Ipv4StaticRouting routing table
/// to the OLSR routing protocol. Entries from this associated
/// routing table that use non-olsr outgoing interfaces are added
/// to the list of local HNA associations so that they are included
/// in HNA messages sent by the node.
/// If this method is called more than once, entries from the old
/// association are deleted before entries from the new one are added.
/// \param routingTable the Ipv4StaticRouting routing table to be associated.
///
void
RoutingProtocol::SetRoutingTableAssociation (Ptr<Ipv4StaticRouting> routingTable)
{
@@ -1984,11 +1880,6 @@ RoutingProtocol::SetRoutingTableAssociation (Ptr<Ipv4StaticRouting> routingTable
"the associated routing table: " << m_state.GetAssociations ().size ());
}
///
/// \brief Tests whether or not the specified route uses a non-OLSR outgoing interface.
/// Returns true if the outgoing interface of the specified route is a non-OLSR interface.
/// Returns false otherwise.
///
bool
RoutingProtocol::UsesNonOlsrOutgoingInterface (const Ipv4RoutingTableEntry &route)
{
@@ -1998,9 +1889,6 @@ RoutingProtocol::UsesNonOlsrOutgoingInterface (const Ipv4RoutingTableEntry &rout
return ci != m_interfaceExclusions.end ();
}
///
/// \brief Updates Link Set according to a new received HELLO message
/// (following \RFC{3626} specification). Neighbor Set is also updated if needed.
void
RoutingProtocol::LinkSensing (const olsr::MessageHeader &msg,
const olsr::MessageHeader::Hello &hello,
@@ -2135,9 +2023,6 @@ RoutingProtocol::LinkSensing (const olsr::MessageHeader &msg,
<< ": LinkSensing END");
}
///
/// \brief Updates the Neighbor Set according to the information contained in
/// a new received HELLO message (following \RFC{3626}).
void
RoutingProtocol::PopulateNeighborSet (const olsr::MessageHeader &msg,
const olsr::MessageHeader::Hello &hello)
@@ -2149,10 +2034,6 @@ RoutingProtocol::PopulateNeighborSet (const olsr::MessageHeader &msg,
}
}
///
/// \brief Updates the 2-hop Neighbor Set according to the information contained
/// in a new received HELLO message (following \RFC{3626}).
void
RoutingProtocol::PopulateTwoHopNeighborSet (const olsr::MessageHeader &msg,
const olsr::MessageHeader::Hello &hello)
@@ -2260,11 +2141,6 @@ RoutingProtocol::PopulateTwoHopNeighborSet (const olsr::MessageHeader &msg,
NS_LOG_DEBUG ("Olsr node " << m_mainAddress << ": PopulateTwoHopNeighborSet END");
}
///
/// \brief Updates the MPR Selector Set according to the information contained in
/// a new received HELLO message (following \RFC{3626}).
void
RoutingProtocol::PopulateMprSelectorSet (const olsr::MessageHeader &msg,
const olsr::MessageHeader::Hello &hello)
@@ -2324,7 +2200,7 @@ RoutingProtocol::PopulateMprSelectorSet (const olsr::MessageHeader &msg,
#if 0
///
/// \brief Drops a given packet because it couldn't be delivered to the corresponding
/// destination by the MAC layer. This may cause a neighbor loss, and appropiate
/// destination by the MAC layer. This may cause a neighbor loss, and appropriate
/// actions are then taken.
///
/// \param p the packet which couldn't be delivered by the MAC layer.
@@ -2358,13 +2234,6 @@ OLSR::mac_failed (Ptr<Packet> p) {
///
/// \brief Performs all actions needed when a neighbor loss occurs.
///
/// Neighbor Set, 2-hop Neighbor Set, MPR Set and MPR Selector Set are updated.
///
/// \param tuple link tuple with the information of the link to the neighbor which has been lost.
///
void
RoutingProtocol::NeighborLoss (const LinkTuple &tuple)
{
@@ -2379,11 +2248,6 @@ RoutingProtocol::NeighborLoss (const LinkTuple &tuple)
RoutingTableComputation ();
}
///
/// \brief Adds a duplicate tuple to the Duplicate Set.
///
/// \param tuple the duplicate tuple to be added.
///
void
RoutingProtocol::AddDuplicateTuple (const DuplicateTuple &tuple)
{
@@ -2395,11 +2259,6 @@ RoutingProtocol::AddDuplicateTuple (const DuplicateTuple &tuple)
m_state.InsertDuplicateTuple (tuple);
}
///
/// \brief Removes a duplicate tuple from the Duplicate Set.
///
/// \param tuple the duplicate tuple to be removed.
///
void
RoutingProtocol::RemoveDuplicateTuple (const DuplicateTuple &tuple)
{
@@ -2431,11 +2290,6 @@ RoutingProtocol::LinkTupleAdded (const LinkTuple &tuple, uint8_t willingness)
AddNeighborTuple (nb_tuple);
}
///
/// \brief Removes a link tuple from the Link Set.
///
/// \param tuple the link tuple to be removed.
///
void
RoutingProtocol::RemoveLinkTuple (const LinkTuple &tuple)
{
@@ -2447,12 +2301,6 @@ RoutingProtocol::RemoveLinkTuple (const LinkTuple &tuple)
m_state.EraseLinkTuple (tuple);
}
///
/// \brief This function is invoked when a link tuple is updated. Its aim is to
/// also update the corresponding neighbor tuple if it is needed.
///
/// \param tuple the link tuple which has been updated.
///
void
RoutingProtocol::LinkTupleUpdated (const LinkTuple &tuple, uint8_t willingness)
{
@@ -2509,11 +2357,6 @@ RoutingProtocol::LinkTupleUpdated (const LinkTuple &tuple, uint8_t willingness)
}
}
///
/// \brief Adds a neighbor tuple to the Neighbor Set.
///
/// \param tuple the neighbor tuple to be added.
///
void
RoutingProtocol::AddNeighborTuple (const NeighborTuple &tuple)
{
@@ -2527,11 +2370,6 @@ RoutingProtocol::AddNeighborTuple (const NeighborTuple &tuple)
IncrementAnsn ();
}
///
/// \brief Removes a neighbor tuple from the Neighbor Set.
///
/// \param tuple the neighbor tuple to be removed.
///
void
RoutingProtocol::RemoveNeighborTuple (const NeighborTuple &tuple)
{
@@ -2545,11 +2383,6 @@ RoutingProtocol::RemoveNeighborTuple (const NeighborTuple &tuple)
IncrementAnsn ();
}
///
/// \brief Adds a 2-hop neighbor tuple to the 2-hop Neighbor Set.
///
/// \param tuple the 2-hop neighbor tuple to be added.
///
void
RoutingProtocol::AddTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple)
{
@@ -2562,11 +2395,6 @@ RoutingProtocol::AddTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple)
m_state.InsertTwoHopNeighborTuple (tuple);
}
///
/// \brief Removes a 2-hop neighbor tuple from the 2-hop Neighbor Set.
///
/// \param tuple the 2-hop neighbor tuple to be removed.
///
void
RoutingProtocol::RemoveTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple)
{
@@ -2585,13 +2413,6 @@ RoutingProtocol::IncrementAnsn ()
m_ansn = (m_ansn + 1) % (OLSR_MAX_SEQ_NUM + 1);
}
///
/// \brief Adds an MPR selector tuple to the MPR Selector Set.
///
/// Advertised Neighbor Sequence Number (ANSN) is also updated.
///
/// \param tuple the MPR selector tuple to be added.
///
void
RoutingProtocol::AddMprSelectorTuple (const MprSelectorTuple &tuple)
{
@@ -2604,13 +2425,6 @@ RoutingProtocol::AddMprSelectorTuple (const MprSelectorTuple &tuple)
IncrementAnsn ();
}
///
/// \brief Removes an MPR selector tuple from the MPR Selector Set.
///
/// Advertised Neighbor Sequence Number (ANSN) is also updated.
///
/// \param tuple the MPR selector tuple to be removed.
///
void
RoutingProtocol::RemoveMprSelectorTuple (const MprSelectorTuple &tuple)
{
@@ -2623,11 +2437,6 @@ RoutingProtocol::RemoveMprSelectorTuple (const MprSelectorTuple &tuple)
IncrementAnsn ();
}
///
/// \brief Adds a topology tuple to the Topology Set.
///
/// \param tuple the topology tuple to be added.
///
void
RoutingProtocol::AddTopologyTuple (const TopologyTuple &tuple)
{
@@ -2641,11 +2450,6 @@ RoutingProtocol::AddTopologyTuple (const TopologyTuple &tuple)
m_state.InsertTopologyTuple (tuple);
}
///
/// \brief Removes a topology tuple from the Topology Set.
///
/// \param tuple the topology tuple to be removed.
///
void
RoutingProtocol::RemoveTopologyTuple (const TopologyTuple &tuple)
{
@@ -2659,11 +2463,6 @@ RoutingProtocol::RemoveTopologyTuple (const TopologyTuple &tuple)
m_state.EraseTopologyTuple (tuple);
}
///
/// \brief Adds an interface association tuple to the Interface Association Set.
///
/// \param tuple the interface association tuple to be added.
///
void
RoutingProtocol::AddIfaceAssocTuple (const IfaceAssocTuple &tuple)
{
@@ -2676,11 +2475,6 @@ RoutingProtocol::AddIfaceAssocTuple (const IfaceAssocTuple &tuple)
m_state.InsertIfaceAssocTuple (tuple);
}
///
/// \brief Removes an interface association tuple from the Interface Association Set.
///
/// \param tuple the interface association tuple to be removed.
///
void
RoutingProtocol::RemoveIfaceAssocTuple (const IfaceAssocTuple &tuple)
{
@@ -2693,48 +2487,30 @@ RoutingProtocol::RemoveIfaceAssocTuple (const IfaceAssocTuple &tuple)
m_state.EraseIfaceAssocTuple (tuple);
}
///
/// \brief Adds a host network association tuple to the Association Set.
///
/// \param tuple the host network association tuple to be added.
///
void
RoutingProtocol::AddAssociationTuple (const AssociationTuple &tuple)
{
m_state.InsertAssociationTuple (tuple);
}
///
/// \brief Removes a host network association tuple from the Association Set.
///
/// \param tuple the host network association tuple to be removed.
///
void
RoutingProtocol::RemoveAssociationTuple (const AssociationTuple &tuple)
{
m_state.EraseAssociationTuple (tuple);
}
uint16_t RoutingProtocol::GetPacketSequenceNumber ()
{
m_packetSequenceNumber = (m_packetSequenceNumber + 1) % (OLSR_MAX_SEQ_NUM + 1);
return m_packetSequenceNumber;
}
/// Increments message sequence number and returns the new value.
uint16_t RoutingProtocol::GetMessageSequenceNumber ()
{
m_messageSequenceNumber = (m_messageSequenceNumber + 1) % (OLSR_MAX_SEQ_NUM + 1);
return m_messageSequenceNumber;
}
///
/// \brief Sends a HELLO message and reschedules the HELLO timer.
/// \param e The event which has expired.
///
void
RoutingProtocol::HelloTimerExpire ()
{
@@ -2742,10 +2518,6 @@ RoutingProtocol::HelloTimerExpire ()
m_helloTimer.Schedule (m_helloInterval);
}
///
/// \brief Sends a TC message (if there exists any MPR selector) and reschedules the TC timer.
/// \param e The event which has expired.
///
void
RoutingProtocol::TcTimerExpire ()
{
@@ -2760,10 +2532,6 @@ RoutingProtocol::TcTimerExpire ()
m_tcTimer.Schedule (m_tcInterval);
}
///
/// \brief Sends a MID message (if the node has more than one interface) and resets the MID timer.
/// \param e The event which has expired.
///
void
RoutingProtocol::MidTimerExpire ()
{
@@ -2771,9 +2539,6 @@ RoutingProtocol::MidTimerExpire ()
m_midTimer.Schedule (m_midInterval);
}
///
/// \brief Sends an HNA message (if the node has associated hosts/networks) and reschedules the HNA timer.
///
void
RoutingProtocol::HnaTimerExpire ()
{
@@ -2788,13 +2553,6 @@ RoutingProtocol::HnaTimerExpire ()
m_hnaTimer.Schedule (m_hnaInterval);
}
///
/// \brief Removes tuple if expired. Else timer is rescheduled to expire at tuple.expirationTime.
///
/// The task of actually removing the tuple is left to the OLSR agent.
///
/// \param tuple The tuple which has expired.
///
void
RoutingProtocol::DupTupleTimerExpire (Ipv4Address address, uint16_t sequenceNumber)
{
@@ -2816,17 +2574,6 @@ RoutingProtocol::DupTupleTimerExpire (Ipv4Address address, uint16_t sequenceNumb
}
}
///
/// \brief Removes tuple_ if expired. Else if symmetric time
/// has expired then it is assumed a neighbor loss and agent_->nb_loss()
/// is called. In this case the timer is rescheduled to expire at
/// tuple_->time(). Otherwise the timer is rescheduled to expire at
/// the minimum between tuple_->time() and tuple_->sym_time().
///
/// The task of actually removing the tuple is left to the OLSR agent.
///
/// \param e The event which has expired.
///
void
RoutingProtocol::LinkTupleTimerExpire (Ipv4Address neighborIfaceAddr)
{
@@ -2861,13 +2608,6 @@ RoutingProtocol::LinkTupleTimerExpire (Ipv4Address neighborIfaceAddr)
}
}
///
/// \brief Removes tuple_ if expired. Else the timer is rescheduled to expire at tuple_->time().
///
/// The task of actually removing the tuple is left to the OLSR agent.
///
/// \param e The event which has expired.
///
void
RoutingProtocol::Nb2hopTupleTimerExpire (Ipv4Address neighborMainAddr, Ipv4Address twoHopNeighborAddr)
{
@@ -2889,13 +2629,6 @@ RoutingProtocol::Nb2hopTupleTimerExpire (Ipv4Address neighborMainAddr, Ipv4Addre
}
}
///
/// \brief Removes tuple_ if expired. Else the timer is rescheduled to expire at tuple_->time().
///
/// The task of actually removing the tuple is left to the OLSR agent.
///
/// \param e The event which has expired.
///
void
RoutingProtocol::MprSelTupleTimerExpire (Ipv4Address mainAddr)
{
@@ -2916,13 +2649,6 @@ RoutingProtocol::MprSelTupleTimerExpire (Ipv4Address mainAddr)
}
}
///
/// \brief Removes tuple_ if expired. Else the timer is rescheduled to expire at tuple_->time().
///
/// The task of actually removing the tuple is left to the OLSR agent.
///
/// \param e The event which has expired.
///
void
RoutingProtocol::TopologyTupleTimerExpire (Ipv4Address destAddr, Ipv4Address lastAddr)
{
@@ -2943,10 +2669,6 @@ RoutingProtocol::TopologyTupleTimerExpire (Ipv4Address destAddr, Ipv4Address las
}
}
///
/// \brief Removes tuple_ if expired. Else timer is rescheduled to expire at tuple_->time().
/// \param e The event which has expired.
///
void
RoutingProtocol::IfaceAssocTupleTimerExpire (Ipv4Address ifaceAddr)
{
@@ -2967,9 +2689,6 @@ RoutingProtocol::IfaceAssocTupleTimerExpire (Ipv4Address ifaceAddr)
}
}
/// \brief Removes tuple_ if expired. Else timer is rescheduled to expire at tuple_->time().
/// \param e The event which has expired.
///
void
RoutingProtocol::AssociationTupleTimerExpire (Ipv4Address gatewayAddr, Ipv4Address networkAddr, Ipv4Mask netmask)
{
@@ -2990,9 +2709,6 @@ RoutingProtocol::AssociationTupleTimerExpire (Ipv4Address gatewayAddr, Ipv4Addre
}
}
///
/// \brief Clears the routing table and frees the memory assigned to each one of its entries.
///
void
RoutingProtocol::Clear ()
{
@@ -3000,22 +2716,12 @@ RoutingProtocol::Clear ()
m_table.clear ();
}
///
/// \brief Deletes the entry whose destination address is given.
/// \param dest address of the destination node.
///
void
RoutingProtocol::RemoveEntry (Ipv4Address const &dest)
{
m_table.erase (dest);
}
///
/// \brief Looks up an entry for the specified destination address.
/// \param dest destination address.
/// \param outEntry output parameter to hold the routing entry result, if fuond
/// \return true if found, false if not found
///
bool
RoutingProtocol::Lookup (Ipv4Address const &dest,
RoutingTableEntry &outEntry) const
@@ -3030,22 +2736,6 @@ RoutingProtocol::Lookup (Ipv4Address const &dest,
return true;
}
///
/// \brief Finds the appropiate entry which must be used in order to forward
/// a data packet to a next hop (given a destination).
///
/// Imagine a routing table like this: [A,B] [B,C] [C,C]; being each pair of the
/// form [dest addr,next-hop addr]. In this case, if this function is invoked with
/// [A,B] then pair [C,C] is returned because C is the next hop that must be used
/// to forward a data packet destined to A. That is, C is a neighbor of this node,
/// but B isn't. This function finds the appropiate neighbor for forwarding a packet.
///
/// \param entry the routing table entry which indicates the destination node
/// we are interested in.
/// \return the appropiate routing table entry which indicates the next
/// hop which must be used for forwarding a data packet, or NULL
/// if there is no such entry.
///
bool
RoutingProtocol::FindSendEntry (RoutingTableEntry const &entry,
RoutingTableEntry &outEntry) const
@@ -3251,16 +2941,6 @@ RoutingProtocol::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress a
{}
///
/// \brief Adds a new entry into the routing table.
///
/// If an entry for the given destination existed, it is deleted and freed.
///
/// \param dest address of the destination node.
/// \param next address of the next hop node.
/// \param iface address of the local interface.
/// \param dist distance to the destination node.
///
void
RoutingProtocol::AddEntry (Ipv4Address const &dest,
Ipv4Address const &next,

View File

@@ -54,13 +54,14 @@ namespace olsr {
/// This section documents the API of the ns-3 OLSR module. For a generic
/// functional description, please refer to the ns-3 manual.
/// \ingroup olsr
/// An %OLSR's routing table entry.
struct RoutingTableEntry
{
Ipv4Address destAddr; ///< Address of the destination node.
Ipv4Address nextAddr; ///< Address of the next hop.
uint32_t interface; ///< Interface index
uint32_t distance; ///< Distance in hops to the destination.
Ipv4Address destAddr; //!< Address of the destination node.
Ipv4Address nextAddr; //!< Address of the next hop.
uint32_t interface; //!< Interface index
uint32_t distance; //!< Distance in hops to the destination.
RoutingTableEntry () : // default values
destAddr (), nextAddr (),
@@ -78,28 +79,33 @@ class RoutingProtocol : public Ipv4RoutingProtocol
{
public:
friend class ::OlsrMprTestCase;
/**
* \brief Get the type ID.
* \return The object TypeId.
*/
static TypeId GetTypeId (void);
RoutingProtocol ();
virtual ~RoutingProtocol ();
///
/// \brief Set the OLSR main address to the first address on the indicated
/// interface
/// \param interface IPv4 interface index
///
/**
* \brief Set the OLSR main address to the first address on the indicated interface.
*
* \param interface IPv4 interface index
*/
void SetMainInterface (uint32_t interface);
///
/// Dump the neighbor table, two-hop neighbor table, and routing table
/// to logging output (NS_LOG_DEBUG log level). If logging is disabled,
/// this function does nothing.
///
/**
* Dump the neighbor table, two-hop neighbor table, and routing table
* to logging output (NS_LOG_DEBUG log level). If logging is disabled,
* this function does nothing.
*/
void Dump (void);
/**
* Return the list of routing table entries discovered by OLSR
**/
*/
std::vector<RoutingTableEntry> GetRoutingTableEntries () const;
/**
@@ -129,22 +135,55 @@ public:
typedef void (* TableChangeTracedCallback) (uint32_t size);
private:
std::set<uint32_t> m_interfaceExclusions;
Ptr<Ipv4StaticRouting> m_routingTableAssociation;
std::set<uint32_t> m_interfaceExclusions; //!< Set of interfaces excluded by OSLR.
Ptr<Ipv4StaticRouting> m_routingTableAssociation; //!< Associations from an Ipv4StaticRouting instance
public:
/**
* Get the excluded interfaces.
* \returns Container of excluded interfaces.
*/
std::set<uint32_t> GetInterfaceExclusions () const
{
return m_interfaceExclusions;
}
/**
* Set the interfaces to be excluded.
* \param exceptions Container of excluded interfaces.
*/
void SetInterfaceExclusions (std::set<uint32_t> exceptions);
/// Inject Association to be sent in HNA message
/**
* \brief Injects the specified (networkAddr, netmask) tuple in the list of
* local HNA associations to be sent by the node via HNA messages.
* If this tuple already exists, nothing is done.
*
* \param networkAddr The network address.
* \param netmask The network mask.
*/
void AddHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask netmask);
/// Removes Association sent in HNA message
/**
* \brief Removes the specified (networkAddr, netmask) tuple from the list of
* local HNA associations to be sent by the node via HNA messages.
* If this tuple does not exist, nothing is done (see "OlsrState::EraseAssociation()").
*
* \param networkAddr The network address.
* \param netmask The network mask.
*/
void RemoveHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask netmask);
/// Inject Associations from an Ipv4StaticRouting instance
/**
* \brief Associates the specified Ipv4StaticRouting routing table
* to the OLSR routing protocol. Entries from this associated
* routing table that use non-olsr outgoing interfaces are added
* to the list of local HNA associations so that they are included
* in HNA messages sent by the node.
* If this method is called more than once, entries from the old
* association are deleted before entries from the new one are added.
* \param routingTable the Ipv4StaticRouting routing table to be associated.
*/
void SetRoutingTableAssociation (Ptr<Ipv4StaticRouting> routingTable);
/**
@@ -156,48 +195,97 @@ public:
protected:
virtual void DoInitialize (void);
private:
std::map<Ipv4Address, RoutingTableEntry> m_table; ///< Data structure for the routing table.
std::map<Ipv4Address, RoutingTableEntry> m_table; //!< Data structure for the routing table.
Ptr<Ipv4StaticRouting> m_hnaRoutingTable;
Ptr<Ipv4StaticRouting> m_hnaRoutingTable; //!< Routing table for HNA routes
EventGarbageCollector m_events;
EventGarbageCollector m_events; //!< Running events.
/// Packets sequence number counter.
uint16_t m_packetSequenceNumber;
/// Messages sequence number counter.
uint16_t m_messageSequenceNumber;
/// Advertised Neighbor Set sequence number.
uint16_t m_ansn;
uint16_t m_packetSequenceNumber; //!< Packets sequence number counter.
uint16_t m_messageSequenceNumber; //!< Messages sequence number counter.
uint16_t m_ansn; //!< Advertised Neighbor Set sequence number.
/// HELLO messages' emission interval.
Time m_helloInterval;
/// TC messages' emission interval.
Time m_tcInterval;
/// MID messages' emission interval.
Time m_midInterval;
/// HNA messages' emission interval.
Time m_hnaInterval;
/// Willingness for forwarding packets on behalf of other nodes.
uint8_t m_willingness;
Time m_helloInterval; //!< HELLO messages' emission interval.
Time m_tcInterval; //!< TC messages' emission interval.
Time m_midInterval; //!< MID messages' emission interval.
Time m_hnaInterval; //!< HNA messages' emission interval.
uint8_t m_willingness; //!< Willingness for forwarding packets on behalf of other nodes.
/// Internal state with all needed data structs.
OlsrState m_state;
Ptr<Ipv4> m_ipv4;
OlsrState m_state; //!< Internal state with all needed data structs.
Ptr<Ipv4> m_ipv4; //!< IPv4 object the routing is linked to.
/**
* \brief Clears the routing table and frees the memory assigned to each one of its entries.
*/
void Clear ();
/**
* Returns the routing table size.
* \return The routing table size.
*/
uint32_t GetSize () const { return m_table.size (); }
/**
* \brief Deletes the entry whose destination address is given.
* \param dest address of the destination node.
*/
void RemoveEntry (const Ipv4Address &dest);
/**
* \brief Adds a new entry into the routing table.
*
* If an entry for the given destination existed, it is deleted and freed.
*
* \param dest address of the destination node.
* \param next address of the next hop node.
* \param interface address of the local interface.
* \param distance distance to the destination node.
*/
void AddEntry (const Ipv4Address &dest,
const Ipv4Address &next,
uint32_t interface,
uint32_t distance);
/**
* \brief Adds a new entry into the routing table.
*
* If an entry for the given destination existed, an error is thrown.
*
* \param dest address of the destination node.
* \param next address of the next hop node.
* \param interfaceAddress address of the local interface.
* \param distance distance to the destination node.
*/
void AddEntry (const Ipv4Address &dest,
const Ipv4Address &next,
const Ipv4Address &interfaceAddress,
uint32_t distance);
/**
* \brief Looks up an entry for the specified destination address.
* \param [in] dest Destination address.
* \param [out] outEntry Holds the routing entry result, if found.
* \return true if found, false if not found.
*/
bool Lookup (const Ipv4Address &dest,
RoutingTableEntry &outEntry) const;
/**
* \brief Finds the appropriate entry which must be used in order to forward
* a data packet to a next hop (given a destination).
*
* Imagine a routing table like this: [A,B] [B,C] [C,C]; being each pair of the
* form [dest addr, next-hop addr]. In this case, if this function is invoked
* with [A,B] then pair [C,C] is returned because C is the next hop that must be used
* to forward a data packet destined to A. That is, C is a neighbor of this node,
* but B isn't. This function finds the appropriate neighbor for forwarding a packet.
*
* \param[in] entry The routing table entry which indicates the destination node
* we are interested in.
*
* \param[out] outEntry The appropriate routing table entry which indicates the next
* hop which must be used for forwarding a data packet, or NULL if there is no such entry.
*
* \return True if an entry was found, false otherwise.
*/
bool FindSendEntry (const RoutingTableEntry &entry,
RoutingTableEntry &outEntry) const;
@@ -222,96 +310,435 @@ private:
void DoDispose ();
/**
* Send an OLSR message.
* \param packet The packet to be sent.
* \param containedMessages The messages contained in the packet.
*/
void SendPacket (Ptr<Packet> packet, const MessageList &containedMessages);
/// Increments packet sequence number and returns the new value.
/**
* Increments packet sequence number and returns the new value.
* \return The packet sequence number.
*/
inline uint16_t GetPacketSequenceNumber ();
/// Increments message sequence number and returns the new value.
/**
* Increments message sequence number and returns the new value.
* \return The message sequence number.
*/
inline uint16_t GetMessageSequenceNumber ();
/**
* Receive an OLSR message.
* \param socket The receiving socket.
*/
void RecvOlsr (Ptr<Socket> socket);
/**
* \brief Computates MPR set of a node following \RFC{3626} hints.
*/
void MprComputation ();
/**
* \brief Creates the routing table of the node following \RFC{3626} hints.
*/
void RoutingTableComputation ();
/**
* \brief Gets the main address associated with a given interface address.
* \param iface_addr the interface address.
* \return the corresponding main address.
*/
Ipv4Address GetMainAddress (Ipv4Address iface_addr) const;
/**
* \brief Tests whether or not the specified route uses a non-OLSR outgoing interface.
* \param route The route to be tested.
* \returns True if the outgoing interface of the specified route is a non-OLSR interface, false otherwise.
*/
bool UsesNonOlsrOutgoingInterface (const Ipv4RoutingTableEntry &route);
// Timer handlers
Timer m_helloTimer;
Timer m_helloTimer; //!< Timer for the HELLO message.
/**
* \brief Sends a HELLO message and reschedules the HELLO timer.
*/
void HelloTimerExpire ();
Timer m_tcTimer;
Timer m_tcTimer; //!< Timer for the TC message.
/**
* \brief Sends a TC message (if there exists any MPR selector) and reschedules the TC timer.
*/
void TcTimerExpire ();
Timer m_midTimer;
Timer m_midTimer; //!< Timer for the MID message.
/**
* \brief \brief Sends a MID message (if the node has more than one interface) and resets the MID timer.
*/
void MidTimerExpire ();
Timer m_hnaTimer;
Timer m_hnaTimer; //!< Timer for the HNA message.
/**
* \brief Sends an HNA message (if the node has associated hosts/networks) and reschedules the HNA timer.
*/
void HnaTimerExpire ();
/**
* \brief Removes tuple if expired. Else timer is rescheduled to expire at tuple.expirationTime.
*
* The task of actually removing the tuple is left to the OLSR agent.
*
* \param address The address of the tuple.
* \param sequenceNumber The sequence number of the tuple.
*/
void DupTupleTimerExpire (Ipv4Address address, uint16_t sequenceNumber);
bool m_linkTupleTimerFirstTime;
bool m_linkTupleTimerFirstTime; //!< Flag to indicate if it is the first time the LinkTupleTimer fires.
/**
* \brief Removes tuple_ if expired. Else if symmetric time
* has expired then it is assumed a neighbor loss and agent_->nb_loss()
* is called. In this case the timer is rescheduled to expire at
* tuple_->time(). Otherwise the timer is rescheduled to expire at
* the minimum between tuple_->time() and tuple_->sym_time().
*
* The task of actually removing the tuple is left to the OLSR agent.
*
* \param neighborIfaceAddr The tuple neighbor interface address.
*/
void LinkTupleTimerExpire (Ipv4Address neighborIfaceAddr);
/**
* \brief Removes 2_hop neighbor tuple_ if expired. Else the timer is rescheduled to expire at tuple_->time().
*
* The task of actually removing the tuple is left to the OLSR agent.
*
* \param neighborMainAddr The neighbor main address.
* \param twoHopNeighborAddr The 2-hop neighbor address.
*/
void Nb2hopTupleTimerExpire (Ipv4Address neighborMainAddr, Ipv4Address twoHopNeighborAddr);
/**
* \brief Removes MPR selector tuple_ if expired. Else the timer is rescheduled to expire at tuple_->time().
*
* The task of actually removing the tuple is left to the OLSR agent.
*
* \param mainAddr The tuple IPv4 address.
*/
void MprSelTupleTimerExpire (Ipv4Address mainAddr);
/**
* \brief Removes topology tuple_ if expired. Else the timer is rescheduled to expire at tuple_->time().
*
* The task of actually removing the tuple is left to the OLSR agent.
*
* \param destAddr The destination address.
* \param lastAddr The last address.
*/
void TopologyTupleTimerExpire (Ipv4Address destAddr, Ipv4Address lastAddr);
/**
* \brief Removes interface association tuple_ if expired. Else the timer is rescheduled to expire at tuple_->time().
*
* \param ifaceAddr The interface address.
*/
void IfaceAssocTupleTimerExpire (Ipv4Address ifaceAddr);
/**
* \brief Removes association tuple_ if expired. Else timer is rescheduled to expire at tuple_->time().
*
* \param gatewayAddr The gateway address.
* \param networkAddr The network address.
* \param netmask The network mask.
*/
void AssociationTupleTimerExpire (Ipv4Address gatewayAddr, Ipv4Address networkAddr, Ipv4Mask netmask);
/**
* Increments the ANSN counter.
*/
void IncrementAnsn ();
/// A list of pending messages which are buffered awaiting for being sent.
olsr::MessageList m_queuedMessages;
Timer m_queuedMessagesTimer; // timer for throttling outgoing messages
Timer m_queuedMessagesTimer; //!< timer for throttling outgoing messages
/**
* \brief OLSR's default forwarding algorithm.
*
* See \RFC{3626} for details.
*
* \param olsrMessage The %OLSR message which must be forwarded.
* \param duplicated NULL if the message has never been considered for forwarding, or a duplicate tuple in other case.
* \param localIface The address of the interface where the message was received from.
* \param senderAddress The sender IPv4 address.
*/
void ForwardDefault (olsr::MessageHeader olsrMessage,
DuplicateTuple *duplicated,
const Ipv4Address &localIface,
const Ipv4Address &senderAddress);
/**
* \brief Enques an %OLSR message which will be sent with a delay of (0, delay].
*
* This buffering system is used in order to piggyback several %OLSR messages in
* a same %OLSR packet.
*
* \param message the %OLSR message which must be sent.
* \param delay maximum delay the %OLSR message is going to be buffered.
*/
void QueueMessage (const olsr::MessageHeader &message, Time delay);
/**
* \brief Creates as many %OLSR packets as needed in order to send all buffered
* %OLSR messages.
*
* Maximum number of messages which can be contained in an %OLSR packet is
* dictated by OLSR_MAX_MSGS constant.
*/
void SendQueuedMessages ();
void SendHello ();
/**
* \brief Creates a new %OLSR HELLO message which is buffered for being sent later on.
*/
void SendHello ();
/**
* \brief Creates a new %OLSR TC message which is buffered for being sent later on.
*/
void SendTc ();
/**
* \brief Creates a new %OLSR MID message which is buffered for being sent later on.
*/
void SendMid ();
/**
* \brief Creates a new %OLSR HNA message which is buffered for being sent later on.
*/
void SendHna ();
/**
* \brief Performs all actions needed when a neighbor loss occurs.
*
* Neighbor Set, 2-hop Neighbor Set, MPR Set and MPR Selector Set are updated.
*
* \param tuple link tuple with the information of the link to the neighbor which has been lost.
*/
void NeighborLoss (const LinkTuple &tuple);
/**
* \brief Adds a duplicate tuple to the Duplicate Set.
*
* \param tuple The duplicate tuple to be added.
*/
void AddDuplicateTuple (const DuplicateTuple &tuple);
/**
* \brief Removes a duplicate tuple from the Duplicate Set.
*
* \param tuple The duplicate tuple to be removed.
*/
void RemoveDuplicateTuple (const DuplicateTuple &tuple);
/**
* Adds a link tuple.
* \param tuple Thetuple to be added.
* \param willingness The tuple willingness.
*/
void LinkTupleAdded (const LinkTuple &tuple, uint8_t willingness);
/**
* \brief Removes a link tuple from the Link Set.
*
* \param tuple The link tuple to be removed.
*/
void RemoveLinkTuple (const LinkTuple &tuple);
/**
* \brief This function is invoked when a link tuple is updated. Its aim is to
* also update the corresponding neighbor tuple if it is needed.
*
* \param tuple The link tuple which has been updated.
* \param willingness The tuple willingness.
*/
void LinkTupleUpdated (const LinkTuple &tuple, uint8_t willingness);
/**
* \brief Adds a neighbor tuple to the Neighbor Set.
*
* \param tuple The neighbor tuple to be added.
*/
void AddNeighborTuple (const NeighborTuple &tuple);
/**
* \brief Removes a neighbor tuple from the Neighbor Set.
*
* \param tuple The neighbor tuple to be removed.
*/
void RemoveNeighborTuple (const NeighborTuple &tuple);
/**
* \brief Adds a 2-hop neighbor tuple to the 2-hop Neighbor Set.
*
* \param tuple The 2-hop neighbor tuple to be added.
*/
void AddTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple);
/**
* \brief Removes a 2-hop neighbor tuple from the 2-hop Neighbor Set.
*
* \param tuple The 2-hop neighbor tuple to be removed.
*/
void RemoveTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple);
/**
* \brief Adds an MPR selector tuple to the MPR Selector Set.
* Advertised Neighbor Sequence Number (ANSN) is also updated.
*
* \param tuple The MPR selector tuple to be added.
*/
void AddMprSelectorTuple (const MprSelectorTuple &tuple);
/**
* \brief Removes an MPR selector tuple from the MPR Selector Set.
* Advertised Neighbor Sequence Number (ANSN) is also updated.
*
* \param tuple The MPR selector tuple to be removed.
*/
void RemoveMprSelectorTuple (const MprSelectorTuple &tuple);
/**
* \brief Adds a topology tuple to the Topology Set.
*
* \param tuple The topology tuple to be added.
*/
void AddTopologyTuple (const TopologyTuple &tuple);
/**
* \brief Removes a topology tuple to the Topology Set.
*
* \param tuple The topology tuple to be removed.
*/
void RemoveTopologyTuple (const TopologyTuple &tuple);
/**
* \brief Adds an interface association tuple to the Interface Association Set.
*
* \param tuple The interface association tuple to be added.
*/
void AddIfaceAssocTuple (const IfaceAssocTuple &tuple);
/**
* \brief Removed an interface association tuple to the Interface Association Set.
*
* \param tuple The interface association tuple to be removed.
*/
void RemoveIfaceAssocTuple (const IfaceAssocTuple &tuple);
/**
* \brief Adds a host network association tuple to the Association Set.
*
* \param tuple The host network association tuple to be added.
*/
void AddAssociationTuple (const AssociationTuple &tuple);
/**
* \brief Removes a host network association tuple to the Association Set.
*
* \param tuple The host network association tuple to be removed.
*/
void RemoveAssociationTuple (const AssociationTuple &tuple);
/**
* \brief Processes a HELLO message following \RFC{3626} specification.
*
* Link sensing and population of the Neighbor Set, 2-hop Neighbor Set and MPR
* Selector Set are performed.
*
* \param msg the %OLSR message which contains the HELLO message.
* \param receiverIface the address of the interface where the message was received from.
* \param senderIface the address of the interface where the message was sent from.
*/
void ProcessHello (const olsr::MessageHeader &msg,
const Ipv4Address &receiverIface,
const Ipv4Address &senderIface);
/**
* \brief Processes a TC message following \RFC{3626} specification.
*
* The Topology Set is updated (if needed) with the information of
* the received TC message.
*
* \param msg The %OLSR message which contains the TC message.
* \param senderIface The address of the interface where the message was sent from.
*
*/
void ProcessTc (const olsr::MessageHeader &msg,
const Ipv4Address &senderIface);
/**
* \brief Processes a MID message following \RFC{3626} specification.
*
* The Interface Association Set is updated (if needed) with the information
* of the received MID message.
*
* \param msg the %OLSR message which contains the MID message.
* \param senderIface the address of the interface where the message was sent from.
*/
void ProcessMid (const olsr::MessageHeader &msg,
const Ipv4Address &senderIface);
/**
*
* \brief Processes a HNA message following \RFC{3626} specification.
*
* The Host Network Association Set is updated (if needed) with the information
* of the received HNA message.
*
* \param msg the %OLSR message which contains the HNA message.
* \param senderIface the address of the interface where the message was sent from.
*
*/
void ProcessHna (const olsr::MessageHeader &msg,
const Ipv4Address &senderIface);
/**
* \brief Updates Link Set according to a new received HELLO message
* (following \RFC{3626} specification). Neighbor Set is also updated if needed.
* \param msg The received message.
* \param hello The received HELLO sub-message.
* \param receiverIface The interface that received the message.
* \param senderIface The sender interface.
*/
void LinkSensing (const olsr::MessageHeader &msg,
const olsr::MessageHeader::Hello &hello,
const Ipv4Address &receiverIface,
const Ipv4Address &sender_iface);
const Ipv4Address &senderIface);
/**
* \brief Updates the Neighbor Set according to the information contained in
* a new received HELLO message (following \RFC{3626}).
* \param msg The received message.
* \param hello The received HELLO sub-message.
*/
void PopulateNeighborSet (const olsr::MessageHeader &msg,
const olsr::MessageHeader::Hello &hello);
/**
* \brief Updates the 2-hop Neighbor Set according to the information contained
* in a new received HELLO message (following \RFC{3626}).
* \param msg The received message.
* \param hello The received HELLO sub-message.
*/
void PopulateTwoHopNeighborSet (const olsr::MessageHeader &msg,
const olsr::MessageHeader::Hello &hello);
/**
* \brief Updates the MPR Selector Set according to the information contained in
* a new received HELLO message (following \RFC{3626}).
* \param msg The received message.
* \param hello The received HELLO sub-message.
*/
void PopulateMprSelectorSet (const olsr::MessageHeader &msg,
const olsr::MessageHeader::Hello &hello);
@@ -319,17 +746,20 @@ private:
/// Check that address is one of my interfaces
bool IsMyOwnAddress (const Ipv4Address & a) const;
Ipv4Address m_mainAddress;
Ipv4Address m_mainAddress; //!< the node main address.
// One socket per interface, each bound to that interface's address
// (reason: for OLSR Link Sensing we need to know on which interface
// HELLO messages arrive)
std::map< Ptr<Socket>, Ipv4InterfaceAddress > m_socketAddresses;
std::map< Ptr<Socket>, Ipv4InterfaceAddress > m_socketAddresses; //!< Container of sockets and the interfaces they are opened onto.
TracedCallback <const PacketHeader &,
const MessageList &> m_rxPacketTrace;
TracedCallback <const PacketHeader &,
const MessageList &> m_txPacketTrace;
/// Rx packet trace.
TracedCallback <const PacketHeader &, const MessageList &> m_rxPacketTrace;
/// Tx packet trace.
TracedCallback <const PacketHeader &, const MessageList &> m_txPacketTrace;
/// Routing table chanes challback
TracedCallback <uint32_t> m_routingTableChanged;
/// Provides uniform random variables.

View File

@@ -30,22 +30,23 @@
namespace ns3 {
namespace olsr {
/// \ingroup olsr
/// This class encapsulates all data structures needed for maintaining internal state of an OLSR node.
class OlsrState
{
// friend class Olsr;
protected:
LinkSet m_linkSet; ///< Link Set (\RFC{3626}, section 4.2.1).
NeighborSet m_neighborSet; ///< Neighbor Set (\RFC{3626}, section 4.3.1).
TwoHopNeighborSet m_twoHopNeighborSet; ///< 2-hop Neighbor Set (\RFC{3626}, section 4.3.2).
TopologySet m_topologySet; ///< Topology Set (\RFC{3626}, section 4.4).
MprSet m_mprSet; ///< MPR Set (\RFC{3626}, section 4.3.3).
MprSelectorSet m_mprSelectorSet; ///< MPR Selector Set (\RFC{3626}, section 4.3.4).
DuplicateSet m_duplicateSet; ///< Duplicate Set (\RFC{3626}, section 3.4).
IfaceAssocSet m_ifaceAssocSet; ///< Interface Association Set (\RFC{3626}, section 4.1).
AssociationSet m_associationSet; ///< Association Set (\RFC{3626}, section12.2). Associations obtained from HNA messages generated by other nodes.
Associations m_associations; ///< The node's local Host Network Associations that will be advertised using HNA messages.
LinkSet m_linkSet; //!< Link Set (\RFC{3626}, section 4.2.1).
NeighborSet m_neighborSet; //!< Neighbor Set (\RFC{3626}, section 4.3.1).
TwoHopNeighborSet m_twoHopNeighborSet; //!< 2-hop Neighbor Set (\RFC{3626}, section 4.3.2).
TopologySet m_topologySet; //!< Topology Set (\RFC{3626}, section 4.4).
MprSet m_mprSet; //!< MPR Set (\RFC{3626}, section 4.3.3).
MprSelectorSet m_mprSelectorSet; //!< MPR Selector Set (\RFC{3626}, section 4.3.4).
DuplicateSet m_duplicateSet; //!< Duplicate Set (\RFC{3626}, section 3.4).
IfaceAssocSet m_ifaceAssocSet; //!< Interface Association Set (\RFC{3626}, section 4.1).
AssociationSet m_associationSet; //!< Association Set (\RFC{3626}, section12.2). Associations obtained from HNA messages generated by other nodes.
Associations m_associations; //!< The node's local Host Network Associations that will be advertised using HNA messages.
public:
@@ -53,122 +54,377 @@ public:
{}
// MPR selector
/**
* Gets the MPR selectors.
* \returns The MPR selectors.
*/
const MprSelectorSet & GetMprSelectors () const
{
return m_mprSelectorSet;
}
/**
* Finds a MPR selector tuple.
* \param mainAddr The MPR selector main address.
* \returns The MPR selector, if found. Else it returns a null pointer.
*/
MprSelectorTuple* FindMprSelectorTuple (const Ipv4Address &mainAddr);
/**
* Erases a MPR selector tuple.
* \param tuple The MPR selector tuple.
*/
void EraseMprSelectorTuple (const MprSelectorTuple &tuple);
/**
* Erases all MPR selector tuples belonging to the same address.
* \param mainAddr The MPR selector main address.
*/
void EraseMprSelectorTuples (const Ipv4Address &mainAddr);
/**
* Inserts a MPR selector tuple
* \param tuple The MPR selector tuple.
*/
void InsertMprSelectorTuple (const MprSelectorTuple &tuple);
/**
* Prints the MPR selector sets.
* \return a string with the output data.
*/
std::string PrintMprSelectorSet () const;
// Neighbor
/**
* Gets the neighbor set.
* \returns The neighbor set.
*/
const NeighborSet & GetNeighbors () const
{
return m_neighborSet;
}
/**
* Gets the neighbor set.
* \returns The neighbor set.
*/
NeighborSet & GetNeighbors ()
{
return m_neighborSet;
}
/**
* Finds a neighbor tuple.
* \param mainAddr The neighbor tuple main address.
* \returns The neighbor tuple, if found. Else it returns a null pointer.
*/
NeighborTuple* FindNeighborTuple (const Ipv4Address &mainAddr);
/**
* Finds a symmetrical neighbor tuple.
* \param mainAddr The neighbor tuple main address.
* \returns The neighbor tuple, if found. Else it returns a null pointer.
*/
const NeighborTuple* FindSymNeighborTuple (const Ipv4Address &mainAddr) const;
/**
* Finds a neighbor tuple.
* \param mainAddr The neighbor tuple main address.
* \param willingness The neighbor willingness.
* \returns The neighbor tuple, if found. Else it returns a null pointer.
*/
NeighborTuple* FindNeighborTuple (const Ipv4Address &mainAddr,
uint8_t willingness);
/**
* Erases a neighbor tuple.
* \param neighborTuple The neighbor tuple.
*/
void EraseNeighborTuple (const NeighborTuple &neighborTuple);
/**
* Erases a neighbor tuple.
* \param mainAddr The neighbor tuple main address.
*/
void EraseNeighborTuple (const Ipv4Address &mainAddr);
/**
* Inserts a neighbor tuple.
* \param tuple The neighbor tuple.
*/
void InsertNeighborTuple (const NeighborTuple &tuple);
// Two-hop neighbor
/**
* Gets the 2-hop neighbor set.
* \returns The 2-hop neighbor set.
*/
const TwoHopNeighborSet & GetTwoHopNeighbors () const
{
return m_twoHopNeighborSet;
}
/**
* Gets the 2-hop neighbor set.
* \returns The 2-hop neighbor set.
*/
TwoHopNeighborSet & GetTwoHopNeighbors ()
{
return m_twoHopNeighborSet;
}
/**
* Finds a 2-hop neighbor tuple.
* \param neighbor The neighbor main address.
* \param twoHopNeighbor The 2-hop neighbor main address.
* \returns The 2-hop neighbor tuple, if found. Else it returns a null pointer.
*/
TwoHopNeighborTuple* FindTwoHopNeighborTuple (const Ipv4Address &neighbor,
const Ipv4Address &twoHopNeighbor);
/**
* Erases a 2-hop neighbor tuple.
* \param tuple The 2-hop neighbor tuple.
*/
void EraseTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple);
/**
* Erases the 2-hop neighbor tuples with the same 1-hop neighbor.
* \param neighbor The neighbor address.
*/
void EraseTwoHopNeighborTuples (const Ipv4Address &neighbor);
/**
* Erases the 2-hop neighbor tuples with matching predicates.
* \param neighbor The neighbor address.
* \param twoHopNeighbor The 2-hop neighbor main address.
*/
void EraseTwoHopNeighborTuples (const Ipv4Address &neighbor,
const Ipv4Address &twoHopNeighbor);
/**
* Inserts a 2-hop neighbor tuple.
* \param tuple The 2-hop neighbor tuple.
*/
void InsertTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple);
// MPR
/**
* Checks if there's an MPR with a specific address.
* \param address The address to test.
* \return True if a MPR with the specified address exists.
*/
bool FindMprAddress (const Ipv4Address &address);
/// MprSet is set by routing protocol after MprCompute
/**
* Sets the MPR set to the one specified.
* \param mprSet The new MPR set.
*/
void SetMprSet (MprSet mprSet);
/// Gets an MPR Set needed by tests
/**
* Gets the MPR set.
* \return The MPR set.
*/
MprSet GetMprSet () const;
// Duplicate
/**
* Finds a duplicate tuple.
* \param address The duplicate tuple address.
* \param sequenceNumber The duplicate tuple sequence number.
* \returns The duplicate tuple, or a null pointer if no match.
*/
DuplicateTuple* FindDuplicateTuple (const Ipv4Address &address,
uint16_t sequenceNumber);
/**
* Erases a duplicate tuple.
* \param tuple The tuple to erase.
*/
void EraseDuplicateTuple (const DuplicateTuple &tuple);
/**
* Inserts a duplicate tuple.
* \param tuple The tuple to insert.
*/
void InsertDuplicateTuple (const DuplicateTuple &tuple);
// Link
/**
* Gets the Link set.
* \return The Link set.
*/
const LinkSet & GetLinks () const
{
return m_linkSet;
}
/**
* Finds a link tuple.
* \param ifaceAddr The interface address of the link.
* \returns The link tuple, or a null pointer if no match.
*/
LinkTuple* FindLinkTuple (const Ipv4Address &ifaceAddr);
/**
* Finds a symmetrical link tuple.
* \param ifaceAddr The interface address of the link.
* \param time The time at which the link should be considered symmetrical.
* \returns The link tuple, or a null pointer if no match.
*/
LinkTuple* FindSymLinkTuple (const Ipv4Address &ifaceAddr, Time time);
/**
* Erases a link tuple.
* \param tuple The tuple to erase.
*/
void EraseLinkTuple (const LinkTuple &tuple);
/**
* Inserts a link tuple.
* \param tuple The tuple to insert.
* \returns A reference to the inserted tuple.
*/
LinkTuple& InsertLinkTuple (const LinkTuple &tuple);
// Topology
/**
* Gets the topology set.
* \returns The topology set.
*/
const TopologySet & GetTopologySet () const
{
return m_topologySet;
}
/**
* Finds a topology tuple.
* \param destAddr The destination address.
* \param lastAddr The address of the node previous to the destination.
* \returns The topology tuple, or a null pointer if no match.
*/
TopologyTuple* FindTopologyTuple (const Ipv4Address &destAddr,
const Ipv4Address &lastAddr);
/**
* Finds a topology tuple.
* \param lastAddr The address of the node previous to the destination.
* \param ansn The Advertised Neighbor Sequence Number.
* \returns The topology tuple, or a null pointer if no match.
*/
TopologyTuple* FindNewerTopologyTuple (const Ipv4Address &lastAddr,
uint16_t ansn);
/**
* Erases a topology tuple.
* \param tuple The tuple to erase.
*/
void EraseTopologyTuple (const TopologyTuple &tuple);
/**
* Erases a topology tuple.
* \param lastAddr The address of the node previous to the destination.
* \param ansn The Advertised Neighbor Sequence Number.
*/
void EraseOlderTopologyTuples (const Ipv4Address &lastAddr,
uint16_t ansn);
/**
* Inserts a topology tuple.
* \param tuple The tuple to insert.
*/
void InsertTopologyTuple (const TopologyTuple &tuple);
// Interface association
/**
* Gets the interface association set.
* \returns The interface association set.
*/
const IfaceAssocSet & GetIfaceAssocSet () const
{
return m_ifaceAssocSet;
}
/**
* Gets a mutable reference to the interface association set.
* \returns The interface association set.
*/
IfaceAssocSet & GetIfaceAssocSetMutable ()
{
return m_ifaceAssocSet;
}
/**
* Finds a interface association tuple.
* \param ifaceAddr The interface address.
* \returns The interface association tuple, or a null pointer if no match.
*/
IfaceAssocTuple* FindIfaceAssocTuple (const Ipv4Address &ifaceAddr);
/**
* Finds a interface association tuple.
* \param ifaceAddr The interface address.
* \returns The interface association tuple, or a null pointer if no match.
*/
const IfaceAssocTuple* FindIfaceAssocTuple (const Ipv4Address &ifaceAddr) const;
/**
* Erases a interface association tuple.
* \param tuple The tuple to erase.
*/
void EraseIfaceAssocTuple (const IfaceAssocTuple &tuple);
/**
* Inserts a interface association tuple.
* \param tuple The tuple to insert.
*/
void InsertIfaceAssocTuple (const IfaceAssocTuple &tuple);
// Host-Network Association
/**
* Gets the association set known to the node.
* \returns The association set known to the node.
*/
const AssociationSet & GetAssociationSet () const // Associations known to the node
{
return m_associationSet;
}
/**
* Gets the association set the node has.
* \returns The association set the node has.
*/
const Associations & GetAssociations () const // Set of associations that the node has
{
return m_associations;
}
/**
* Finds an association tuple.
* \param gatewayAddr The gateway address.
* \param networkAddr The network address.
* \param netmask The network mask.
* \returns The association tuple, or a null pointer if no match.
*/
AssociationTuple* FindAssociationTuple (const Ipv4Address &gatewayAddr, \
const Ipv4Address &networkAddr, \
const Ipv4Mask &netmask);
/**
* Erases a known association tuple.
* \param tuple The tuple to erase.
*/
void EraseAssociationTuple (const AssociationTuple &tuple);
/**
* Inserts a known association tuple.
* \param tuple The tuple to insert.
*/
void InsertAssociationTuple (const AssociationTuple &tuple);
/**
* Erases an association.
* \param tuple The tuple to erase.
*/
void EraseAssociation (const Association &tuple);
/**
* Inserts an association tuple.
* \param tuple The tuple to insert.
*/
void InsertAssociation (const Association &tuple);
// Returns a vector of all interfaces of a given neighbor, with the
// exception of the "main" one.
/**
* Returns a vector of all interfaces of a given neighbor, with the
* exception of the "main" one.
* \param neighborMainAddr The neighbor main address
* \returns A container of the neighbor addresses (excluding the main one).
*/
std::vector<Ipv4Address>
FindNeighborInterfaces (const Ipv4Address &neighborMainAddr) const;