00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
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
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
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 }
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__