Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __INET_OSPFNEIGHBOR_H
00019 #define __INET_OSPFNEIGHBOR_H
00020
00021 #include "OSPFPacket_m.h"
00022 #include "OSPFTimer_m.h"
00023 #include "OSPFcommon.h"
00024 #include "LSA.h"
00025 #include <list>
00026
00027 namespace OSPF {
00028
00029 class NeighborState;
00030 class Interface;
00031
00032 class Neighbor {
00033
00034 friend class NeighborState;
00035
00036 public:
00037 enum NeighborEventType {
00038 HelloReceived = 0,
00039 Start = 1,
00040 TwoWayReceived = 2,
00041 NegotiationDone = 3,
00042 ExchangeDone = 4,
00043 BadLinkStateRequest = 5,
00044 LoadingDone = 6,
00045 IsAdjacencyOK = 7,
00046 SequenceNumberMismatch = 8,
00047 OneWayReceived = 9,
00048 KillNeighbor = 10,
00049 InactivityTimer = 11,
00050 PollTimer = 12,
00051 LinkDown = 13,
00052 DDRetransmissionTimer = 14,
00053 UpdateRetransmissionTimer = 15,
00054 RequestRetransmissionTimer = 16
00055 };
00056
00057 enum NeighborStateType {
00058 DownState = 0,
00059 AttemptState = 1,
00060 InitState = 2,
00061 TwoWayState = 4,
00062 ExchangeStartState = 8,
00063 ExchangeState = 16,
00064 LoadingState = 32,
00065 FullState = 64
00066 };
00067
00068 enum DatabaseExchangeRelationshipType {
00069 Master = 0,
00070 Slave = 1
00071 };
00072
00073 struct DDPacketID {
00074 OSPFDDOptions ddOptions;
00075 OSPFOptions options;
00076 unsigned long sequenceNumber;
00077 };
00078
00079 private:
00080 struct TransmittedLSA {
00081 LSAKeyType lsaKey;
00082 unsigned short age;
00083 };
00084
00085 private:
00086 NeighborState* state;
00087 NeighborState* previousState;
00088 OSPFTimer* inactivityTimer;
00089 OSPFTimer* pollTimer;
00090 OSPFTimer* ddRetransmissionTimer;
00091 OSPFTimer* updateRetransmissionTimer;
00092 bool updateRetransmissionTimerActive;
00093 OSPFTimer* requestRetransmissionTimer;
00094 bool requestRetransmissionTimerActive;
00095 DatabaseExchangeRelationshipType databaseExchangeRelationship;
00096 bool firstAdjacencyInited;
00097 unsigned long ddSequenceNumber;
00098 DDPacketID lastReceivedDDPacket;
00099 RouterID neighborID;
00100 unsigned char neighborPriority;
00101 IPv4Address neighborIPAddress;
00102 OSPFOptions neighborOptions;
00103 DesignatedRouterID neighborsDesignatedRouter;
00104 DesignatedRouterID neighborsBackupDesignatedRouter;
00105 bool designatedRoutersSetUp;
00106 short neighborsRouterDeadInterval;
00107 std::list<OSPFLSA*> linkStateRetransmissionList;
00108 std::list<OSPFLSAHeader*> databaseSummaryList;
00109 std::list<OSPFLSAHeader*> linkStateRequestList;
00110 std::list<TransmittedLSA> transmittedLSAs;
00111 OSPFDatabaseDescriptionPacket* lastTransmittedDDPacket;
00112
00113 Interface* parentInterface;
00114
00115
00116 static unsigned long ddSequenceNumberInitSeed;
00117
00118 private:
00119 void ChangeState(NeighborState* newState, NeighborState* currentState);
00120
00121 public:
00122 Neighbor(RouterID neighbor = NullRouterID);
00123 virtual ~Neighbor(void);
00124
00125 void ProcessEvent (NeighborEventType event);
00126 void Reset (void);
00127 void InitFirstAdjacency (void);
00128 NeighborStateType GetState (void) const;
00129 static const char* GetStateString (NeighborStateType stateType);
00130 void SendDatabaseDescriptionPacket (bool init = false);
00131 bool RetransmitDatabaseDescriptionPacket(void);
00132 void CreateDatabaseSummary (void);
00133 void SendLinkStateRequestPacket (void);
00134 void RetransmitUpdatePacket (void);
00135 bool NeedAdjacency (void);
00136 void AddToRetransmissionList (OSPFLSA* lsa);
00137 void RemoveFromRetransmissionList (LSAKeyType lsaKey);
00138 bool IsLSAOnRetransmissionList (LSAKeyType lsaKey) const;
00139 OSPFLSA* FindOnRetransmissionList (LSAKeyType lsaKey);
00140 void StartUpdateRetransmissionTimer (void);
00141 void ClearUpdateRetransmissionTimer (void);
00142 void AddToRequestList (OSPFLSAHeader* lsaHeader);
00143 void RemoveFromRequestList (LSAKeyType lsaKey);
00144 bool IsLSAOnRequestList (LSAKeyType lsaKey) const;
00145 OSPFLSAHeader* FindOnRequestList (LSAKeyType lsaKey);
00146 void StartRequestRetransmissionTimer (void);
00147 void ClearRequestRetransmissionTimer (void);
00148 void AddToTransmittedLSAList (LSAKeyType lsaKey);
00149 bool IsOnTransmittedLSAList (LSAKeyType lsaKey) const;
00150 void AgeTransmittedLSAList (void);
00151 unsigned long GetUniqueULong (void);
00152 void DeleteLastSentDDPacket (void);
00153
00154 void SetNeighborID (RouterID id) { neighborID = id; }
00155 RouterID GetNeighborID (void) const { return neighborID; }
00156 void SetPriority (unsigned char priority) { neighborPriority = priority; }
00157 unsigned char GetPriority (void) const { return neighborPriority; }
00158 void SetAddress (IPv4Address address) { neighborIPAddress = address; }
00159 IPv4Address GetAddress (void) const { return neighborIPAddress; }
00160 void SetDesignatedRouter (DesignatedRouterID routerID) { neighborsDesignatedRouter = routerID; }
00161 DesignatedRouterID GetDesignatedRouter (void) const { return neighborsDesignatedRouter; }
00162 void SetBackupDesignatedRouter (DesignatedRouterID routerID) { neighborsBackupDesignatedRouter = routerID; }
00163 DesignatedRouterID GetBackupDesignatedRouter (void) const { return neighborsBackupDesignatedRouter; }
00164 void SetRouterDeadInterval (short interval) { neighborsRouterDeadInterval = interval; }
00165 short GetRouterDeadInterval (void) const { return neighborsRouterDeadInterval; }
00166 void SetDDSequenceNumber (unsigned long sequenceNumber) { ddSequenceNumber = sequenceNumber; }
00167 unsigned long GetDDSequenceNumber (void) const { return ddSequenceNumber; }
00168 void SetOptions (OSPFOptions options) { neighborOptions = options; }
00169 OSPFOptions GetOptions (void) const { return neighborOptions; }
00170 void SetLastReceivedDDPacket (DDPacketID packetID) { lastReceivedDDPacket = packetID; }
00171 DDPacketID GetLastReceivedDDPacket (void) const { return lastReceivedDDPacket; }
00172
00173 void SetDatabaseExchangeRelationship(DatabaseExchangeRelationshipType relation) { databaseExchangeRelationship = relation; }
00174 DatabaseExchangeRelationshipType GetDatabaseExchangeRelationship(void) const { return databaseExchangeRelationship; }
00175
00176 void SetInterface (Interface* intf) { parentInterface = intf; }
00177 Interface* GetInterface (void) { return parentInterface; }
00178 const Interface* GetInterface (void) const { return parentInterface; }
00179
00180 OSPFTimer* GetInactivityTimer (void) { return inactivityTimer; }
00181 OSPFTimer* GetPollTimer (void) { return pollTimer; }
00182 OSPFTimer* GetDDRetransmissionTimer (void) { return ddRetransmissionTimer; }
00183 OSPFTimer* GetUpdateRetransmissionTimer (void) { return updateRetransmissionTimer; }
00184 bool IsUpdateRetransmissionTimerActive (void) const { return updateRetransmissionTimerActive; }
00185 bool IsRequestRetransmissionTimerActive (void) const { return requestRetransmissionTimerActive; }
00186 bool IsFirstAdjacencyInited (void) const { return firstAdjacencyInited; }
00187 bool DesignatedRoutersAreSetUp (void) const { return designatedRoutersSetUp; }
00188 void SetUpDesignatedRouters (bool setUp) { designatedRoutersSetUp = setUp; }
00189 unsigned long GetDatabaseSummaryListCount (void) const { return databaseSummaryList.size(); }
00190
00191 void IncrementDDSequenceNumber (void) { ddSequenceNumber++; }
00192 bool IsLinkStateRequestListEmpty (void) const { return linkStateRequestList.empty(); }
00193 bool IsLinkStateRetransmissionListEmpty(void) const { return linkStateRetransmissionList.empty(); }
00194 void PopFirstLinkStateRequest (void) { linkStateRequestList.pop_front(); }
00195 };
00196
00197 }
00198
00199 inline bool operator== (OSPF::Neighbor::DDPacketID leftID, OSPF::Neighbor::DDPacketID rightID)
00200 {
00201 return ((leftID.ddOptions.I_Init == rightID.ddOptions.I_Init) &&
00202 (leftID.ddOptions.M_More == rightID.ddOptions.M_More) &&
00203 (leftID.ddOptions.MS_MasterSlave == rightID.ddOptions.MS_MasterSlave) &&
00204 (leftID.options == rightID.options) &&
00205 (leftID.sequenceNumber == rightID.sequenceNumber));
00206 }
00207
00208 inline bool operator!= (OSPF::Neighbor::DDPacketID leftID, OSPF::Neighbor::DDPacketID rightID)
00209 {
00210 return (!(leftID == rightID));
00211 }
00212
00213 #endif // __INET_OSPFNEIGHBOR_H
00214