dhcp4impl.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 980 行 · 第 1/2 页
C
980 行
if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
goto ON_ERROR;
}
Instance->CompletionEvent = CompletionEvent;
//
// Restore the TPL now, don't call poll function at NET_TPL_LOCK.
//
NET_RESTORE_TPL (OldTpl);
if (CompletionEvent == NULL) {
while (DhcpSb->IoStatus == EFI_ALREADY_STARTED) {
DhcpSb->UdpIo->Udp->Poll (DhcpSb->UdpIo->Udp);
}
return DhcpSb->IoStatus;
}
return EFI_SUCCESS;
ON_ERROR:
NET_RESTORE_TPL (OldTpl);
return Status;
}
STATIC
EFI_STATUS
EFIAPI
EfiDhcp4RenewRebind (
IN EFI_DHCP4_PROTOCOL *This,
IN BOOLEAN RebindRequest,
IN EFI_EVENT CompletionEvent OPTIONAL
)
/*++
Routine Description:
Request an extra manual renew/rebind.
Arguments:
This - The DHCP protocol instance
RebindRequest - TRUE if request a rebind, otherwise renew it
CompletionEvent - Event to signal when complete
Returns:
EFI_INVALID_PARAMETER - The parameters are invalid
EFI_NOT_STARTED - The DHCP protocol hasn't been started.
EFI_ACCESS_DENIED - The DHCP protocol isn't in Bound state.
EFI_SUCCESS - The DHCP is renewed/rebound.
--*/
{
DHCP_PROTOCOL *Instance;
DHCP_SERVICE *DhcpSb;
EFI_STATUS Status;
EFI_TPL OldTpl;
//
// First validate the parameters
//
if (This == NULL) {
return EFI_INVALID_PARAMETER;
}
Instance = DHCP_INSTANCE_FROM_THIS (This);
if (Instance->Signature != DHCP_PROTOCOL_SIGNATURE) {
return EFI_INVALID_PARAMETER;
}
OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);
DhcpSb = Instance->Service;
if (DhcpSb->DhcpState == Dhcp4Stopped) {
Status = EFI_NOT_STARTED;
goto ON_ERROR;
}
if (DhcpSb->DhcpState != Dhcp4Bound) {
Status = EFI_ACCESS_DENIED;
goto ON_ERROR;
}
if (DHCP_IS_BOOTP (DhcpSb->Para)) {
return EFI_SUCCESS;
}
//
// Transit the states then send a extra DHCP request
//
if (!RebindRequest) {
DhcpSetState (DhcpSb, Dhcp4Renewing, FALSE);
} else {
DhcpSetState (DhcpSb, Dhcp4Rebinding, FALSE);
}
Status = DhcpSendMessage (
DhcpSb,
DhcpSb->Selected,
DhcpSb->Para,
DHCP_MSG_REQUEST,
"Extra renew/rebind by the application"
);
if (EFI_ERROR (Status)) {
DhcpSetState (DhcpSb, Dhcp4Bound, FALSE);
goto ON_ERROR;
}
DhcpSb->ExtraRefresh = TRUE;
DhcpSb->IoStatus = EFI_ALREADY_STARTED;
Instance->RenewRebindEvent = CompletionEvent;
NET_RESTORE_TPL (OldTpl);
if (CompletionEvent == NULL) {
while (DhcpSb->IoStatus == EFI_ALREADY_STARTED) {
DhcpSb->UdpIo->Udp->Poll (DhcpSb->UdpIo->Udp);
}
return DhcpSb->IoStatus;
}
return EFI_SUCCESS;
ON_ERROR:
NET_RESTORE_TPL (OldTpl);
return Status;
}
STATIC
EFI_STATUS
EFIAPI
EfiDhcp4Release (
IN EFI_DHCP4_PROTOCOL *This
)
/*++
Routine Description:
Release the current acquired lease.
Arguments:
This - The DHCP protocol instance
Returns:
EFI_INVALID_PARAMETER - The parameter is invalid
EFI_DEVICE_ERROR - Failed to transmit the DHCP release packet
EFI_ACCESS_DENIED - The DHCP service isn't in one of the connected state.
EFI_SUCCESS - The lease is released.
--*/
{
DHCP_PROTOCOL *Instance;
DHCP_SERVICE *DhcpSb;
EFI_STATUS Status;
EFI_TPL OldTpl;
//
// First validate the parameters
//
if (This == NULL) {
return EFI_INVALID_PARAMETER;
}
Instance = DHCP_INSTANCE_FROM_THIS (This);
if (Instance->Signature != DHCP_PROTOCOL_SIGNATURE) {
return EFI_INVALID_PARAMETER;
}
Status = EFI_SUCCESS;
OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);
DhcpSb = Instance->Service;
if ((DhcpSb->DhcpState != Dhcp4InitReboot) && (DhcpSb->DhcpState != Dhcp4Bound)) {
Status = EFI_ACCESS_DENIED;
goto ON_EXIT;
}
if (!DHCP_IS_BOOTP (DhcpSb->Para) && (DhcpSb->DhcpState == Dhcp4Bound)) {
Status = DhcpSendMessage (
DhcpSb,
DhcpSb->Selected,
DhcpSb->Para,
DHCP_MSG_RELEASE,
NULL
);
if (EFI_ERROR (Status)) {
Status = EFI_DEVICE_ERROR;
goto ON_EXIT;
}
}
DhcpCleanLease (DhcpSb);
ON_EXIT:
NET_RESTORE_TPL (OldTpl);
return Status;
}
STATIC
EFI_STATUS
EFIAPI
EfiDhcp4Stop (
IN EFI_DHCP4_PROTOCOL *This
)
/*++
Routine Description:
Stop the current DHCP process. After this, other DHCP child
can gain control of the service, configure and use it.
Arguments:
This - The DHCP protocol instance
Returns:
EFI_INVALID_PARAMETER - The parameter is invalid.
EFI_SUCCESS - The DHCP process is stopped.
--*/
{
DHCP_PROTOCOL *Instance;
DHCP_SERVICE *DhcpSb;
EFI_TPL OldTpl;
//
// First validate the parameters
//
if (This == NULL) {
return EFI_INVALID_PARAMETER;
}
Instance = DHCP_INSTANCE_FROM_THIS (This);
if (Instance->Signature != DHCP_PROTOCOL_SIGNATURE) {
return EFI_INVALID_PARAMETER;
}
OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);
DhcpSb = Instance->Service;
DhcpCleanLease (DhcpSb);
DhcpSb->DhcpState = Dhcp4Stopped;
DhcpSb->ServiceState = DHCP_UNCONFIGED;
NET_RESTORE_TPL (OldTpl);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
EFIAPI
EfiDhcp4Build (
IN EFI_DHCP4_PROTOCOL *This,
IN EFI_DHCP4_PACKET *SeedPacket,
IN UINT32 DeleteCount,
IN UINT8 *DeleteList OPTIONAL,
IN UINT32 AppendCount,
IN EFI_DHCP4_PACKET_OPTION *AppendList[] OPTIONAL,
OUT EFI_DHCP4_PACKET **NewPacket
)
/*++
Routine Description:
Build a new DHCP packet from the seed packet. Options may be deleted or
appended. The caller should free the NewPacket when finished using it.
Arguments:
This - The DHCP protocol instance.
SeedPacket - The seed packet to start with
DeleteCount - The number of options to delete
DeleteList - The options to delete from the packet
AppendCount - The number of options to append
AppendList - The options to append to the packet
NewPacket - The new packet, allocated and built by this function.
Returns:
EFI_INVALID_PARAMETER - The parameters are invalid.
EFI_OUT_OF_RESOURCES - Failed to allocate memory
EFI_SUCCESS - The packet is build.
--*/
{
//
// First validate the parameters
//
if ((This == NULL) || (NewPacket == NULL)) {
return EFI_INVALID_PARAMETER;
}
if ((SeedPacket == NULL) || (SeedPacket->Dhcp4.Magik != DHCP_OPTION_MAGIC) ||
EFI_ERROR (DhcpValidateOptions (SeedPacket, NULL))) {
return EFI_INVALID_PARAMETER;
}
if (((DeleteCount == 0) && (AppendCount == 0)) ||
((DeleteCount != 0) && (DeleteList == NULL)) ||
((AppendCount != 0) && (AppendList == NULL))) {
return EFI_INVALID_PARAMETER;
}
return DhcpBuild (
SeedPacket,
DeleteCount,
DeleteList,
AppendCount,
AppendList,
NewPacket
);
}
STATIC
EFI_STATUS
EFIAPI
EfiDhcp4TransmitReceive (
IN EFI_DHCP4_PROTOCOL *This,
IN EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token
)
/*++
Routine Description:
Transmit and receive a packet through this DHCP service.
This is unsupported.
Arguments:
This - The DHCP protocol instance
Token - The transmit and receive instance
Returns:
EFI_UNSUPPORTED - It always returns unsupported.
--*/
{
//
// This function is for PXE, leave it for now
//
return EFI_UNSUPPORTED;
}
STATIC
EFI_STATUS
Dhcp4ParseCheckOption (
IN UINT8 Tag,
IN UINT8 Len,
IN UINT8 *Data,
IN VOID *Context
)
/*++
Routine Description:
Callback function for DhcpIterateOptions. This callback sets the
EFI_DHCP4_PACKET_OPTION array in the DHCP_PARSE_CONTEXT to point
the individual DHCP option in the packet.
Arguments:
Tag - The DHCP option type
Len - length of the DHCP option data
Data - The DHCP option data
Context - The context, to pass several parameters in.
Returns:
EFI_SUCCESS - It always returns EFI_SUCCESS
--*/
{
DHCP_PARSE_CONTEXT *Parse;
Parse = (DHCP_PARSE_CONTEXT *) Context;
Parse->Index++;
if (Parse->Index < Parse->OptionCount) {
//
// Use _CR to get the memory position of EFI_DHCP4_PACKET_OPTION for
// the EFI_DHCP4_PACKET_OPTION->Data because DhcpIterateOptions only
// pass in the point to option data.
//
Parse->Option[Parse->Index - 1] = _CR (Data, EFI_DHCP4_PACKET_OPTION, Data);
}
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
EFIAPI
EfiDhcp4Parse (
IN EFI_DHCP4_PROTOCOL *This,
IN EFI_DHCP4_PACKET *Packet,
IN OUT UINT32 *OptionCount,
OUT EFI_DHCP4_PACKET_OPTION *PacketOptionList[] OPTIONAL
)
/*++
Routine Description:
Parse the DHCP options in the Packet into the PacketOptionList.
User should allocate this array of EFI_DHCP4_PACKET_OPTION points.
Arguments:
This - The DHCP protocol instance
Packet - The DHCP packet to parse
OptionCount - On input, the size of the PacketOptionList; On output,
the actual number of options processed.
PacketOptionList - The array of EFI_DHCP4_PACKET_OPTION points
Returns:
EFI_INVALID_PARAMETER - The parameters are invalid.
EFI_BUFFER_TOO_SMALL - A bigger array of points is needed.
EFI_SUCCESS - The options are parsed.
--*/
{
DHCP_PARSE_CONTEXT Context;
EFI_STATUS Status;
//
// First validate the parameters
//
if ((This == NULL) || (Packet == NULL) || (OptionCount == NULL)) {
return EFI_INVALID_PARAMETER;
}
if ((Packet->Size < Packet->Length + 2 * sizeof (UINT32)) ||
(Packet->Dhcp4.Magik != DHCP_OPTION_MAGIC) ||
EFI_ERROR (DhcpValidateOptions (Packet, NULL))) {
return EFI_INVALID_PARAMETER;
}
if ((*OptionCount != 0) && (PacketOptionList == NULL)) {
return EFI_BUFFER_TOO_SMALL;
}
NetZeroMem (PacketOptionList, *OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *));
Context.Option = PacketOptionList;
Context.OptionCount = *OptionCount;
Context.Index = 0;
Status = DhcpIterateOptions (Packet, Dhcp4ParseCheckOption, &Context);
if (EFI_ERROR (Status)) {
return Status;
}
*OptionCount = Context.Index;
if (Context.Index > Context.OptionCount) {
return EFI_BUFFER_TOO_SMALL;
}
return EFI_SUCCESS;
}
EFI_DHCP4_PROTOCOL mDhcp4ProtocolTemplate = {
EfiDhcp4GetModeData,
EfiDhcp4Configure,
EfiDhcp4Start,
EfiDhcp4RenewRebind,
EfiDhcp4Release,
EfiDhcp4Stop,
EfiDhcp4Build,
EfiDhcp4TransmitReceive,
EfiDhcp4Parse
};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?