IPv6InterfaceData.h

Go to the documentation of this file.
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