1.Fix a bug in Dhcp4Dxe driver to correct the ‘secs’ field in DHCP message.
Signed-off-by: sfu5 Reviewed-by: tye Reviewed-by: xdu2 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12742 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
0d11446d51
commit
842d83d65e
@ -478,6 +478,7 @@ DhcpInitProtocol (
|
|||||||
Instance->RenewRebindEvent = NULL;
|
Instance->RenewRebindEvent = NULL;
|
||||||
Instance->Token = NULL;
|
Instance->Token = NULL;
|
||||||
Instance->UdpIo = NULL;
|
Instance->UdpIo = NULL;
|
||||||
|
Instance->ElaspedTime = 0;
|
||||||
NetbufQueInit (&Instance->ResponseQueue);
|
NetbufQueInit (&Instance->ResponseQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
This file implement the EFI_DHCP4_PROTOCOL interface.
|
This file implement the EFI_DHCP4_PROTOCOL interface.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -932,6 +932,12 @@ EfiDhcp4RenewRebind (
|
|||||||
DhcpSetState (DhcpSb, Dhcp4Rebinding, FALSE);
|
DhcpSetState (DhcpSb, Dhcp4Rebinding, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Clear initial time to make sure that elapsed-time
|
||||||
|
// is set to 0 for first REQUEST in renewal process.
|
||||||
|
//
|
||||||
|
Instance->ElaspedTime = 0;
|
||||||
|
|
||||||
Status = DhcpSendMessage (
|
Status = DhcpSendMessage (
|
||||||
DhcpSb,
|
DhcpSb,
|
||||||
DhcpSb->Selected,
|
DhcpSb->Selected,
|
||||||
@ -1723,3 +1729,19 @@ EfiDhcp4Parse (
|
|||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set the elapsed time based on the given instance and the pointer to the
|
||||||
|
elapsed time option.
|
||||||
|
|
||||||
|
@param[in] Elapsed The pointer to the position to append.
|
||||||
|
@param[in] Instance The pointer to the Dhcp4 instance.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
SetElapsedTime (
|
||||||
|
IN UINT16 *Elapsed,
|
||||||
|
IN DHCP_PROTOCOL *Instance
|
||||||
|
)
|
||||||
|
{
|
||||||
|
WriteUnaligned16 (Elapsed, HTONS(Instance->ElaspedTime));
|
||||||
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
RFC 1534: Interoperation Between DHCP and BOOTP
|
RFC 1534: Interoperation Between DHCP and BOOTP
|
||||||
RFC 3396: Encoding Long Options in DHCP.
|
RFC 3396: Encoding Long Options in DHCP.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -71,6 +71,7 @@ struct _DHCP_PROTOCOL {
|
|||||||
EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token;
|
EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token;
|
||||||
UDP_IO *UdpIo; // The UDP IO used for TransmitReceive.
|
UDP_IO *UdpIo; // The UDP IO used for TransmitReceive.
|
||||||
UINT32 Timeout;
|
UINT32 Timeout;
|
||||||
|
UINT16 ElaspedTime;
|
||||||
NET_BUF_QUEUE ResponseQueue;
|
NET_BUF_QUEUE ResponseQueue;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -183,4 +184,17 @@ DhcpCleanConfigure (
|
|||||||
IN OUT EFI_DHCP4_CONFIG_DATA *Config
|
IN OUT EFI_DHCP4_CONFIG_DATA *Config
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set the elapsed time based on the given instance and the pointer to the
|
||||||
|
elapsed time option.
|
||||||
|
|
||||||
|
@param[in] Elapsed The pointer to the position to append.
|
||||||
|
@param[in] Instance The pointer to the Dhcp4 instance.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
SetElapsedTime (
|
||||||
|
IN UINT16 *Elapsed,
|
||||||
|
IN DHCP_PROTOCOL *Instance
|
||||||
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
EFI DHCP protocol implementation.
|
EFI DHCP protocol implementation.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -37,6 +37,11 @@ DhcpInitRequest (
|
|||||||
|
|
||||||
ASSERT ((DhcpSb->DhcpState == Dhcp4Init) || (DhcpSb->DhcpState == Dhcp4InitReboot));
|
ASSERT ((DhcpSb->DhcpState == Dhcp4Init) || (DhcpSb->DhcpState == Dhcp4InitReboot));
|
||||||
|
|
||||||
|
//
|
||||||
|
// Clear initial time to make sure that elapsed-time is set to 0 for first Discover or REQUEST message.
|
||||||
|
//
|
||||||
|
DhcpSb->ActiveChild->ElaspedTime= 0;
|
||||||
|
|
||||||
if (DhcpSb->DhcpState == Dhcp4Init) {
|
if (DhcpSb->DhcpState == Dhcp4Init) {
|
||||||
DhcpSetState (DhcpSb, Dhcp4Selecting, FALSE);
|
DhcpSetState (DhcpSb, Dhcp4Selecting, FALSE);
|
||||||
Status = DhcpSendMessage (DhcpSb, NULL, NULL, DHCP_MSG_DISCOVER, NULL);
|
Status = DhcpSendMessage (DhcpSb, NULL, NULL, DHCP_MSG_DISCOVER, NULL);
|
||||||
@ -1218,6 +1223,17 @@ DhcpSendMessage (
|
|||||||
EFI_IP4 (Head->ClientAddr) = HTONL (DhcpSb->ClientAddr);
|
EFI_IP4 (Head->ClientAddr) = HTONL (DhcpSb->ClientAddr);
|
||||||
CopyMem (Head->ClientHwAddr, DhcpSb->Mac.Addr, DhcpSb->HwLen);
|
CopyMem (Head->ClientHwAddr, DhcpSb->Mac.Addr, DhcpSb->HwLen);
|
||||||
|
|
||||||
|
if ((Type == DHCP_MSG_DECLINE) || (Type == DHCP_MSG_RELEASE)) {
|
||||||
|
Head->Seconds = 0;
|
||||||
|
} else if ((Type == DHCP_MSG_REQUEST) && (DhcpSb->DhcpState == Dhcp4Requesting)) {
|
||||||
|
//
|
||||||
|
// Use the same value as the original DHCPDISCOVER message.
|
||||||
|
//
|
||||||
|
Head->Seconds = DhcpSb->LastPacket->Dhcp4.Header.Seconds;
|
||||||
|
} else {
|
||||||
|
SetElapsedTime(&Head->Seconds, DhcpSb->ActiveChild);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Append the DHCP message type
|
// Append the DHCP message type
|
||||||
//
|
//
|
||||||
@ -1429,7 +1445,12 @@ DhcpRetransmit (
|
|||||||
|
|
||||||
ASSERT (DhcpSb->LastPacket != NULL);
|
ASSERT (DhcpSb->LastPacket != NULL);
|
||||||
|
|
||||||
DhcpSb->LastPacket->Dhcp4.Header.Seconds = HTONS (*(UINT16 *)(&DhcpSb->LastTimeout));
|
//
|
||||||
|
// For REQUEST message in Dhcp4Requesting state, do not change the secs fields.
|
||||||
|
//
|
||||||
|
if (DhcpSb->DhcpState != Dhcp4Requesting) {
|
||||||
|
SetElapsedTime(&DhcpSb->LastPacket->Dhcp4.Header.Seconds, DhcpSb->ActiveChild);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Wrap it into a netbuf then send it.
|
// Wrap it into a netbuf then send it.
|
||||||
@ -1503,6 +1524,13 @@ DhcpOnTimerTick (
|
|||||||
DhcpSb = (DHCP_SERVICE *) Context;
|
DhcpSb = (DHCP_SERVICE *) Context;
|
||||||
Instance = DhcpSb->ActiveChild;
|
Instance = DhcpSb->ActiveChild;
|
||||||
|
|
||||||
|
//
|
||||||
|
// 0xffff is the maximum supported value for elapsed time according to RFC.
|
||||||
|
//
|
||||||
|
if (Instance != NULL && Instance->ElaspedTime < 0xffff) {
|
||||||
|
Instance->ElaspedTime++;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check the retransmit timer
|
// Check the retransmit timer
|
||||||
//
|
//
|
||||||
@ -1593,6 +1621,8 @@ DhcpOnTimerTick (
|
|||||||
goto END_SESSION;
|
goto END_SESSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Instance->ElaspedTime= 0;
|
||||||
|
|
||||||
Status = DhcpSendMessage (
|
Status = DhcpSendMessage (
|
||||||
DhcpSb,
|
DhcpSb,
|
||||||
DhcpSb->Selected,
|
DhcpSb->Selected,
|
||||||
@ -1613,6 +1643,8 @@ DhcpOnTimerTick (
|
|||||||
goto END_SESSION;
|
goto END_SESSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Instance->ElaspedTime= 0;
|
||||||
|
|
||||||
Status = DhcpSendMessage (
|
Status = DhcpSendMessage (
|
||||||
DhcpSb,
|
DhcpSb,
|
||||||
DhcpSb->Selected,
|
DhcpSb->Selected,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user