|
INET Framework for OMNeT++/OMNEST
|
00001 // 00002 // Copyright (C) 2005 Andras Varga 00003 // Copyright (C) 2005 Wei Yang, Ng 00004 // 00005 // This program is free software; you can redistribute it and/or 00006 // modify it under the terms of the GNU Lesser General Public 00007 // License as published by the Free Software Foundation; either 00008 // version 2.1 of the License, or (at your option) any later version. 00009 // 00010 // This program is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 // GNU Lesser General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU Lesser General Public 00016 // License along with this program; if not, see <http://www.gnu.org/licenses/>. 00017 // 00018 00019 00020 #ifndef __IPv6INTERFACEDATA_H 00021 #define __IPv6INTERFACEDATA_H 00022 00023 00024 #include <vector> 00025 #include <omnetpp.h> 00026 #include "INETDefs.h" 00027 #include "IPv6Address.h" 00028 #include "InterfaceEntry.h" 00029 00030 #define IPv6_DEFAULT_DUPADDRDETECTTRANSMITS 1 // send NS once (RFC2462:Section 5.1) 00031 00032 #define IPv6_MIN_MTU 1280// octets 00033 #define IPv6_DEFAULT_ADVCURHOPLIMIT 30 00034 00035 #define IPv6_DEFAULT_MAX_RTR_ADV_INT 600 //seconds-decrease to enable more periodic RAs 00036 #define IPv6_DEFAULT_ADV_REACHABLE_TIME 3600// seconds 00037 #define IPv6_DEFAULT_ADV_RETRANS_TIMER 1 // seconds 00038 #define IPv6__INET_DEFAULT_ROUTER_HOPLIMIT 64 00039 00040 /**************RFC 2461: Section 10 Protocol Constants*************************/ 00041 //Router Constants 00042 #define IPv6_MAX_INITIAL_RTR_ADVERT_INTERVAL 16 // seconds 00043 #define IPv6_MAX_INITIAL_RTR_ADVERTISEMENTS 3 // transmissions 00044 #define IPv6_MAX_FINAL_RTR_ADVERTISEMENTS 3 // transmissions 00045 #define IPv6_MIN_DELAY_BETWEEN_RAS 3 // seconds 00046 #define IPv6_MAX_RA_DELAY_TIME .5 // seconds 00047 00048 //Host Constants 00049 #define IPv6_MAX_RTR_SOLICITATION_DELAY 1 // seconds 00050 #define IPv6_RTR_SOLICITATION_INTERVAL 4 // seconds 00051 #define IPv6_MAX_RTR_SOLICITATIONS 3 // transmissions 00052 00053 //Node Constants 00054 #define IPv6_MAX_MULTICAST_SOLICIT 3 // transmissions 00055 #define IPv6_MAX_UNICAST_SOLICIT 3 // transmissions 00056 #define IPv6_MAX_ANYCAST_DELAY_TIME 1 // seconds 00057 #define IPv6_MAX_NEIGHBOUR_ADVERTISEMENT 3 // transmissions 00058 #define IPv6_REACHABLE_TIME 30 // seconds 00059 #define IPv6_RETRANS_TIMER 1 // seconds 00060 #define IPv6_DELAY_FIRST_PROBE_TIME 5 // seconds 00061 #define IPv6_MIN_RANDOM_FACTOR 0.5 00062 #define IPv6_MAX_RANDOM_FACTOR 1.5 00063 /***************END of RFC 2461 Protocol Constants*****************************/ 00064 00070 class INET_API IPv6InterfaceData : public InterfaceProtocolData 00071 { 00072 public: 00081 struct AdvPrefix 00082 { 00083 IPv6Address prefix; 00084 short prefixLength; 00085 simtime_t advValidLifetime; // see comment above 00086 bool advOnLinkFlag; 00087 simtime_t advPreferredLifetime; // see comment above 00088 bool advAutonomousFlag; 00089 // USE_MOBILITY: bool advRtrAddr; 00090 }; 00091 00092 /*************RFC 2461: Section 10 Protocol Constants**********************/ 00093 struct RouterConstants 00094 { 00095 simtime_t maxInitialRtrAdvertInterval; 00096 uint maxInitialRtrAdvertisements; 00097 uint maxFinalRtrAdvertisements; 00098 simtime_t minDelayBetweenRAs; 00099 simtime_t maxRADelayTime; 00100 }; 00101 RouterConstants routerConstants; 00102 00103 struct HostConstants 00104 { 00105 simtime_t maxRtrSolicitationDelay; 00106 simtime_t rtrSolicitationInterval; 00107 int maxRtrSolicitations; 00108 }; 00109 HostConstants hostConstants; 00110 00111 struct NodeConstants 00112 { 00113 uint maxMulticastSolicit; 00114 uint maxUnicastSolicit; 00115 simtime_t maxAnycastDelayTime; 00116 uint maxNeighbourAdvertisement; 00117 simtime_t reachableTime; 00118 simtime_t retransTimer; 00119 simtime_t delayFirstProbeTime; 00120 double minRandomFactor; 00121 double maxRandomFactor; 00122 }; 00123 NodeConstants nodeConstants; 00124 /***************END of RFC 2461 Protocol Constants*************************/ 00125 00126 protected: 00127 // addresses 00128 struct AddressData 00129 { 00130 IPv6Address address; // address itself 00131 bool tentative; // true if currently undergoing Duplicate Address Detection 00132 simtime_t expiryTime; // end of valid lifetime; 0 means infinity 00133 simtime_t prefExpiryTime; // end of preferred lifetime; 0 means infinity 00134 }; 00135 typedef std::vector<AddressData> AddressDataVector; 00136 // TBD should be std::map, so that isLocalAddress() is faster? 00137 00138 AddressDataVector addresses; // interface addresses 00139 IPv6Address preferredAddr; // cached result of preferred address selection 00140 simtime_t preferredAddrExpiryTime; 00141 00142 /***************RFC 2462: Section 5.1 Node Configuration Variables*********/ 00143 struct NodeVariables 00144 { 00164 int dupAddrDetectTransmits; 00165 }; 00166 NodeVariables nodeVars; 00167 /***************END of RFC 2461 Node Configuration Variables***************/ 00168 00169 /***************RFC 2461: Section 6.3.2 Host Variables*********************/ 00170 struct HostVariables 00171 { 00177 uint linkMTU; 00183 short curHopLimit; 00188 uint baseReachableTime; 00197 simtime_t reachableTime; 00204 uint retransTimer; 00205 }; 00206 HostVariables hostVars; 00207 /***************END of RFC 2461 Host Variables*****************************/ 00208 00209 /***************RFC 2461: Section 6.2.1 Router Configuration Variables*****/ 00210 typedef std::vector<AdvPrefix> AdvPrefixList; 00211 struct RouterVariables 00212 { 00219 bool advSendAdvertisements; 00227 simtime_t maxRtrAdvInterval; 00235 simtime_t minRtrAdvInterval; 00242 bool advManagedFlag; 00249 bool advOtherConfigFlag;// also false as not disseminating other config info from routers 00256 int advLinkMTU; 00265 int advReachableTime; // host BaseReachableTime? 00273 int advRetransTimer; // host RetransTimer? 00283 short advCurHopLimit; // host CurHopLimit 00292 simtime_t advDefaultLifetime; // integer seconds in ND rfc but for MIPv6 really need better granularity 00293 //bool fastRA; 00294 //uint maxFastRAS; 00295 //mutable uint fastRACounter; 00296 00297 // These are either learned from routers or configured manually(router) 00298 AdvPrefixList advPrefixList; 00299 }; 00300 RouterVariables rtrVars; 00301 /***************END of RFC 2461 Host Variables*****************************/ 00302 00303 protected: 00304 int findAddress(const IPv6Address& addr) const; 00305 void choosePreferredAddress(); 00306 void changed1() {changed(NF_INTERFACE_IPv6CONFIG_CHANGED);} 00307 00308 static bool addrLess(const AddressData& a, const AddressData& b); 00309 00310 public: 00311 IPv6InterfaceData(); 00312 virtual ~IPv6InterfaceData() {} 00313 std::string info() const; 00314 std::string detailedInfo() const; 00315 00321 virtual void assignAddress(const IPv6Address& addr, bool tentative, 00322 simtime_t expiryTime, simtime_t prefExpiryTime); 00323 00329 virtual void updateMatchingAddressExpiryTimes(const IPv6Address& prefix, int length, 00330 simtime_t expiryTime=0, simtime_t prefExpiryTime=0); 00331 00335 int getNumAddresses() const {return addresses.size();} 00336 00340 const IPv6Address& getAddress(int i) const; 00341 00345 bool isTentativeAddress(int i) const; 00346 00347 // FIXME address validity check missing. introduce hasValidAddress(addr, now) which would compare lifetimes too? 00348 00353 bool hasAddress(const IPv6Address& addr) const; 00354 00359 bool matchesSolicitedNodeMulticastAddress(const IPv6Address& solNodeAddr) const; 00360 00364 bool isTentativeAddress(const IPv6Address& addr) const; 00365 00369 virtual void permanentlyAssign(const IPv6Address& addr); 00370 00382 const IPv6Address& getPreferredAddress() const {return preferredAddr;} // FIXME TBD check expiry time! 00383 00388 const IPv6Address& getLinkLocalAddress() const; 00389 00393 virtual void removeAddress(const IPv6Address& address); 00394 00407 /************Getters for Router Protocol Constants*************************/ 00408 simtime_t _getMaxInitialRtrAdvertInterval() {return routerConstants.maxInitialRtrAdvertInterval;} 00409 uint _getMaxInitialRtrAdvertisements() {return routerConstants.maxInitialRtrAdvertisements;} 00410 uint _getMaxFinalRtrAdvertisements() {return routerConstants.maxFinalRtrAdvertisements;} 00411 simtime_t _getMinDelayBetweenRAs() {return routerConstants.minDelayBetweenRAs;} 00412 simtime_t _getMaxRADelayTime() {return routerConstants.maxRADelayTime;} 00413 /************Setters for Router Protocol Constants*************************/ 00414 virtual void _setMaxInitialRtrAdvertInterval(simtime_t d) {routerConstants.maxInitialRtrAdvertInterval = d;} 00415 virtual void _setMaxInitialRtrAdvertisements(uint d) {routerConstants.maxInitialRtrAdvertisements = d;} 00416 virtual void _setMaxFinalRtrAdvertisements(uint d) {routerConstants.maxFinalRtrAdvertisements = d;} 00417 virtual void _setMinDelayBetweenRAs(simtime_t d) {routerConstants.minDelayBetweenRAs = d;} 00418 virtual void _setMaxRADelayTime(simtime_t d) {routerConstants.maxRADelayTime = d;} 00419 /************End of Router Protocol Constant getters and setters***********/ 00420 00421 /************Getters for Host Protocol Constants***************************/ 00422 simtime_t _getMaxRtrSolicitationDelay() {return hostConstants.maxRtrSolicitationDelay;} 00423 simtime_t _getRtrSolicitationInterval() {return hostConstants.rtrSolicitationInterval;} 00424 uint _getMaxRtrSolicitations() {return hostConstants.maxRtrSolicitations;} 00425 /************Setters for Host Protocol Constants***************************/ 00426 virtual void _setMaxRtrSolicitationDelay(simtime_t d) {hostConstants.maxRtrSolicitationDelay = d;} 00427 virtual void _setRtrSolicitationInterval(simtime_t d) {hostConstants.rtrSolicitationInterval = d;} 00428 virtual void _setMaxRtrSolicitations(uint d) {hostConstants.maxRtrSolicitations = d;} 00429 /************End of Host Protocol Constant getters and setters*************/ 00430 00431 /************Getters for Node Protocol Constants***************************/ 00432 uint _getMaxMulticastSolicit() {return nodeConstants.maxMulticastSolicit;} 00433 uint _getMaxUnicastSolicit() {return nodeConstants.maxUnicastSolicit;} 00434 simtime_t _getMaxAnycastDelayTime() {return nodeConstants.maxAnycastDelayTime;} 00435 uint _getMaxNeighbourAdvertisement() {return nodeConstants.maxNeighbourAdvertisement;} 00436 simtime_t _getReachableTime() {return nodeConstants.reachableTime;} 00437 simtime_t _getRetransTimer() {return nodeConstants.retransTimer;} 00438 simtime_t _getDelayFirstProbeTime() {return nodeConstants.delayFirstProbeTime;} 00439 double _getMinRandomFactor() {return nodeConstants.minRandomFactor;} 00440 double _getMaxRandomFactor() {return nodeConstants.maxRandomFactor;} 00441 /************Setters for Node Protocol Constants***************************/ 00442 virtual void _setMaxMulticastSolicit(uint d) {nodeConstants.maxMulticastSolicit = d;} 00443 virtual void _setMaxUnicastSolicit(uint d) {nodeConstants.maxUnicastSolicit = d;} 00444 virtual void _setMaxAnycastDelayTime(simtime_t d) {nodeConstants.maxAnycastDelayTime = d;} 00445 virtual void _setMaxNeighbourAdvertisement(uint d) {nodeConstants.maxNeighbourAdvertisement = d;} 00446 virtual void _setReachableTime(simtime_t d) {nodeConstants.reachableTime = d;} 00447 virtual void _setRetransTimer(simtime_t d) {nodeConstants.retransTimer = d;} 00448 virtual void _setDelayFirstProbeTime(simtime_t d) {nodeConstants.delayFirstProbeTime = d;} 00449 virtual void _setMinRandomFactor(double d) {nodeConstants.minRandomFactor = d;} 00450 virtual void _setMaxRandomFactor(double d) {nodeConstants.maxRandomFactor = d;} 00451 /************End of Node Protocol Constant getters and setters*************/ 00452 00453 /************Getters for Node Variables************************************/ 00454 int dupAddrDetectTransmits() {return nodeVars.dupAddrDetectTransmits;} 00455 /************Setters for Node Variables************************************/ 00456 virtual void setDupAddrDetectTransmits(int d) {nodeVars.dupAddrDetectTransmits = d;} 00457 /************End of Node Variables getters and setters*********************/ 00458 00459 /************Getters for Host Variables************************************/ 00460 uint getLinkMTU() {return hostVars.linkMTU;} 00461 short getCurHopLimit() {return hostVars.curHopLimit;} 00462 uint getBaseReachableTime() {return hostVars.baseReachableTime;} 00463 simtime_t getReachableTime() {return hostVars.reachableTime;} 00464 uint getRetransTimer() {return hostVars.retransTimer;} 00465 /************Setters for Host Variables************************************/ 00466 virtual void setLinkMTU(uint d) {hostVars.linkMTU = d;} 00467 virtual void setCurHopLimit(short d) {hostVars.curHopLimit = d;} 00468 virtual void setBaseReachableTime(uint d) {hostVars.baseReachableTime = d;} 00469 virtual void setReachableTime(simtime_t d) {hostVars.reachableTime = d;} 00470 virtual void setRetransTimer(uint d) {hostVars.retransTimer = d;} 00471 /************End of Host Variables getters and setters*********************/ 00472 00473 /************Getters for Router Configuration Variables********************/ 00474 bool getAdvSendAdvertisements() {return rtrVars.advSendAdvertisements;} 00475 simtime_t getMaxRtrAdvInterval() {return rtrVars.maxRtrAdvInterval;} 00476 simtime_t getMinRtrAdvInterval() {return rtrVars.minRtrAdvInterval;} 00477 bool getAdvManagedFlag() {return rtrVars.advManagedFlag;} 00478 bool getAdvOtherConfigFlag() {return rtrVars.advOtherConfigFlag;} 00479 int getAdvLinkMTU() {return rtrVars.advLinkMTU;} 00480 int getAdvReachableTime() {return rtrVars.advReachableTime;} 00481 int getAdvRetransTimer() {return rtrVars.advRetransTimer;} 00482 short getAdvCurHopLimit() {return rtrVars.advCurHopLimit;} 00483 simtime_t getAdvDefaultLifetime() {return rtrVars.advDefaultLifetime;} 00484 /************Setters for Router Configuration Variables********************/ 00485 virtual void setAdvSendAdvertisements(bool d) {rtrVars.advSendAdvertisements = d;} 00486 virtual void setMaxRtrAdvInterval(simtime_t d) {rtrVars.maxRtrAdvInterval = d;} 00487 virtual void setMinRtrAdvInterval(simtime_t d) {rtrVars.minRtrAdvInterval = d;} 00488 virtual void setAdvManagedFlag(bool d) {rtrVars.advManagedFlag = d;} 00489 virtual void setAdvOtherConfigFlag(bool d) {rtrVars.advOtherConfigFlag = d;} 00490 virtual void setAdvLinkMTU(int d) {rtrVars.advLinkMTU = d;} 00491 virtual void setAdvReachableTime(int d) {rtrVars.advReachableTime = d;} 00492 virtual void setAdvRetransTimer(int d) {rtrVars.advRetransTimer = d;} 00493 virtual void setAdvCurHopLimit(short d) {rtrVars.advCurHopLimit = d;} 00494 virtual void setAdvDefaultLifetime(simtime_t d) {rtrVars.advDefaultLifetime = d;} 00495 /************End of Router Configuration Variables getters and setters*****/ 00496 00502 virtual void addAdvPrefix(const AdvPrefix& advPrefix); 00503 00507 int getNumAdvPrefixes() const {return rtrVars.advPrefixList.size();} 00508 00512 const AdvPrefix& getAdvPrefix(int i) const; 00513 00518 virtual void setAdvPrefix(int i, const AdvPrefix& advPrefix); 00519 00524 virtual void removeAdvPrefix(int i); 00525 00530 virtual simtime_t generateReachableTime(double MIN_RANDOM_FACTOR, double MAX_RANDOM_FACTOR, 00531 uint baseReachableTime); 00532 00536 virtual simtime_t generateReachableTime(); 00537 }; 00538 00539 #endif 00540