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
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
00041
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
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
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
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;
00086 bool advOnLinkFlag;
00087 simtime_t advPreferredLifetime;
00088 bool advAutonomousFlag;
00089
00090 };
00091
00092
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
00125
00126 protected:
00127
00128 struct AddressData
00129 {
00130 IPv6Address address;
00131 bool tentative;
00132 simtime_t expiryTime;
00133 simtime_t prefExpiryTime;
00134 };
00135 typedef std::vector<AddressData> AddressDataVector;
00136
00137
00138 AddressDataVector addresses;
00139 IPv6Address preferredAddr;
00140 simtime_t preferredAddrExpiryTime;
00141
00142
00143 struct NodeVariables
00144 {
00164 int dupAddrDetectTransmits;
00165 };
00166 NodeVariables nodeVars;
00167
00168
00169
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
00208
00209
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;
00256 int advLinkMTU;
00265 int advReachableTime;
00273 int advRetransTimer;
00283 short advCurHopLimit;
00292 simtime_t advDefaultLifetime;
00293
00294
00295
00296
00297
00298 AdvPrefixList advPrefixList;
00299 };
00300 RouterVariables rtrVars;
00301
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
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;}
00383
00388 const IPv6Address& getLinkLocalAddress() const;
00389
00393 virtual void removeAddress(const IPv6Address& address);
00394
00407
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
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
00420
00421
00422 simtime_t _getMaxRtrSolicitationDelay() {return hostConstants.maxRtrSolicitationDelay;}
00423 simtime_t _getRtrSolicitationInterval() {return hostConstants.rtrSolicitationInterval;}
00424 uint _getMaxRtrSolicitations() {return hostConstants.maxRtrSolicitations;}
00425
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
00430
00431
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
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
00452
00453
00454 int dupAddrDetectTransmits() {return nodeVars.dupAddrDetectTransmits;}
00455
00456 virtual void setDupAddrDetectTransmits(int d) {nodeVars.dupAddrDetectTransmits = d;}
00457
00458
00459
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
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
00472
00473
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
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
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