OSPFcommon.h

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