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