INET Framework for OMNeT++/OMNEST
AnsaOSPFcommon.h
Go to the documentation of this file.
00001 #ifndef __INET_OSPFCOMMON_H
00002 #define __INET_OSPFCOMMON_H
00003 
00004 #include <ctype.h>
00005 #include <stdio.h>
00006 #include <functional>
00007 
00008 // global constants
00009 #define LS_REFRESH_TIME                     1800
00010 #define MIN_LS_INTERVAL                     5
00011 #define MIN_LS_ARRIVAL                      1
00012 #define MAX_AGE                             3600
00013 #define CHECK_AGE                           300
00014 #define MAX_AGE_DIFF                        900
00015 #define LS_INFINITY                         16777215
00016 #define DEFAULT_DESTINATION_ADDRESS         0
00017 #define DEFAULT_DESTINATION_MASK            0
00018 #define INITIAL_SEQUENCE_NUMBER             -2147483647
00019 #define MAX_SEQUENCE_NUMBER                 2147483647
00020 
00021 #define VIRTUAL_LINK_TTL                    32
00022 #define IPV4_HEADER_LENGTH                  60
00023 #define IPV4_DATAGRAM_LENGTH                65536
00024 #define OSPF_HEADER_LENGTH                  24
00025 #define OSPF_LSA_HEADER_LENGTH              20
00026 #define OSPF_DD_HEADER_LENGTH               8
00027 #define OSPF_REQUEST_LENGTH                 12
00028 #define OSPF_ROUTERLSA_HEADER_LENGTH        4
00029 #define OSPF_LINK_HEADER_LENGTH             12
00030 #define OSPF_TOS_LENGTH                     4
00031 #define OSPF_NETWORKLSA_MASK_LENGTH         4
00032 #define OSPF_NETWORKLSA_ADDRESS_LENGTH      4
00033 #define OSPF_SUMMARYLSA_HEADER_LENGTH       8
00034 #define OSPF_ASEXTERNALLSA_HEADER_LENGTH    16
00035 #define OSPF_ASEXTERNALLSA_TOS_INFO_LENGTH  12
00036 
00037 namespace AnsaOSPF {
00038 
00039 typedef unsigned long Metric;
00040 
00041 enum AuthenticationType {
00042     NullType           = 0,
00043     SimplePasswordType = 1,
00044     CrytographicType   = 2
00045 };
00046 
00047 struct AuthenticationKeyType {
00048     char    bytes[8];
00049 };
00050 
00051 //FIXME remove this type, use IPAddress instead
00052 struct IPv4Address {
00053     unsigned char   bytes[4];
00054 
00055 
00056     unsigned int asInt() { return (bytes[0]<<24) | bytes[1]<<16 | bytes[2]<<8 | bytes[3]; }
00057 };
00058 
00059 class IPv4Address_Less : public std::binary_function <IPv4Address, IPv4Address, bool>
00060 {
00061 public:
00062     bool operator() (IPv4Address leftAddress, IPv4Address rightAddress) const;
00063 };
00064 
00065 struct IPv4AddressRange {
00066     IPv4Address address;
00067     IPv4Address mask;
00068 };
00069 
00070 class IPv4AddressRange_Less : public std::binary_function <IPv4AddressRange, IPv4AddressRange, bool>
00071 {
00072 public:
00073     bool operator() (IPv4AddressRange leftAddressRange, IPv4AddressRange rightAddressRange) const;
00074 };
00075 
00076 struct HostRouteParameters {
00077     unsigned char ifIndex;
00078     IPv4Address   address;
00079     Metric        linkCost;
00080 };
00081 
00082 typedef unsigned long RouterID;
00083 typedef unsigned long AreaID;
00084 typedef unsigned long LinkStateID;
00085 
00086 struct LSAKeyType {
00087     LinkStateID linkStateID;
00088     RouterID    advertisingRouter;
00089 };
00090 
00091 class LSAKeyType_Less : public std::binary_function <LSAKeyType, LSAKeyType, bool>
00092 {
00093 public:
00094     bool operator() (LSAKeyType leftKey, LSAKeyType rightKey) const;
00095 };
00096 
00097 struct DesignatedRouterID {
00098     RouterID    routerID;
00099     IPv4Address ipInterfaceAddress;
00100 };
00101 
00102 const RouterID              NullRouterID = 0;
00103 const AreaID                BackboneAreaID = 0;
00104 const LinkStateID           NullLinkStateID = 0;
00105 const IPv4Address           NullIPv4Address = { {0, 0, 0, 0} };
00106 const IPv4Address           AllSPFRouters = { {224, 0, 0, 5} };
00107 const IPv4Address           AllDRouters = { {224, 0, 0, 6} };
00108 const IPv4AddressRange      NullIPv4AddressRange = { { {0, 0, 0, 0} }, { {0, 0, 0, 0} } };
00109 const DesignatedRouterID    NullDesignatedRouterID = { 0, { {0, 0, 0, 0} } };
00110 
00111 } // namespace AnsaOSPF
00112 
00113 inline bool operator== (AnsaOSPF::IPv4Address leftAddress, AnsaOSPF::IPv4Address rightAddress)
00114 {
00115     return (leftAddress.bytes[0] == rightAddress.bytes[0] &&
00116             leftAddress.bytes[1] == rightAddress.bytes[1] &&
00117             leftAddress.bytes[2] == rightAddress.bytes[2] &&
00118             leftAddress.bytes[3] == rightAddress.bytes[3]);
00119 }
00120 
00121 inline bool operator!= (AnsaOSPF::IPv4Address leftAddress, AnsaOSPF::IPv4Address rightAddress)
00122 {
00123     return (!(leftAddress == rightAddress));
00124 }
00125 
00126 inline bool operator< (AnsaOSPF::IPv4Address leftAddress, AnsaOSPF::IPv4Address rightAddress)
00127 {
00128         return leftAddress.asInt() < rightAddress.asInt();
00129 }
00130 
00131 inline bool operator<= (AnsaOSPF::IPv4Address leftAddress, AnsaOSPF::IPv4Address rightAddress)
00132 {
00133     return ((leftAddress < rightAddress) || (leftAddress == rightAddress));
00134 }
00135 
00136 inline bool operator> (AnsaOSPF::IPv4Address leftAddress, AnsaOSPF::IPv4Address rightAddress)
00137 {
00138     return (!(leftAddress <= rightAddress));
00139 }
00140 
00141 inline bool operator>= (AnsaOSPF::IPv4Address leftAddress, AnsaOSPF::IPv4Address rightAddress)
00142 {
00143     return (!(leftAddress < rightAddress));
00144 }
00145 
00146 inline AnsaOSPF::IPv4Address operator& (AnsaOSPF::IPv4Address address, AnsaOSPF::IPv4Address mask)
00147 {
00148     AnsaOSPF::IPv4Address maskedAddress;
00149     maskedAddress.bytes[0] = address.bytes[0] & mask.bytes[0];
00150     maskedAddress.bytes[1] = address.bytes[1] & mask.bytes[1];
00151     maskedAddress.bytes[2] = address.bytes[2] & mask.bytes[2];
00152     maskedAddress.bytes[3] = address.bytes[3] & mask.bytes[3];
00153     return maskedAddress;
00154 }
00155 
00156 inline AnsaOSPF::IPv4Address operator| (AnsaOSPF::IPv4Address address, AnsaOSPF::IPv4Address match)
00157 {
00158     AnsaOSPF::IPv4Address matchAddress;
00159     matchAddress.bytes[0] = address.bytes[0] | match.bytes[0];
00160     matchAddress.bytes[1] = address.bytes[1] | match.bytes[1];
00161     matchAddress.bytes[2] = address.bytes[2] | match.bytes[2];
00162     matchAddress.bytes[3] = address.bytes[3] | match.bytes[3];
00163     return matchAddress;
00164 }
00165 
00166 inline AnsaOSPF::IPv4Address operator~ (AnsaOSPF::IPv4Address wildcard)
00167 {
00168     AnsaOSPF::IPv4Address mask;
00169     mask.bytes[0] = (~wildcard.bytes[0]);
00170     mask.bytes[1] = (~wildcard.bytes[1]);
00171     mask.bytes[2] = (~wildcard.bytes[2]);
00172     mask.bytes[3] = (~wildcard.bytes[3]);
00173     return mask;
00174 }
00175 
00176 inline bool operator== (AnsaOSPF::IPv4AddressRange leftAddressRange, AnsaOSPF::IPv4AddressRange rightAddressRange)
00177 {
00178     return (leftAddressRange.address == rightAddressRange.address &&
00179             leftAddressRange.mask    == rightAddressRange.mask);
00180 }
00181 
00182 inline bool operator!= (AnsaOSPF::IPv4AddressRange leftAddressRange, AnsaOSPF::IPv4AddressRange rightAddressRange)
00183 {
00184     return (!(leftAddressRange == rightAddressRange));
00185 }
00186 
00187 inline bool operator== (AnsaOSPF::DesignatedRouterID leftID, AnsaOSPF::DesignatedRouterID rightID)
00188 {
00189     return (leftID.routerID == rightID.routerID &&
00190                 leftID.ipInterfaceAddress == rightID.ipInterfaceAddress);
00191 }
00192 
00193 inline bool operator!= (AnsaOSPF::DesignatedRouterID leftID, AnsaOSPF::DesignatedRouterID rightID)
00194 {
00195     return (!(leftID == rightID));
00196 }
00197 
00198 inline bool AnsaOSPF::IPv4Address_Less::operator() (AnsaOSPF::IPv4Address leftAddress, AnsaOSPF::IPv4Address rightAddress) const
00199 {
00200     return (leftAddress < rightAddress);
00201 }
00202 
00203 inline bool AnsaOSPF::IPv4AddressRange_Less::operator() (AnsaOSPF::IPv4AddressRange leftAddressRange, AnsaOSPF::IPv4AddressRange rightAddressRange) const
00204 {
00205     return ((leftAddressRange.address < rightAddressRange.address) ||
00206             ((leftAddressRange.address == rightAddressRange.address) &&
00207              (leftAddressRange.mask < rightAddressRange.mask)));
00208 }
00209 
00210 inline bool AnsaOSPF::LSAKeyType_Less::operator() (AnsaOSPF::LSAKeyType leftKey, AnsaOSPF::LSAKeyType rightKey) const
00211 {
00212     return ((leftKey.linkStateID < rightKey.linkStateID) ||
00213             ((leftKey.linkStateID == rightKey.linkStateID) &&
00214              (leftKey.advertisingRouter < rightKey.advertisingRouter)));
00215 }
00216 
00217 inline AnsaOSPF::IPv4Address IPv4AddressFromAddressString(const char* charForm)
00218 {
00219     AnsaOSPF::IPv4Address byteForm = AnsaOSPF::NullIPv4Address;
00220 
00221     int  lastDot = -1;
00222     int  byteCount = 0;
00223     for (int i = 0; i < 16; i++) {
00224         if (charForm[i] == '\0') {
00225             if ((byteCount <= 3) && (i - lastDot - 1 <= 3)) {
00226                 switch (i - lastDot - 1) {
00227                     case 3: byteForm.bytes[byteCount] += (((charForm[i - 3] - '0') < 3) ? (charForm[i - 3] - '0') : 0) * 100;
00228                     case 2: byteForm.bytes[byteCount] += (charForm[i - 2] - '0') * 10;
00229                     case 1: byteForm.bytes[byteCount] += charForm[i - 1] - '0';
00230                     default: break;
00231                 }
00232             }
00233             break;
00234         }
00235         if ((!isdigit(charForm[i])) && (charForm[i] != '.')) {
00236             break;
00237         }
00238         if (charForm[i] == '.') {
00239             if (i == 0) {
00240                 break;
00241             }
00242             if (i - lastDot - 1 > 3) {
00243                 break;
00244             }
00245             switch (i - lastDot - 1) {
00246                 case 3: byteForm.bytes[byteCount] += (((charForm[i - 3] - '0') < 3) ? (charForm[i - 3] - '0') : 0) * 100;
00247                 case 2: byteForm.bytes[byteCount] += (charForm[i - 2] - '0') * 10;
00248                 case 1: byteForm.bytes[byteCount] += charForm[i - 1] - '0';
00249                 default: break;
00250             }
00251             byteCount++;
00252             lastDot = i;
00253             if (byteCount > 3) {
00254                 break;
00255             }
00256         }
00257     }
00258 
00259     return byteForm;
00260 }
00261 
00262 inline AnsaOSPF::IPv4Address IPv4AddressFromULong(unsigned long longForm)
00263 {
00264 
00265     AnsaOSPF::IPv4Address byteForm;
00266 
00267     byteForm.bytes[0] = (longForm & 0xFF000000) >> 24;
00268     byteForm.bytes[1] = (longForm & 0x00FF0000) >> 16;
00269     byteForm.bytes[2] = (longForm & 0x0000FF00) >> 8;
00270     byteForm.bytes[3] =  longForm & 0x000000FF;
00271     return byteForm;
00272 }
00273 
00274 inline unsigned long ULongFromIPv4Address(AnsaOSPF::IPv4Address byteForm)
00275 {
00276     return ((byteForm.bytes[0] << 24) + (byteForm.bytes[1] << 16) + (byteForm.bytes[2] << 8) + byteForm.bytes[3]);
00277 }
00278 
00279 inline unsigned long ULongFromAddressString(const char* charForm)
00280 {
00281     return ULongFromIPv4Address(IPv4AddressFromAddressString(charForm));
00282 }
00283 
00284 inline char* AddressStringFromIPv4Address(char* buffer, int bufferLength, AnsaOSPF::IPv4Address byteForm)
00285 {
00286     if (bufferLength < 16) {
00287         buffer = '\0';
00288     }
00289     else {
00290         sprintf(buffer, "%d.%d.%d.%d", byteForm.bytes[0], byteForm.bytes[1], byteForm.bytes[2], byteForm.bytes[3]);
00291     }
00292     return buffer;
00293 }
00294 
00295 inline char* AddressStringFromULong(char* buffer, int bufferLength, unsigned long longForm)
00296 {
00297     if (bufferLength < 16) {
00298         buffer = '\0';
00299     }
00300     else {
00301         sprintf(buffer, "%d.%d.%d.%d", (int)((longForm & 0xFF000000) >> 24),
00302                                         (int)((longForm & 0x00FF0000) >> 16),
00303                                         (int)((longForm & 0x0000FF00) >> 8),
00304                                         (int)(longForm & 0x000000FF));
00305     }
00306     return buffer;
00307 }
00308 
00309 inline char HexCharToByte(char hex)
00310 {
00311     switch (hex) {
00312         case '0':   return 0;
00313         case '1':   return 1;
00314         case '2':   return 2;
00315         case '3':   return 3;
00316         case '4':   return 4;
00317         case '5':   return 5;
00318         case '6':   return 6;
00319         case '7':   return 7;
00320         case '8':   return 8;
00321         case '9':   return 9;
00322         case 'A':   return 10;
00323         case 'B':   return 11;
00324         case 'C':   return 12;
00325         case 'D':   return 13;
00326         case 'E':   return 14;
00327         case 'F':   return 15;
00328         case 'a':   return 10;
00329         case 'b':   return 11;
00330         case 'c':   return 12;
00331         case 'd':   return 13;
00332         case 'e':   return 14;
00333         case 'f':   return 15;
00334         default:    return 0;
00335     };
00336 }
00337 
00338 inline char HexPairToByte(char upperHex, char lowerHex)
00339 {
00340     return ((HexCharToByte(upperHex) << 4) & (HexCharToByte(lowerHex)));
00341 }
00342 
00343 #endif // __COMMON_HPP__