|
INET Framework for OMNeT++/OMNEST
|
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__