Go to the documentation of this file.00001
00019 #ifndef IPV6NEIGHBOURDISCOVERY_H
00020 #define IPV6NEIGHBOURDISCOVERY_H
00021
00022 #include <stdio.h>
00023 #include <string.h>
00024 #include <vector>
00025 #include <set>
00026 #include <omnetpp.h>
00027 #include "IPv6Address.h"
00028 #include "IPv6Datagram.h"
00029 #include "IPv6NDMessage_m.h"
00030 #include "IPv6ControlInfo.h"
00031 #include "IPv6InterfaceData.h"
00032 #include "InterfaceEntry.h"
00033 #include "IInterfaceTable.h"
00034 #include "InterfaceTableAccess.h"
00035 #include "RoutingTable6.h"
00036 #include "RoutingTable6Access.h"
00037 #include "IPv6NeighbourCache.h"
00038 #include "ICMPv6.h"
00039 #include "ICMPv6Access.h"
00040
00044 class INET_API IPv6NeighbourDiscovery : public cSimpleModule
00045 {
00046 public:
00047 typedef std::vector<cMessage*> MsgPtrVector;
00048 typedef IPv6NeighbourCache::Key Key;
00049 typedef IPv6NeighbourCache::Neighbour Neighbour;
00050
00051 public:
00052 IPv6NeighbourDiscovery();
00053 virtual ~IPv6NeighbourDiscovery();
00054
00055 public:
00072 const MACAddress& resolveNeighbour(const IPv6Address& nextHop, int interfaceId);
00073
00083 virtual void reachabilityConfirmed(const IPv6Address& neighbour, int interfaceId);
00084
00085 protected:
00086
00087
00088 cQueue pendingQueue;
00089
00090 IInterfaceTable *ift;
00091 RoutingTable6 *rt6;
00092 ICMPv6 *icmpv6;
00093 IPv6NeighbourCache neighbourCache;
00094 typedef std::set<cMessage*> RATimerList;
00095
00096
00097
00098 struct DADEntry {
00099 int interfaceId;
00100 IPv6Address address;
00101 int numNSSent;
00102 cMessage *timeoutMsg;
00103 };
00104 typedef std::set<DADEntry*> DADList;
00105
00106
00107 struct RDEntry {
00108 int interfaceId;
00109 int numRSSent;
00110 cMessage *timeoutMsg;
00111 };
00112 typedef std::set<RDEntry*> RDList;
00113
00114
00115 struct AdvIfEntry {
00116 int interfaceId;
00117 int numRASent;
00118 simtime_t nextScheduledRATime;
00119 cMessage *raTimeoutMsg;
00120 };
00121 typedef std::set<AdvIfEntry*> AdvIfList;
00122
00123
00124 RATimerList raTimerList;
00125
00126 DADList dadList;
00127
00128 RDList rdList;
00129
00130 AdvIfList advIfList;
00131
00132 protected:
00133
00134 virtual int numInitStages() const {return 4;}
00135 virtual void initialize(int stage);
00136 virtual void handleMessage(cMessage *msg);
00137 virtual void processNDMessage(ICMPv6Message *msg, IPv6ControlInfo *ctrlInfo);
00138 virtual void finish();
00139
00140 virtual void processIPv6Datagram(IPv6Datagram *datagram);
00141 virtual IPv6NeighbourDiscovery::AdvIfEntry *fetchAdvIfEntry(InterfaceEntry *ie);
00142 virtual IPv6NeighbourDiscovery::RDEntry *fetchRDEntry(InterfaceEntry *ie);
00143
00144
00154 virtual IPv6Address determineNextHop(const IPv6Address& destAddr, int& outIfID);
00155 virtual void initiateNeighbourUnreachabilityDetection(Neighbour *neighbour);
00156 virtual void processNUDTimeout(cMessage *timeoutMsg);
00157 virtual IPv6Address selectDefaultRouter(int& outIfID);
00166 virtual void timeoutPrefixEntry(const IPv6Address& destPrefix, int prefixLength);
00175 virtual void timeoutDefaultRouter(const IPv6Address& addr, int interfaceID);
00184 virtual void initiateAddressResolution(const IPv6Address& dgSrcAddr,
00185 Neighbour *nce);
00190 virtual void processARTimeout(cMessage *arTimeoutMsg);
00195 virtual void dropQueuedPacketsAwaitingAR(Neighbour *nce);
00200 virtual void sendPacketToIPv6Module(cMessage *msg, const IPv6Address& destAddr,
00201 const IPv6Address& srcAddr, int interfaceId);
00202
00207 virtual void sendQueuedPacketsToIPv6Module(Neighbour *nce);
00208
00213 virtual void initiateDAD(const IPv6Address& tentativeAddr, InterfaceEntry *ie);
00214
00220 virtual void processDADTimeout(cMessage *msg);
00221
00222
00237 virtual void assignLinkLocalAddress(cMessage *timerMsg);
00238
00239
00240
00241
00242 virtual IPv6RouterSolicitation *createAndSendRSPacket(InterfaceEntry *ie);
00243 virtual void initiateRouterDiscovery(cMessage *msg);
00253 virtual void cancelRouterDiscovery(InterfaceEntry *ie);
00254 virtual void processRDTimeout(cMessage *msg);
00255 virtual void processRSPacket(IPv6RouterSolicitation *rs, IPv6ControlInfo *rsCtrlInfo);
00256 virtual bool validateRSPacket(IPv6RouterSolicitation *rs, IPv6ControlInfo *rsCtrlInfo);
00257
00258
00259
00260 virtual IPv6RouterAdvertisement *createAndSendRAPacket(const IPv6Address& destAddr,
00261 InterfaceEntry *ie);
00262 virtual void processRAPacket(IPv6RouterAdvertisement *ra, IPv6ControlInfo *raCtrlInfo);
00263 virtual void processRAForRouterUpdates(IPv6RouterAdvertisement *ra,
00264 IPv6ControlInfo *raCtrlInfo);
00265
00266
00267
00268
00269
00270
00271 virtual void processRAPrefixInfo(IPv6RouterAdvertisement *ra, InterfaceEntry *ie);
00272 virtual void processRAPrefixInfoForAddrAutoConf(IPv6NDPrefixInformation& prefixInfo,
00273 InterfaceEntry *ie);
00278 virtual void createRATimer(InterfaceEntry *ie);
00285 virtual void resetRATimer(InterfaceEntry *ie);
00286 virtual void sendPeriodicRA(cMessage *msg);
00287 virtual void sendSolicitedRA(cMessage *msg);
00288 virtual bool validateRAPacket(IPv6RouterAdvertisement *ra, IPv6ControlInfo *raCtrlInfo);
00289
00290
00291
00292 virtual IPv6NeighbourSolicitation *createAndSendNSPacket(
00293 const IPv6Address& nsTargetAddr, const IPv6Address& dgDestAddr,
00294 const IPv6Address& dgSrcAddr, InterfaceEntry *ie);
00295 virtual void processNSPacket(IPv6NeighbourSolicitation *ns, IPv6ControlInfo *naCtrlInfo);
00296 virtual bool validateNSPacket(IPv6NeighbourSolicitation *ns, IPv6ControlInfo *nsCtrlInfo);
00297 virtual void processNSForTentativeAddress(IPv6NeighbourSolicitation *ns,
00298 IPv6ControlInfo *ctrlInfo);
00299 virtual void processNSForNonTentativeAddress(IPv6NeighbourSolicitation *ns,
00300 IPv6ControlInfo *ctrlInfo, InterfaceEntry *ie);
00301 virtual void processNSWithSpecifiedSrcAddr(IPv6NeighbourSolicitation *ns,
00302 IPv6ControlInfo *ctrlInfo, InterfaceEntry *ie);
00303
00304
00305
00306 virtual void sendSolicitedNA(IPv6NeighbourSolicitation *ns,
00307 IPv6ControlInfo *nsCtrlInfo, InterfaceEntry *ie);
00308 virtual void sendUnsolicitedNA(InterfaceEntry *ie);
00309 virtual void processNAPacket(IPv6NeighbourAdvertisement *na, IPv6ControlInfo *naCtrlInfo);
00310 virtual bool validateNAPacket(IPv6NeighbourAdvertisement *na, IPv6ControlInfo *naCtrlInfo);
00311 virtual void processNAForIncompleteNCEState(IPv6NeighbourAdvertisement *na,
00312 IPv6NeighbourCache::Neighbour *nce);
00313 virtual void processNAForOtherNCEStates(IPv6NeighbourAdvertisement *na,
00314 IPv6NeighbourCache::Neighbour *nce);
00315
00316
00317
00318 virtual IPv6Redirect *createAndSendRedirectPacket(InterfaceEntry *ie);
00319 virtual void processRedirectPacket(IPv6Redirect *redirect, IPv6ControlInfo *ctrlInfo);
00320
00321
00327
00328
00329 };
00330 #endif //IPV6NEIGHBOURDISCOVERY_H