00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __OLSR_AGENT_IMPL_H__
00025 #define __OLSR_AGENT_IMPL_H__
00026
00027 #include <vector>
00028
00029 #include "olsr-agent.h"
00030 #include "olsr-header.h"
00031 #include "olsr-state.h"
00032
00033 #include "olsr-routing-table.h"
00034 #include "repositories.h"
00035
00036 #include "ns3/object.h"
00037 #include "ns3/packet.h"
00038 #include "ns3/node.h"
00039 #include "ns3/socket.h"
00040 #include "ns3/event-garbage-collector.h"
00041 #include "ns3/timer.h"
00042 #include "ns3/traced-callback.h"
00043
00044
00045 namespace ns3 {
00046 namespace olsr {
00047
00048
00049 class AgentImpl : public Agent
00050 {
00051 public:
00052 static TypeId GetTypeId (void);
00053
00054 AgentImpl ();
00055 virtual ~AgentImpl ();
00056
00057 virtual void SetNode (Ptr<Node> node);
00058
00059 virtual void Start ();
00060 virtual void SetMainInterface (uint32_t interface);
00061 virtual Ptr<const olsr::RoutingTable> GetRoutingTable () const;
00062
00063 private:
00064 EventGarbageCollector m_events;
00065
00066
00067 Ipv4Address m_routingAgentAddr;
00068
00069
00070 uint16_t m_packetSequenceNumber;
00071
00072 uint16_t m_messageSequenceNumber;
00073
00074 uint16_t m_ansn;
00075
00076
00077 Time m_helloInterval;
00078
00079 Time m_tcInterval;
00080
00081 Time m_midInterval;
00082
00083 uint8_t m_willingness;
00084
00085
00086 Ptr<RoutingTable> m_routingTable;
00087
00088 OlsrState m_state;
00089
00090 Ptr<Ipv4> m_ipv4;
00091
00092 protected:
00093 void DoDispose ();
00094
00095 void SendPacket (Ptr<Packet> packet, const MessageList &containedMessages);
00096
00097
00098 inline uint16_t GetPacketSequenceNumber ();
00099
00100 inline uint16_t GetMessageSequenceNumber ();
00101
00102 void RecvOlsr (Ptr<Socket> socket);
00103
00104 void MprComputation ();
00105 void RoutingTableComputation ();
00106 Ipv4Address GetMainAddress (Ipv4Address iface_addr) const;
00107
00108
00109 Timer m_helloTimer;
00110 void HelloTimerExpire ();
00111
00112 Timer m_tcTimer;
00113 void TcTimerExpire ();
00114
00115 Timer m_midTimer;
00116 void MidTimerExpire ();
00117
00118 void DupTupleTimerExpire (Ipv4Address address, uint16_t sequenceNumber);
00119 bool m_linkTupleTimerFirstTime;
00120 void LinkTupleTimerExpire (Ipv4Address neighborIfaceAddr);
00121 void Nb2hopTupleTimerExpire (Ipv4Address neighborMainAddr, Ipv4Address twoHopNeighborAddr);
00122 void MprSelTupleTimerExpire (Ipv4Address mainAddr);
00123 void TopologyTupleTimerExpire (Ipv4Address destAddr, Ipv4Address lastAddr);
00124 void IfaceAssocTupleTimerExpire (Ipv4Address ifaceAddr);
00125
00126 void IncrementAnsn ();
00127
00128
00129 olsr::MessageList m_queuedMessages;
00130 Timer m_queuedMessagesTimer;
00131
00132 void ForwardDefault (olsr::MessageHeader olsrMessage,
00133 DuplicateTuple *duplicated,
00134 const Ipv4Address &localIface,
00135 const Ipv4Address &senderAddress);
00136 void QueueMessage (const olsr::MessageHeader &message, Time delay);
00137 void SendQueuedMessages ();
00138 void SendHello ();
00139 void SendTc ();
00140 void SendMid ();
00141
00142 void NeighborLoss (const LinkTuple &tuple);
00143 void AddDuplicateTuple (const DuplicateTuple &tuple);
00144 void RemoveDuplicateTuple (const DuplicateTuple &tuple);
00145 void LinkTupleAdded (const LinkTuple &tuple, uint8_t willingness);
00146 void RemoveLinkTuple (const LinkTuple &tuple);
00147 void LinkTupleUpdated (const LinkTuple &tuple, uint8_t willingness);
00148 void AddNeighborTuple (const NeighborTuple &tuple);
00149 void RemoveNeighborTuple (const NeighborTuple &tuple);
00150 void AddTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple);
00151 void RemoveTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple);
00152 void AddMprSelectorTuple (const MprSelectorTuple &tuple);
00153 void RemoveMprSelectorTuple (const MprSelectorTuple &tuple);
00154 void AddTopologyTuple (const TopologyTuple &tuple);
00155 void RemoveTopologyTuple (const TopologyTuple &tuple);
00156 void AddIfaceAssocTuple (const IfaceAssocTuple &tuple);
00157 void RemoveIfaceAssocTuple (const IfaceAssocTuple &tuple);
00158
00159 void ProcessHello (const olsr::MessageHeader &msg,
00160 const Ipv4Address &receiverIface,
00161 const Ipv4Address &senderIface);
00162 void ProcessTc (const olsr::MessageHeader &msg,
00163 const Ipv4Address &senderIface);
00164 void ProcessMid (const olsr::MessageHeader &msg,
00165 const Ipv4Address &senderIface);
00166
00167 void LinkSensing (const olsr::MessageHeader &msg,
00168 const olsr::MessageHeader::Hello &hello,
00169 const Ipv4Address &receiverIface,
00170 const Ipv4Address &sender_iface);
00171 void PopulateNeighborSet (const olsr::MessageHeader &msg,
00172 const olsr::MessageHeader::Hello &hello);
00173 void PopulateTwoHopNeighborSet (const olsr::MessageHeader &msg,
00174 const olsr::MessageHeader::Hello &hello);
00175 void PopulateMprSelectorSet (const olsr::MessageHeader &msg,
00176 const olsr::MessageHeader::Hello &hello);
00177
00178 int Degree (NeighborTuple const &tuple);
00179
00180 Ipv4Address m_mainAddress;
00181
00182
00183
00184
00185 std::map< Ptr<Socket>, Ipv4Address > m_socketAddresses;
00186
00187 TracedCallback <const PacketHeader &,
00188 const MessageList &> m_rxPacketTrace;
00189 TracedCallback <const PacketHeader &,
00190 const MessageList &> m_txPacketTrace;
00191 TracedCallback <uint32_t> m_routingTableChanged;
00192
00193 };
00194
00195 }}
00196
00197 #endif