Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Dhcp4Dxe/Dhcp4Option.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (22 months ago)
- Location:
- trunk/src/VBox/Devices/EFI/FirmwareNew
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FirmwareNew
-
Property svn:mergeinfo
changed from (toggle deleted branches)
to (toggle deleted branches)/vendor/edk2/current 103735-103757,103769-103776,129194-145445 /vendor/edk2/current 103735-103757,103769-103776,129194-156846
-
Property svn:mergeinfo
changed from (toggle deleted branches)
-
trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/Dhcp4Dxe/Dhcp4Option.c
r85718 r99404 14 14 /// DHCP_OPTION_FORMAT structure. 15 15 /// 16 DHCP_OPTION_FORMAT DhcpOptionFormats[] = {17 { DHCP4_TAG_NETMASK, DHCP_OPTION_IP, 1, 1 , TRUE},18 { DHCP4_TAG_TIME_OFFSET, DHCP_OPTION_INT32, 1, 1 , FALSE},19 { DHCP4_TAG_ROUTER, DHCP_OPTION_IP, 1, -1 , TRUE},20 { DHCP4_TAG_TIME_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},21 { DHCP4_TAG_NAME_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},22 { DHCP4_TAG_DNS_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},23 { DHCP4_TAG_LOG_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},24 { DHCP4_TAG_COOKIE_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},25 { DHCP4_TAG_LPR_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},26 { DHCP4_TAG_IMPRESS_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},27 { DHCP4_TAG_RL_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},28 { DHCP4_TAG_HOSTNAME, DHCP_OPTION_INT8, 1, -1 , FALSE},29 { DHCP4_TAG_BOOTFILE_LEN, DHCP_OPTION_INT16, 1, 1 , FALSE},30 { DHCP4_TAG_DUMP, DHCP_OPTION_INT8, 1, -1 , FALSE},31 { DHCP4_TAG_DOMAINNAME, DHCP_OPTION_INT8, 1, -1 , FALSE},32 { DHCP4_TAG_SWAP_SERVER, DHCP_OPTION_IP, 1, 1 , FALSE},33 { DHCP4_TAG_ROOTPATH, DHCP_OPTION_INT8, 1, -1 , FALSE},34 { DHCP4_TAG_EXTEND_PATH, DHCP_OPTION_INT8, 1, -1 , FALSE},35 36 { DHCP4_TAG_IPFORWARD, DHCP_OPTION_SWITCH, 1, 1 , FALSE},37 { DHCP4_TAG_NONLOCAL_SRR, DHCP_OPTION_SWITCH, 1, 1 , FALSE},38 { DHCP4_TAG_POLICY_SRR, DHCP_OPTION_IPPAIR, 1, -1 , FALSE},39 { DHCP4_TAG_EMTU, DHCP_OPTION_INT16, 1, 1 , FALSE},40 { DHCP4_TAG_TTL, DHCP_OPTION_INT8, 1, 1 , FALSE},41 { DHCP4_TAG_PATHMTU_AGE, DHCP_OPTION_INT32, 1, 1 , FALSE},42 { DHCP4_TAG_PATHMTU_PLATEAU,DHCP_OPTION_INT16, 1, -1 , FALSE},43 44 { DHCP4_TAG_IFMTU, DHCP_OPTION_INT16, 1, 1 , FALSE},45 { DHCP4_TAG_SUBNET_LOCAL, DHCP_OPTION_SWITCH, 1, 1 , FALSE},46 { DHCP4_TAG_BROADCAST, DHCP_OPTION_IP, 1, 1 , FALSE},47 { DHCP4_TAG_DISCOVER_MASK, DHCP_OPTION_SWITCH, 1, 1 , FALSE},48 { DHCP4_TAG_SUPPLY_MASK, DHCP_OPTION_SWITCH, 1, 1 , FALSE},49 { DHCP4_TAG_DISCOVER_ROUTE, DHCP_OPTION_SWITCH, 1, 1 , FALSE},50 { DHCP4_TAG_ROUTER_SOLICIT, DHCP_OPTION_IP, 1, 1 , FALSE},51 { DHCP4_TAG_STATIC_ROUTE, DHCP_OPTION_IPPAIR, 1, -1 , FALSE},52 53 { DHCP4_TAG_TRAILER, DHCP_OPTION_SWITCH, 1, 1 , FALSE},54 { DHCP4_TAG_ARPAGE, DHCP_OPTION_INT32, 1, 1 , FALSE},55 { DHCP4_TAG_ETHER_ENCAP, DHCP_OPTION_SWITCH, 1, 1 , FALSE},56 57 { DHCP4_TAG_TCP_TTL, DHCP_OPTION_INT8, 1, 1 , FALSE},58 { DHCP4_TAG_KEEP_INTERVAL, DHCP_OPTION_INT32, 1, 1 , FALSE},59 { DHCP4_TAG_KEEP_GARBAGE, DHCP_OPTION_SWITCH, 1, 1 , FALSE},60 61 { DHCP4_TAG_NIS_DOMAIN, DHCP_OPTION_INT8, 1, -1 , FALSE},62 { DHCP4_TAG_NIS_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},63 { DHCP4_TAG_NTP_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},64 { DHCP4_TAG_VENDOR, DHCP_OPTION_INT8, 1, -1 , FALSE},65 { DHCP4_TAG_NBNS, DHCP_OPTION_IP, 1, -1 , FALSE},66 { DHCP4_TAG_NBDD, DHCP_OPTION_IP, 1, -1 , FALSE},67 { DHCP4_TAG_NBTYPE, DHCP_OPTION_INT8, 1, 1 , FALSE},68 { DHCP4_TAG_NBSCOPE, DHCP_OPTION_INT8, 1, -1 , FALSE},69 { DHCP4_TAG_XFONT, DHCP_OPTION_IP, 1, -1 , FALSE},70 { DHCP4_TAG_XDM, DHCP_OPTION_IP, 1, -1 , FALSE},71 72 { DHCP4_TAG_REQUEST_IP, DHCP_OPTION_IP, 1, 1 , FALSE},73 { DHCP4_TAG_LEASE, DHCP_OPTION_INT32, 1, 1 , TRUE},74 { DHCP4_TAG_OVERLOAD, DHCP_OPTION_INT8, 1, 1 , TRUE},75 { DHCP4_TAG_MSG_TYPE, DHCP_OPTION_INT8, 1, 1 , TRUE},76 { DHCP4_TAG_SERVER_ID, DHCP_OPTION_IP, 1, 1 , TRUE},77 { DHCP4_TAG_PARA_LIST, DHCP_OPTION_INT8, 1, -1 , FALSE},78 { DHCP4_TAG_MESSAGE, DHCP_OPTION_INT8, 1, -1 , FALSE},79 { DHCP4_TAG_MAXMSG, DHCP_OPTION_INT16, 1, 1 , FALSE},80 { DHCP4_TAG_T1, DHCP_OPTION_INT32, 1, 1 , TRUE},81 { DHCP4_TAG_T2, DHCP_OPTION_INT32, 1, 1 , TRUE},82 { DHCP4_TAG_VENDOR_CLASS_ID,DHCP_OPTION_INT8, 1, -1 , FALSE},83 { DHCP4_TAG_CLIENT_ID, DHCP_OPTION_INT8, 2, -1 , FALSE},84 85 { DHCP4_TAG_NISPLUS, DHCP_OPTION_INT8, 1, -1 , FALSE},86 { DHCP4_TAG_NISPLUS_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},87 88 { DHCP4_TAG_TFTP, DHCP_OPTION_INT8, 1, -1 , FALSE},89 { DHCP4_TAG_BOOTFILE, DHCP_OPTION_INT8, 1, -1 , FALSE},90 91 { DHCP4_TAG_MOBILEIP, DHCP_OPTION_IP, 0, -1 , FALSE},92 { DHCP4_TAG_SMTP, DHCP_OPTION_IP, 1, -1 , FALSE},93 { DHCP4_TAG_POP3, DHCP_OPTION_IP, 1, -1 , FALSE},94 { DHCP4_TAG_NNTP, DHCP_OPTION_IP, 1, -1 , FALSE},95 { DHCP4_TAG_WWW, DHCP_OPTION_IP, 1, -1 , FALSE},96 { DHCP4_TAG_FINGER, DHCP_OPTION_IP, 1, -1 , FALSE},97 { DHCP4_TAG_IRC, DHCP_OPTION_IP, 1, -1 , FALSE},98 { DHCP4_TAG_STTALK, DHCP_OPTION_IP, 1, -1 , FALSE},99 { DHCP4_TAG_STDA, DHCP_OPTION_IP, 1, -1 , FALSE},100 101 { DHCP4_TAG_CLASSLESS_ROUTE,DHCP_OPTION_INT8, 5, -1 , FALSE},16 DHCP_OPTION_FORMAT DhcpOptionFormats[] = { 17 { DHCP4_TAG_NETMASK, DHCP_OPTION_IP, 1, 1, TRUE }, 18 { DHCP4_TAG_TIME_OFFSET, DHCP_OPTION_INT32, 1, 1, FALSE }, 19 { DHCP4_TAG_ROUTER, DHCP_OPTION_IP, 1, -1, TRUE }, 20 { DHCP4_TAG_TIME_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 21 { DHCP4_TAG_NAME_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 22 { DHCP4_TAG_DNS_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 23 { DHCP4_TAG_LOG_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 24 { DHCP4_TAG_COOKIE_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 25 { DHCP4_TAG_LPR_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 26 { DHCP4_TAG_IMPRESS_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 27 { DHCP4_TAG_RL_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 28 { DHCP4_TAG_HOSTNAME, DHCP_OPTION_INT8, 1, -1, FALSE }, 29 { DHCP4_TAG_BOOTFILE_LEN, DHCP_OPTION_INT16, 1, 1, FALSE }, 30 { DHCP4_TAG_DUMP, DHCP_OPTION_INT8, 1, -1, FALSE }, 31 { DHCP4_TAG_DOMAINNAME, DHCP_OPTION_INT8, 1, -1, FALSE }, 32 { DHCP4_TAG_SWAP_SERVER, DHCP_OPTION_IP, 1, 1, FALSE }, 33 { DHCP4_TAG_ROOTPATH, DHCP_OPTION_INT8, 1, -1, FALSE }, 34 { DHCP4_TAG_EXTEND_PATH, DHCP_OPTION_INT8, 1, -1, FALSE }, 35 36 { DHCP4_TAG_IPFORWARD, DHCP_OPTION_SWITCH, 1, 1, FALSE }, 37 { DHCP4_TAG_NONLOCAL_SRR, DHCP_OPTION_SWITCH, 1, 1, FALSE }, 38 { DHCP4_TAG_POLICY_SRR, DHCP_OPTION_IPPAIR, 1, -1, FALSE }, 39 { DHCP4_TAG_EMTU, DHCP_OPTION_INT16, 1, 1, FALSE }, 40 { DHCP4_TAG_TTL, DHCP_OPTION_INT8, 1, 1, FALSE }, 41 { DHCP4_TAG_PATHMTU_AGE, DHCP_OPTION_INT32, 1, 1, FALSE }, 42 { DHCP4_TAG_PATHMTU_PLATEAU, DHCP_OPTION_INT16, 1, -1, FALSE }, 43 44 { DHCP4_TAG_IFMTU, DHCP_OPTION_INT16, 1, 1, FALSE }, 45 { DHCP4_TAG_SUBNET_LOCAL, DHCP_OPTION_SWITCH, 1, 1, FALSE }, 46 { DHCP4_TAG_BROADCAST, DHCP_OPTION_IP, 1, 1, FALSE }, 47 { DHCP4_TAG_DISCOVER_MASK, DHCP_OPTION_SWITCH, 1, 1, FALSE }, 48 { DHCP4_TAG_SUPPLY_MASK, DHCP_OPTION_SWITCH, 1, 1, FALSE }, 49 { DHCP4_TAG_DISCOVER_ROUTE, DHCP_OPTION_SWITCH, 1, 1, FALSE }, 50 { DHCP4_TAG_ROUTER_SOLICIT, DHCP_OPTION_IP, 1, 1, FALSE }, 51 { DHCP4_TAG_STATIC_ROUTE, DHCP_OPTION_IPPAIR, 1, -1, FALSE }, 52 53 { DHCP4_TAG_TRAILER, DHCP_OPTION_SWITCH, 1, 1, FALSE }, 54 { DHCP4_TAG_ARPAGE, DHCP_OPTION_INT32, 1, 1, FALSE }, 55 { DHCP4_TAG_ETHER_ENCAP, DHCP_OPTION_SWITCH, 1, 1, FALSE }, 56 57 { DHCP4_TAG_TCP_TTL, DHCP_OPTION_INT8, 1, 1, FALSE }, 58 { DHCP4_TAG_KEEP_INTERVAL, DHCP_OPTION_INT32, 1, 1, FALSE }, 59 { DHCP4_TAG_KEEP_GARBAGE, DHCP_OPTION_SWITCH, 1, 1, FALSE }, 60 61 { DHCP4_TAG_NIS_DOMAIN, DHCP_OPTION_INT8, 1, -1, FALSE }, 62 { DHCP4_TAG_NIS_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 63 { DHCP4_TAG_NTP_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 64 { DHCP4_TAG_VENDOR, DHCP_OPTION_INT8, 1, -1, FALSE }, 65 { DHCP4_TAG_NBNS, DHCP_OPTION_IP, 1, -1, FALSE }, 66 { DHCP4_TAG_NBDD, DHCP_OPTION_IP, 1, -1, FALSE }, 67 { DHCP4_TAG_NBTYPE, DHCP_OPTION_INT8, 1, 1, FALSE }, 68 { DHCP4_TAG_NBSCOPE, DHCP_OPTION_INT8, 1, -1, FALSE }, 69 { DHCP4_TAG_XFONT, DHCP_OPTION_IP, 1, -1, FALSE }, 70 { DHCP4_TAG_XDM, DHCP_OPTION_IP, 1, -1, FALSE }, 71 72 { DHCP4_TAG_REQUEST_IP, DHCP_OPTION_IP, 1, 1, FALSE }, 73 { DHCP4_TAG_LEASE, DHCP_OPTION_INT32, 1, 1, TRUE }, 74 { DHCP4_TAG_OVERLOAD, DHCP_OPTION_INT8, 1, 1, TRUE }, 75 { DHCP4_TAG_MSG_TYPE, DHCP_OPTION_INT8, 1, 1, TRUE }, 76 { DHCP4_TAG_SERVER_ID, DHCP_OPTION_IP, 1, 1, TRUE }, 77 { DHCP4_TAG_PARA_LIST, DHCP_OPTION_INT8, 1, -1, FALSE }, 78 { DHCP4_TAG_MESSAGE, DHCP_OPTION_INT8, 1, -1, FALSE }, 79 { DHCP4_TAG_MAXMSG, DHCP_OPTION_INT16, 1, 1, FALSE }, 80 { DHCP4_TAG_T1, DHCP_OPTION_INT32, 1, 1, TRUE }, 81 { DHCP4_TAG_T2, DHCP_OPTION_INT32, 1, 1, TRUE }, 82 { DHCP4_TAG_VENDOR_CLASS_ID, DHCP_OPTION_INT8, 1, -1, FALSE }, 83 { DHCP4_TAG_CLIENT_ID, DHCP_OPTION_INT8, 2, -1, FALSE }, 84 85 { DHCP4_TAG_NISPLUS, DHCP_OPTION_INT8, 1, -1, FALSE }, 86 { DHCP4_TAG_NISPLUS_SERVER, DHCP_OPTION_IP, 1, -1, FALSE }, 87 88 { DHCP4_TAG_TFTP, DHCP_OPTION_INT8, 1, -1, FALSE }, 89 { DHCP4_TAG_BOOTFILE, DHCP_OPTION_INT8, 1, -1, FALSE }, 90 91 { DHCP4_TAG_MOBILEIP, DHCP_OPTION_IP, 0, -1, FALSE }, 92 { DHCP4_TAG_SMTP, DHCP_OPTION_IP, 1, -1, FALSE }, 93 { DHCP4_TAG_POP3, DHCP_OPTION_IP, 1, -1, FALSE }, 94 { DHCP4_TAG_NNTP, DHCP_OPTION_IP, 1, -1, FALSE }, 95 { DHCP4_TAG_WWW, DHCP_OPTION_IP, 1, -1, FALSE }, 96 { DHCP4_TAG_FINGER, DHCP_OPTION_IP, 1, -1, FALSE }, 97 { DHCP4_TAG_IRC, DHCP_OPTION_IP, 1, -1, FALSE }, 98 { DHCP4_TAG_STTALK, DHCP_OPTION_IP, 1, -1, FALSE }, 99 { DHCP4_TAG_STDA, DHCP_OPTION_IP, 1, -1, FALSE }, 100 101 { DHCP4_TAG_CLASSLESS_ROUTE, DHCP_OPTION_INT8, 5, -1, FALSE }, 102 102 }; 103 104 103 105 104 /** … … 114 113 DHCP_OPTION_FORMAT * 115 114 DhcpFindOptionFormat ( 116 IN UINT8 117 ) 118 { 119 INTN 120 INTN 121 INTN 115 IN UINT8 Tag 116 ) 117 { 118 INTN Left; 119 INTN Right; 120 INTN Middle; 122 121 123 122 Left = 0; … … 134 133 Right = Middle - 1; 135 134 } else { 136 Left 135 Left = Middle + 1; 137 136 } 138 137 } … … 140 139 return NULL; 141 140 } 142 143 141 144 142 /** … … 155 153 BOOLEAN 156 154 DhcpOptionIsValid ( 157 IN DHCP_OPTION_FORMAT 158 IN UINT8 159 IN INTN 160 ) 161 { 162 INTN 163 INTN 164 INTN 155 IN DHCP_OPTION_FORMAT *Format, 156 IN UINT8 *OptValue, 157 IN INTN Len 158 ) 159 { 160 INTN Unit; 161 INTN Occur; 162 INTN Index; 165 163 166 164 Unit = 0; 167 165 168 166 switch (Format->Type) { 169 case DHCP_OPTION_SWITCH:170 case DHCP_OPTION_INT8:171 Unit = 1;172 break;173 174 case DHCP_OPTION_INT16:175 Unit = 2;176 break;177 178 case DHCP_OPTION_INT32:179 case DHCP_OPTION_IP:180 Unit = 4;181 break;182 183 case DHCP_OPTION_IPPAIR:184 Unit = 8;185 break;167 case DHCP_OPTION_SWITCH: 168 case DHCP_OPTION_INT8: 169 Unit = 1; 170 break; 171 172 case DHCP_OPTION_INT16: 173 Unit = 2; 174 break; 175 176 case DHCP_OPTION_INT32: 177 case DHCP_OPTION_IP: 178 Unit = 4; 179 break; 180 181 case DHCP_OPTION_IPPAIR: 182 Unit = 8; 183 break; 186 184 } 187 185 … … 202 200 if (((Format->MinOccur != -1) && (Occur < Format->MinOccur)) || 203 201 ((Format->MaxOccur != -1) && (Occur > Format->MaxOccur)) 204 ) { 202 ) 203 { 205 204 return FALSE; 206 205 } … … 220 219 } 221 220 222 223 221 /** 224 222 Extract the client interested options, all the parameters are … … 236 234 EFI_STATUS 237 235 DhcpGetParameter ( 238 IN UINT8 239 IN INTN 240 IN UINT8 241 OUT DHCP_PARAMETER 236 IN UINT8 Tag, 237 IN INTN Len, 238 IN UINT8 *Data, 239 OUT DHCP_PARAMETER *Para 242 240 ) 243 241 { 244 242 switch (Tag) { 245 case DHCP4_TAG_NETMASK: 246 Para->NetMask = NetGetUint32 (Data); 247 break; 248 249 case DHCP4_TAG_ROUTER: 250 // 251 // Return the first router to consumer which is the preferred one 252 // 253 Para->Router = NetGetUint32 (Data); 254 break; 255 256 case DHCP4_TAG_LEASE: 257 Para->Lease = NetGetUint32 (Data); 258 break; 259 260 case DHCP4_TAG_OVERLOAD: 261 Para->Overload = *Data; 262 263 if ((Para->Overload < 1) || (Para->Overload > 3)) { 264 return EFI_INVALID_PARAMETER; 265 } 266 break; 267 268 case DHCP4_TAG_MSG_TYPE: 269 Para->DhcpType = *Data; 270 271 if ((Para->DhcpType < 1) || (Para->DhcpType > 9)) { 272 return EFI_INVALID_PARAMETER; 273 } 274 break; 275 276 case DHCP4_TAG_SERVER_ID: 277 Para->ServerId = NetGetUint32 (Data); 278 break; 279 280 case DHCP4_TAG_T1: 281 Para->T1 = NetGetUint32 (Data); 282 break; 283 284 case DHCP4_TAG_T2: 285 Para->T2 = NetGetUint32 (Data); 286 break; 243 case DHCP4_TAG_NETMASK: 244 Para->NetMask = NetGetUint32 (Data); 245 break; 246 247 case DHCP4_TAG_ROUTER: 248 // 249 // Return the first router to consumer which is the preferred one 250 // 251 Para->Router = NetGetUint32 (Data); 252 break; 253 254 case DHCP4_TAG_LEASE: 255 Para->Lease = NetGetUint32 (Data); 256 break; 257 258 case DHCP4_TAG_OVERLOAD: 259 Para->Overload = *Data; 260 261 if ((Para->Overload < 1) || (Para->Overload > 3)) { 262 return EFI_INVALID_PARAMETER; 263 } 264 265 break; 266 267 case DHCP4_TAG_MSG_TYPE: 268 Para->DhcpType = *Data; 269 270 if ((Para->DhcpType < 1) || (Para->DhcpType > 9)) { 271 return EFI_INVALID_PARAMETER; 272 } 273 274 break; 275 276 case DHCP4_TAG_SERVER_ID: 277 Para->ServerId = NetGetUint32 (Data); 278 break; 279 280 case DHCP4_TAG_T1: 281 Para->T1 = NetGetUint32 (Data); 282 break; 283 284 case DHCP4_TAG_T2: 285 Para->T2 = NetGetUint32 (Data); 286 break; 287 287 } 288 288 289 289 return EFI_SUCCESS; 290 290 } 291 292 291 293 292 /** … … 309 308 EFI_STATUS 310 309 DhcpIterateBufferOptions ( 311 IN UINT8 312 IN INTN 313 IN DHCP_CHECK_OPTION 314 IN VOID 315 OUT UINT8 316 ) 317 { 318 INTN 319 UINT8 320 UINT8 310 IN UINT8 *Buffer, 311 IN INTN BufLen, 312 IN DHCP_CHECK_OPTION Check OPTIONAL, 313 IN VOID *Context, 314 OUT UINT8 *Overload OPTIONAL 315 ) 316 { 317 INTN Cur; 318 UINT8 Tag; 319 UINT8 Len; 321 320 322 321 Cur = 0; … … 365 364 } 366 365 367 368 366 /** 369 367 Iterate through a DHCP message to visit each option. First inspect … … 383 381 EFI_STATUS 384 382 DhcpIterateOptions ( 385 IN EFI_DHCP4_PACKET 386 IN DHCP_CHECK_OPTION 387 IN VOID 388 ) 389 { 390 EFI_STATUS 391 UINT8 383 IN EFI_DHCP4_PACKET *Packet, 384 IN DHCP_CHECK_OPTION Check OPTIONAL, 385 IN VOID *Context 386 ) 387 { 388 EFI_STATUS Status; 389 UINT8 Overload; 392 390 393 391 Overload = 0; 394 392 395 Status 396 397 398 399 400 401 393 Status = DhcpIterateBufferOptions ( 394 Packet->Dhcp4.Option, 395 Packet->Length - sizeof (EFI_DHCP4_HEADER) - sizeof (UINT32), 396 Check, 397 Context, 398 &Overload 399 ); 402 400 403 401 if (EFI_ERROR (Status)) { … … 407 405 if ((Overload == DHCP_OVERLOAD_FILENAME) || (Overload == DHCP_OVERLOAD_BOTH)) { 408 406 Status = DhcpIterateBufferOptions ( 409 (UINT8 *) 407 (UINT8 *)Packet->Dhcp4.Header.BootFileName, 410 408 128, 411 409 Check, … … 421 419 if ((Overload == DHCP_OVERLOAD_SVRNAME) || (Overload == DHCP_OVERLOAD_BOTH)) { 422 420 Status = DhcpIterateBufferOptions ( 423 (UINT8 *) 421 (UINT8 *)Packet->Dhcp4.Header.ServerName, 424 422 64, 425 423 Check, … … 436 434 } 437 435 438 439 436 /** 440 437 Call back function to DhcpIterateOptions to compute each option's … … 453 450 EFI_STATUS 454 451 DhcpGetOptionLen ( 455 IN UINT8 456 IN UINT8 457 IN UINT8 458 IN VOID 459 ) 460 { 461 DHCP_OPTION_COUNT 462 463 OpCount = (DHCP_OPTION_COUNT *) 464 OpCount[Tag].Offset = (UINT16) 452 IN UINT8 Tag, 453 IN UINT8 Len, 454 IN UINT8 *Data, 455 IN VOID *Context 456 ) 457 { 458 DHCP_OPTION_COUNT *OpCount; 459 460 OpCount = (DHCP_OPTION_COUNT *)Context; 461 OpCount[Tag].Offset = (UINT16)(OpCount[Tag].Offset + Len); 465 462 466 463 return EFI_SUCCESS; 467 464 } 468 469 465 470 466 /** … … 483 479 EFI_STATUS 484 480 DhcpFillOption ( 485 IN UINT8 486 IN UINT8 487 IN UINT8 488 IN VOID 489 ) 490 { 491 DHCP_OPTION_CONTEXT 492 DHCP_OPTION_COUNT 493 DHCP_OPTION 494 UINT8 495 UINT8 496 497 OptContext = (DHCP_OPTION_CONTEXT *)Context;498 499 OptCount 500 Index 501 Options 502 Buf 481 IN UINT8 Tag, 482 IN UINT8 Len, 483 IN UINT8 *Data, 484 IN VOID *Context 485 ) 486 { 487 DHCP_OPTION_CONTEXT *OptContext; 488 DHCP_OPTION_COUNT *OptCount; 489 DHCP_OPTION *Options; 490 UINT8 *Buf; 491 UINT8 Index; 492 493 OptContext = (DHCP_OPTION_CONTEXT *)Context; 494 495 OptCount = OptContext->OpCount; 496 Index = OptCount[Tag].Index; 497 Options = OptContext->Options; 498 Buf = OptContext->Buf; 503 499 504 500 if (Options[Index].Data == NULL) { … … 509 505 CopyMem (Buf + OptCount[Tag].Offset, Data, Len); 510 506 511 OptCount[Tag].Offset = (UINT16)(OptCount[Tag].Offset + Len);512 Options[Index].Len = (UINT16)(Options[Index].Len + Len);507 OptCount[Tag].Offset = (UINT16)(OptCount[Tag].Offset + Len); 508 Options[Index].Len = (UINT16)(Options[Index].Len + Len); 513 509 return EFI_SUCCESS; 514 510 } 515 516 511 517 512 /** … … 545 540 EFI_STATUS 546 541 DhcpParseOption ( 547 IN EFI_DHCP4_PACKET 548 OUT INTN 549 OUT DHCP_OPTION 550 ) 551 { 552 DHCP_OPTION_CONTEXT 553 DHCP_OPTION 554 DHCP_OPTION_COUNT 555 EFI_STATUS 556 UINT16 557 INTN 558 INTN 542 IN EFI_DHCP4_PACKET *Packet, 543 OUT INTN *Count, 544 OUT DHCP_OPTION **OptionPoint 545 ) 546 { 547 DHCP_OPTION_CONTEXT Context; 548 DHCP_OPTION *Options; 549 DHCP_OPTION_COUNT *OptCount; 550 EFI_STATUS Status; 551 UINT16 TotalLen; 552 INTN OptNum; 553 INTN Index; 559 554 560 555 ASSERT ((Count != NULL) && (OptionPoint != NULL)); … … 581 576 // option value buffer to put the data. 582 577 // 583 TotalLen 584 OptNum 578 TotalLen = 0; 579 OptNum = 0; 585 580 586 581 for (Index = 0; Index < DHCP_MAX_OPTIONS; Index++) { 587 582 if (OptCount[Index].Offset != 0) { 588 OptCount[Index].Index = (UINT8)OptNum;589 590 TotalLen = (UINT16)(TotalLen + OptCount[Index].Offset);591 OptCount[Index].Offset = (UINT16)(TotalLen - OptCount[Index].Offset);583 OptCount[Index].Index = (UINT8)OptNum; 584 585 TotalLen = (UINT16)(TotalLen + OptCount[Index].Offset); 586 OptCount[Index].Offset = (UINT16)(TotalLen - OptCount[Index].Offset); 592 587 593 588 OptNum++; … … 595 590 } 596 591 597 *Count 598 *OptionPoint 592 *Count = OptNum; 593 *OptionPoint = NULL; 599 594 600 595 if (OptNum == 0) { … … 606 601 // continuous buffer to put all the options' data. 607 602 // 608 Options = AllocateZeroPool ((UINTN) 603 Options = AllocateZeroPool ((UINTN)(OptNum * sizeof (DHCP_OPTION)) + TotalLen); 609 604 610 605 if (Options == NULL) { … … 615 610 Context.OpCount = OptCount; 616 611 Context.Options = Options; 617 Context.Buf = (UINT8 *) 618 619 Status 612 Context.Buf = (UINT8 *)(Options + OptNum); 613 614 Status = DhcpIterateOptions (Packet, DhcpFillOption, &Context); 620 615 621 616 if (EFI_ERROR (Status)) { … … 631 626 } 632 627 633 634 628 /** 635 629 Validate the packet's options. If necessary, allocate … … 646 640 EFI_STATUS 647 641 DhcpValidateOptions ( 648 IN EFI_DHCP4_PACKET 649 OUT DHCP_PARAMETER 650 ) 651 { 652 DHCP_PARAMETER 653 DHCP_OPTION_FORMAT 654 DHCP_OPTION 655 DHCP_OPTION 656 EFI_STATUS 657 BOOLEAN 658 INTN 659 INTN 642 IN EFI_DHCP4_PACKET *Packet, 643 OUT DHCP_PARAMETER **Para OPTIONAL 644 ) 645 { 646 DHCP_PARAMETER Parameter; 647 DHCP_OPTION_FORMAT *Format; 648 DHCP_OPTION *AllOption; 649 DHCP_OPTION *Option; 650 EFI_STATUS Status; 651 BOOLEAN Updated; 652 INTN Count; 653 INTN Index; 660 654 661 655 if (Para != NULL) { … … 669 663 return Status; 670 664 } 665 671 666 ASSERT (AllOption != NULL); 672 667 … … 717 712 } 718 713 719 720 721 714 /** 722 715 Append an option to the memory, if the option is longer than … … 733 726 UINT8 * 734 727 DhcpAppendOption ( 735 OUT UINT8 736 IN UINT8 737 IN UINT16 738 IN UINT8 739 ) 740 { 741 INTN 742 INTN 728 OUT UINT8 *Buf, 729 IN UINT8 Tag, 730 IN UINT16 DataLen, 731 IN UINT8 *Data 732 ) 733 { 734 INTN Index; 735 INTN Len; 743 736 744 737 ASSERT (DataLen != 0); 745 738 746 739 for (Index = 0; Index < (DataLen + 254) / 255; Index++) { 747 Len 740 Len = MIN (255, DataLen - Index * 255); 748 741 749 742 *(Buf++) = Tag; 750 *(Buf++) = (UINT8) 751 CopyMem (Buf, Data + Index * 255, (UINTN) 752 753 Buf 743 *(Buf++) = (UINT8)Len; 744 CopyMem (Buf, Data + Index * 255, (UINTN)Len); 745 746 Buf += Len; 754 747 } 755 748 756 749 return Buf; 757 750 } 758 759 751 760 752 /** … … 777 769 EFI_STATUS 778 770 DhcpBuild ( 779 IN EFI_DHCP4_PACKET *SeedPacket,780 IN UINT32 DeleteCount,781 IN UINT8 *DeleteList OPTIONAL,782 IN UINT32 AppendCount,783 IN EFI_DHCP4_PACKET_OPTION *AppendList[] OPTIONAL,784 OUT EFI_DHCP4_PACKET **NewPacket785 ) 786 { 787 DHCP_OPTION 788 DHCP_OPTION 789 EFI_DHCP4_PACKET 790 EFI_STATUS 791 INTN 792 UINT32 793 UINT32 794 UINT8 771 IN EFI_DHCP4_PACKET *SeedPacket, 772 IN UINT32 DeleteCount, 773 IN UINT8 *DeleteList OPTIONAL, 774 IN UINT32 AppendCount, 775 IN EFI_DHCP4_PACKET_OPTION *AppendList[] OPTIONAL, 776 OUT EFI_DHCP4_PACKET **NewPacket 777 ) 778 { 779 DHCP_OPTION *Mark; 780 DHCP_OPTION *SeedOptions; 781 EFI_DHCP4_PACKET *Packet; 782 EFI_STATUS Status; 783 INTN Count; 784 UINT32 Index; 785 UINT32 Len; 786 UINT8 *Buf; 795 787 796 788 // … … 805 797 806 798 for (Index = 0; Index < DHCP_MAX_OPTIONS; Index++) { 807 Mark[Index].Tag = (UINT8) 799 Mark[Index].Tag = (UINT8)Index; 808 800 Mark[Index].Len = 0; 809 801 } … … 821 813 822 814 if (SeedOptions != NULL) { 823 for (Index = 0; Index < (UINT32) 815 for (Index = 0; Index < (UINT32)Count; Index++) { 824 816 Mark[SeedOptions[Index].Tag] = SeedOptions[Index]; 825 817 } … … 855 847 } 856 848 857 Status 858 Packet = (EFI_DHCP4_PACKET *)AllocatePool (Len);849 Status = EFI_OUT_OF_RESOURCES; 850 Packet = (EFI_DHCP4_PACKET *)AllocatePool (Len); 859 851 860 852 if (Packet == NULL) { … … 862 854 } 863 855 864 Packet->Size 865 Packet->Length 856 Packet->Size = Len; 857 Packet->Length = 0; 866 858 CopyMem (&Packet->Dhcp4.Header, &SeedPacket->Dhcp4.Header, sizeof (Packet->Dhcp4.Header)); 867 Packet->Dhcp4.Magik 868 Buf 859 Packet->Dhcp4.Magik = DHCP_OPTION_MAGIC; 860 Buf = Packet->Dhcp4.Option; 869 861 870 862 for (Index = 0; Index < DHCP_MAX_OPTIONS; Index++) { … … 874 866 } 875 867 876 *(Buf++) 877 Packet->Length 878 + (UINT32)(Buf - Packet->Dhcp4.Option);879 880 *NewPacket 881 Status 868 *(Buf++) = DHCP4_TAG_EOP; 869 Packet->Length = sizeof (EFI_DHCP4_HEADER) + sizeof (UINT32) 870 + (UINT32)(Buf - Packet->Dhcp4.Option); 871 872 *NewPacket = Packet; 873 Status = EFI_SUCCESS; 882 874 883 875 ON_ERROR:
Note:
See TracChangeset
for help on using the changeset viewer.