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 + -
显示快捷键?