diff --git a/NetworkPkg/Dhcp6Dxe/Dhcp6Impl.c b/NetworkPkg/Dhcp6Dxe/Dhcp6Impl.c index 934c03ed85..d8c0ad0d24 100644 --- a/NetworkPkg/Dhcp6Dxe/Dhcp6Impl.c +++ b/NetworkPkg/Dhcp6Dxe/Dhcp6Impl.c @@ -103,12 +103,6 @@ EfiDhcp6Start ( OldTpl = gBS->RaiseTPL (TPL_CALLBACK); Instance->UdpSts = EFI_ALREADY_STARTED; - // - // Need to clear initial time to make sure that elapsed-time - // is set to 0 for first Solicit. - // - Instance->StartTime = 0; - // // Send the solicit message to start S.A.R.R process. // diff --git a/NetworkPkg/Dhcp6Dxe/Dhcp6Impl.h b/NetworkPkg/Dhcp6Dxe/Dhcp6Impl.h index 71b16b1919..e3e7553163 100644 --- a/NetworkPkg/Dhcp6Dxe/Dhcp6Impl.h +++ b/NetworkPkg/Dhcp6Dxe/Dhcp6Impl.h @@ -249,6 +249,10 @@ struct _DHCP6_INSTANCE { volatile EFI_STATUS UdpSts; BOOLEAN InDestroy; BOOLEAN MediaPresent; + // + // StartTime is used to calculate the 'elapsed-time' option. Refer to RFC3315, + // the elapsed-time is amount of time since the client began its current DHCP transaction. + // UINT64 StartTime; }; diff --git a/NetworkPkg/Dhcp6Dxe/Dhcp6Io.c b/NetworkPkg/Dhcp6Dxe/Dhcp6Io.c index 0e83d07853..962d9387ca 100644 --- a/NetworkPkg/Dhcp6Dxe/Dhcp6Io.c +++ b/NetworkPkg/Dhcp6Dxe/Dhcp6Io.c @@ -593,6 +593,14 @@ Dhcp6UpdateIaInfo ( if (Instance->Config->IaDescriptor.Type == Dhcp6OptIana) { T1 = NTOHL (ReadUnaligned32 ((UINT32 *) (Option + 8))); T2 = NTOHL (ReadUnaligned32 ((UINT32 *) (Option + 12))); + // + // Refer to RFC3155 Chapter 22.4. If a client receives an IA_NA with T1 greater than T2, + // and both T1 and T2 are greater than 0, the client discards the IA_NA option and processes + // the remainder of the message as though the server had not included the invalid IA_NA option. + // + if (T1 > T2 && T2 > 0) { + return EFI_DEVICE_ERROR; + } IaInnerOpt = Option + 16; IaInnerLen = (UINT16) (NTOHS (ReadUnaligned16 ((UINT16 *) (Option + 2))) - 12); } else { @@ -697,7 +705,7 @@ Dhcp6SeekStsOption ( &Instance->Config->IaDescriptor ); if (*Option == NULL) { - return EFI_DEVICE_ERROR; + return EFI_SUCCESS; } // @@ -949,7 +957,8 @@ Dhcp6SendSolicitMsg ( Cursor, Instance->IaCb.Ia, Instance->IaCb.T1, - Instance->IaCb.T2 + Instance->IaCb.T2, + Packet->Dhcp6.Header.MessageType ); // @@ -987,6 +996,10 @@ Dhcp6SendSolicitMsg ( // Dhcp6selecting. // Instance->IaCb.Ia->State = Dhcp6Selecting; + // + // Clear initial time for current transaction. + // + Instance->StartTime = 0; Status = Dhcp6TransmitPacket (Instance, Packet, Elapsed); @@ -1133,7 +1146,8 @@ Dhcp6SendRequestMsg ( Cursor, Instance->IaCb.Ia, Instance->IaCb.T1, - Instance->IaCb.T2 + Instance->IaCb.T2, + Packet->Dhcp6.Header.MessageType ); // @@ -1171,6 +1185,10 @@ Dhcp6SendRequestMsg ( // Dhcp6requesting. // Instance->IaCb.Ia->State = Dhcp6Requesting; + // + // Clear initial time for current transaction. + // + Instance->StartTime = 0; Status = Dhcp6TransmitPacket (Instance, Packet, Elapsed); @@ -1282,7 +1300,7 @@ Dhcp6SendDeclineMsg ( ServerId->Duid ); - Cursor = Dhcp6AppendIaOption (Cursor, DecIa, 0, 0); + Cursor = Dhcp6AppendIaOption (Cursor, DecIa, 0, 0, Packet->Dhcp6.Header.MessageType); // // Determine the size/length of packet. @@ -1305,6 +1323,10 @@ Dhcp6SendDeclineMsg ( // Dhcp6declining. // Instance->IaCb.Ia->State = Dhcp6Declining; + // + // Clear initial time for current transaction. + // + Instance->StartTime = 0; Status = Dhcp6TransmitPacket (Instance, Packet, Elapsed); @@ -1415,7 +1437,7 @@ Dhcp6SendReleaseMsg ( &Elapsed ); - Cursor = Dhcp6AppendIaOption (Cursor, RelIa, 0, 0); + Cursor = Dhcp6AppendIaOption (Cursor, RelIa, 0, 0, Packet->Dhcp6.Header.MessageType); // // Determine the size/length of packet @@ -1540,7 +1562,8 @@ Dhcp6SendRenewRebindMsg ( Cursor, Instance->IaCb.Ia, Instance->IaCb.T1, - Instance->IaCb.T2 + Instance->IaCb.T2, + Packet->Dhcp6.Header.MessageType ); if (!RebindRequest) { @@ -1612,6 +1635,10 @@ Dhcp6SendRenewRebindMsg ( // Instance->IaCb.Ia->State = State; Instance->IaCb.LeaseTime = (RebindRequest) ? Instance->IaCb.T2 : Instance->IaCb.T1; + // + // Clear initial time for current transaction. + // + Instance->StartTime = 0; Status = Dhcp6TransmitPacket (Instance, Packet, Elapsed); @@ -1844,6 +1871,11 @@ Dhcp6SendInfoRequestMsg ( // Packet->Length += (UINT32) (Cursor - Packet->Dhcp6.Option); ASSERT (Packet->Size > Packet->Length + 8); + + // + // Clear initial time for current transaction. + // + Instance->StartTime = 0; // // Send info-request packet with no state. @@ -1941,7 +1973,8 @@ Dhcp6SendConfirmMsg ( Cursor, Instance->IaCb.Ia, Instance->IaCb.T1, - Instance->IaCb.T2 + Instance->IaCb.T2, + Packet->Dhcp6.Header.MessageType ); // @@ -1978,6 +2011,10 @@ Dhcp6SendConfirmMsg ( // Dhcp6Confirming. // Instance->IaCb.Ia->State = Dhcp6Confirming; + // + // Clear initial time for current transaction. + // + Instance->StartTime = 0; Status = Dhcp6TransmitPacket (Instance, Packet, Elapsed); @@ -2020,6 +2057,8 @@ Dhcp6HandleReplyMsg ( ASSERT (Instance->IaCb.Ia != NULL); ASSERT (Packet != NULL); + Status = EFI_SUCCESS; + if (Packet->Dhcp6.Header.MessageType != Dhcp6MsgReply) { return EFI_DEVICE_ERROR; } @@ -2056,7 +2095,7 @@ Dhcp6HandleReplyMsg ( &Instance->Config->IaDescriptor ); if (Option == NULL) { - return EFI_DEVICE_ERROR; + return EFI_SUCCESS; } } @@ -2069,19 +2108,6 @@ Dhcp6HandleReplyMsg ( return Status; } - // - // Dequeue the sent packet from retransmit list since reply received. - // - Status = Dhcp6DequeueRetry ( - Instance, - Packet->Dhcp6.Header.TransactionId, - FALSE - ); - - if (EFI_ERROR (Status)) { - return Status; - } - // // When receive a valid reply packet in response to a decline/release packet, // the client considers the decline/release event completed regardless of the @@ -2115,7 +2141,8 @@ Dhcp6HandleReplyMsg ( // Instance->StartTime = 0; - return EFI_SUCCESS; + Status = EFI_SUCCESS; + goto ON_EXIT; } // @@ -2131,56 +2158,64 @@ Dhcp6HandleReplyMsg ( ); if (!EFI_ERROR (Status)) { - // - // Reset start time for next exchange. - // - Instance->StartTime = 0; - // // No status code or no error status code means succeed to reply. // Status = Dhcp6UpdateIaInfo (Instance, Packet); + if (!EFI_ERROR (Status)) { + // + // Reset start time for next exchange. + // + Instance->StartTime = 0; - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Set bound state and store the reply packet. - // - if (Instance->IaCb.Ia->ReplyPacket != NULL) { - FreePool (Instance->IaCb.Ia->ReplyPacket); - } - - Instance->IaCb.Ia->ReplyPacket = AllocateZeroPool (Packet->Size); - - if (Instance->IaCb.Ia->ReplyPacket == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - CopyMem (Instance->IaCb.Ia->ReplyPacket, Packet, Packet->Size); - - Instance->IaCb.Ia->State = Dhcp6Bound; - - // - // For sync, set the success flag out of polling in start/renewrebind. - // - Instance->UdpSts = EFI_SUCCESS; - - // - // Maybe this is a new round DHCP process due to some reason, such as NotOnLink - // ReplyMsg for ConfirmMsg should triger new round to acquire new address. In that - // case, clear old address.ValidLifetime and append to new address. Therefore, DHCP - // consumers can be notified to flush old address. - // - Dhcp6AppendCacheIa (Instance); - - // - // For async, signal the Ia event to inform Ia infomation update. - // - if (Instance->Config->IaInfoEvent != NULL) { - gBS->SignalEvent (Instance->Config->IaInfoEvent); + // + // Set bound state and store the reply packet. + // + if (Instance->IaCb.Ia->ReplyPacket != NULL) { + FreePool (Instance->IaCb.Ia->ReplyPacket); + } + + Instance->IaCb.Ia->ReplyPacket = AllocateZeroPool (Packet->Size); + + if (Instance->IaCb.Ia->ReplyPacket == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto ON_EXIT; + } + + CopyMem (Instance->IaCb.Ia->ReplyPacket, Packet, Packet->Size); + + Instance->IaCb.Ia->State = Dhcp6Bound; + + // + // For sync, set the success flag out of polling in start/renewrebind. + // + Instance->UdpSts = EFI_SUCCESS; + + // + // Maybe this is a new round DHCP process due to some reason, such as NotOnLink + // ReplyMsg for ConfirmMsg should triger new round to acquire new address. In that + // case, clear old address.ValidLifetime and append to new address. Therefore, DHCP + // consumers can be notified to flush old address. + // + Dhcp6AppendCacheIa (Instance); + + // + // For async, signal the Ia event to inform Ia infomation update. + // + if (Instance->Config->IaInfoEvent != NULL) { + gBS->SignalEvent (Instance->Config->IaInfoEvent); + } + } else if (Status == EFI_NOT_FOUND) { + // + // Refer to RFC3315 Chapter 18.1.8, for each IA in the original Renew or Rebind message, + // the client sends a Renew or Rebind if the IA is not in the Reply message. + // Return EFI_SUCCESS so we can continue to restart the Renew/Rebind process. + // + return EFI_SUCCESS; } + + goto ON_EXIT; + } else if (Option != NULL) { // // Any error status code option is found. @@ -2226,6 +2261,19 @@ Dhcp6HandleReplyMsg ( } break; + case Dhcp6StsNoBinding: + if (Instance->IaCb.Ia->State == Dhcp6Renewing || Instance->IaCb.Ia->State == Dhcp6Rebinding) { + // + // Refer to RFC3315 Chapter 18.1.8, for each IA in the original Renew or Rebind message, the client + // sends a Request message if the IA contained a Status Code option with the NoBinding status. + // + Status = Dhcp6SendRequestMsg(Instance); + if (EFI_ERROR (Status)) { + return Status; + } + } + break; + default: // // The other status code, just restart solicitation. @@ -2235,6 +2283,18 @@ Dhcp6HandleReplyMsg ( } return EFI_SUCCESS; + +ON_EXIT: + + if (!EFI_ERROR(Status)) { + Status = Dhcp6DequeueRetry ( + Instance, + Packet->Dhcp6.Header.TransactionId, + FALSE + ); + } + + return Status; } @@ -2378,17 +2438,13 @@ Dhcp6HandleAdvertiseMsg ( // display the associated status message to the user. // See the details in the section-17.1.3 of rfc-3315. // - Option = Dhcp6SeekOption( - Packet->Dhcp6.Option, - Packet->Length - 4, - Dhcp6OptStatusCode + Status = Dhcp6SeekStsOption ( + Instance, + Packet, + &Option ); - - if (Option != NULL) { - StsCode = NTOHS (ReadUnaligned16 ((UINT16 *) (Option + 4))); - if (StsCode != Dhcp6StsSuccess) { - return EFI_DEVICE_ERROR; - } + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; } // diff --git a/NetworkPkg/Dhcp6Dxe/Dhcp6Utility.c b/NetworkPkg/Dhcp6Dxe/Dhcp6Utility.c index 4c32028680..32247c927b 100644 --- a/NetworkPkg/Dhcp6Dxe/Dhcp6Utility.c +++ b/NetworkPkg/Dhcp6Dxe/Dhcp6Utility.c @@ -647,6 +647,75 @@ Dhcp6AppendOption ( return Buf; } +/** + Append the appointed IA Address option to Buf, and move Buf to the end. + + @param[in, out] Buf The pointer to the position to append. + @param[in] IaAddr The pointer to the IA Address. + @param[in] MessageType Message type of DHCP6 package. + + @return Buf The position to append the next option. + +**/ +UINT8 * +Dhcp6AppendIaAddrOption ( + IN OUT UINT8 *Buf, + IN EFI_DHCP6_IA_ADDRESS *IaAddr, + IN UINT32 MessageType +) +{ + + // The format of the IA Address option is: + // + // 0 1 2 3 + // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + // | OPTION_IAADDR | option-len | + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + // | | + // | IPv6 address | + // | | + // | | + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + // | preferred-lifetime | + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + // | valid-lifetime | + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + // . . + // . IAaddr-options . + // . . + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + // + // Fill the value of Ia Address option type + // + WriteUnaligned16 ((UINT16 *) Buf, HTONS (Dhcp6OptIaAddr)); + Buf += 2; + + WriteUnaligned16 ((UINT16 *) Buf, HTONS (sizeof (EFI_DHCP6_IA_ADDRESS))); + Buf += 2; + + CopyMem (Buf, &IaAddr->IpAddress, sizeof(EFI_IPv6_ADDRESS)); + Buf += sizeof(EFI_IPv6_ADDRESS); + + // + // Fill the value of preferred-lifetime and valid-lifetime. + // According to RFC3315 Chapter 18.1.2, the preferred-lifetime and valid-lifetime fields + // should set to 0 when initiate a Confirm message. + // + if (MessageType != Dhcp6MsgConfirm) { + WriteUnaligned32 ((UINT32 *) Buf, HTONL (IaAddr->PreferredLifetime)); + } + Buf += 4; + + if (MessageType != Dhcp6MsgConfirm) { + WriteUnaligned32 ((UINT32 *) Buf, HTONL (IaAddr->ValidLifetime)); + } + Buf += 4; + + return Buf; +} + /** Append the appointed Ia option to Buf, and move Buf to the end. @@ -655,6 +724,7 @@ Dhcp6AppendOption ( @param[in] Ia The pointer to the Ia. @param[in] T1 The time of T1. @param[in] T2 The time of T2. + @param[in] MessageType Message type of DHCP6 package. @return Buf The position to append the next Ia option. @@ -664,13 +734,13 @@ Dhcp6AppendIaOption ( IN OUT UINT8 *Buf, IN EFI_DHCP6_IA *Ia, IN UINT32 T1, - IN UINT32 T2 + IN UINT32 T2, + IN UINT32 MessageType ) { UINT8 *AddrOpt; UINT16 *Len; UINTN Index; - UINT16 Length; // // The format of IA_NA and IA_TA option: @@ -713,9 +783,9 @@ Dhcp6AppendIaOption ( // Fill the value of t1 and t2 if iana, keep it 0xffffffff if no specified. // if (Ia->Descriptor.Type == Dhcp6OptIana) { - WriteUnaligned32 ((UINT32 *) Buf, ((T1 != 0) ? T1 : 0xffffffff)); + WriteUnaligned32 ((UINT32 *) Buf, HTONL ((T1 != 0) ? T1 : 0xffffffff)); Buf += 4; - WriteUnaligned32 ((UINT32 *) Buf, ((T2 != 0) ? T2 : 0xffffffff)); + WriteUnaligned32 ((UINT32 *) Buf, HTONL ((T2 != 0) ? T2 : 0xffffffff)); Buf += 4; } @@ -723,15 +793,8 @@ Dhcp6AppendIaOption ( // Fill all the addresses belong to the Ia // for (Index = 0; Index < Ia->IaAddressCount; Index++) { - - AddrOpt = (UINT8 *) Ia->IaAddress + Index * sizeof (EFI_DHCP6_IA_ADDRESS); - Length = HTONS ((UINT16) sizeof (EFI_DHCP6_IA_ADDRESS)); - Buf = Dhcp6AppendOption ( - Buf, - HTONS (Dhcp6OptIaAddr), - Length, - AddrOpt - ); + AddrOpt = (UINT8 *) Ia->IaAddress + Index * sizeof (EFI_DHCP6_IA_ADDRESS); + Buf = Dhcp6AppendIaAddrOption (Buf, (EFI_DHCP6_IA_ADDRESS *) AddrOpt, MessageType); } // @@ -827,7 +890,7 @@ SetElapsedTime ( // // Sentinel value of 0 means that this is the first DHCP packet that we are - // sending and that we need to initialize the value. First DHCP Solicit + // sending and that we need to initialize the value. First DHCP message // gets 0 elapsed-time. Otherwise, calculate based on StartTime. // if (Instance->StartTime == 0) { @@ -934,10 +997,39 @@ Dhcp6SeekIaOption ( return Option; } +/** + Check whether the incoming IPv6 address in IaAddr is one of the maintained + addresses in the IA control blcok. + + @param[in] IaAddr The pointer to the IA Address to be checked. + @param[in] CurrentIa The pointer to the IA in IA control block. + + @retval TRUE Yes, this Address is already in IA control block. + @retval FALSE No, this Address is NOT in IA control block. + +**/ +BOOLEAN +Dhcp6AddrIsInCurrentIa ( + IN EFI_DHCP6_IA_ADDRESS *IaAddr, + IN EFI_DHCP6_IA *CurrentIa + ) +{ + UINT32 Index; + + ASSERT (IaAddr != NULL && CurrentIa != NULL); + + for (Index = 0; Index < CurrentIa->IaAddressCount; Index++) { + if (EFI_IP6_EQUAL(&IaAddr->IpAddress, &CurrentIa->IaAddress[Index].IpAddress)) { + return TRUE; + } + } + return FALSE; +} /** Parse the address option and update the address infomation. + @param[in] CurrentIa The pointer to the Ia Address in control blcok. @param[in] IaInnerOpt The pointer to the buffer. @param[in] IaInnerLen The length to parse. @param[out] AddrNum The number of addresses. @@ -946,6 +1038,7 @@ Dhcp6SeekIaOption ( **/ VOID Dhcp6ParseAddrOption ( + IN EFI_DHCP6_IA *CurrentIa, IN UINT8 *IaInnerOpt, IN UINT16 IaInnerLen, OUT UINT32 *AddrNum, @@ -956,6 +1049,8 @@ Dhcp6ParseAddrOption ( UINT16 DataLen; UINT16 OpCode; UINT32 ValidLt; + UINT32 PreferredLt; + EFI_DHCP6_IA_ADDRESS *IaAddr; // // The format of the IA Address option: @@ -992,19 +1087,21 @@ Dhcp6ParseAddrOption ( while (Cursor < IaInnerOpt + IaInnerLen) { // - // Count the Ia address option with non-0 valid time. + // Refer to RFC3315 Chapter 18.1.8, we need to update lifetimes for any addresses in the IA option + // that the client already has recorded in the IA, and discard the Ia address option with 0 valid time. // OpCode = ReadUnaligned16 ((UINT16 *) Cursor); - ValidLt = ReadUnaligned32 ((UINT32 *) (Cursor + 24)); - if (OpCode == HTONS (Dhcp6OptIaAddr) && ValidLt != 0) { - + PreferredLt = NTOHL (ReadUnaligned32 ((UINT32 *) (Cursor + 20))); + ValidLt = NTOHL (ReadUnaligned32 ((UINT32 *) (Cursor + 24))); + IaAddr = (EFI_DHCP6_IA_ADDRESS *) (Cursor + 4); + if (OpCode == HTONS (Dhcp6OptIaAddr) && ValidLt >= PreferredLt && + (Dhcp6AddrIsInCurrentIa(IaAddr, CurrentIa) || ValidLt !=0)) { if (AddrBuf != NULL) { - CopyMem (AddrBuf, Cursor + 4, sizeof (EFI_DHCP6_IA_ADDRESS)); - AddrBuf->PreferredLifetime = NTOHL (AddrBuf->PreferredLifetime); - AddrBuf->ValidLifetime = NTOHL (AddrBuf->ValidLifetime); + CopyMem (AddrBuf, IaAddr, sizeof (EFI_DHCP6_IA_ADDRESS)); + AddrBuf->PreferredLifetime = PreferredLt; + AddrBuf->ValidLifetime = ValidLt; AddrBuf = (EFI_DHCP6_IA_ADDRESS *) ((UINT8 *) AddrBuf + sizeof (EFI_DHCP6_IA_ADDRESS)); } - (*AddrNum)++; } DataLen = NTOHS (ReadUnaligned16 ((UINT16 *) (Cursor + 2))); @@ -1025,6 +1122,7 @@ Dhcp6ParseAddrOption ( @retval EFI_NOT_FOUND No valid IA option is found. @retval EFI_SUCCESS Create an IA control block successfully. @retval EFI_OUT_OF_RESOURCES Required system resources could not be allocated. + @retval EFI_DEVICE_ERROR An unexpected error. **/ EFI_STATUS @@ -1041,14 +1139,14 @@ Dhcp6GenerateIaCb ( EFI_DHCP6_IA *Ia; if (Instance->IaCb.Ia == NULL) { - return EFI_NOT_FOUND; + return EFI_DEVICE_ERROR; } // // Calculate the number of addresses for this Ia, excluding the addresses with // the value 0 of valid lifetime. // - Dhcp6ParseAddrOption (IaInnerOpt, IaInnerLen, &AddrNum, NULL); + Dhcp6ParseAddrOption (Instance->IaCb.Ia, IaInnerOpt, IaInnerLen, &AddrNum, NULL); if (AddrNum == 0) { return EFI_NOT_FOUND; @@ -1070,7 +1168,7 @@ Dhcp6GenerateIaCb ( Ia->State = Instance->IaCb.Ia->State; Ia->IaAddressCount = AddrNum; CopyMem (&Ia->Descriptor, &Instance->Config->IaDescriptor, sizeof (EFI_DHCP6_IA_DESCRIPTOR)); - Dhcp6ParseAddrOption (IaInnerOpt, IaInnerLen, &AddrNum, Ia->IaAddress); + Dhcp6ParseAddrOption (Instance->IaCb.Ia, IaInnerOpt, IaInnerLen, &AddrNum, Ia->IaAddress); // // Free original IA resource. diff --git a/NetworkPkg/Dhcp6Dxe/Dhcp6Utility.h b/NetworkPkg/Dhcp6Dxe/Dhcp6Utility.h index 2a44d0068f..8c3151e306 100644 --- a/NetworkPkg/Dhcp6Dxe/Dhcp6Utility.h +++ b/NetworkPkg/Dhcp6Dxe/Dhcp6Utility.h @@ -192,6 +192,7 @@ Dhcp6AppendOption ( @param[in] Ia The pointer to the Ia. @param[in] T1 The time of T1. @param[in] T2 The time of T2. + @param[in] MessageType Message type of DHCP6 package. @return Buf The position to append the next Ia option. @@ -201,7 +202,8 @@ Dhcp6AppendIaOption ( IN OUT UINT8 *Buf, IN EFI_DHCP6_IA *Ia, IN UINT32 T1, - IN UINT32 T2 + IN UINT32 T2, + IN UINT32 MessageType ); /** @@ -274,6 +276,7 @@ Dhcp6SeekIaOption ( /** Parse the address option and update the address info. + @param[in] CurrentIa The pointer to the Ia Address in control blcok. @param[in] IaInnerOpt The pointer to the buffer. @param[in] IaInnerLen The length to parse. @param[out] AddrNum The number of addresses. @@ -282,6 +285,7 @@ Dhcp6SeekIaOption ( **/ VOID Dhcp6ParseAddrOption ( + IN EFI_DHCP6_IA *CurrentIa, IN UINT8 *IaInnerOpt, IN UINT16 IaInnerLen, OUT UINT32 *AddrNum, @@ -300,6 +304,7 @@ Dhcp6ParseAddrOption ( @retval EFI_NOT_FOUND No valid IA option is found. @retval EFI_SUCCESS Create an IA control block successfully. @retval EFI_OUT_OF_RESOURCES Required system resources could not be allocated. + @retval EFI_DEVICE_ERROR An unexpected error. **/ EFI_STATUS