ip4config.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 778 行 · 第 1/2 页
C
778 行
/*++
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
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
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
Ip4Config.c
Abstract:
This code implements the IP4Config and NicIp4Config protocols.
--*/
#include "Ip4Config.h"
IP4_CONFIG_INSTANCE *mIp4ConfigNicList[MAX_IP4_CONFIG_IN_VARIABLE];
VOID
EFIAPI
Ip4ConfigOnDhcp4Complete (
IN EFI_EVENT Event,
IN VOID *Context
);
STATIC
EFI_STATUS
EFIAPI
EfiNicIp4ConfigGetName (
IN EFI_NIC_IP4_CONFIG_PROTOCOL *This,
IN UINT16 *Name, OPTIONAL
IN NIC_ADDR *NicAddr OPTIONAL
)
/*++
Routine Description:
Return the name and MAC address for the NIC. The Name, if not NULL,
has at least IP4_NIC_NAME_LENGTH bytes.
Arguments:
This - The NIC IP4 CONFIG protocol
Name - The buffer to return the name
NicAddr - The buffer to return the MAC addr
Returns:
EFI_INVALID_PARAMETER - This is NULL
EFI_SUCCESS - The name or address of the NIC are returned.
--*/
{
IP4_CONFIG_INSTANCE *Instance;
if (This == NULL) {
return EFI_INVALID_PARAMETER;
}
Instance = IP4_CONFIG_INSTANCE_FROM_NIC_IP4CONFIG (This);
if (Name != NULL) {
NetCopyMem (Name, Instance->NicName, IP4_NIC_NAME_LENGTH);
}
if (NicAddr != NULL) {
*NicAddr = Instance->NicAddr;
}
return EFI_SUCCESS;
}
NIC_IP4_CONFIG_INFO *
Ip4ConfigGetNicInfo (
IN NIC_ADDR *NicAddr
)
/*++
Routine Description:
Get the NIC's configure information from the IP4 configure variable.
It will remove the invalid variable.
Arguments:
NicAddr - The NIC to check
Returns:
NULL if no configure for the NIC in the variable, or it is invalid.
Otherwise the NIC's IP configure parameter.
--*/
{
IP4_CONFIG_VARIABLE *Variable;
IP4_CONFIG_VARIABLE *NewVariable;
NIC_IP4_CONFIG_INFO *Config;
//
// Read the configuration parameter for this NicAddr from
// the EFI variable
//
Variable = Ip4ConfigReadVariable ();
if (Variable == NULL) {
return NULL;
}
Config = Ip4ConfigFindNicVariable (Variable, NicAddr);
if (Config == NULL) {
NetFreePool (Variable);
return NULL;
}
//
// Validate the configuration, if the configuration is invalid,
// remove it from the variable.
//
if (!Ip4ConfigIsValid (Config)) {
NewVariable = Ip4ConfigModifyVariable (Variable, &Config->NicAddr, NULL);
Ip4ConfigWriteVariable (NewVariable);
if (NewVariable != NULL) {
NetFreePool (NewVariable);
};
NetFreePool (Config);
Config = NULL;
}
NetFreePool (Variable);
return Config;
}
EFI_STATUS
EFIAPI
EfiNicIp4ConfigGetInfo (
IN EFI_NIC_IP4_CONFIG_PROTOCOL *This,
IN OUT UINTN *ConfigLen,
OUT NIC_IP4_CONFIG_INFO *NicConfig
)
/*++
Routine Description:
Get the configure parameter for this NIC.
Arguments:
This - The NIC IP4 CONFIG protocol
ConfigLen - The length of the NicConfig buffer.
NicConfig - The buffer to receive the NIC's configure parameter.
Returns:
EFI_INVALID_PARAMETER - This or ConfigLen is NULL
EFI_NOT_FOUND - There is no configure parameter for the NIC in NVRam.
--*/
{
IP4_CONFIG_INSTANCE *Instance;
NIC_IP4_CONFIG_INFO *Config;
EFI_STATUS Status;
UINTN Len;
if ((This == NULL) || (ConfigLen == NULL)) {
return EFI_INVALID_PARAMETER;
}
//
// Read the Nic's configuration parameter from variable
//
Instance = IP4_CONFIG_INSTANCE_FROM_NIC_IP4CONFIG (This);
Config = Ip4ConfigGetNicInfo (&Instance->NicAddr);
if (Config == NULL) {
return EFI_NOT_FOUND;
}
//
// Copy the data to user's buffer
//
Len = SIZEOF_NIC_IP4_CONFIG_INFO (Config);
if ((*ConfigLen < Len) || (NicConfig == NULL)) {
Status = EFI_BUFFER_TOO_SMALL;
} else {
Status = EFI_SUCCESS;
NetCopyMem (NicConfig, Config, Len);
}
*ConfigLen = Len;
NetFreePool (Config);
return Status;
}
EFI_STATUS
EFIAPI
EfiNicIp4ConfigSetInfo (
IN EFI_NIC_IP4_CONFIG_PROTOCOL *This,
IN NIC_IP4_CONFIG_INFO *NicConfig, OPTIONAL
IN BOOLEAN Reconfig
)
/*++
Routine Description:
Set the IP configure parameters for this NIC. If Reconfig is TRUE,
the IP driver will be informed to discard current auto configure
parameter and restart the auto configuration process. If current
there is a pending auto configuration, EFI_ALREADY_STARTED is
returned. You can only change the configure setting when either
the configure has finished or not started yet. If NicConfig, the
NIC's configure parameter is removed from the variable.
Arguments:
This - The NIC IP4 CONFIG protocol
NicConfig - The new NIC IP4 configure parameter
Reconfig - Inform the IP4 driver to restart the auto configuration
Returns:
EFI_INVALID_PARAMETER - This is NULL or the configure parameter is invalid.
EFI_ALREADY_STARTED - There is a pending auto configuration.
EFI_NOT_FOUND - No auto configure parameter is found
--*/
{
IP4_CONFIG_INSTANCE *Instance;
IP4_CONFIG_VARIABLE *Variable;
IP4_CONFIG_VARIABLE *NewVariable;
EFI_STATUS Status;
//
// Validate the parameters
//
if (This == NULL) {
return EFI_INVALID_PARAMETER;
}
Instance = IP4_CONFIG_INSTANCE_FROM_NIC_IP4CONFIG (This);
if ((NicConfig != NULL) && (!Ip4ConfigIsValid (NicConfig) ||
!NIC_ADDR_EQUAL (&NicConfig->NicAddr, &Instance->NicAddr))) {
return EFI_INVALID_PARAMETER;
}
if (Instance->State == IP4_CONFIG_STATE_STARTED) {
return EFI_ALREADY_STARTED;
}
//
// Update the parameter in the configure variable
//
Variable = Ip4ConfigReadVariable ();
if ((Variable == NULL) && (NicConfig == NULL)) {
return EFI_NOT_FOUND;
}
NewVariable = Ip4ConfigModifyVariable (Variable, &Instance->NicAddr, NicConfig);
Status = Ip4ConfigWriteVariable (NewVariable);
if (NewVariable != NULL) {
NetFreePool (NewVariable);
}
//
// Variable is NULL when saving the first configure parameter
//
if (Variable != NULL) {
NetFreePool (Variable);
}
if (EFI_ERROR (Status)) {
return Status;
}
//
// Signal the IP4 to run the auto configuration again
//
if (Reconfig && (Instance->ReconfigEvent != NULL)) {
Status = gBS->SignalEvent (Instance->ReconfigEvent);
}
return Status;
}
EFI_STATUS
EFIAPI
EfiIp4ConfigStart (
IN EFI_IP4_CONFIG_PROTOCOL *This,
IN EFI_EVENT DoneEvent,
IN EFI_EVENT ReconfigEvent
)
/*++
Routine Description:
Start the auto configuration process.
Arguments:
This - The IP4 configure protocol
DoneEvent - The event to signal when auto configure is done
ReconfigEvent - The event to signal when reconfigure is necessary.
Returns:
EFI_INVALID_PARAMETER - One of the function parameters is NULL.
EFI_ALREADY_STARTED - The auto configuration has already started.
EFI_SUCCESS - The auto configure is successfully started.
--*/
{
IP4_CONFIG_INSTANCE *Instance;
EFI_DHCP4_PROTOCOL *Dhcp4;
EFI_DHCP4_MODE_DATA Dhcp4Mode;
EFI_DHCP4_PACKET_OPTION *OptionList[1];
IP4_CONFIG_DHCP4_OPTION ParaList;
EFI_STATUS Status;
UINT32 Source;
if ((This == NULL) || (DoneEvent == NULL) || (ReconfigEvent == NULL)) {
return EFI_INVALID_PARAMETER;
}
Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (This);
if (Instance->State != IP4_CONFIG_STATE_IDLE) {
return EFI_ALREADY_STARTED;
}
Instance->DoneEvent = DoneEvent;
Instance->ReconfigEvent = ReconfigEvent;
Instance->NicConfig = Ip4ConfigGetNicInfo (&Instance->NicAddr);
if (Instance->NicConfig == NULL) {
Source = IP4_CONFIG_SOURCE_DHCP;
} else {
Source = Instance->NicConfig->Source;
}
//
// If the source is static, the auto configuration is done.
// return now.
//
if (Source == IP4_CONFIG_SOURCE_STATIC) {
Instance->State = IP4_CONFIG_STATE_CONFIGURED;
Instance->Result = EFI_SUCCESS;
gBS->SignalEvent (Instance->DoneEvent);
return EFI_SUCCESS;
}
//
// Start the dhcp process
//
ASSERT ((Source == IP4_CONFIG_SOURCE_DHCP) && (Instance->Dhcp4 == NULL));
Status = NetLibCreateServiceChild (
Instance->Controller,
Instance->Image,
&gEfiDhcp4ServiceBindingProtocolGuid,
&Instance->Dhcp4Handle
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
Status = gBS->OpenProtocol (
Instance->Dhcp4Handle,
&gEfiDhcp4ProtocolGuid,
(VOID **) &Instance->Dhcp4,
Instance->Image,
Instance->Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?