From: qhuang8 Date: Sun, 30 Sep 2007 03:08:02 +0000 (+0000) Subject: Update to support to produce Component Name and & Component Name 2 protocol based... X-Git-Tag: edk2-stable201903~22019 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=83cbd279b64f3081af5c06d50fa26e15a99fc066;ds=sidebyside Update to support to produce Component Name and & Component Name 2 protocol based on Feature flag PcdComponentNameDisable & PcdComponentName2Disable. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4006 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/MdeModulePkg/Universal/Network/ArpDxe/ArpDebug.h b/MdeModulePkg/Universal/Network/ArpDxe/ArpDebug.h index 05f542d086..fb69b07351 100644 --- a/MdeModulePkg/Universal/Network/ArpDxe/ArpDebug.h +++ b/MdeModulePkg/Universal/Network/ArpDxe/ArpDebug.h @@ -1,30 +1,30 @@ -/** @file - -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: - - ArpDebug.h - -Abstract: - - -**/ - -#ifndef _ARP_DEBUG_H_ -#define _ARP_DEBUG_H_ - - -#define ARP_DEBUG_TRACE(PrintArg) NET_DEBUG_TRACE ("Arp", PrintArg) -#define ARP_DEBUG_WARN(PrintArg) NET_DEBUG_WARNING ("Arp", PrintArg) -#define ARP_DEBUG_ERROR(PrintArg) NET_DEBUG_ERROR ("Arp", PrintArg) - -#endif - +/** @file + +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: + + ArpDebug.h + +Abstract: + + +**/ + +#ifndef _ARP_DEBUG_H_ +#define _ARP_DEBUG_H_ + + +#define ARP_DEBUG_TRACE(PrintArg) NET_DEBUG_TRACE ("Arp", PrintArg) +#define ARP_DEBUG_WARN(PrintArg) NET_DEBUG_WARNING ("Arp", PrintArg) +#define ARP_DEBUG_ERROR(PrintArg) NET_DEBUG_ERROR ("Arp", PrintArg) + +#endif + diff --git a/MdeModulePkg/Universal/Network/ArpDxe/ArpDriver.c b/MdeModulePkg/Universal/Network/ArpDxe/ArpDriver.c index 924028531a..58bc72219c 100644 --- a/MdeModulePkg/Universal/Network/ArpDxe/ArpDriver.c +++ b/MdeModulePkg/Universal/Network/ArpDxe/ArpDriver.c @@ -749,14 +749,13 @@ Returns: --*/ { - return EfiLibInstallAllDriverProtocols ( + return EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, &gArpDriverBinding, ImageHandle, &gArpComponentName, - NULL, - NULL + &gArpComponentName2 ); } diff --git a/MdeModulePkg/Universal/Network/ArpDxe/ArpDriver.h b/MdeModulePkg/Universal/Network/ArpDxe/ArpDriver.h index 93526c777f..457441a5c4 100644 --- a/MdeModulePkg/Universal/Network/ArpDxe/ArpDriver.h +++ b/MdeModulePkg/Universal/Network/ArpDxe/ArpDriver.h @@ -1,84 +1,85 @@ -/** @file - -Copyright (c) 2006 - 2007, 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: - - ArpDriver.c - -Abstract: - - -**/ - -#ifndef _ARP_DRIVER_H_ -#define _ARP_DRIVER_H_ - +/** @file + +Copyright (c) 2006 - 2007, 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: + + ArpDriver.c + +Abstract: + + +**/ + +#ifndef _ARP_DRIVER_H_ +#define _ARP_DRIVER_H_ + #include #include -#include +#include #include #include #include #include -#include - -#include "ArpDebug.h" - -// -// Global variables -// -extern EFI_DRIVER_BINDING_PROTOCOL gArpDriverBinding; -extern EFI_COMPONENT_NAME_PROTOCOL gArpComponentName; - -EFI_STATUS -EFIAPI -ArpDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -ArpDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -ArpDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -EFI_STATUS -EFIAPI -ArpServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE *ChildHandle - ); - -EFI_STATUS -EFIAPI -ArpServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ); - -#endif - +#include + +#include "ArpDebug.h" + +// +// Global variables +// +extern EFI_DRIVER_BINDING_PROTOCOL gArpDriverBinding; +extern EFI_COMPONENT_NAME_PROTOCOL gArpComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gArpComponentName2; + +EFI_STATUS +EFIAPI +ArpDriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +ArpDriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +ArpDriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +EFI_STATUS +EFIAPI +ArpServiceBindingCreateChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE *ChildHandle + ); + +EFI_STATUS +EFIAPI +ArpServiceBindingDestroyChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE ChildHandle + ); + +#endif + diff --git a/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h b/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h index 607443a99e..729cb5d68e 100644 --- a/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h +++ b/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h @@ -1,341 +1,341 @@ -/** @file - -Copyright (c) 2006 - 2007, 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: - - ArpImpl.h - -Abstract: - - -**/ - -#ifndef _ARP_IMPL_H_ -#define _ARP_IMPL_H_ - +/** @file + +Copyright (c) 2006 - 2007, 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: + + ArpImpl.h + +Abstract: + + +**/ + +#ifndef _ARP_IMPL_H_ +#define _ARP_IMPL_H_ + #include #include -#include +#include #include #include #include #include -#include -#include -#include -#include -#include - -#include "ArpDebug.h" - -#define ARP_ETHER_PROTO_TYPE 0x0806 -#define IPv4_ETHER_PROTO_TYPE 0x0800 -#define IPv6_ETHER_PROTO_TYPE 0x86DD - -#define ARP_OPCODE_REQUEST 0x0001 -#define ARP_OPCODE_REPLY 0x0002 - -#define ARP_DEFAULT_TIMEOUT_VALUE (400 * TICKS_PER_SECOND) -#define ARP_DEFAULT_RETRY_COUNT 2 -#define ARP_DEFAULT_RETRY_INTERVAL (5 * TICKS_PER_MS) -#define ARP_PERIODIC_TIMER_INTERVAL (500 * TICKS_PER_MS) - -#pragma pack(1) -typedef struct _ARP_HEAD { - UINT16 HwType; - UINT16 ProtoType; - UINT8 HwAddrLen; - UINT8 ProtoAddrLen; - UINT16 OpCode; -} ARP_HEAD; -#pragma pack() - -typedef struct _ARP_ADDRESS { - UINT8 *SenderHwAddr; - UINT8 *SenderProtoAddr; - UINT8 *TargetHwAddr; - UINT8 *TargetProtoAddr; -} ARP_ADDRESS; - -#define MATCH_SW_ADDRESS 0x1 -#define MATCH_HW_ADDRESS 0x2 - -typedef enum { - ByNone = 0, - ByProtoAddress = MATCH_SW_ADDRESS, - ByHwAddress = MATCH_HW_ADDRESS, - ByBoth = MATCH_SW_ADDRESS | MATCH_HW_ADDRESS -} FIND_OPTYPE; - -#define ARP_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'I') - -#define ARP_INSTANCE_DATA_FROM_THIS(a) \ - CR ( \ - (a), \ - ARP_INSTANCE_DATA, \ - ArpProto, \ - ARP_INSTANCE_DATA_SIGNATURE \ - ) - -typedef struct _ARP_SERVICE_DATA ARP_SERVICE_DATA; - -typedef struct _ARP_INSTANCE_DATA { - UINT32 Signature; - ARP_SERVICE_DATA *ArpService; - EFI_HANDLE Handle; - EFI_ARP_PROTOCOL ArpProto; - NET_LIST_ENTRY List; - EFI_ARP_CONFIG_DATA ConfigData; - BOOLEAN Configured; - BOOLEAN Destroyed; -} ARP_INSTANCE_DATA; - -#define ARP_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'S') - -#define ARP_SERVICE_DATA_FROM_THIS(a) \ - CR ( \ - (a), \ - ARP_SERVICE_DATA, \ - ServiceBinding, \ - ARP_SERVICE_DATA_SIGNATURE \ - ) - -struct _ARP_SERVICE_DATA { - UINT32 Signature; - EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; - - EFI_HANDLE MnpChildHandle; - EFI_HANDLE ImageHandle; - EFI_HANDLE ControllerHandle; - - EFI_MANAGED_NETWORK_PROTOCOL *Mnp; - EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData; - EFI_MANAGED_NETWORK_COMPLETION_TOKEN RxToken; - - EFI_SIMPLE_NETWORK_MODE SnpMode; - - NET_LOCK Lock; - - UINTN ChildrenNumber; - NET_LIST_ENTRY ChildrenList; - - NET_LIST_ENTRY PendingRequestTable; - NET_LIST_ENTRY DeniedCacheTable; - NET_LIST_ENTRY ResolvedCacheTable; - - EFI_EVENT PeriodicTimer; -}; - -typedef struct _USER_REQUEST_CONTEXT { - NET_LIST_ENTRY List; - ARP_INSTANCE_DATA *Instance; - EFI_EVENT UserRequestEvent; - VOID *UserHwAddrBuffer; -} USER_REQUEST_CONTEXT; - -#define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS) -#define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS) - -typedef struct _NET_ARP_ADDRESS { - UINT16 Type; - UINT8 Length; - UINT8 *AddressPtr; - union { - UINT8 ProtoAddress[ARP_MAX_PROTOCOL_ADDRESS_LEN]; - UINT8 HwAddress[ARP_MAX_HARDWARE_ADDRESS_LEN]; - } Buffer; -} NET_ARP_ADDRESS; - -typedef enum { - Hardware, - Protocol -} ARP_ADDRESS_TYPE; - -typedef struct _ARP_CACHE_ENTRY { - NET_LIST_ENTRY List; - - UINT32 RetryCount; - UINT32 DefaultDecayTime; - UINT32 DecayTime; - UINT32 NextRetryTime; - - NET_ARP_ADDRESS Addresses[2]; - - NET_LIST_ENTRY UserRequestList; -} ARP_CACHE_ENTRY; - -EFI_STATUS -EFIAPI -ArpConfigure ( - IN EFI_ARP_PROTOCOL *This, - IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL - ); - -EFI_STATUS -EFIAPI -ArpAdd ( - IN EFI_ARP_PROTOCOL *This, - IN BOOLEAN DenyFlag, - IN VOID *TargetSwAddress OPTIONAL, - IN VOID *TargetHwAddress OPTIONAL, - IN UINT32 TimeoutValue, - IN BOOLEAN Overwrite - ); - -EFI_STATUS -EFIAPI -ArpFind ( - IN EFI_ARP_PROTOCOL *This, - IN BOOLEAN BySwAddress, - IN VOID *AddressBuffer OPTIONAL, - OUT UINT32 *EntryLength OPTIONAL, - OUT UINT32 *EntryCount OPTIONAL, - OUT EFI_ARP_FIND_DATA **Entries OPTIONAL, - IN BOOLEAN Refresh - ); - -EFI_STATUS -EFIAPI -ArpDelete ( - IN EFI_ARP_PROTOCOL *This, - IN BOOLEAN BySwAddress, - IN VOID *AddressBuffer OPTIONAL - ); - -EFI_STATUS -EFIAPI -ArpFlush ( - IN EFI_ARP_PROTOCOL *This - ); - -EFI_STATUS -EFIAPI -ArpRequest ( - IN EFI_ARP_PROTOCOL *This, - IN VOID *TargetSwAddress OPTIONAL, - IN EFI_EVENT ResolvedEvent OPTIONAL, - OUT VOID *TargetHwAddress - ); - -EFI_STATUS -EFIAPI -ArpCancel ( - IN EFI_ARP_PROTOCOL *This, - IN VOID *TargetSwAddress OPTIONAL, - IN EFI_EVENT ResolvedEvent OPTIONAL - ); - -EFI_STATUS -ArpConfigureInstance ( - IN ARP_INSTANCE_DATA *Instance, - IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL - ); - -ARP_CACHE_ENTRY * -ArpFindDeniedCacheEntry ( - IN ARP_SERVICE_DATA *ArpService, - IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL, - IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL - ); - -ARP_CACHE_ENTRY * -ArpFindNextCacheEntryInTable ( - IN NET_LIST_ENTRY *CacheTable, - IN NET_LIST_ENTRY *StartEntry, - IN FIND_OPTYPE FindOpType, - IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL, - IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL - ); - -ARP_CACHE_ENTRY * -ArpAllocCacheEntry ( - IN ARP_INSTANCE_DATA *Instance - ); - -VOID -ArpFillAddressInCacheEntry ( - IN ARP_CACHE_ENTRY *CacheEntry, - IN NET_ARP_ADDRESS *HwAddr OPTIONAL, - IN NET_ARP_ADDRESS *SwAddr OPTIONAL - ); - -UINTN -ArpAddressResolved ( - IN ARP_CACHE_ENTRY *CacheEntry, - IN ARP_INSTANCE_DATA *Instance OPTIONAL, - IN EFI_EVENT UserEvent OPTIONAL - ); - -UINTN -ArpDeleteCacheEntry ( - IN ARP_INSTANCE_DATA *Instance, - IN BOOLEAN BySwAddress, - IN UINT8 *AddressBuffer OPTIONAL, - IN BOOLEAN Force - ); - -VOID -ArpSendFrame ( - IN ARP_INSTANCE_DATA *Instance, - IN ARP_CACHE_ENTRY *CacheEntry, - IN UINT16 ArpOpCode - ); - -VOID -ArpInitInstance ( - IN ARP_SERVICE_DATA *ArpService, - IN ARP_INSTANCE_DATA *Instance - ); - -VOID -EFIAPI -ArpOnFrameRcvd ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -VOID -EFIAPI -ArpOnFrameSent ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -VOID -EFIAPI -ArpTimerHandler ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -UINTN -ArpCancelRequest ( - IN ARP_INSTANCE_DATA *Instance, - IN VOID *TargetSwAddress OPTIONAL, - IN EFI_EVENT UserEvent OPTIONAL - ); - -EFI_STATUS -ArpFindCacheEntry ( - IN ARP_INSTANCE_DATA *Instance, - IN BOOLEAN BySwAddress, - IN VOID *AddressBuffer OPTIONAL, - OUT UINT32 *EntryLength OPTIONAL, - OUT UINT32 *EntryCount OPTIONAL, - OUT EFI_ARP_FIND_DATA **Entries OPTIONAL, - IN BOOLEAN Refresh - ); - -#endif - +#include +#include +#include +#include +#include + +#include "ArpDebug.h" + +#define ARP_ETHER_PROTO_TYPE 0x0806 +#define IPv4_ETHER_PROTO_TYPE 0x0800 +#define IPv6_ETHER_PROTO_TYPE 0x86DD + +#define ARP_OPCODE_REQUEST 0x0001 +#define ARP_OPCODE_REPLY 0x0002 + +#define ARP_DEFAULT_TIMEOUT_VALUE (400 * TICKS_PER_SECOND) +#define ARP_DEFAULT_RETRY_COUNT 2 +#define ARP_DEFAULT_RETRY_INTERVAL (5 * TICKS_PER_MS) +#define ARP_PERIODIC_TIMER_INTERVAL (500 * TICKS_PER_MS) + +#pragma pack(1) +typedef struct _ARP_HEAD { + UINT16 HwType; + UINT16 ProtoType; + UINT8 HwAddrLen; + UINT8 ProtoAddrLen; + UINT16 OpCode; +} ARP_HEAD; +#pragma pack() + +typedef struct _ARP_ADDRESS { + UINT8 *SenderHwAddr; + UINT8 *SenderProtoAddr; + UINT8 *TargetHwAddr; + UINT8 *TargetProtoAddr; +} ARP_ADDRESS; + +#define MATCH_SW_ADDRESS 0x1 +#define MATCH_HW_ADDRESS 0x2 + +typedef enum { + ByNone = 0, + ByProtoAddress = MATCH_SW_ADDRESS, + ByHwAddress = MATCH_HW_ADDRESS, + ByBoth = MATCH_SW_ADDRESS | MATCH_HW_ADDRESS +} FIND_OPTYPE; + +#define ARP_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'I') + +#define ARP_INSTANCE_DATA_FROM_THIS(a) \ + CR ( \ + (a), \ + ARP_INSTANCE_DATA, \ + ArpProto, \ + ARP_INSTANCE_DATA_SIGNATURE \ + ) + +typedef struct _ARP_SERVICE_DATA ARP_SERVICE_DATA; + +typedef struct _ARP_INSTANCE_DATA { + UINT32 Signature; + ARP_SERVICE_DATA *ArpService; + EFI_HANDLE Handle; + EFI_ARP_PROTOCOL ArpProto; + NET_LIST_ENTRY List; + EFI_ARP_CONFIG_DATA ConfigData; + BOOLEAN Configured; + BOOLEAN Destroyed; +} ARP_INSTANCE_DATA; + +#define ARP_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'S') + +#define ARP_SERVICE_DATA_FROM_THIS(a) \ + CR ( \ + (a), \ + ARP_SERVICE_DATA, \ + ServiceBinding, \ + ARP_SERVICE_DATA_SIGNATURE \ + ) + +struct _ARP_SERVICE_DATA { + UINT32 Signature; + EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; + + EFI_HANDLE MnpChildHandle; + EFI_HANDLE ImageHandle; + EFI_HANDLE ControllerHandle; + + EFI_MANAGED_NETWORK_PROTOCOL *Mnp; + EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData; + EFI_MANAGED_NETWORK_COMPLETION_TOKEN RxToken; + + EFI_SIMPLE_NETWORK_MODE SnpMode; + + NET_LOCK Lock; + + UINTN ChildrenNumber; + NET_LIST_ENTRY ChildrenList; + + NET_LIST_ENTRY PendingRequestTable; + NET_LIST_ENTRY DeniedCacheTable; + NET_LIST_ENTRY ResolvedCacheTable; + + EFI_EVENT PeriodicTimer; +}; + +typedef struct _USER_REQUEST_CONTEXT { + NET_LIST_ENTRY List; + ARP_INSTANCE_DATA *Instance; + EFI_EVENT UserRequestEvent; + VOID *UserHwAddrBuffer; +} USER_REQUEST_CONTEXT; + +#define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS) +#define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS) + +typedef struct _NET_ARP_ADDRESS { + UINT16 Type; + UINT8 Length; + UINT8 *AddressPtr; + union { + UINT8 ProtoAddress[ARP_MAX_PROTOCOL_ADDRESS_LEN]; + UINT8 HwAddress[ARP_MAX_HARDWARE_ADDRESS_LEN]; + } Buffer; +} NET_ARP_ADDRESS; + +typedef enum { + Hardware, + Protocol +} ARP_ADDRESS_TYPE; + +typedef struct _ARP_CACHE_ENTRY { + NET_LIST_ENTRY List; + + UINT32 RetryCount; + UINT32 DefaultDecayTime; + UINT32 DecayTime; + UINT32 NextRetryTime; + + NET_ARP_ADDRESS Addresses[2]; + + NET_LIST_ENTRY UserRequestList; +} ARP_CACHE_ENTRY; + +EFI_STATUS +EFIAPI +ArpConfigure ( + IN EFI_ARP_PROTOCOL *This, + IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL + ); + +EFI_STATUS +EFIAPI +ArpAdd ( + IN EFI_ARP_PROTOCOL *This, + IN BOOLEAN DenyFlag, + IN VOID *TargetSwAddress OPTIONAL, + IN VOID *TargetHwAddress OPTIONAL, + IN UINT32 TimeoutValue, + IN BOOLEAN Overwrite + ); + +EFI_STATUS +EFIAPI +ArpFind ( + IN EFI_ARP_PROTOCOL *This, + IN BOOLEAN BySwAddress, + IN VOID *AddressBuffer OPTIONAL, + OUT UINT32 *EntryLength OPTIONAL, + OUT UINT32 *EntryCount OPTIONAL, + OUT EFI_ARP_FIND_DATA **Entries OPTIONAL, + IN BOOLEAN Refresh + ); + +EFI_STATUS +EFIAPI +ArpDelete ( + IN EFI_ARP_PROTOCOL *This, + IN BOOLEAN BySwAddress, + IN VOID *AddressBuffer OPTIONAL + ); + +EFI_STATUS +EFIAPI +ArpFlush ( + IN EFI_ARP_PROTOCOL *This + ); + +EFI_STATUS +EFIAPI +ArpRequest ( + IN EFI_ARP_PROTOCOL *This, + IN VOID *TargetSwAddress OPTIONAL, + IN EFI_EVENT ResolvedEvent OPTIONAL, + OUT VOID *TargetHwAddress + ); + +EFI_STATUS +EFIAPI +ArpCancel ( + IN EFI_ARP_PROTOCOL *This, + IN VOID *TargetSwAddress OPTIONAL, + IN EFI_EVENT ResolvedEvent OPTIONAL + ); + +EFI_STATUS +ArpConfigureInstance ( + IN ARP_INSTANCE_DATA *Instance, + IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL + ); + +ARP_CACHE_ENTRY * +ArpFindDeniedCacheEntry ( + IN ARP_SERVICE_DATA *ArpService, + IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL, + IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL + ); + +ARP_CACHE_ENTRY * +ArpFindNextCacheEntryInTable ( + IN NET_LIST_ENTRY *CacheTable, + IN NET_LIST_ENTRY *StartEntry, + IN FIND_OPTYPE FindOpType, + IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL, + IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL + ); + +ARP_CACHE_ENTRY * +ArpAllocCacheEntry ( + IN ARP_INSTANCE_DATA *Instance + ); + +VOID +ArpFillAddressInCacheEntry ( + IN ARP_CACHE_ENTRY *CacheEntry, + IN NET_ARP_ADDRESS *HwAddr OPTIONAL, + IN NET_ARP_ADDRESS *SwAddr OPTIONAL + ); + +UINTN +ArpAddressResolved ( + IN ARP_CACHE_ENTRY *CacheEntry, + IN ARP_INSTANCE_DATA *Instance OPTIONAL, + IN EFI_EVENT UserEvent OPTIONAL + ); + +UINTN +ArpDeleteCacheEntry ( + IN ARP_INSTANCE_DATA *Instance, + IN BOOLEAN BySwAddress, + IN UINT8 *AddressBuffer OPTIONAL, + IN BOOLEAN Force + ); + +VOID +ArpSendFrame ( + IN ARP_INSTANCE_DATA *Instance, + IN ARP_CACHE_ENTRY *CacheEntry, + IN UINT16 ArpOpCode + ); + +VOID +ArpInitInstance ( + IN ARP_SERVICE_DATA *ArpService, + IN ARP_INSTANCE_DATA *Instance + ); + +VOID +EFIAPI +ArpOnFrameRcvd ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +VOID +EFIAPI +ArpOnFrameSent ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +VOID +EFIAPI +ArpTimerHandler ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +UINTN +ArpCancelRequest ( + IN ARP_INSTANCE_DATA *Instance, + IN VOID *TargetSwAddress OPTIONAL, + IN EFI_EVENT UserEvent OPTIONAL + ); + +EFI_STATUS +ArpFindCacheEntry ( + IN ARP_INSTANCE_DATA *Instance, + IN BOOLEAN BySwAddress, + IN VOID *AddressBuffer OPTIONAL, + OUT UINT32 *EntryLength OPTIONAL, + OUT UINT32 *EntryCount OPTIONAL, + OUT EFI_ARP_FIND_DATA **Entries OPTIONAL, + IN BOOLEAN Refresh + ); + +#endif + diff --git a/MdeModulePkg/Universal/Network/ArpDxe/ComponentName.c b/MdeModulePkg/Universal/Network/ArpDxe/ComponentName.c index ad92f3cc31..47d7bd70ae 100644 --- a/MdeModulePkg/Universal/Network/ArpDxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/ArpDxe/ComponentName.c @@ -23,6 +23,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI ArpComponentNameGetDriverName ( @@ -31,16 +70,86 @@ ArpComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI ArpComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName ); + // // EFI Component Name Protocol // @@ -48,13 +157,62 @@ EFI_COMPONENT_NAME_PROTOCOL gArpComponentName = { ArpComponentNameGetDriverName, ArpComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gArpComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) ArpComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) ArpComponentNameGetControllerName, + "en" + }; + STATIC EFI_UNICODE_STRING_TABLE mArpDriverNameTable[] = { - { "eng", L"ARP Network Service Driver" }, + { "eng;en", L"ARP Network Service Driver" }, { NULL, NULL } }; +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI ArpComponentNameGetDriverName ( @@ -62,94 +220,93 @@ ArpComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language - A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - DriverName - A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - Returns: - EFI_SUCCES - The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - DriverName is NULL. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { - return LookupUnicodeString ( + return LookupUnicodeString2 ( Language, - gArpComponentName.SupportedLanguages, + This->SupportedLanguages, mArpDriverNameTable, - DriverName + DriverName, + (BOOLEAN)(This == &gArpComponentName) ); } +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI ArpComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle - The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle - The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - ControllerName - A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - Returns: - EFI_SUCCESS - The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - ControllerName is NULL. - EFI_UNSUPPORTED - The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/Dhcp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/Dhcp4Dxe/ComponentName.c index 6808e771ac..8402ae5cfa 100644 --- a/MdeModulePkg/Universal/Network/Dhcp4Dxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/Dhcp4Dxe/ComponentName.c @@ -24,6 +24,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI DhcpComponentNameGetDriverName ( @@ -32,6 +71,75 @@ DhcpComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI DhcpComponentNameGetControllerName ( @@ -42,18 +150,29 @@ DhcpComponentNameGetControllerName ( OUT CHAR16 **ControllerName ); + // // EFI Component Name Protocol // -EFI_COMPONENT_NAME_PROTOCOL gDhcp4ComponentName = { +EFI_COMPONENT_NAME_PROTOCOL gDhcp4ComponentName = { DhcpComponentNameGetDriverName, DhcpComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gDhcp4ComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) DhcpComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) DhcpComponentNameGetControllerName, + "en" + }; + static EFI_UNICODE_STRING_TABLE mDhcpDriverNameTable[] = { { - "eng", + "eng;en", L"DHCP Protocol Driver" }, { @@ -62,6 +181,45 @@ static EFI_UNICODE_STRING_TABLE mDhcpDriverNameTable[] = { } }; +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI DhcpComponentNameGetDriverName ( @@ -69,41 +227,84 @@ DhcpComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language - A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - DriverName - A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - Returns: - EFI_SUCCES - The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - DriverName is NULL. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { - return LookupUnicodeString ( - Language, - gDhcp4ComponentName.SupportedLanguages, - mDhcpDriverNameTable, - DriverName - ); + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mDhcpDriverNameTable, + DriverName, + (BOOLEAN)(This == &gDhcp4ComponentName) + ); } +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI DhcpComponentNameGetControllerName ( @@ -113,50 +314,6 @@ DhcpComponentNameGetControllerName ( IN CHAR8 *Language, OUT CHAR16 **ControllerName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle - The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle - The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - ControllerName - A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language - specified by Language from the point of view of the - driver specified by This. - - Returns: - EFI_SUCCESS - The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - ChildHandle isn't NULL and isn't a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - ControllerName is NULL. - EFI_UNSUPPORTED - The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Driver.c b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Driver.c index d14697262c..9549790883 100644 --- a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Driver.c +++ b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Driver.c @@ -61,14 +61,13 @@ Returns: --*/ { - return EfiLibInstallAllDriverProtocols ( + return EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, &gDhcp4DriverBinding, ImageHandle, &gDhcp4ComponentName, - NULL, - NULL + &gDhcp4ComponentName2 ); } diff --git a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Driver.h b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Driver.h index 100bf56bb2..845a2847a3 100644 --- a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Driver.h +++ b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Driver.h @@ -1,67 +1,68 @@ -/** @file - -Copyright (c) 2006 - 2007, 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: - - Dhcp4Driver.h - -Abstract: - - Header for the DHCP4 driver - - -**/ - -#ifndef __EFI_DHCP4_DRIVER_H__ -#define __EFI_DHCP4_DRIVER_H__ - -extern EFI_COMPONENT_NAME_PROTOCOL gDhcp4ComponentName; - -EFI_STATUS -EFIAPI -Dhcp4DriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -Dhcp4DriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -Dhcp4DriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -EFI_STATUS -EFIAPI -Dhcp4ServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE *ChildHandle - ); - -EFI_STATUS -EFIAPI -Dhcp4ServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ); - -#endif +/** @file + +Copyright (c) 2006 - 2007, 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: + + Dhcp4Driver.h + +Abstract: + + Header for the DHCP4 driver + + +**/ + +#ifndef __EFI_DHCP4_DRIVER_H__ +#define __EFI_DHCP4_DRIVER_H__ + +extern EFI_COMPONENT_NAME_PROTOCOL gDhcp4ComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gDhcp4ComponentName2; + +EFI_STATUS +EFIAPI +Dhcp4DriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +Dhcp4DriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +Dhcp4DriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +EFI_STATUS +EFIAPI +Dhcp4ServiceBindingCreateChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE *ChildHandle + ); + +EFI_STATUS +EFIAPI +Dhcp4ServiceBindingDestroyChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE ChildHandle + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.h b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.h index d81d68fa1e..7a04109f4d 100644 --- a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.h +++ b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Impl.h @@ -1,34 +1,34 @@ -/** @file - -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: - - Dhcp4Impl.h - -Abstract: - - EFI DHCP protocol implementation - RFCs supported are: - RFC 2131: Dynamic Host Configuration Protocol - RFC 2132: DHCP Options and BOOTP Vendor Extensions - RFC 1534: Interoperation Between DHCP and BOOTP - RFC 3396: Encoding Long Options in DHCP - - -**/ - -#ifndef __EFI_DHCP4_IMPL_H__ -#define __EFI_DHCP4_IMPL_H__ - - +/** @file + +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: + + Dhcp4Impl.h + +Abstract: + + EFI DHCP protocol implementation + RFCs supported are: + RFC 2131: Dynamic Host Configuration Protocol + RFC 2132: DHCP Options and BOOTP Vendor Extensions + RFC 1534: Interoperation Between DHCP and BOOTP + RFC 3396: Encoding Long Options in DHCP + + +**/ + +#ifndef __EFI_DHCP4_IMPL_H__ +#define __EFI_DHCP4_IMPL_H__ + + #include @@ -39,121 +39,121 @@ Abstract: #include #include #include -#include -#include - -typedef struct _DHCP_SERVICE DHCP_SERVICE; -typedef struct _DHCP_PROTOCOL DHCP_PROTOCOL; - -#include "Dhcp4Option.h" -#include "Dhcp4Io.h" - -enum { - DHCP_SERVICE_SIGNATURE = EFI_SIGNATURE_32 ('D', 'H', 'C', 'P'), - DHCP_PROTOCOL_SIGNATURE = EFI_SIGNATURE_32 ('d', 'h', 'c', 'p'), - - // - // The state of the DHCP service. It starts as UNCONFIGED. If - // and active child configures the service successfully, it - // goes to CONFIGED. If the active child configures NULL, it - // goes back to UNCONFIGED. It becomes DESTORY if it is (partly) - // destoried. - // - DHCP_UNCONFIGED = 0, - DHCP_CONFIGED, - DHCP_DESTORY -}; - -struct _DHCP_PROTOCOL { - UINT32 Signature; - EFI_DHCP4_PROTOCOL Dhcp4Protocol; - NET_LIST_ENTRY Link; - EFI_HANDLE Handle; - DHCP_SERVICE *Service; - - BOOLEAN InDestory; - - EFI_EVENT CompletionEvent; - EFI_EVENT RenewRebindEvent; - - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token; -}; - -// -// DHCP driver is specical in that it is a singleton. Although it -// has a service binding, there can be only one active child. -// -struct _DHCP_SERVICE { - UINT32 Signature; - EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; - - INTN ServiceState; // CONFIGED, UNCONFIGED, and DESTORY - BOOLEAN InDestory; - - EFI_HANDLE Controller; - EFI_HANDLE Image; - - NET_LIST_ENTRY Children; - UINTN NumChildren; - - INTN DhcpState; - EFI_STATUS IoStatus; // the result of last user operation - UINT32 Xid; - - IP4_ADDR ClientAddr; // lease IP or configured client address - IP4_ADDR Netmask; - IP4_ADDR ServerAddr; - - EFI_DHCP4_PACKET *LastOffer; // The last received offer - EFI_DHCP4_PACKET *Selected; - DHCP_PARAMETER *Para; - - UINT32 Lease; - UINT32 T1; - UINT32 T2; - INTN ExtraRefresh; // This refresh is reqested by user - - UDP_IO_PORT *UdpIo; // Udp child receiving all DHCP message - UDP_IO_PORT *LeaseIoPort; // Udp child with lease IP - NET_BUF *LastPacket; // The last sent packet for retransmission - EFI_MAC_ADDRESS Mac; - UINT8 HwType; - UINT8 HwLen; - - DHCP_PROTOCOL *ActiveChild; - EFI_DHCP4_CONFIG_DATA ActiveConfig; - UINT32 UserOptionLen; - - // - // Timer event and various timer - // - EFI_EVENT Timer; - - UINT32 PacketToLive; // Retransmission timer for our packets - INTN CurRetry; - INTN MaxRetries; - - UINT32 WaitOffer; // Time to collect the offers - UINT32 LeaseLife; -}; - -typedef struct { - EFI_DHCP4_PACKET_OPTION **Option; - UINT32 OptionCount; - UINT32 Index; -} DHCP_PARSE_CONTEXT; - -#define DHCP_INSTANCE_FROM_THIS(Proto) \ - CR ((Proto), DHCP_PROTOCOL, Dhcp4Protocol, DHCP_PROTOCOL_SIGNATURE) - -#define DHCP_SERVICE_FROM_THIS(Sb) \ - CR ((Sb), DHCP_SERVICE, ServiceBinding, DHCP_SERVICE_SIGNATURE) - -extern EFI_DHCP4_PROTOCOL mDhcp4ProtocolTemplate; - -VOID -DhcpYieldControl ( - IN DHCP_SERVICE *DhcpSb - ); - -#endif +#include +#include + +typedef struct _DHCP_SERVICE DHCP_SERVICE; +typedef struct _DHCP_PROTOCOL DHCP_PROTOCOL; + +#include "Dhcp4Option.h" +#include "Dhcp4Io.h" + +enum { + DHCP_SERVICE_SIGNATURE = EFI_SIGNATURE_32 ('D', 'H', 'C', 'P'), + DHCP_PROTOCOL_SIGNATURE = EFI_SIGNATURE_32 ('d', 'h', 'c', 'p'), + + // + // The state of the DHCP service. It starts as UNCONFIGED. If + // and active child configures the service successfully, it + // goes to CONFIGED. If the active child configures NULL, it + // goes back to UNCONFIGED. It becomes DESTORY if it is (partly) + // destoried. + // + DHCP_UNCONFIGED = 0, + DHCP_CONFIGED, + DHCP_DESTORY +}; + +struct _DHCP_PROTOCOL { + UINT32 Signature; + EFI_DHCP4_PROTOCOL Dhcp4Protocol; + NET_LIST_ENTRY Link; + EFI_HANDLE Handle; + DHCP_SERVICE *Service; + + BOOLEAN InDestory; + + EFI_EVENT CompletionEvent; + EFI_EVENT RenewRebindEvent; + + EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token; +}; + +// +// DHCP driver is specical in that it is a singleton. Although it +// has a service binding, there can be only one active child. +// +struct _DHCP_SERVICE { + UINT32 Signature; + EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; + + INTN ServiceState; // CONFIGED, UNCONFIGED, and DESTORY + BOOLEAN InDestory; + + EFI_HANDLE Controller; + EFI_HANDLE Image; + + NET_LIST_ENTRY Children; + UINTN NumChildren; + + INTN DhcpState; + EFI_STATUS IoStatus; // the result of last user operation + UINT32 Xid; + + IP4_ADDR ClientAddr; // lease IP or configured client address + IP4_ADDR Netmask; + IP4_ADDR ServerAddr; + + EFI_DHCP4_PACKET *LastOffer; // The last received offer + EFI_DHCP4_PACKET *Selected; + DHCP_PARAMETER *Para; + + UINT32 Lease; + UINT32 T1; + UINT32 T2; + INTN ExtraRefresh; // This refresh is reqested by user + + UDP_IO_PORT *UdpIo; // Udp child receiving all DHCP message + UDP_IO_PORT *LeaseIoPort; // Udp child with lease IP + NET_BUF *LastPacket; // The last sent packet for retransmission + EFI_MAC_ADDRESS Mac; + UINT8 HwType; + UINT8 HwLen; + + DHCP_PROTOCOL *ActiveChild; + EFI_DHCP4_CONFIG_DATA ActiveConfig; + UINT32 UserOptionLen; + + // + // Timer event and various timer + // + EFI_EVENT Timer; + + UINT32 PacketToLive; // Retransmission timer for our packets + INTN CurRetry; + INTN MaxRetries; + + UINT32 WaitOffer; // Time to collect the offers + UINT32 LeaseLife; +}; + +typedef struct { + EFI_DHCP4_PACKET_OPTION **Option; + UINT32 OptionCount; + UINT32 Index; +} DHCP_PARSE_CONTEXT; + +#define DHCP_INSTANCE_FROM_THIS(Proto) \ + CR ((Proto), DHCP_PROTOCOL, Dhcp4Protocol, DHCP_PROTOCOL_SIGNATURE) + +#define DHCP_SERVICE_FROM_THIS(Sb) \ + CR ((Sb), DHCP_SERVICE, ServiceBinding, DHCP_SERVICE_SIGNATURE) + +extern EFI_DHCP4_PROTOCOL mDhcp4ProtocolTemplate; + +VOID +DhcpYieldControl ( + IN DHCP_SERVICE *DhcpSb + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.h b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.h index a05b66282e..560c791d09 100644 --- a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.h +++ b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.h @@ -1,115 +1,115 @@ -/** @file - -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: - - Dhcp4Io.h - -Abstract: - - The DHCP4 protocol implementation. - - -**/ - -#ifndef __EFI_DHCP4_IO_H__ -#define __EFI_DHCP4_IO_H__ - -#include - -#include - -#include -#include -#include -#include - - -enum { - DHCP_WAIT_OFFER = 3, // Time to wait the offers - DHCP_DEFAULT_LEASE = 7 *24 *60 *60, // Seven days as default. - DHCP_SERVER_PORT = 67, - DHCP_CLIENT_PORT = 68, - - // - // BOOTP header "op" field - // - BOOTP_REQUEST = 1, - BOOTP_REPLY = 2, - - // - // DHCP message types - // - DHCP_MSG_DISCOVER = 1, - DHCP_MSG_OFFER = 2, - DHCP_MSG_REQUEST = 3, - DHCP_MSG_DECLINE = 4, - DHCP_MSG_ACK = 5, - DHCP_MSG_NAK = 6, - DHCP_MSG_RELEASE = 7, - DHCP_MSG_INFORM = 8, - - // - // DHCP notify user type - // - DHCP_NOTIFY_COMPLETION = 1, - DHCP_NOTIFY_RENEWREBIND, - DHCP_NOTIFY_ALL -}; - -#define DHCP_IS_BOOTP(Parameter) (((Parameter) == NULL) || ((Parameter)->DhcpType == 0)) - -#define DHCP_CONNECTED(State) \ - (((State) == Dhcp4Bound) || ((State) == (Dhcp4Renewing)) || ((State) == Dhcp4Rebinding)) - -EFI_STATUS -DhcpSetState ( - IN DHCP_SERVICE *DhcpSb, - IN INTN State, - IN BOOLEAN CallUser - ); - -EFI_STATUS -DhcpSendMessage ( - IN DHCP_SERVICE *DhcpSb, - IN EFI_DHCP4_PACKET *Seed, - IN DHCP_PARAMETER *Para, - IN UINT8 Type, - IN UINT8 *Msg - ); - -VOID -EFIAPI -DhcpOnTimerTick ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -VOID -DhcpInput ( - NET_BUF *UdpPacket, - UDP_POINTS *Points, - EFI_STATUS IoStatus, - VOID *Context - ); - -EFI_STATUS -DhcpInitRequest ( - IN DHCP_SERVICE *DhcpSb - ); - -VOID -DhcpCleanLease ( - IN DHCP_SERVICE *DhcpSb - ); - -#endif +/** @file + +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: + + Dhcp4Io.h + +Abstract: + + The DHCP4 protocol implementation. + + +**/ + +#ifndef __EFI_DHCP4_IO_H__ +#define __EFI_DHCP4_IO_H__ + +#include + +#include + +#include +#include +#include +#include + + +enum { + DHCP_WAIT_OFFER = 3, // Time to wait the offers + DHCP_DEFAULT_LEASE = 7 *24 *60 *60, // Seven days as default. + DHCP_SERVER_PORT = 67, + DHCP_CLIENT_PORT = 68, + + // + // BOOTP header "op" field + // + BOOTP_REQUEST = 1, + BOOTP_REPLY = 2, + + // + // DHCP message types + // + DHCP_MSG_DISCOVER = 1, + DHCP_MSG_OFFER = 2, + DHCP_MSG_REQUEST = 3, + DHCP_MSG_DECLINE = 4, + DHCP_MSG_ACK = 5, + DHCP_MSG_NAK = 6, + DHCP_MSG_RELEASE = 7, + DHCP_MSG_INFORM = 8, + + // + // DHCP notify user type + // + DHCP_NOTIFY_COMPLETION = 1, + DHCP_NOTIFY_RENEWREBIND, + DHCP_NOTIFY_ALL +}; + +#define DHCP_IS_BOOTP(Parameter) (((Parameter) == NULL) || ((Parameter)->DhcpType == 0)) + +#define DHCP_CONNECTED(State) \ + (((State) == Dhcp4Bound) || ((State) == (Dhcp4Renewing)) || ((State) == Dhcp4Rebinding)) + +EFI_STATUS +DhcpSetState ( + IN DHCP_SERVICE *DhcpSb, + IN INTN State, + IN BOOLEAN CallUser + ); + +EFI_STATUS +DhcpSendMessage ( + IN DHCP_SERVICE *DhcpSb, + IN EFI_DHCP4_PACKET *Seed, + IN DHCP_PARAMETER *Para, + IN UINT8 Type, + IN UINT8 *Msg + ); + +VOID +EFIAPI +DhcpOnTimerTick ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +VOID +DhcpInput ( + NET_BUF *UdpPacket, + UDP_POINTS *Points, + EFI_STATUS IoStatus, + VOID *Context + ); + +EFI_STATUS +DhcpInitRequest ( + IN DHCP_SERVICE *DhcpSb + ); + +VOID +DhcpCleanLease ( + IN DHCP_SERVICE *DhcpSb + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Option.h b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Option.h index 4bc1920eb3..9db2e0a721 100644 --- a/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Option.h +++ b/MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Option.h @@ -1,266 +1,266 @@ -/** @file - -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: - - Dhcp4Option.h - -Abstract: - - To validate, parse and process the DHCP options - - -**/ - -#ifndef __EFI_DHCP4_OPTION_H__ -#define __EFI_DHCP4_OPTION_H__ - -// -// DHCP option tags (types) -// -enum { - // - // RFC1497 vendor extensions - // - DHCP_TAG_PAD = 0, // Pad Option - DHCP_TAG_EOP = 255, // End Option - DHCP_TAG_NETMASK = 1, // Subnet Mask - DHCP_TAG_TIME_OFFSET = 2, // Time Offset from UTC - DHCP_TAG_ROUTER = 3, // Router option, - DHCP_TAG_TIME_SERVER = 4, // Time Server - DHCP_TAG_NAME_SERVER = 5, // Name Server - DHCP_TAG_DNS_SERVER = 6, // Domain Name Server - DHCP_TAG_LOG_SERVER = 7, // Log Server - DHCP_TAG_COOKIE_SERVER = 8, // Cookie Server - DHCP_TAG_LPR_SERVER = 9, // LPR Print Server - DHCP_TAG_IMPRESS_SERVER = 10, // Impress Server - DHCP_TAG_RL_SERVER = 11, // Resource Location Server - DHCP_TAG_HOSTNAME = 12, // Host Name - DHCP_TAG_BOOTFILE_LEN = 13, // Boot File Size - DHCP_TAG_DUMP = 14, // Merit Dump File - DHCP_TAG_DOMAINNAME = 15, // Domain Name - DHCP_TAG_SWAP_SERVER = 16, // Swap Server - DHCP_TAG_ROOTPATH = 17, // Root path - DHCP_TAG_EXTEND_PATH = 18, // Extensions Path - - // - // IP Layer Parameters per Host - // - DHCP_TAG_IPFORWARD = 19, // IP Forwarding Enable/Disable - DHCP_TAG_NONLOCAL_SRR = 20, // on-Local Source Routing Enable/Disable - DHCP_TAG_POLICY_SRR = 21, // Policy Filter - DHCP_TAG_EMTU = 22, // Maximum Datagram Reassembly Size - DHCP_TAG_TTL = 23, // Default IP Time-to-live - DHCP_TAG_PATHMTU_AGE = 24, // Path MTU Aging Timeout - DHCP_TAG_PATHMTU_PLATEAU = 25, // Path MTU Plateau Table - - // - // IP Layer Parameters per Interface - // - DHCP_TAG_IFMTU = 26, // Interface MTU - DHCP_TAG_SUBNET_LOCAL = 27, // All Subnets are Local - DHCP_TAG_BROADCAST = 28, // Broadcast Address - DHCP_TAG_DISCOVER_MASK = 29, // Perform Mask Discovery - DHCP_TAG_SUPPLY_MASK = 30, // Mask Supplier - DHCP_TAG_DISCOVER_ROUTE = 31, // Perform Router Discovery - DHCP_TAG_ROUTER_SOLICIT = 32, // Router Solicitation Address - DHCP_TAG_STATIC_ROUTE = 33, // Static Route - - // - // Link Layer Parameters per Interface - // - DHCP_TAG_TRAILER = 34, // Trailer Encapsulation - DHCP_TAG_ARPAGE = 35, // ARP Cache Timeout - DHCP_TAG_ETHER_ENCAP = 36, // Ethernet Encapsulation - - // - // TCP Parameters - // - DHCP_TAG_TCP_TTL = 37, // TCP Default TTL - DHCP_TAG_KEEP_INTERVAL = 38, // TCP Keepalive Interval - DHCP_TAG_KEEP_GARBAGE = 39, // TCP Keepalive Garbage - - // - // Application and Service Parameters - // - DHCP_TAG_NIS_DOMAIN = 40, // Network Information Service Domain - DHCP_TAG_NIS_SERVER = 41, // Network Information Servers - DHCP_TAG_NTP_SERVER = 42, // Network Time Protocol Servers - DHCP_TAG_VENDOR = 43, // Vendor Specific Information - DHCP_TAG_NBNS = 44, // NetBIOS over TCP/IP Name Server - DHCP_TAG_NBDD = 45, // NetBIOS Datagram Distribution Server - DHCP_TAG_NBTYPE = 46, // NetBIOS over TCP/IP Node Type - DHCP_TAG_NBSCOPE = 47, // NetBIOS over TCP/IP Scope - DHCP_TAG_XFONT = 48, // X Window System Font Server - DHCP_TAG_XDM = 49, // X Window System Display Manager - DHCP_TAG_NISPLUS = 64, // Network Information Service+ Domain - DHCP_TAG_NISPLUS_SERVER = 65, // Network Information Service+ Servers - DHCP_TAG_MOBILEIP = 68, // Mobile IP Home Agent - DHCP_TAG_SMTP = 69, // Simple Mail Transport Protocol Server - DHCP_TAG_POP3 = 70, // Post Office Protocol (POP3) Server - DHCP_TAG_NNTP = 71, // Network News Transport Protocol Server - DHCP_TAG_WWW = 72, // Default World Wide Web (WWW) Server - DHCP_TAG_FINGER = 73, // Default Finger Server - DHCP_TAG_IRC = 74, // Default Internet Relay Chat (IRC) Server - DHCP_TAG_STTALK = 75, // StreetTalk Server - DHCP_TAG_STDA = 76, // StreetTalk Directory Assistance Server - DHCP_TAG_CLASSLESS_ROUTE = 121, // Classless Route - - // - // DHCP Extensions - // - DHCP_TAG_REQUEST_IP = 50, // Requested IP Address - DHCP_TAG_LEASE = 51, // IP Address Lease Time - DHCP_TAG_OVERLOAD = 52, // Option Overload - DHCP_TAG_TFTP = 66, // TFTP server name - DHCP_TAG_BOOTFILE = 67, // Bootfile name - DHCP_TAG_TYPE = 53, // DHCP Message Type - DHCP_TAG_SERVER_ID = 54, // Server Identifier - DHCP_TAG_PARA_LIST = 55, // Parameter Request List - DHCP_TAG_MESSAGE = 56, // Message - DHCP_TAG_MAXMSG = 57, // Maximum DHCP Message Size - DHCP_TAG_T1 = 58, // Renewal (T1) Time Value - DHCP_TAG_T2 = 59, // Rebinding (T2) Time Value - DHCP_TAG_VENDOR_CLASS = 60, // Vendor class identifier - DHCP_TAG_CLIENT_ID = 61 // Client-identifier -}; - -enum { - DHCP_OPTION_MAGIC = 0x63538263, // Network byte order - DHCP_MAX_OPTIONS = 256, - - // - // DHCP option types, this is used to validate the DHCP options. - // - DHCP_OPTION_SWITCH = 1, - DHCP_OPTION_INT8, - DHCP_OPTION_INT16, - DHCP_OPTION_INT32, - DHCP_OPTION_IP, - DHCP_OPTION_IPPAIR, - - // - // Value of DHCP overload option - // - DHCP_OVERLOAD_FILENAME = 1, - DHCP_OVERLOAD_SVRNAME = 2, - DHCP_OVERLOAD_BOTH = 3 -}; - -// -// The DHCP option structure. This structure extends the EFI_DHCP_OPTION -// structure to support options longer than 255 bytes, such as classless route. -// -typedef struct { - UINT8 Tag; - UINT16 Len; - UINT8 *Data; -} DHCP_OPTION; - -// -// Structures used to parse the DHCP options with RFC3396 support. -// -typedef struct { - UINT8 Index; - UINT16 Offset; -} DHCP_OPTION_COUNT; - -typedef struct { - DHCP_OPTION_COUNT *OpCount; - DHCP_OPTION *Options; - UINT8 *Buf; -} DHCP_OPTION_CONTEXT; - -// -// The options that matters to DHCP driver itself. The user of -// DHCP clients may be interested in other options, such as -// classless route, who can parse the DHCP offer to get them. -// -typedef struct { - IP4_ADDR NetMask; // DHCP_TAG_NETMASK - IP4_ADDR Router; // DHCP_TAG_ROUTER, only the first router is used - - // - // DHCP specific options - // - UINT8 DhcpType; // DHCP_TAG_TYPE - UINT8 Overload; // DHCP_TAG_OVERLOAD - IP4_ADDR ServerId; // DHCP_TAG_SERVER_ID - UINT32 Lease; // DHCP_TAG_LEASE - UINT32 T1; // DHCP_TAG_T1 - UINT32 T2; // DHCP_TAG_T2 -} DHCP_PARAMETER; - -// -// Structure used to describe and validate the format of DHCP options. -// Type is the options' data type, such as DHCP_OPTION_INT8. MinOccur -// is the minium occurance of this data type. MaxOccur is defined -// similarly. If MaxOccur is -1, it means that there is no limit on the -// maximum occurance. Alert tells whether DHCP client should further -// inspect the option to parse DHCP_PARAMETER. -// -typedef struct { - UINT8 Tag; - INTN Type; - INTN MinOccur; - INTN MaxOccur; - BOOLEAN Alert; -} DHCP_OPTION_FORMAT; - -typedef -EFI_STATUS -(*DHCP_CHECK_OPTION) ( - IN UINT8 Tag, - IN UINT8 Len, - IN UINT8 *Data, - IN VOID *Context - ); - -EFI_STATUS -DhcpIterateOptions ( - IN EFI_DHCP4_PACKET *Packet, - IN DHCP_CHECK_OPTION Check, OPTIONAL - IN VOID *Context - ); - -EFI_STATUS -DhcpValidateOptions ( - IN EFI_DHCP4_PACKET *Packet, - OUT DHCP_PARAMETER **Para OPTIONAL - ); - -EFI_STATUS -DhcpParseOption ( - IN EFI_DHCP4_PACKET *Packet, - OUT INTN *Count, - OUT DHCP_OPTION **OptionPoint - ); - -UINT8 * -DhcpAppendOption ( - IN UINT8 *Buf, - IN UINT8 Tag, - IN UINT16 DataLen, - IN UINT8 *Data - ); - -EFI_STATUS -DhcpBuild ( - 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 - ); - -#endif +/** @file + +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: + + Dhcp4Option.h + +Abstract: + + To validate, parse and process the DHCP options + + +**/ + +#ifndef __EFI_DHCP4_OPTION_H__ +#define __EFI_DHCP4_OPTION_H__ + +// +// DHCP option tags (types) +// +enum { + // + // RFC1497 vendor extensions + // + DHCP_TAG_PAD = 0, // Pad Option + DHCP_TAG_EOP = 255, // End Option + DHCP_TAG_NETMASK = 1, // Subnet Mask + DHCP_TAG_TIME_OFFSET = 2, // Time Offset from UTC + DHCP_TAG_ROUTER = 3, // Router option, + DHCP_TAG_TIME_SERVER = 4, // Time Server + DHCP_TAG_NAME_SERVER = 5, // Name Server + DHCP_TAG_DNS_SERVER = 6, // Domain Name Server + DHCP_TAG_LOG_SERVER = 7, // Log Server + DHCP_TAG_COOKIE_SERVER = 8, // Cookie Server + DHCP_TAG_LPR_SERVER = 9, // LPR Print Server + DHCP_TAG_IMPRESS_SERVER = 10, // Impress Server + DHCP_TAG_RL_SERVER = 11, // Resource Location Server + DHCP_TAG_HOSTNAME = 12, // Host Name + DHCP_TAG_BOOTFILE_LEN = 13, // Boot File Size + DHCP_TAG_DUMP = 14, // Merit Dump File + DHCP_TAG_DOMAINNAME = 15, // Domain Name + DHCP_TAG_SWAP_SERVER = 16, // Swap Server + DHCP_TAG_ROOTPATH = 17, // Root path + DHCP_TAG_EXTEND_PATH = 18, // Extensions Path + + // + // IP Layer Parameters per Host + // + DHCP_TAG_IPFORWARD = 19, // IP Forwarding Enable/Disable + DHCP_TAG_NONLOCAL_SRR = 20, // on-Local Source Routing Enable/Disable + DHCP_TAG_POLICY_SRR = 21, // Policy Filter + DHCP_TAG_EMTU = 22, // Maximum Datagram Reassembly Size + DHCP_TAG_TTL = 23, // Default IP Time-to-live + DHCP_TAG_PATHMTU_AGE = 24, // Path MTU Aging Timeout + DHCP_TAG_PATHMTU_PLATEAU = 25, // Path MTU Plateau Table + + // + // IP Layer Parameters per Interface + // + DHCP_TAG_IFMTU = 26, // Interface MTU + DHCP_TAG_SUBNET_LOCAL = 27, // All Subnets are Local + DHCP_TAG_BROADCAST = 28, // Broadcast Address + DHCP_TAG_DISCOVER_MASK = 29, // Perform Mask Discovery + DHCP_TAG_SUPPLY_MASK = 30, // Mask Supplier + DHCP_TAG_DISCOVER_ROUTE = 31, // Perform Router Discovery + DHCP_TAG_ROUTER_SOLICIT = 32, // Router Solicitation Address + DHCP_TAG_STATIC_ROUTE = 33, // Static Route + + // + // Link Layer Parameters per Interface + // + DHCP_TAG_TRAILER = 34, // Trailer Encapsulation + DHCP_TAG_ARPAGE = 35, // ARP Cache Timeout + DHCP_TAG_ETHER_ENCAP = 36, // Ethernet Encapsulation + + // + // TCP Parameters + // + DHCP_TAG_TCP_TTL = 37, // TCP Default TTL + DHCP_TAG_KEEP_INTERVAL = 38, // TCP Keepalive Interval + DHCP_TAG_KEEP_GARBAGE = 39, // TCP Keepalive Garbage + + // + // Application and Service Parameters + // + DHCP_TAG_NIS_DOMAIN = 40, // Network Information Service Domain + DHCP_TAG_NIS_SERVER = 41, // Network Information Servers + DHCP_TAG_NTP_SERVER = 42, // Network Time Protocol Servers + DHCP_TAG_VENDOR = 43, // Vendor Specific Information + DHCP_TAG_NBNS = 44, // NetBIOS over TCP/IP Name Server + DHCP_TAG_NBDD = 45, // NetBIOS Datagram Distribution Server + DHCP_TAG_NBTYPE = 46, // NetBIOS over TCP/IP Node Type + DHCP_TAG_NBSCOPE = 47, // NetBIOS over TCP/IP Scope + DHCP_TAG_XFONT = 48, // X Window System Font Server + DHCP_TAG_XDM = 49, // X Window System Display Manager + DHCP_TAG_NISPLUS = 64, // Network Information Service+ Domain + DHCP_TAG_NISPLUS_SERVER = 65, // Network Information Service+ Servers + DHCP_TAG_MOBILEIP = 68, // Mobile IP Home Agent + DHCP_TAG_SMTP = 69, // Simple Mail Transport Protocol Server + DHCP_TAG_POP3 = 70, // Post Office Protocol (POP3) Server + DHCP_TAG_NNTP = 71, // Network News Transport Protocol Server + DHCP_TAG_WWW = 72, // Default World Wide Web (WWW) Server + DHCP_TAG_FINGER = 73, // Default Finger Server + DHCP_TAG_IRC = 74, // Default Internet Relay Chat (IRC) Server + DHCP_TAG_STTALK = 75, // StreetTalk Server + DHCP_TAG_STDA = 76, // StreetTalk Directory Assistance Server + DHCP_TAG_CLASSLESS_ROUTE = 121, // Classless Route + + // + // DHCP Extensions + // + DHCP_TAG_REQUEST_IP = 50, // Requested IP Address + DHCP_TAG_LEASE = 51, // IP Address Lease Time + DHCP_TAG_OVERLOAD = 52, // Option Overload + DHCP_TAG_TFTP = 66, // TFTP server name + DHCP_TAG_BOOTFILE = 67, // Bootfile name + DHCP_TAG_TYPE = 53, // DHCP Message Type + DHCP_TAG_SERVER_ID = 54, // Server Identifier + DHCP_TAG_PARA_LIST = 55, // Parameter Request List + DHCP_TAG_MESSAGE = 56, // Message + DHCP_TAG_MAXMSG = 57, // Maximum DHCP Message Size + DHCP_TAG_T1 = 58, // Renewal (T1) Time Value + DHCP_TAG_T2 = 59, // Rebinding (T2) Time Value + DHCP_TAG_VENDOR_CLASS = 60, // Vendor class identifier + DHCP_TAG_CLIENT_ID = 61 // Client-identifier +}; + +enum { + DHCP_OPTION_MAGIC = 0x63538263, // Network byte order + DHCP_MAX_OPTIONS = 256, + + // + // DHCP option types, this is used to validate the DHCP options. + // + DHCP_OPTION_SWITCH = 1, + DHCP_OPTION_INT8, + DHCP_OPTION_INT16, + DHCP_OPTION_INT32, + DHCP_OPTION_IP, + DHCP_OPTION_IPPAIR, + + // + // Value of DHCP overload option + // + DHCP_OVERLOAD_FILENAME = 1, + DHCP_OVERLOAD_SVRNAME = 2, + DHCP_OVERLOAD_BOTH = 3 +}; + +// +// The DHCP option structure. This structure extends the EFI_DHCP_OPTION +// structure to support options longer than 255 bytes, such as classless route. +// +typedef struct { + UINT8 Tag; + UINT16 Len; + UINT8 *Data; +} DHCP_OPTION; + +// +// Structures used to parse the DHCP options with RFC3396 support. +// +typedef struct { + UINT8 Index; + UINT16 Offset; +} DHCP_OPTION_COUNT; + +typedef struct { + DHCP_OPTION_COUNT *OpCount; + DHCP_OPTION *Options; + UINT8 *Buf; +} DHCP_OPTION_CONTEXT; + +// +// The options that matters to DHCP driver itself. The user of +// DHCP clients may be interested in other options, such as +// classless route, who can parse the DHCP offer to get them. +// +typedef struct { + IP4_ADDR NetMask; // DHCP_TAG_NETMASK + IP4_ADDR Router; // DHCP_TAG_ROUTER, only the first router is used + + // + // DHCP specific options + // + UINT8 DhcpType; // DHCP_TAG_TYPE + UINT8 Overload; // DHCP_TAG_OVERLOAD + IP4_ADDR ServerId; // DHCP_TAG_SERVER_ID + UINT32 Lease; // DHCP_TAG_LEASE + UINT32 T1; // DHCP_TAG_T1 + UINT32 T2; // DHCP_TAG_T2 +} DHCP_PARAMETER; + +// +// Structure used to describe and validate the format of DHCP options. +// Type is the options' data type, such as DHCP_OPTION_INT8. MinOccur +// is the minium occurance of this data type. MaxOccur is defined +// similarly. If MaxOccur is -1, it means that there is no limit on the +// maximum occurance. Alert tells whether DHCP client should further +// inspect the option to parse DHCP_PARAMETER. +// +typedef struct { + UINT8 Tag; + INTN Type; + INTN MinOccur; + INTN MaxOccur; + BOOLEAN Alert; +} DHCP_OPTION_FORMAT; + +typedef +EFI_STATUS +(*DHCP_CHECK_OPTION) ( + IN UINT8 Tag, + IN UINT8 Len, + IN UINT8 *Data, + IN VOID *Context + ); + +EFI_STATUS +DhcpIterateOptions ( + IN EFI_DHCP4_PACKET *Packet, + IN DHCP_CHECK_OPTION Check, OPTIONAL + IN VOID *Context + ); + +EFI_STATUS +DhcpValidateOptions ( + IN EFI_DHCP4_PACKET *Packet, + OUT DHCP_PARAMETER **Para OPTIONAL + ); + +EFI_STATUS +DhcpParseOption ( + IN EFI_DHCP4_PACKET *Packet, + OUT INTN *Count, + OUT DHCP_OPTION **OptionPoint + ); + +UINT8 * +DhcpAppendOption ( + IN UINT8 *Buf, + IN UINT8 Tag, + IN UINT16 DataLen, + IN UINT8 *Data + ); + +EFI_STATUS +DhcpBuild ( + 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 + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/ComponentName.c b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/ComponentName.c index 1be21a1791..1fbee2a097 100644 --- a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/ComponentName.c @@ -24,6 +24,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Ip4ConfigComponentNameGetDriverName ( @@ -32,6 +71,75 @@ Ip4ConfigComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Ip4ConfigComponentNameGetControllerName ( @@ -42,21 +150,71 @@ Ip4ConfigComponentNameGetControllerName ( OUT CHAR16 **ControllerName ); + // // EFI Component Name Protocol // -EFI_COMPONENT_NAME_PROTOCOL gIp4ConfigComponentName = { +EFI_COMPONENT_NAME_PROTOCOL gIp4ConfigComponentName = { Ip4ConfigComponentNameGetDriverName, Ip4ConfigComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gIp4ConfigComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) Ip4ConfigComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) Ip4ConfigComponentNameGetControllerName, + "en" + }; + STATIC EFI_UNICODE_STRING_TABLE mIp4ConfigDriverNameTable[] = { - {"eng", L"IP4 CONFIG Network Service Driver"}, + {"eng;en", L"IP4 CONFIG Network Service Driver"}, {NULL, NULL} }; +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Ip4ConfigComponentNameGetDriverName ( @@ -64,94 +222,93 @@ Ip4ConfigComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language - A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - DriverName - A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - Returns: - EFI_SUCCES - The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - DriverName is NULL. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { - return LookupUnicodeString ( + return LookupUnicodeString2 ( Language, - gIp4ConfigComponentName.SupportedLanguages, + This->SupportedLanguages, mIp4ConfigDriverNameTable, - DriverName + DriverName, + (BOOLEAN)(This == &gIp4ConfigComponentName) ); } +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Ip4ConfigComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle - The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle - The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - ControllerName - A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - Returns: - EFI_SUCCESS - The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - ControllerName is NULL. - EFI_UNSUPPORTED - The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.h b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.h index 8c58c8078c..55629447af 100644 --- a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.h +++ b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.h @@ -1,28 +1,28 @@ -/** @file - -Copyright (c) 2006 - 2007, 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.h - -Abstract: - - Header file for IP4Config driver. - - -**/ - -#ifndef __EFI_IP4CONFIG_H__ -#define __EFI_IP4CONFIG_H__ - +/** @file + +Copyright (c) 2006 - 2007, 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.h + +Abstract: + + Header file for IP4Config driver. + + +**/ + +#ifndef __EFI_IP4CONFIG_H__ +#define __EFI_IP4CONFIG_H__ + #include #include @@ -36,97 +36,98 @@ Abstract: #include #include #include -#include - -#include "NicIp4Variable.h" - -typedef struct _IP4_CONFIG_INSTANCE IP4_CONFIG_INSTANCE; - -enum { - IP4_CONFIG_STATE_IDLE = 0, - IP4_CONFIG_STATE_STARTED, - IP4_CONFIG_STATE_CONFIGURED, - - IP4_PROTO_ICMP = 0x01, - IP4_CONFIG_INSTANCE_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', '4', 'C'), - - DHCP_TAG_PARA_LIST = 55, - DHCP_TAG_NETMASK = 1, - DHCP_TAG_ROUTER = 3 -}; - -// -// Configure the DHCP to request the routers and netmask -// from server. The DHCP_TAG_NETMASK is included in Head. -// -#pragma pack(1) -typedef struct { - EFI_DHCP4_PACKET_OPTION Head; - UINT8 Route; -} IP4_CONFIG_DHCP4_OPTION; -#pragma pack() - -struct _IP4_CONFIG_INSTANCE { - UINT32 Signature; - EFI_HANDLE Controller; - EFI_HANDLE Image; - - EFI_IP4_CONFIG_PROTOCOL Ip4ConfigProtocol; - EFI_NIC_IP4_CONFIG_PROTOCOL NicIp4Protocol; - - // - // NicConfig's state, such as IP4_CONFIG_STATE_IDLE - // - INTN State; - - // - // Mnp child to keep the connection with MNP. - // - EFI_MANAGED_NETWORK_PROTOCOL *Mnp; - EFI_HANDLE MnpHandle; - - // - // User's requests data - // - EFI_EVENT DoneEvent; - EFI_EVENT ReconfigEvent; - EFI_STATUS Result; - - // - // Identity of this interface and some configuration info. - // - NIC_ADDR NicAddr; - UINT16 NicName[IP4_NIC_NAME_LENGTH]; - UINT32 NicIndex; - NIC_IP4_CONFIG_INFO *NicConfig; - - // - // DHCP handles to access DHCP - // - EFI_DHCP4_PROTOCOL *Dhcp4; - EFI_HANDLE Dhcp4Handle; - EFI_EVENT Dhcp4Event; -}; - -#define IP4_CONFIG_INSTANCE_FROM_IP4CONFIG(this) \ - CR (this, IP4_CONFIG_INSTANCE, Ip4ConfigProtocol, IP4_CONFIG_INSTANCE_SIGNATURE) - -#define IP4_CONFIG_INSTANCE_FROM_NIC_IP4CONFIG(this) \ - CR (this, IP4_CONFIG_INSTANCE, NicIp4Protocol, IP4_CONFIG_INSTANCE_SIGNATURE) - -extern EFI_DRIVER_BINDING_PROTOCOL gIp4ConfigDriverBinding; -extern EFI_COMPONENT_NAME_PROTOCOL gIp4ConfigComponentName; -extern IP4_CONFIG_INSTANCE *mIp4ConfigNicList[MAX_IP4_CONFIG_IN_VARIABLE]; -extern EFI_IP4_CONFIG_PROTOCOL mIp4ConfigProtocolTemplate; -extern EFI_NIC_IP4_CONFIG_PROTOCOL mNicIp4ConfigProtocolTemplate; - -VOID -Ip4ConfigCleanDhcp4 ( - IN IP4_CONFIG_INSTANCE *This - ); - -VOID -Ip4ConfigCleanConfig ( - IN IP4_CONFIG_INSTANCE *Instance - ); -#endif +#include + +#include "NicIp4Variable.h" + +typedef struct _IP4_CONFIG_INSTANCE IP4_CONFIG_INSTANCE; + +enum { + IP4_CONFIG_STATE_IDLE = 0, + IP4_CONFIG_STATE_STARTED, + IP4_CONFIG_STATE_CONFIGURED, + + IP4_PROTO_ICMP = 0x01, + IP4_CONFIG_INSTANCE_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', '4', 'C'), + + DHCP_TAG_PARA_LIST = 55, + DHCP_TAG_NETMASK = 1, + DHCP_TAG_ROUTER = 3 +}; + +// +// Configure the DHCP to request the routers and netmask +// from server. The DHCP_TAG_NETMASK is included in Head. +// +#pragma pack(1) +typedef struct { + EFI_DHCP4_PACKET_OPTION Head; + UINT8 Route; +} IP4_CONFIG_DHCP4_OPTION; +#pragma pack() + +struct _IP4_CONFIG_INSTANCE { + UINT32 Signature; + EFI_HANDLE Controller; + EFI_HANDLE Image; + + EFI_IP4_CONFIG_PROTOCOL Ip4ConfigProtocol; + EFI_NIC_IP4_CONFIG_PROTOCOL NicIp4Protocol; + + // + // NicConfig's state, such as IP4_CONFIG_STATE_IDLE + // + INTN State; + + // + // Mnp child to keep the connection with MNP. + // + EFI_MANAGED_NETWORK_PROTOCOL *Mnp; + EFI_HANDLE MnpHandle; + + // + // User's requests data + // + EFI_EVENT DoneEvent; + EFI_EVENT ReconfigEvent; + EFI_STATUS Result; + + // + // Identity of this interface and some configuration info. + // + NIC_ADDR NicAddr; + UINT16 NicName[IP4_NIC_NAME_LENGTH]; + UINT32 NicIndex; + NIC_IP4_CONFIG_INFO *NicConfig; + + // + // DHCP handles to access DHCP + // + EFI_DHCP4_PROTOCOL *Dhcp4; + EFI_HANDLE Dhcp4Handle; + EFI_EVENT Dhcp4Event; +}; + +#define IP4_CONFIG_INSTANCE_FROM_IP4CONFIG(this) \ + CR (this, IP4_CONFIG_INSTANCE, Ip4ConfigProtocol, IP4_CONFIG_INSTANCE_SIGNATURE) + +#define IP4_CONFIG_INSTANCE_FROM_NIC_IP4CONFIG(this) \ + CR (this, IP4_CONFIG_INSTANCE, NicIp4Protocol, IP4_CONFIG_INSTANCE_SIGNATURE) + +extern EFI_DRIVER_BINDING_PROTOCOL gIp4ConfigDriverBinding; +extern EFI_COMPONENT_NAME_PROTOCOL gIp4ConfigComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gIp4ConfigComponentName2; +extern IP4_CONFIG_INSTANCE *mIp4ConfigNicList[MAX_IP4_CONFIG_IN_VARIABLE]; +extern EFI_IP4_CONFIG_PROTOCOL mIp4ConfigProtocolTemplate; +extern EFI_NIC_IP4_CONFIG_PROTOCOL mNicIp4ConfigProtocolTemplate; + +VOID +Ip4ConfigCleanDhcp4 ( + IN IP4_CONFIG_INSTANCE *This + ); + +VOID +Ip4ConfigCleanConfig ( + IN IP4_CONFIG_INSTANCE *Instance + ); +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigDriver.c b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigDriver.c index c3845f4734..fdd50b3535 100644 --- a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigDriver.c +++ b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigDriver.c @@ -85,14 +85,13 @@ Returns: --*/ { - return EfiLibInstallAllDriverProtocols ( + return EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, &gIp4ConfigDriverBinding, ImageHandle, &gIp4ConfigComponentName, - NULL, - NULL + &gIp4ConfigComponentName2 ); } diff --git a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/NicIp4Variable.h b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/NicIp4Variable.h index 74d1660c4d..be8ccd7b5f 100644 --- a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/NicIp4Variable.h +++ b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/NicIp4Variable.h @@ -1,75 +1,75 @@ -/** @file - -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: - - NicIp4Variable.h - -Abstract: - - Routines used to operate the Ip4 configure variable - - -**/ - -#ifndef _NIC_IP4_VARIABLE_H_ -#define _NIC_IP4_VARIABLE_H_ - - -#include - -// -// Return the size of NIC_IP4_CONFIG_INFO and EFI_IP4_IPCONFIG_DATA. -// They are of variable size -// -#define SIZEOF_IP4_CONFIG_INFO(Ip4Config) \ - (sizeof (EFI_IP4_IPCONFIG_DATA) + \ - sizeof (EFI_IP4_ROUTE_TABLE) * (NET_MAX (1, (Ip4Config)->RouteTableSize) - 1)) - -#define SIZEOF_NIC_IP4_CONFIG_INFO(NicConfig) \ - (sizeof (NIC_IP4_CONFIG_INFO) + \ - sizeof (EFI_IP4_ROUTE_TABLE) * (NET_MAX (1, (NicConfig)->Ip4Info.RouteTableSize) - 1)) - -// -// Compare whether two NIC address are equal includes their type and length. -// -#define NIC_ADDR_EQUAL(Nic1, Nic2) \ - (((Nic1)->Type == (Nic2)->Type) && ((Nic1)->Len == (Nic2)->Len) && \ - NET_MAC_EQUAL (&(Nic1)->MacAddr, &(Nic2)->MacAddr, (Nic1)->Len)) - -BOOLEAN -Ip4ConfigIsValid ( - IN NIC_IP4_CONFIG_INFO *NicConfig - ); - -IP4_CONFIG_VARIABLE * -Ip4ConfigReadVariable ( - VOID - ); - -EFI_STATUS -Ip4ConfigWriteVariable ( - IN IP4_CONFIG_VARIABLE *Config OPTIONAL - ); - -NIC_IP4_CONFIG_INFO * -Ip4ConfigFindNicVariable ( - IN IP4_CONFIG_VARIABLE *Variable, - IN NIC_ADDR *NicAddr - ); - -IP4_CONFIG_VARIABLE * -Ip4ConfigModifyVariable ( - IN IP4_CONFIG_VARIABLE *Variable, OPTIONAL - IN NIC_ADDR *NicAddr, - IN NIC_IP4_CONFIG_INFO *Config OPTIONAL - ); -#endif +/** @file + +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: + + NicIp4Variable.h + +Abstract: + + Routines used to operate the Ip4 configure variable + + +**/ + +#ifndef _NIC_IP4_VARIABLE_H_ +#define _NIC_IP4_VARIABLE_H_ + + +#include + +// +// Return the size of NIC_IP4_CONFIG_INFO and EFI_IP4_IPCONFIG_DATA. +// They are of variable size +// +#define SIZEOF_IP4_CONFIG_INFO(Ip4Config) \ + (sizeof (EFI_IP4_IPCONFIG_DATA) + \ + sizeof (EFI_IP4_ROUTE_TABLE) * (NET_MAX (1, (Ip4Config)->RouteTableSize) - 1)) + +#define SIZEOF_NIC_IP4_CONFIG_INFO(NicConfig) \ + (sizeof (NIC_IP4_CONFIG_INFO) + \ + sizeof (EFI_IP4_ROUTE_TABLE) * (NET_MAX (1, (NicConfig)->Ip4Info.RouteTableSize) - 1)) + +// +// Compare whether two NIC address are equal includes their type and length. +// +#define NIC_ADDR_EQUAL(Nic1, Nic2) \ + (((Nic1)->Type == (Nic2)->Type) && ((Nic1)->Len == (Nic2)->Len) && \ + NET_MAC_EQUAL (&(Nic1)->MacAddr, &(Nic2)->MacAddr, (Nic1)->Len)) + +BOOLEAN +Ip4ConfigIsValid ( + IN NIC_IP4_CONFIG_INFO *NicConfig + ); + +IP4_CONFIG_VARIABLE * +Ip4ConfigReadVariable ( + VOID + ); + +EFI_STATUS +Ip4ConfigWriteVariable ( + IN IP4_CONFIG_VARIABLE *Config OPTIONAL + ); + +NIC_IP4_CONFIG_INFO * +Ip4ConfigFindNicVariable ( + IN IP4_CONFIG_VARIABLE *Variable, + IN NIC_ADDR *NicAddr + ); + +IP4_CONFIG_VARIABLE * +Ip4ConfigModifyVariable ( + IN IP4_CONFIG_VARIABLE *Variable, OPTIONAL + IN NIC_ADDR *NicAddr, + IN NIC_IP4_CONFIG_INFO *Config OPTIONAL + ); +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/Ip4Dxe/ComponentName.c index 728887587e..01642c2383 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/ComponentName.c @@ -24,6 +24,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Ip4ComponentNameGetDriverName ( @@ -32,6 +71,75 @@ Ip4ComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Ip4ComponentNameGetControllerName ( @@ -42,18 +150,29 @@ Ip4ComponentNameGetControllerName ( OUT CHAR16 **ControllerName ); + // // EFI Component Name Protocol // -EFI_COMPONENT_NAME_PROTOCOL gIp4ComponentName = { +EFI_COMPONENT_NAME_PROTOCOL gIp4ComponentName = { Ip4ComponentNameGetDriverName, Ip4ComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gIp4ComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) Ip4ComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) Ip4ComponentNameGetControllerName, + "en" + }; + static EFI_UNICODE_STRING_TABLE mIp4DriverNameTable[] = { { - "eng", + "eng;en", L"IP4 Network Service Driver" }, { @@ -62,6 +181,45 @@ static EFI_UNICODE_STRING_TABLE mIp4DriverNameTable[] = { } }; +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Ip4ComponentNameGetDriverName ( @@ -69,44 +227,85 @@ Ip4ComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable - name of the EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the driver name - that that the caller is requesting, and it must match - one of the languages specified in SupportedLanguages. - The number of languages supported by a driver is up to - the driver writer. - DriverName - A pointer to the Unicode string to return. This Unicode - string is the name of the driver specified by This in the - language specified by Language. - - Returns: - EFI_SUCCES - The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - DriverName is NULL. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { - return LookupUnicodeString ( - Language, - gIp4ComponentName.SupportedLanguages, - mIp4DriverNameTable, - DriverName - ); + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mIp4DriverNameTable, + DriverName, + (BOOLEAN)(This == &gIp4ComponentName) + ); } +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Ip4ComponentNameGetControllerName ( @@ -116,51 +315,6 @@ Ip4ComponentNameGetControllerName ( IN CHAR8 *Language, OUT CHAR16 **ControllerName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of - the controller that is being managed by an EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle - The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle - The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - ControllerName - A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language - specified by Language from the point of view of the - driver specified by This. - - Returns: - EFI_SUCCESS - The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not - a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - ControllerName is NULL. - EFI_UNSUPPORTED - The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h index 4c5a7b4079..35368b3461 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Common.h @@ -1,143 +1,143 @@ -/** @file - -Copyright (c) 2005 - 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: - - Ip4Common.h - -Abstract: - - Common definition for IP4. - - -**/ - -#ifndef __EFI_IP4_COMMON_H__ -#define __EFI_IP4_COMMON_H__ - -typedef struct _IP4_INTERFACE IP4_INTERFACE; -typedef struct _IP4_PROTOCOL IP4_PROTOCOL; -typedef struct _IP4_SERVICE IP4_SERVICE; - - -enum { - IP4_ETHER_PROTO = 0x0800, - - IP4_PROTO_ICMP = 0x01, - IP4_PROTO_IGMP = 0x02, - - // - // The packet is received as link level broadcast/multicast/promiscuous. - // - IP4_LINK_BROADCAST = 0x00000001, - IP4_LINK_MULTICAST = 0x00000002, - IP4_LINK_PROMISC = 0x00000004, - - // - // IP4 address cast type classfication. Keep it true that any - // type bigger than or equal to LOCAL_BROADCAST is broadcast. - // - IP4_PROMISCUOUS = 1, - IP4_LOCAL_HOST, - IP4_MULTICAST, - IP4_LOCAL_BROADCAST, // Destination is 255.255.255.255 - IP4_SUBNET_BROADCAST, - IP4_NET_BROADCAST, - - // - // IP4 header flags - // - IP4_HEAD_DF_MASK = 0x4000, - IP4_HEAD_MF_MASK = 0x2000, - IP4_HEAD_OFFSET_MASK = 0x1fff -}; - -#define IP4_ALLZERO_ADDRESS 0x00000000u -#define IP4_ALLONE_ADDRESS 0xFFFFFFFFu -#define IP4_ALLSYSTEM_ADDRESS 0xE0000001u -#define IP4_ALLROUTER_ADDRESS 0xE0000002u - -// -// Compose the fragment field to be used in the IP4 header. -// -#define IP4_HEAD_FRAGMENT_FIELD(Df, Mf, Offset) \ - ((UINT16)(((Df) ? 0x4000 : 0) | ((Mf) ? 0x2000 : 0) | (((Offset) >> 3) & 0x1fff))) - -#define IP4_LAST_FRAGMENT(FragmentField) \ - (((FragmentField) & IP4_HEAD_MF_MASK) == 0) - -#define IP4_FIRST_FRAGMENT(FragmentField) \ - ((BOOLEAN)(((FragmentField) & IP4_HEAD_OFFSET_MASK) == 0)) - -#define IP4_IS_BROADCAST(CastType) ((CastType) >= IP4_LOCAL_BROADCAST) - -// -// Conver the Microsecond to second. IP transmit/receive time is -// in the unit of microsecond. IP ticks once per second. -// -#define IP4_US_TO_SEC(Us) (((Us) + 999999) / 1000000) - -INTN -Ip4GetNetCast ( - IN IP4_ADDR IpAddr, - IN IP4_INTERFACE *IpIf - ); - -INTN -Ip4GetHostCast ( - IN IP4_SERVICE *IpSb, - IN IP4_ADDR Dst, - IN IP4_ADDR Src - ); - -IP4_INTERFACE * -Ip4FindInterface ( - IN IP4_SERVICE *IpService, - IN IP4_ADDR Addr - ); - -IP4_INTERFACE * -Ip4FindNet ( - IN IP4_SERVICE *IpService, - IN IP4_ADDR Addr - ); - -IP4_INTERFACE * -Ip4FindStationAddress ( - IN IP4_SERVICE *IpSb, - IN IP4_ADDR Ip, - IN IP4_ADDR Netmask - ); - -EFI_STATUS -Ip4GetMulticastMac ( - IN EFI_MANAGED_NETWORK_PROTOCOL *Mnp, - IN IP4_ADDR Multicast, - OUT EFI_MAC_ADDRESS *Mac - ); - -IP4_HEAD * -Ip4NtohHead ( - IN IP4_HEAD *Head - ); - -EFI_STATUS -Ip4SetVariableData ( - IN IP4_SERVICE *IpSb - ); - -VOID -Ip4ClearVariableData ( - IN IP4_SERVICE *IpSb - ); - -#endif +/** @file + +Copyright (c) 2005 - 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: + + Ip4Common.h + +Abstract: + + Common definition for IP4. + + +**/ + +#ifndef __EFI_IP4_COMMON_H__ +#define __EFI_IP4_COMMON_H__ + +typedef struct _IP4_INTERFACE IP4_INTERFACE; +typedef struct _IP4_PROTOCOL IP4_PROTOCOL; +typedef struct _IP4_SERVICE IP4_SERVICE; + + +enum { + IP4_ETHER_PROTO = 0x0800, + + IP4_PROTO_ICMP = 0x01, + IP4_PROTO_IGMP = 0x02, + + // + // The packet is received as link level broadcast/multicast/promiscuous. + // + IP4_LINK_BROADCAST = 0x00000001, + IP4_LINK_MULTICAST = 0x00000002, + IP4_LINK_PROMISC = 0x00000004, + + // + // IP4 address cast type classfication. Keep it true that any + // type bigger than or equal to LOCAL_BROADCAST is broadcast. + // + IP4_PROMISCUOUS = 1, + IP4_LOCAL_HOST, + IP4_MULTICAST, + IP4_LOCAL_BROADCAST, // Destination is 255.255.255.255 + IP4_SUBNET_BROADCAST, + IP4_NET_BROADCAST, + + // + // IP4 header flags + // + IP4_HEAD_DF_MASK = 0x4000, + IP4_HEAD_MF_MASK = 0x2000, + IP4_HEAD_OFFSET_MASK = 0x1fff +}; + +#define IP4_ALLZERO_ADDRESS 0x00000000u +#define IP4_ALLONE_ADDRESS 0xFFFFFFFFu +#define IP4_ALLSYSTEM_ADDRESS 0xE0000001u +#define IP4_ALLROUTER_ADDRESS 0xE0000002u + +// +// Compose the fragment field to be used in the IP4 header. +// +#define IP4_HEAD_FRAGMENT_FIELD(Df, Mf, Offset) \ + ((UINT16)(((Df) ? 0x4000 : 0) | ((Mf) ? 0x2000 : 0) | (((Offset) >> 3) & 0x1fff))) + +#define IP4_LAST_FRAGMENT(FragmentField) \ + (((FragmentField) & IP4_HEAD_MF_MASK) == 0) + +#define IP4_FIRST_FRAGMENT(FragmentField) \ + ((BOOLEAN)(((FragmentField) & IP4_HEAD_OFFSET_MASK) == 0)) + +#define IP4_IS_BROADCAST(CastType) ((CastType) >= IP4_LOCAL_BROADCAST) + +// +// Conver the Microsecond to second. IP transmit/receive time is +// in the unit of microsecond. IP ticks once per second. +// +#define IP4_US_TO_SEC(Us) (((Us) + 999999) / 1000000) + +INTN +Ip4GetNetCast ( + IN IP4_ADDR IpAddr, + IN IP4_INTERFACE *IpIf + ); + +INTN +Ip4GetHostCast ( + IN IP4_SERVICE *IpSb, + IN IP4_ADDR Dst, + IN IP4_ADDR Src + ); + +IP4_INTERFACE * +Ip4FindInterface ( + IN IP4_SERVICE *IpService, + IN IP4_ADDR Addr + ); + +IP4_INTERFACE * +Ip4FindNet ( + IN IP4_SERVICE *IpService, + IN IP4_ADDR Addr + ); + +IP4_INTERFACE * +Ip4FindStationAddress ( + IN IP4_SERVICE *IpSb, + IN IP4_ADDR Ip, + IN IP4_ADDR Netmask + ); + +EFI_STATUS +Ip4GetMulticastMac ( + IN EFI_MANAGED_NETWORK_PROTOCOL *Mnp, + IN IP4_ADDR Multicast, + OUT EFI_MAC_ADDRESS *Mac + ); + +IP4_HEAD * +Ip4NtohHead ( + IN IP4_HEAD *Head + ); + +EFI_STATUS +Ip4SetVariableData ( + IN IP4_SERVICE *IpSb + ); + +VOID +Ip4ClearVariableData ( + IN IP4_SERVICE *IpSb + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c index f8d4b39276..0d308c0521 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c @@ -56,14 +56,13 @@ Returns: --*/ { - return EfiLibInstallAllDriverProtocols ( + return EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, &gIp4DriverBinding, ImageHandle, &gIp4ComponentName, - NULL, - NULL + &gIp4ComponentName2 ); } diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.h index 5421c90c3b..6ff56f0e94 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.h @@ -1,84 +1,85 @@ -/** @file - -Copyright (c) 2005 - 2007, 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: - - Ip4Driver.h - -Abstract: - - -**/ - -#ifndef __EFI_IP4_DRIVER_H__ -#define __EFI_IP4_DRIVER_H__ - -#include - -extern EFI_DRIVER_BINDING_PROTOCOL gIp4DriverBinding; -extern EFI_COMPONENT_NAME_PROTOCOL gIp4ComponentName; - -// -// Function prototype for the driver's entry point -// -EFI_STATUS -EFIAPI -Ip4DriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); - -// -// Function prototypes for the Drivr Binding Protocol -// -EFI_STATUS -EFIAPI -Ip4DriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -Ip4DriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -Ip4DriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -// -// Function ptototypes for the ServiceBinding Prococol -// -EFI_STATUS -EFIAPI -Ip4ServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE *ChildHandle - ); - -EFI_STATUS -EFIAPI -Ip4ServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ); -#endif +/** @file + +Copyright (c) 2005 - 2007, 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: + + Ip4Driver.h + +Abstract: + + +**/ + +#ifndef __EFI_IP4_DRIVER_H__ +#define __EFI_IP4_DRIVER_H__ + +#include + +extern EFI_DRIVER_BINDING_PROTOCOL gIp4DriverBinding; +extern EFI_COMPONENT_NAME_PROTOCOL gIp4ComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gIp4ComponentName2; + +// +// Function prototype for the driver's entry point +// +EFI_STATUS +EFIAPI +Ip4DriverEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +// +// Function prototypes for the Drivr Binding Protocol +// +EFI_STATUS +EFIAPI +Ip4DriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +Ip4DriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +Ip4DriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +// +// Function ptototypes for the ServiceBinding Prococol +// +EFI_STATUS +EFIAPI +Ip4ServiceBindingCreateChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE *ChildHandle + ); + +EFI_STATUS +EFIAPI +Ip4ServiceBindingDestroyChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE ChildHandle + ); +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Icmp.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Icmp.h index 366b02c176..7999b2e306 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Icmp.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Icmp.h @@ -1,99 +1,99 @@ -/** @file - -Copyright (c) 2005 - 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: - - Ip4Icmp.h - -Abstract: - - Header file for ICMP protocol. - - -**/ - -#ifndef __EFI_IP4_ICMP_H__ -#define __EFI_IP4_ICMP_H__ - -enum { - // - // ICMP type definations - // - ICMP_ECHO_REPLY = 0, - ICMP_DEST_UNREACHABLE = 3, - ICMP_SOURCE_QUENCH = 4, - ICMP_REDIRECT = 5, - ICMP_ECHO_REQUEST = 8, - ICMP_TIME_EXCEEDED = 11, - ICMP_PARAMETER_PROBLEM = 12, - ICMP_TIMESTAMP = 13, - ICMP_INFO_REQUEST = 15, - ICMP_INFO_REPLY = 16, - ICMP_TYPE_MAX = ICMP_INFO_REPLY, - - ICMP_DEFAULT_CODE = 0, - - // - // ICMP code definations for ICMP_DEST_UNREACHABLE - // - ICMP_NET_UNREACHABLE = 0, - ICMP_HOST_UNREACHABLE = 1, - ICMP_PROTO_UNREACHABLE = 2, // Host may generate - ICMP_PORT_UNREACHABLE = 3, // Host may generate - ICMP_FRAGMENT_FAILED = 4, - ICMP_SOURCEROUTE_FAILED = 5, // Host may generate - ICMP_NET_UNKNOWN = 6, - ICMP_HOST_UNKNOWN = 7, - ICMP_SOURCE_ISOLATED = 8, - ICMP_NET_PROHIBITED = 9, - ICMP_HOST_PROHIBITED = 10, - ICMP_NET_UNREACHABLE_TOS = 11, - ICMP_HOST_UNREACHABLE_TOS = 12, - - // - // ICMP code definations for ICMP_TIME_EXCEEDED - // - ICMP_TIMEOUT_IN_TRANSIT = 0, - ICMp_TIMEOUT_REASSEMBLE = 1, // Host may generate - - // - // ICMP code definations for ICMP_TIME_EXCEEDED - // - ICMP_NET_REDIRECT = 0, - ICMP_HOST_REDIRECT = 1, - ICMP_NET_TOS_REDIRECT = 2, - ICMP_HOST_TOS_REDIRECT = 3, - - // - // ICMP message classes, each class of ICMP message shares - // a common message format. INVALID_MESSAGE is only a flag. - // - ICMP_INVALID_MESSAGE = 0, - ICMP_ERROR_MESSAGE = 1, - ICMP_QUERY_MESSAGE = 2 -}; - -typedef struct { - UINT8 IcmpType; - UINT8 IcmpClass; -} IP4_ICMP_CLASS; - -extern IP4_ICMP_CLASS mIcmpClass[]; -extern EFI_IP4_ICMP_TYPE mIp4SupportedIcmp[]; - -EFI_STATUS -Ip4IcmpHandle ( - IN IP4_SERVICE *IpSb, - IN IP4_HEAD *Header, - IN NET_BUF *Packet - ); -#endif +/** @file + +Copyright (c) 2005 - 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: + + Ip4Icmp.h + +Abstract: + + Header file for ICMP protocol. + + +**/ + +#ifndef __EFI_IP4_ICMP_H__ +#define __EFI_IP4_ICMP_H__ + +enum { + // + // ICMP type definations + // + ICMP_ECHO_REPLY = 0, + ICMP_DEST_UNREACHABLE = 3, + ICMP_SOURCE_QUENCH = 4, + ICMP_REDIRECT = 5, + ICMP_ECHO_REQUEST = 8, + ICMP_TIME_EXCEEDED = 11, + ICMP_PARAMETER_PROBLEM = 12, + ICMP_TIMESTAMP = 13, + ICMP_INFO_REQUEST = 15, + ICMP_INFO_REPLY = 16, + ICMP_TYPE_MAX = ICMP_INFO_REPLY, + + ICMP_DEFAULT_CODE = 0, + + // + // ICMP code definations for ICMP_DEST_UNREACHABLE + // + ICMP_NET_UNREACHABLE = 0, + ICMP_HOST_UNREACHABLE = 1, + ICMP_PROTO_UNREACHABLE = 2, // Host may generate + ICMP_PORT_UNREACHABLE = 3, // Host may generate + ICMP_FRAGMENT_FAILED = 4, + ICMP_SOURCEROUTE_FAILED = 5, // Host may generate + ICMP_NET_UNKNOWN = 6, + ICMP_HOST_UNKNOWN = 7, + ICMP_SOURCE_ISOLATED = 8, + ICMP_NET_PROHIBITED = 9, + ICMP_HOST_PROHIBITED = 10, + ICMP_NET_UNREACHABLE_TOS = 11, + ICMP_HOST_UNREACHABLE_TOS = 12, + + // + // ICMP code definations for ICMP_TIME_EXCEEDED + // + ICMP_TIMEOUT_IN_TRANSIT = 0, + ICMp_TIMEOUT_REASSEMBLE = 1, // Host may generate + + // + // ICMP code definations for ICMP_TIME_EXCEEDED + // + ICMP_NET_REDIRECT = 0, + ICMP_HOST_REDIRECT = 1, + ICMP_NET_TOS_REDIRECT = 2, + ICMP_HOST_TOS_REDIRECT = 3, + + // + // ICMP message classes, each class of ICMP message shares + // a common message format. INVALID_MESSAGE is only a flag. + // + ICMP_INVALID_MESSAGE = 0, + ICMP_ERROR_MESSAGE = 1, + ICMP_QUERY_MESSAGE = 2 +}; + +typedef struct { + UINT8 IcmpType; + UINT8 IcmpClass; +} IP4_ICMP_CLASS; + +extern IP4_ICMP_CLASS mIcmpClass[]; +extern EFI_IP4_ICMP_TYPE mIp4SupportedIcmp[]; + +EFI_STATUS +Ip4IcmpHandle ( + IN IP4_SERVICE *IpSb, + IN IP4_HEAD *Header, + IN NET_BUF *Packet + ); +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.h index 9db1d8ac79..22db034a0a 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4If.h @@ -1,238 +1,238 @@ -/** @file - -Copyright (c) 2005 - 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: - - Ip4If.h - -Abstract: - - Definition for IP4 pesudo interface structure. - - -**/ - -#ifndef __EFI_IP4_IF_H__ -#define __EFI_IP4_IF_H__ - -enum { - IP4_FRAME_RX_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', 'F', 'R'), - IP4_FRAME_TX_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', 'F', 'T'), - IP4_FRAME_ARP_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', 'F', 'A'), - IP4_INTERFACE_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', 'I', 'F') -}; - -// -// This prototype is used by both receive and transmission. -// When receiving Netbuf is allocated by IP4_INTERFACE, and -// released by IP4. Flag shows whether the frame is received -// as link broadcast/multicast... -// -// When transmitting, the Netbuf is from IP4, and provided -// to the callback as a reference. Flag isn't used. -// -// IpInstance can be NULL which means that it is the IP4 driver -// itself sending the packets. IP4 driver may send packets that -// don't belong to any instance, such as ICMP errors, ICMP echo -// responses, or IGMP packets. IpInstance is used as a tag in -// this module. -// -typedef -VOID -(*IP4_FRAME_CALLBACK) ( - IP4_PROTOCOL *IpInstance, OPTIONAL - NET_BUF *Packet, - EFI_STATUS IoStatus, - UINT32 LinkFlag, - VOID *Context - ); - -// -// Each receive request is wrapped in an IP4_LINK_RX_TOKEN. -// Upon completion, the Callback will be called. Only one -// receive request is send to MNP. IpInstance is always NULL. -// Reference MNP's spec for information. -// -typedef struct { - UINT32 Signature; - IP4_INTERFACE *Interface; - - IP4_PROTOCOL *IpInstance; - IP4_FRAME_CALLBACK CallBack; - VOID *Context; - - EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken; -} IP4_LINK_RX_TOKEN; - -// -// Each transmit request is wrapped in an IP4_LINK_TX_TOKEN. -// Upon completion, the Callback will be called. -// -typedef struct { - UINT32 Signature; - NET_LIST_ENTRY Link; - - IP4_INTERFACE *Interface; - - IP4_PROTOCOL *IpInstance; - IP4_FRAME_CALLBACK CallBack; - NET_BUF *Packet; - VOID *Context; - - EFI_MAC_ADDRESS DstMac; - EFI_MAC_ADDRESS SrcMac; - - EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken; - EFI_MANAGED_NETWORK_TRANSMIT_DATA MnpTxData; -} IP4_LINK_TX_TOKEN; - -// -// Only one ARP request is requested for all the frames in -// a time. It is started for the first frames to the Ip. Any -// subsequent transmission frame will be linked to Frames, and -// be sent all at once the ARP requests succeed. -// -typedef struct { - UINT32 Signature; - NET_LIST_ENTRY Link; - - NET_LIST_ENTRY Frames; - IP4_INTERFACE *Interface; - - // - // ARP requesting staffs - // - EFI_EVENT OnResolved; - IP4_ADDR Ip; - EFI_MAC_ADDRESS Mac; -} IP4_ARP_QUE; - -// -// Callback to select which frame to cancel. Caller can cancel a -// single frame, or all the frame from an IP instance. -// -typedef -BOOLEAN -(*IP4_FRAME_TO_CANCEL) ( - IP4_LINK_TX_TOKEN *Frame, - VOID *Context - ); - -// -// Each IP4 instance has its own station address. All the instances -// with the same station address share a single interface structure. -// Each interface has its own ARP child, and shares one MNP child. -// Notice the special cases that DHCP can configure the interface -// with 0.0.0.0/0.0.0.0. -// -struct _IP4_INTERFACE { - UINT32 Signature; - NET_LIST_ENTRY Link; - INTN RefCnt; - - // - // IP address and subnet mask of the interface. It also contains - // the subnet/net broadcast address for quick access. The fileds - // are invalid if (Configured == FALSE) - // - IP4_ADDR Ip; - IP4_ADDR SubnetMask; - IP4_ADDR SubnetBrdcast; - IP4_ADDR NetBrdcast; - BOOLEAN Configured; - - // - // Handle used to create/destory ARP child. All the IP children - // share one MNP which is owned by IP service binding. - // - EFI_HANDLE Controller; - EFI_HANDLE Image; - - EFI_MANAGED_NETWORK_PROTOCOL *Mnp; - EFI_ARP_PROTOCOL *Arp; - EFI_HANDLE ArpHandle; - - // - // Queues to keep the frames sent and waiting ARP request. - // - NET_LIST_ENTRY ArpQues; - NET_LIST_ENTRY SentFrames; - IP4_LINK_RX_TOKEN *RecvRequest; - - // - // The interface's MAC and broadcast MAC address. - // - EFI_MAC_ADDRESS Mac; - EFI_MAC_ADDRESS BroadcastMac; - UINT32 HwaddrLen; - - // - // All the IP instances that have the same IP/SubnetMask are linked - // together through IpInstances. If any of the instance enables - // promiscuous receive, PromiscRecv is true. - // - NET_LIST_ENTRY IpInstances; - BOOLEAN PromiscRecv; -}; - -IP4_INTERFACE * -Ip4CreateInterface ( - IN EFI_MANAGED_NETWORK_PROTOCOL *Mnp, - IN EFI_HANDLE Controller, - IN EFI_HANDLE ImageHandle - ); - -EFI_STATUS -Ip4SetAddress ( - IN IP4_INTERFACE *Interface, - IN IP4_ADDR IpAddr, - IN IP4_ADDR SubnetMask - ); - -EFI_STATUS -Ip4FreeInterface ( - IN IP4_INTERFACE *Interface, - IN IP4_PROTOCOL *IpInstance OPTIONAL - ); - -EFI_STATUS -Ip4SendFrame ( - IN IP4_INTERFACE *Interface, - IN IP4_PROTOCOL *IpInstance, OPTIONAL - IN NET_BUF *Packet, - IN IP4_ADDR NextHop, - IN IP4_FRAME_CALLBACK CallBack, - IN VOID *Context - ); - -VOID -Ip4CancelFrames ( - IN IP4_INTERFACE *Interface, - IN EFI_STATUS IoStatus, - IN IP4_FRAME_TO_CANCEL FrameToCancel, OPTIONAL - IN VOID *Context - ); - -VOID -Ip4CancelReceive ( - IN IP4_INTERFACE *Interface - ); - -EFI_STATUS -Ip4ReceiveFrame ( - IN IP4_INTERFACE *Interface, - IN IP4_PROTOCOL *IpInstance, OPTIONAL - IN IP4_FRAME_CALLBACK CallBack, - IN VOID *Context - ); - -#endif +/** @file + +Copyright (c) 2005 - 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: + + Ip4If.h + +Abstract: + + Definition for IP4 pesudo interface structure. + + +**/ + +#ifndef __EFI_IP4_IF_H__ +#define __EFI_IP4_IF_H__ + +enum { + IP4_FRAME_RX_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', 'F', 'R'), + IP4_FRAME_TX_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', 'F', 'T'), + IP4_FRAME_ARP_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', 'F', 'A'), + IP4_INTERFACE_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', 'I', 'F') +}; + +// +// This prototype is used by both receive and transmission. +// When receiving Netbuf is allocated by IP4_INTERFACE, and +// released by IP4. Flag shows whether the frame is received +// as link broadcast/multicast... +// +// When transmitting, the Netbuf is from IP4, and provided +// to the callback as a reference. Flag isn't used. +// +// IpInstance can be NULL which means that it is the IP4 driver +// itself sending the packets. IP4 driver may send packets that +// don't belong to any instance, such as ICMP errors, ICMP echo +// responses, or IGMP packets. IpInstance is used as a tag in +// this module. +// +typedef +VOID +(*IP4_FRAME_CALLBACK) ( + IP4_PROTOCOL *IpInstance, OPTIONAL + NET_BUF *Packet, + EFI_STATUS IoStatus, + UINT32 LinkFlag, + VOID *Context + ); + +// +// Each receive request is wrapped in an IP4_LINK_RX_TOKEN. +// Upon completion, the Callback will be called. Only one +// receive request is send to MNP. IpInstance is always NULL. +// Reference MNP's spec for information. +// +typedef struct { + UINT32 Signature; + IP4_INTERFACE *Interface; + + IP4_PROTOCOL *IpInstance; + IP4_FRAME_CALLBACK CallBack; + VOID *Context; + + EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken; +} IP4_LINK_RX_TOKEN; + +// +// Each transmit request is wrapped in an IP4_LINK_TX_TOKEN. +// Upon completion, the Callback will be called. +// +typedef struct { + UINT32 Signature; + NET_LIST_ENTRY Link; + + IP4_INTERFACE *Interface; + + IP4_PROTOCOL *IpInstance; + IP4_FRAME_CALLBACK CallBack; + NET_BUF *Packet; + VOID *Context; + + EFI_MAC_ADDRESS DstMac; + EFI_MAC_ADDRESS SrcMac; + + EFI_MANAGED_NETWORK_COMPLETION_TOKEN MnpToken; + EFI_MANAGED_NETWORK_TRANSMIT_DATA MnpTxData; +} IP4_LINK_TX_TOKEN; + +// +// Only one ARP request is requested for all the frames in +// a time. It is started for the first frames to the Ip. Any +// subsequent transmission frame will be linked to Frames, and +// be sent all at once the ARP requests succeed. +// +typedef struct { + UINT32 Signature; + NET_LIST_ENTRY Link; + + NET_LIST_ENTRY Frames; + IP4_INTERFACE *Interface; + + // + // ARP requesting staffs + // + EFI_EVENT OnResolved; + IP4_ADDR Ip; + EFI_MAC_ADDRESS Mac; +} IP4_ARP_QUE; + +// +// Callback to select which frame to cancel. Caller can cancel a +// single frame, or all the frame from an IP instance. +// +typedef +BOOLEAN +(*IP4_FRAME_TO_CANCEL) ( + IP4_LINK_TX_TOKEN *Frame, + VOID *Context + ); + +// +// Each IP4 instance has its own station address. All the instances +// with the same station address share a single interface structure. +// Each interface has its own ARP child, and shares one MNP child. +// Notice the special cases that DHCP can configure the interface +// with 0.0.0.0/0.0.0.0. +// +struct _IP4_INTERFACE { + UINT32 Signature; + NET_LIST_ENTRY Link; + INTN RefCnt; + + // + // IP address and subnet mask of the interface. It also contains + // the subnet/net broadcast address for quick access. The fileds + // are invalid if (Configured == FALSE) + // + IP4_ADDR Ip; + IP4_ADDR SubnetMask; + IP4_ADDR SubnetBrdcast; + IP4_ADDR NetBrdcast; + BOOLEAN Configured; + + // + // Handle used to create/destory ARP child. All the IP children + // share one MNP which is owned by IP service binding. + // + EFI_HANDLE Controller; + EFI_HANDLE Image; + + EFI_MANAGED_NETWORK_PROTOCOL *Mnp; + EFI_ARP_PROTOCOL *Arp; + EFI_HANDLE ArpHandle; + + // + // Queues to keep the frames sent and waiting ARP request. + // + NET_LIST_ENTRY ArpQues; + NET_LIST_ENTRY SentFrames; + IP4_LINK_RX_TOKEN *RecvRequest; + + // + // The interface's MAC and broadcast MAC address. + // + EFI_MAC_ADDRESS Mac; + EFI_MAC_ADDRESS BroadcastMac; + UINT32 HwaddrLen; + + // + // All the IP instances that have the same IP/SubnetMask are linked + // together through IpInstances. If any of the instance enables + // promiscuous receive, PromiscRecv is true. + // + NET_LIST_ENTRY IpInstances; + BOOLEAN PromiscRecv; +}; + +IP4_INTERFACE * +Ip4CreateInterface ( + IN EFI_MANAGED_NETWORK_PROTOCOL *Mnp, + IN EFI_HANDLE Controller, + IN EFI_HANDLE ImageHandle + ); + +EFI_STATUS +Ip4SetAddress ( + IN IP4_INTERFACE *Interface, + IN IP4_ADDR IpAddr, + IN IP4_ADDR SubnetMask + ); + +EFI_STATUS +Ip4FreeInterface ( + IN IP4_INTERFACE *Interface, + IN IP4_PROTOCOL *IpInstance OPTIONAL + ); + +EFI_STATUS +Ip4SendFrame ( + IN IP4_INTERFACE *Interface, + IN IP4_PROTOCOL *IpInstance, OPTIONAL + IN NET_BUF *Packet, + IN IP4_ADDR NextHop, + IN IP4_FRAME_CALLBACK CallBack, + IN VOID *Context + ); + +VOID +Ip4CancelFrames ( + IN IP4_INTERFACE *Interface, + IN EFI_STATUS IoStatus, + IN IP4_FRAME_TO_CANCEL FrameToCancel, OPTIONAL + IN VOID *Context + ); + +VOID +Ip4CancelReceive ( + IN IP4_INTERFACE *Interface + ); + +EFI_STATUS +Ip4ReceiveFrame ( + IN IP4_INTERFACE *Interface, + IN IP4_PROTOCOL *IpInstance, OPTIONAL + IN IP4_FRAME_CALLBACK CallBack, + IN VOID *Context + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Igmp.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Igmp.h index 9bda9f942b..0b61874632 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Igmp.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Igmp.h @@ -1,120 +1,120 @@ -/** @file - -Copyright (c) 2005 - 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: - - Ip4Igmp.h - -Abstract: - - -**/ - -#ifndef __EFI_IP4_IGMP_H__ -#define __EFI_IP4_IGMP_H__ - -#pragma pack(1) -typedef struct { - UINT8 Type; - UINT8 MaxRespTime; - UINT16 Checksum; - IP4_ADDR Group; -} IGMP_HEAD; -#pragma pack() - -// -// The status of multicast group. It isn't necessary to maintain -// explicit state of host state diagram. A group with non-zero -// DelayTime is in "delaying member" state. otherwise, it is in -// "idle member" state. -// -typedef struct { - NET_LIST_ENTRY Link; - INTN RefCnt; - IP4_ADDR Address; - INTN DelayTime; - BOOLEAN ReportByUs; - EFI_MAC_ADDRESS Mac; -} IGMP_GROUP; - -// -// The IGMP status. Each IP4 service instance has a IGMP_SERVICE_DATA -// attached. The Igmpv1QuerySeen remember whether the server on this -// connected network is v1 or v2. -// -typedef struct { - INTN Igmpv1QuerySeen; - NET_LIST_ENTRY Groups; -} IGMP_SERVICE_DATA; - -enum { - // - // IGMP message type - // - IGMP_MEMBERSHIP_QUERY = 0x11, - IGMP_V1_MEMBERSHIP_REPORT = 0x12, - IGMP_V2_MEMBERSHIP_REPORT = 0x16, - IGMP_LEAVE_GROUP = 0x17, - - IGMP_V1ROUTER_PRESENT = 400, - IGMP_UNSOLICIATED_REPORT = 10 -}; - -EFI_STATUS -Ip4InitIgmp ( - IN IP4_SERVICE *IpService - ); - -EFI_STATUS -Ip4JoinGroup ( - IN IP4_PROTOCOL *IpInstance, - IN IP4_ADDR Address - ); - -EFI_STATUS -Ip4LeaveGroup ( - IN IP4_PROTOCOL *IpInstance, - IN IP4_ADDR Address - ); - -EFI_STATUS -Ip4IgmpHandle ( - IN IP4_SERVICE *IpService, - IN IP4_HEAD *Head, - IN NET_BUF *Packet - ); - -VOID -Ip4IgmpTicking ( - IN IP4_SERVICE *IpService - ); - -IP4_ADDR * -Ip4CombineGroups ( - IN IP4_ADDR *SourceGroups, - IN UINT32 Count, - IN IP4_ADDR Addr - ); - -INTN -Ip4RemoveGroupAddr ( - IN IP4_ADDR *Group, - IN UINT32 GroupCnt, - IN IP4_ADDR Addr - ); - -IGMP_GROUP * -Ip4FindGroup ( - IN IGMP_SERVICE_DATA *IgmpCtrl, - IN IP4_ADDR Address - ); -#endif +/** @file + +Copyright (c) 2005 - 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: + + Ip4Igmp.h + +Abstract: + + +**/ + +#ifndef __EFI_IP4_IGMP_H__ +#define __EFI_IP4_IGMP_H__ + +#pragma pack(1) +typedef struct { + UINT8 Type; + UINT8 MaxRespTime; + UINT16 Checksum; + IP4_ADDR Group; +} IGMP_HEAD; +#pragma pack() + +// +// The status of multicast group. It isn't necessary to maintain +// explicit state of host state diagram. A group with non-zero +// DelayTime is in "delaying member" state. otherwise, it is in +// "idle member" state. +// +typedef struct { + NET_LIST_ENTRY Link; + INTN RefCnt; + IP4_ADDR Address; + INTN DelayTime; + BOOLEAN ReportByUs; + EFI_MAC_ADDRESS Mac; +} IGMP_GROUP; + +// +// The IGMP status. Each IP4 service instance has a IGMP_SERVICE_DATA +// attached. The Igmpv1QuerySeen remember whether the server on this +// connected network is v1 or v2. +// +typedef struct { + INTN Igmpv1QuerySeen; + NET_LIST_ENTRY Groups; +} IGMP_SERVICE_DATA; + +enum { + // + // IGMP message type + // + IGMP_MEMBERSHIP_QUERY = 0x11, + IGMP_V1_MEMBERSHIP_REPORT = 0x12, + IGMP_V2_MEMBERSHIP_REPORT = 0x16, + IGMP_LEAVE_GROUP = 0x17, + + IGMP_V1ROUTER_PRESENT = 400, + IGMP_UNSOLICIATED_REPORT = 10 +}; + +EFI_STATUS +Ip4InitIgmp ( + IN IP4_SERVICE *IpService + ); + +EFI_STATUS +Ip4JoinGroup ( + IN IP4_PROTOCOL *IpInstance, + IN IP4_ADDR Address + ); + +EFI_STATUS +Ip4LeaveGroup ( + IN IP4_PROTOCOL *IpInstance, + IN IP4_ADDR Address + ); + +EFI_STATUS +Ip4IgmpHandle ( + IN IP4_SERVICE *IpService, + IN IP4_HEAD *Head, + IN NET_BUF *Packet + ); + +VOID +Ip4IgmpTicking ( + IN IP4_SERVICE *IpService + ); + +IP4_ADDR * +Ip4CombineGroups ( + IN IP4_ADDR *SourceGroups, + IN UINT32 Count, + IN IP4_ADDR Addr + ); + +INTN +Ip4RemoveGroupAddr ( + IN IP4_ADDR *Group, + IN UINT32 GroupCnt, + IN IP4_ADDR Addr + ); + +IGMP_GROUP * +Ip4FindGroup ( + IN IGMP_SERVICE_DATA *IgmpCtrl, + IN IP4_ADDR Address + ); +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.h index 58bf045372..35ada7feff 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.h @@ -1,28 +1,28 @@ -/** @file - -Copyright (c) 2005 - 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: - - Ip4Impl.h - -Abstract: - - Ip4 internal functions and type defintions. - - -**/ - -#ifndef __EFI_IP4_IMPL_H__ -#define __EFI_IP4_IMPL_H__ - +/** @file + +Copyright (c) 2005 - 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: + + Ip4Impl.h + +Abstract: + + Ip4 internal functions and type defintions. + + +**/ + +#ifndef __EFI_IP4_IMPL_H__ +#define __EFI_IP4_IMPL_H__ + #include #include @@ -35,224 +35,224 @@ Abstract: #include #include #include -#include -#include -#include -#include - -#include "Ip4Common.h" -#include "Ip4Driver.h" -#include "Ip4If.h" -#include "Ip4Icmp.h" -#include "Ip4Option.h" -#include "Ip4Igmp.h" -#include "Ip4Route.h" -#include "Ip4Input.h" -#include "Ip4Output.h" - -enum { - IP4_PROTOCOL_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', '4', 'P'), - IP4_SERVICE_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', '4', 'S'), - - // - // The state of IP4 protocol. It starts from UNCONFIGED. if it is - // successfully configured, it goes to CONFIGED. if configure NULL - // is called, it becomes UNCONFIGED again. If (partly) destoried, it - // becomes DESTORY. - // - IP4_STATE_UNCONFIGED = 0, - IP4_STATE_CONFIGED, - IP4_STATE_DESTORY, - - // - // The state of IP4 service. It starts from UNSTARTED. It transits - // to STARTED if autoconfigure is started. If default address is - // configured, it becomes CONFIGED. and if partly destoried, it goes - // to DESTORY. - // - IP4_SERVICE_UNSTARTED = 0, - IP4_SERVICE_STARTED, - IP4_SERVICE_CONFIGED, - IP4_SERVICE_DESTORY -}; - -// -// IP4_TXTOKEN_WRAP wraps the upper layer's transmit token. -// The user's data is kept in the Packet. When fragment is -// needed, each fragment of the Packet has a reference to the -// Packet, no data is actually copied. The Packet will be -// released when all the fragments of it have been recycled by -// MNP. Upon then, the IP4_TXTOKEN_WRAP will be released, and -// user's event signalled. -// -typedef struct { - IP4_PROTOCOL *IpInstance; - EFI_IP4_COMPLETION_TOKEN *Token; - NET_BUF *Packet; - BOOLEAN Sent; - INTN Life; -} IP4_TXTOKEN_WRAP; - -// -// IP4_RXDATA_WRAP wraps the data IP4 child delivers to the -// upper layers. The received packet is kept in the Packet. -// The Packet itself may be constructured from some fragments. -// All the fragments of the Packet is organized by a -// IP4_ASSEMBLE_ENTRY structure. If the Packet is recycled by -// the upper layer, the assemble entry and its associated -// fragments will be freed at last. -// -typedef struct { - NET_LIST_ENTRY Link; - IP4_PROTOCOL *IpInstance; - NET_BUF *Packet; - EFI_IP4_RECEIVE_DATA RxData; -} IP4_RXDATA_WRAP; - -struct _IP4_PROTOCOL { - UINT32 Signature; - - EFI_IP4_PROTOCOL Ip4Proto; - EFI_HANDLE Handle; - INTN State; - - IP4_SERVICE *Service; - NET_LIST_ENTRY Link; // Link to all the IP protocol from the service - - // - // User's transmit/receive tokens, and received/deliverd packets - // - NET_MAP RxTokens; - NET_MAP TxTokens; // map between (User's Token, IP4_TXTOKE_WRAP) - NET_LIST_ENTRY Received; // Received but not delivered packet - NET_LIST_ENTRY Delivered; // Delivered and to be recycled packets - EFI_LOCK RecycleLock; - - // - // Instance's address and route tables. There are two route tables. - // RouteTable is used by the IP4 driver to route packet. EfiRouteTable - // is used to communicate the current route info to the upper layer. - // - IP4_INTERFACE *Interface; - NET_LIST_ENTRY AddrLink; // Ip instances with the same IP address. - IP4_ROUTE_TABLE *RouteTable; - - EFI_IP4_ROUTE_TABLE *EfiRouteTable; - UINT32 EfiRouteCount; - - // - // IGMP data for this instance - // - IP4_ADDR *Groups; // stored in network byte order - UINT32 GroupCount; - - EFI_IP4_CONFIG_DATA ConfigData; - -}; - -struct _IP4_SERVICE { - UINT32 Signature; - EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; - INTN State; - BOOLEAN InDestory; - - // - // List of all the IP instances and interfaces, and default - // interface and route table and caches. - // - UINTN NumChildren; - NET_LIST_ENTRY Children; - - NET_LIST_ENTRY Interfaces; - - IP4_INTERFACE *DefaultInterface; - IP4_ROUTE_TABLE *DefaultRouteTable; - - // - // Ip reassemble utilities, and IGMP data - // - IP4_ASSEMBLE_TABLE Assemble; - IGMP_SERVICE_DATA IgmpCtrl; - - // - // Low level protocol used by this service instance - // - EFI_HANDLE Image; - EFI_HANDLE Controller; - - EFI_HANDLE MnpChildHandle; - EFI_MANAGED_NETWORK_PROTOCOL *Mnp; - - EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData; - EFI_SIMPLE_NETWORK_MODE SnpMode; - - EFI_EVENT Timer; - - // - // Auto configure staff - // - EFI_IP4_CONFIG_PROTOCOL *Ip4Config; - EFI_EVENT DoneEvent; - EFI_EVENT ReconfigEvent; - - // - // The string representation of the current mac address of the - // NIC this IP4_SERVICE works on. - // - CHAR16 *MacString; -}; - -#define IP4_INSTANCE_FROM_PROTOCOL(Ip4) \ - CR ((Ip4), IP4_PROTOCOL, Ip4Proto, IP4_PROTOCOL_SIGNATURE) - -#define IP4_SERVICE_FROM_PROTOCOL(Sb) \ - CR ((Sb), IP4_SERVICE, ServiceBinding, IP4_SERVICE_SIGNATURE) - -#define IP4_NO_MAPPING(IpInstance) (!(IpInstance)->Interface->Configured) - -extern EFI_IP4_PROTOCOL mEfiIp4ProtocolTemplete; - -EFI_STATUS -Ip4ServiceConfigMnp ( - IN IP4_SERVICE *IpSb, - IN BOOLEAN Force - ); - -VOID -Ip4InitProtocol ( - IN IP4_SERVICE *IpSb, - IN IP4_PROTOCOL *IpInstance - ); - -EFI_STATUS -Ip4CleanProtocol ( - IN IP4_PROTOCOL *IpInstance - ); - -EFI_STATUS -Ip4Cancel ( - IN IP4_PROTOCOL *IpInstance, - IN EFI_IP4_COMPLETION_TOKEN *Token - ); - -EFI_STATUS -Ip4Groups ( - IN IP4_PROTOCOL *IpInstance, - IN BOOLEAN JoinFlag, - IN EFI_IPv4_ADDRESS *GroupAddress - ); - -VOID -EFIAPI -Ip4TimerTicking ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -EFI_STATUS -Ip4SentPacketTicking ( - IN NET_MAP *Map, - IN NET_MAP_ITEM *Item, - IN VOID *Context - ); -#endif +#include +#include +#include +#include + +#include "Ip4Common.h" +#include "Ip4Driver.h" +#include "Ip4If.h" +#include "Ip4Icmp.h" +#include "Ip4Option.h" +#include "Ip4Igmp.h" +#include "Ip4Route.h" +#include "Ip4Input.h" +#include "Ip4Output.h" + +enum { + IP4_PROTOCOL_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', '4', 'P'), + IP4_SERVICE_SIGNATURE = EFI_SIGNATURE_32 ('I', 'P', '4', 'S'), + + // + // The state of IP4 protocol. It starts from UNCONFIGED. if it is + // successfully configured, it goes to CONFIGED. if configure NULL + // is called, it becomes UNCONFIGED again. If (partly) destoried, it + // becomes DESTORY. + // + IP4_STATE_UNCONFIGED = 0, + IP4_STATE_CONFIGED, + IP4_STATE_DESTORY, + + // + // The state of IP4 service. It starts from UNSTARTED. It transits + // to STARTED if autoconfigure is started. If default address is + // configured, it becomes CONFIGED. and if partly destoried, it goes + // to DESTORY. + // + IP4_SERVICE_UNSTARTED = 0, + IP4_SERVICE_STARTED, + IP4_SERVICE_CONFIGED, + IP4_SERVICE_DESTORY +}; + +// +// IP4_TXTOKEN_WRAP wraps the upper layer's transmit token. +// The user's data is kept in the Packet. When fragment is +// needed, each fragment of the Packet has a reference to the +// Packet, no data is actually copied. The Packet will be +// released when all the fragments of it have been recycled by +// MNP. Upon then, the IP4_TXTOKEN_WRAP will be released, and +// user's event signalled. +// +typedef struct { + IP4_PROTOCOL *IpInstance; + EFI_IP4_COMPLETION_TOKEN *Token; + NET_BUF *Packet; + BOOLEAN Sent; + INTN Life; +} IP4_TXTOKEN_WRAP; + +// +// IP4_RXDATA_WRAP wraps the data IP4 child delivers to the +// upper layers. The received packet is kept in the Packet. +// The Packet itself may be constructured from some fragments. +// All the fragments of the Packet is organized by a +// IP4_ASSEMBLE_ENTRY structure. If the Packet is recycled by +// the upper layer, the assemble entry and its associated +// fragments will be freed at last. +// +typedef struct { + NET_LIST_ENTRY Link; + IP4_PROTOCOL *IpInstance; + NET_BUF *Packet; + EFI_IP4_RECEIVE_DATA RxData; +} IP4_RXDATA_WRAP; + +struct _IP4_PROTOCOL { + UINT32 Signature; + + EFI_IP4_PROTOCOL Ip4Proto; + EFI_HANDLE Handle; + INTN State; + + IP4_SERVICE *Service; + NET_LIST_ENTRY Link; // Link to all the IP protocol from the service + + // + // User's transmit/receive tokens, and received/deliverd packets + // + NET_MAP RxTokens; + NET_MAP TxTokens; // map between (User's Token, IP4_TXTOKE_WRAP) + NET_LIST_ENTRY Received; // Received but not delivered packet + NET_LIST_ENTRY Delivered; // Delivered and to be recycled packets + EFI_LOCK RecycleLock; + + // + // Instance's address and route tables. There are two route tables. + // RouteTable is used by the IP4 driver to route packet. EfiRouteTable + // is used to communicate the current route info to the upper layer. + // + IP4_INTERFACE *Interface; + NET_LIST_ENTRY AddrLink; // Ip instances with the same IP address. + IP4_ROUTE_TABLE *RouteTable; + + EFI_IP4_ROUTE_TABLE *EfiRouteTable; + UINT32 EfiRouteCount; + + // + // IGMP data for this instance + // + IP4_ADDR *Groups; // stored in network byte order + UINT32 GroupCount; + + EFI_IP4_CONFIG_DATA ConfigData; + +}; + +struct _IP4_SERVICE { + UINT32 Signature; + EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; + INTN State; + BOOLEAN InDestory; + + // + // List of all the IP instances and interfaces, and default + // interface and route table and caches. + // + UINTN NumChildren; + NET_LIST_ENTRY Children; + + NET_LIST_ENTRY Interfaces; + + IP4_INTERFACE *DefaultInterface; + IP4_ROUTE_TABLE *DefaultRouteTable; + + // + // Ip reassemble utilities, and IGMP data + // + IP4_ASSEMBLE_TABLE Assemble; + IGMP_SERVICE_DATA IgmpCtrl; + + // + // Low level protocol used by this service instance + // + EFI_HANDLE Image; + EFI_HANDLE Controller; + + EFI_HANDLE MnpChildHandle; + EFI_MANAGED_NETWORK_PROTOCOL *Mnp; + + EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData; + EFI_SIMPLE_NETWORK_MODE SnpMode; + + EFI_EVENT Timer; + + // + // Auto configure staff + // + EFI_IP4_CONFIG_PROTOCOL *Ip4Config; + EFI_EVENT DoneEvent; + EFI_EVENT ReconfigEvent; + + // + // The string representation of the current mac address of the + // NIC this IP4_SERVICE works on. + // + CHAR16 *MacString; +}; + +#define IP4_INSTANCE_FROM_PROTOCOL(Ip4) \ + CR ((Ip4), IP4_PROTOCOL, Ip4Proto, IP4_PROTOCOL_SIGNATURE) + +#define IP4_SERVICE_FROM_PROTOCOL(Sb) \ + CR ((Sb), IP4_SERVICE, ServiceBinding, IP4_SERVICE_SIGNATURE) + +#define IP4_NO_MAPPING(IpInstance) (!(IpInstance)->Interface->Configured) + +extern EFI_IP4_PROTOCOL mEfiIp4ProtocolTemplete; + +EFI_STATUS +Ip4ServiceConfigMnp ( + IN IP4_SERVICE *IpSb, + IN BOOLEAN Force + ); + +VOID +Ip4InitProtocol ( + IN IP4_SERVICE *IpSb, + IN IP4_PROTOCOL *IpInstance + ); + +EFI_STATUS +Ip4CleanProtocol ( + IN IP4_PROTOCOL *IpInstance + ); + +EFI_STATUS +Ip4Cancel ( + IN IP4_PROTOCOL *IpInstance, + IN EFI_IP4_COMPLETION_TOKEN *Token + ); + +EFI_STATUS +Ip4Groups ( + IN IP4_PROTOCOL *IpInstance, + IN BOOLEAN JoinFlag, + IN EFI_IPv4_ADDRESS *GroupAddress + ); + +VOID +EFIAPI +Ip4TimerTicking ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +EFI_STATUS +Ip4SentPacketTicking ( + IN NET_MAP *Map, + IN NET_MAP_ITEM *Item, + IN VOID *Context + ); +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.h index 2acf769968..af8ed1adf3 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Input.h @@ -1,138 +1,138 @@ -/** @file - -Copyright (c) 2005 - 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: - - Ip4Input.h - -Abstract: - - -**/ - -#ifndef __EFI_IP4_INPUT_H__ -#define __EFI_IP4_INPUT_H__ - -enum { - IP4_MIN_HEADLEN = 20, - IP4_MAX_HEADLEN = 60, - - IP4_ASSEMLE_HASH_SIZE = 31, - IP4_FRAGMENT_LIFE = 120, - IP4_MAX_PACKET_SIZE = 65535 -}; - -// -// Per packet information for input process. LinkFlag specifies whether -// the packet is received as Link layer unicast, multicast or broadcast. -// The CastType is the IP layer cast type, such as IP multicast or unicast. -// Start, End and Length are staffs used to assemble the packets. Start -// is the sequence number of the first byte of data in the packet. Length -// is the number of bytes of data. End = Start + Length, that is, the -// sequence number of last byte + 1. Each assembled packet has a count down -// life. If it isn't consumed before Life reaches zero, the packet is released. -// -typedef struct { - UINTN LinkFlag; - INTN CastType; - INTN Start; - INTN End; - INTN Length; - UINT32 Life; - EFI_STATUS Status; -} IP4_CLIP_INFO; - -// -// Structure used to assemble IP packets. -// -typedef struct { - NET_LIST_ENTRY Link; - - // - // Identity of one IP4 packet. Each fragment of a packet has - // the same (Dst, Src, Id, Protocol). - // - IP4_ADDR Dst; - IP4_ADDR Src; - UINT16 Id; - UINT8 Protocol; - - INTN TotalLen; - INTN CurLen; - NET_LIST_ENTRY Fragments; // List of all the fragments of this packet - - IP4_HEAD *Head; // IP head of the first fragment - IP4_CLIP_INFO *Info; // Per packet info of the first fragment - INTN Life; // Count down life for the packet. -} IP4_ASSEMBLE_ENTRY; - -// -// Each Ip service instance has an assemble table to reassemble -// the packets before delivery to its children. It is organized -// as hash table. -// -typedef struct { - NET_LIST_ENTRY Bucket[IP4_ASSEMLE_HASH_SIZE]; -} IP4_ASSEMBLE_TABLE; - -#define IP4_GET_CLIP_INFO(Packet) ((IP4_CLIP_INFO *) ((Packet)->ProtoData)) - -#define IP4_ASSEMBLE_HASH(Dst, Src, Id, Proto) \ - (((Dst) + (Src) + ((Id) << 16) + (Proto)) % IP4_ASSEMLE_HASH_SIZE) - -#define IP4_RXDATA_WRAP_SIZE(NumFrag) \ - (sizeof (IP4_RXDATA_WRAP) + sizeof (EFI_IP4_FRAGMENT_DATA) * ((NumFrag) - 1)) - -VOID -Ip4InitAssembleTable ( - IN IP4_ASSEMBLE_TABLE *Table - ); - -VOID -Ip4CleanAssembleTable ( - IN IP4_ASSEMBLE_TABLE *Table - ); - -VOID -Ip4AccpetFrame ( - IN IP4_PROTOCOL *Ip4Instance, - IN NET_BUF *Packet, - IN EFI_STATUS IoStatus, - IN UINT32 Flag, - IN VOID *Context - ); - -EFI_STATUS -Ip4Demultiplex ( - IN IP4_SERVICE *SbInstance, - IN IP4_HEAD *Head, - IN NET_BUF *Packet - ); - -INTN -Ip4InterfaceEnquePacket ( - IN IP4_SERVICE *SbInstance, - IN IP4_HEAD *Head, - IN NET_BUF *Packet, - IN IP4_INTERFACE *Interface - ); - -EFI_STATUS -Ip4InstanceDeliverPacket ( - IN IP4_PROTOCOL *Ip4Instance - ); - -VOID -Ip4PacketTimerTicking ( - IN IP4_SERVICE *IpSb - ); - -#endif +/** @file + +Copyright (c) 2005 - 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: + + Ip4Input.h + +Abstract: + + +**/ + +#ifndef __EFI_IP4_INPUT_H__ +#define __EFI_IP4_INPUT_H__ + +enum { + IP4_MIN_HEADLEN = 20, + IP4_MAX_HEADLEN = 60, + + IP4_ASSEMLE_HASH_SIZE = 31, + IP4_FRAGMENT_LIFE = 120, + IP4_MAX_PACKET_SIZE = 65535 +}; + +// +// Per packet information for input process. LinkFlag specifies whether +// the packet is received as Link layer unicast, multicast or broadcast. +// The CastType is the IP layer cast type, such as IP multicast or unicast. +// Start, End and Length are staffs used to assemble the packets. Start +// is the sequence number of the first byte of data in the packet. Length +// is the number of bytes of data. End = Start + Length, that is, the +// sequence number of last byte + 1. Each assembled packet has a count down +// life. If it isn't consumed before Life reaches zero, the packet is released. +// +typedef struct { + UINTN LinkFlag; + INTN CastType; + INTN Start; + INTN End; + INTN Length; + UINT32 Life; + EFI_STATUS Status; +} IP4_CLIP_INFO; + +// +// Structure used to assemble IP packets. +// +typedef struct { + NET_LIST_ENTRY Link; + + // + // Identity of one IP4 packet. Each fragment of a packet has + // the same (Dst, Src, Id, Protocol). + // + IP4_ADDR Dst; + IP4_ADDR Src; + UINT16 Id; + UINT8 Protocol; + + INTN TotalLen; + INTN CurLen; + NET_LIST_ENTRY Fragments; // List of all the fragments of this packet + + IP4_HEAD *Head; // IP head of the first fragment + IP4_CLIP_INFO *Info; // Per packet info of the first fragment + INTN Life; // Count down life for the packet. +} IP4_ASSEMBLE_ENTRY; + +// +// Each Ip service instance has an assemble table to reassemble +// the packets before delivery to its children. It is organized +// as hash table. +// +typedef struct { + NET_LIST_ENTRY Bucket[IP4_ASSEMLE_HASH_SIZE]; +} IP4_ASSEMBLE_TABLE; + +#define IP4_GET_CLIP_INFO(Packet) ((IP4_CLIP_INFO *) ((Packet)->ProtoData)) + +#define IP4_ASSEMBLE_HASH(Dst, Src, Id, Proto) \ + (((Dst) + (Src) + ((Id) << 16) + (Proto)) % IP4_ASSEMLE_HASH_SIZE) + +#define IP4_RXDATA_WRAP_SIZE(NumFrag) \ + (sizeof (IP4_RXDATA_WRAP) + sizeof (EFI_IP4_FRAGMENT_DATA) * ((NumFrag) - 1)) + +VOID +Ip4InitAssembleTable ( + IN IP4_ASSEMBLE_TABLE *Table + ); + +VOID +Ip4CleanAssembleTable ( + IN IP4_ASSEMBLE_TABLE *Table + ); + +VOID +Ip4AccpetFrame ( + IN IP4_PROTOCOL *Ip4Instance, + IN NET_BUF *Packet, + IN EFI_STATUS IoStatus, + IN UINT32 Flag, + IN VOID *Context + ); + +EFI_STATUS +Ip4Demultiplex ( + IN IP4_SERVICE *SbInstance, + IN IP4_HEAD *Head, + IN NET_BUF *Packet + ); + +INTN +Ip4InterfaceEnquePacket ( + IN IP4_SERVICE *SbInstance, + IN IP4_HEAD *Head, + IN NET_BUF *Packet, + IN IP4_INTERFACE *Interface + ); + +EFI_STATUS +Ip4InstanceDeliverPacket ( + IN IP4_PROTOCOL *Ip4Instance + ); + +VOID +Ip4PacketTimerTicking ( + IN IP4_SERVICE *IpSb + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Option.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Option.h index 665b55b06a..830962ee24 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Option.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Option.h @@ -1,52 +1,52 @@ -/** @file - -Copyright (c) 2005 - 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: - - Ip4Option.h - -Abstract: - - IP4 option support routines. - - -**/ - -#ifndef __EFI_IP4_OPTION_H__ -#define __EFI_IP4_OPTION_H__ - -enum { - IP4_OPTION_EOP = 0, - IP4_OPTION_NOP = 1, - IP4_OPTION_LSRR = 131, // Loss source and record routing, 10000011 - IP4_OPTION_SSRR = 137, // Strict source and record routing, 10001001 - IP4_OPTION_RR = 7, // Record routing, 00000111 - - IP4_OPTION_COPY_MASK = 0x80 -}; - -BOOLEAN -Ip4OptionIsValid ( - IN UINT8 *Option, - IN UINT32 OptLen, - IN BOOLEAN Rcvd - ); - -EFI_STATUS -Ip4CopyOption ( - IN UINT8 *Option, - IN UINT32 OptLen, - IN BOOLEAN Fragment, - IN UINT8 *Buf, OPTIONAL - IN OUT UINT32 *BufLen - ); -#endif +/** @file + +Copyright (c) 2005 - 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: + + Ip4Option.h + +Abstract: + + IP4 option support routines. + + +**/ + +#ifndef __EFI_IP4_OPTION_H__ +#define __EFI_IP4_OPTION_H__ + +enum { + IP4_OPTION_EOP = 0, + IP4_OPTION_NOP = 1, + IP4_OPTION_LSRR = 131, // Loss source and record routing, 10000011 + IP4_OPTION_SSRR = 137, // Strict source and record routing, 10001001 + IP4_OPTION_RR = 7, // Record routing, 00000111 + + IP4_OPTION_COPY_MASK = 0x80 +}; + +BOOLEAN +Ip4OptionIsValid ( + IN UINT8 *Option, + IN UINT32 OptLen, + IN BOOLEAN Rcvd + ); + +EFI_STATUS +Ip4CopyOption ( + IN UINT8 *Option, + IN UINT32 OptLen, + IN BOOLEAN Fragment, + IN UINT8 *Buf, OPTIONAL + IN OUT UINT32 *BufLen + ); +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Output.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Output.h index e165e1d715..991f10cbc0 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Output.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Output.h @@ -1,54 +1,54 @@ -/** @file - -Copyright (c) 2005 - 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: - - Ip4Output.h - -Abstract: - - -**/ - -#ifndef __EFI_IP4_OUTPUT_H__ -#define __EFI_IP4_OUTPUT_H__ - -VOID -Ip4SysPacketSent ( - IP4_PROTOCOL *Ip4Instance, - NET_BUF *Packet, - EFI_STATUS IoStatus, - UINT32 Flag, - VOID *Context - ); - -EFI_STATUS -Ip4Output ( - IN IP4_SERVICE *IpSb, - IN IP4_PROTOCOL *IpInstance, OPTIONAL - IN NET_BUF *Data, - IN IP4_HEAD *Head, - IN UINT8 *Option, - IN UINT32 OptLen, - IN IP4_ADDR GateWay, - IN IP4_FRAME_CALLBACK Callback, - IN VOID *Context - ); - -VOID -Ip4CancelPacket ( - IN IP4_INTERFACE *IpIf, - IN NET_BUF *Packet, - IN EFI_STATUS IoStatus - ); - -extern UINT16 mIp4Id; -#endif +/** @file + +Copyright (c) 2005 - 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: + + Ip4Output.h + +Abstract: + + +**/ + +#ifndef __EFI_IP4_OUTPUT_H__ +#define __EFI_IP4_OUTPUT_H__ + +VOID +Ip4SysPacketSent ( + IP4_PROTOCOL *Ip4Instance, + NET_BUF *Packet, + EFI_STATUS IoStatus, + UINT32 Flag, + VOID *Context + ); + +EFI_STATUS +Ip4Output ( + IN IP4_SERVICE *IpSb, + IN IP4_PROTOCOL *IpInstance, OPTIONAL + IN NET_BUF *Data, + IN IP4_HEAD *Head, + IN UINT8 *Option, + IN UINT32 OptLen, + IN IP4_ADDR GateWay, + IN IP4_FRAME_CALLBACK Callback, + IN VOID *Context + ); + +VOID +Ip4CancelPacket ( + IN IP4_INTERFACE *IpIf, + IN NET_BUF *Packet, + IN EFI_STATUS IoStatus + ); + +extern UINT16 mIp4Id; +#endif diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Route.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Route.h index 3dce5d2f3a..fdf40ca5bf 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Route.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Route.h @@ -1,151 +1,151 @@ -/** @file - -Copyright (c) 2005 - 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: - - Ip4Route.h - -Abstract: - - EFI IP4 route table and route cache table defintions. - - -**/ - -#ifndef __EFI_IP4_ROUTE_H__ -#define __EFI_IP4_ROUTE_H__ - -#include "IP4Common.h" - -enum { - IP4_DIRECT_ROUTE = 0x00000001, - - IP4_ROUTE_CACHE_HASH = 31, - IP4_ROUTE_CACHE_MAX = 64 // Max NO. of cache entry per hash bucket -}; - -#define IP4_ROUTE_CACHE_HASH(Dst, Src) (((Dst) ^ (Src)) % IP4_ROUTE_CACHE_HASH) - -// -// The route entry in the route table. Dest/Netmask is the destion -// network. The nexthop is the gateway to send the packet to in -// order to reach the Dest/Netmask. If the Flag has IP4_DIRECT_ROUTE -// on, the gateway is the destination of the IP packet itself. Route -// enties of the connected network have the flag on. -// -typedef struct { - NET_LIST_ENTRY Link; - INTN RefCnt; - IP4_ADDR Dest; - IP4_ADDR Netmask; - IP4_ADDR NextHop; - UINT32 Flag; -} IP4_ROUTE_ENTRY; - -// -// The route cache entry. The route cache entry is optional. -// But it is necessary to support the ICMP redirect message. -// Check Ip4ProcessIcmpRedirect for information. -// -// The cache entry field Tag is used to tag all the route -// cache entry spawned from a route table entry. This makes -// it simple to delete all the route cache entries from a -// to-be-deleted route entry. -// -typedef struct { - NET_LIST_ENTRY Link; - INTN RefCnt; - IP4_ADDR Dest; - IP4_ADDR Src; - IP4_ADDR NextHop; - UINTN Tag; -} IP4_ROUTE_CACHE_ENTRY; - -// -// The route cache table is organized as a hash table. Each -// IP4 route table has a embedded route cache. For now the -// route cache and route table are binded togehter. But keep -// the route cache a seperated structure in case we want to -// detach them later. -// -typedef struct { - NET_LIST_ENTRY CacheBucket[IP4_ROUTE_CACHE_HASH]; -} IP4_ROUTE_CACHE; - -// -// Each IP4 instance has its own route table. Each ServiceBinding -// instance has a default route table and default address. -// -// All the route table entries with the same mask are linked -// together in one route area. For example, RouteArea[0] contains -// the default routes. A route table also contains a route cache. -// -typedef struct _IP4_ROUTE_TABLE IP4_ROUTE_TABLE; - -struct _IP4_ROUTE_TABLE { - INTN RefCnt; - UINT32 TotalNum; - NET_LIST_ENTRY RouteArea[IP4_MASK_NUM]; - IP4_ROUTE_TABLE *Next; - IP4_ROUTE_CACHE Cache; -}; - -IP4_ROUTE_TABLE* -Ip4CreateRouteTable ( - VOID - ); - -VOID -Ip4FreeRouteTable ( - IN IP4_ROUTE_TABLE *RouteTable - ); - -EFI_STATUS -Ip4AddRoute ( - IN IP4_ROUTE_TABLE *RtTable, - IN IP4_ADDR Dest, - IN IP4_ADDR Netmask, - IN IP4_ADDR Gateway - ); - -EFI_STATUS -Ip4DelRoute ( - IN IP4_ROUTE_TABLE *RtTable, - IN IP4_ADDR Dest, - IN IP4_ADDR Netmask, - IN IP4_ADDR Gateway - ); - -IP4_ROUTE_CACHE_ENTRY * -Ip4FindRouteCache ( - IN IP4_ROUTE_TABLE *RtTable, - IN IP4_ADDR Dest, - IN IP4_ADDR Src - ); - -VOID -Ip4FreeRouteCacheEntry ( - IN IP4_ROUTE_CACHE_ENTRY *RtCacheEntry - ); - -IP4_ROUTE_CACHE_ENTRY * -Ip4Route ( - IN IP4_ROUTE_TABLE *RtTable, - IN IP4_ADDR Dest, - IN IP4_ADDR Src - ); - -EFI_STATUS -Ip4BuildEfiRouteTable ( - IN IP4_PROTOCOL *IpInstance - ); -#endif +/** @file + +Copyright (c) 2005 - 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: + + Ip4Route.h + +Abstract: + + EFI IP4 route table and route cache table defintions. + + +**/ + +#ifndef __EFI_IP4_ROUTE_H__ +#define __EFI_IP4_ROUTE_H__ + +#include "IP4Common.h" + +enum { + IP4_DIRECT_ROUTE = 0x00000001, + + IP4_ROUTE_CACHE_HASH = 31, + IP4_ROUTE_CACHE_MAX = 64 // Max NO. of cache entry per hash bucket +}; + +#define IP4_ROUTE_CACHE_HASH(Dst, Src) (((Dst) ^ (Src)) % IP4_ROUTE_CACHE_HASH) + +// +// The route entry in the route table. Dest/Netmask is the destion +// network. The nexthop is the gateway to send the packet to in +// order to reach the Dest/Netmask. If the Flag has IP4_DIRECT_ROUTE +// on, the gateway is the destination of the IP packet itself. Route +// enties of the connected network have the flag on. +// +typedef struct { + NET_LIST_ENTRY Link; + INTN RefCnt; + IP4_ADDR Dest; + IP4_ADDR Netmask; + IP4_ADDR NextHop; + UINT32 Flag; +} IP4_ROUTE_ENTRY; + +// +// The route cache entry. The route cache entry is optional. +// But it is necessary to support the ICMP redirect message. +// Check Ip4ProcessIcmpRedirect for information. +// +// The cache entry field Tag is used to tag all the route +// cache entry spawned from a route table entry. This makes +// it simple to delete all the route cache entries from a +// to-be-deleted route entry. +// +typedef struct { + NET_LIST_ENTRY Link; + INTN RefCnt; + IP4_ADDR Dest; + IP4_ADDR Src; + IP4_ADDR NextHop; + UINTN Tag; +} IP4_ROUTE_CACHE_ENTRY; + +// +// The route cache table is organized as a hash table. Each +// IP4 route table has a embedded route cache. For now the +// route cache and route table are binded togehter. But keep +// the route cache a seperated structure in case we want to +// detach them later. +// +typedef struct { + NET_LIST_ENTRY CacheBucket[IP4_ROUTE_CACHE_HASH]; +} IP4_ROUTE_CACHE; + +// +// Each IP4 instance has its own route table. Each ServiceBinding +// instance has a default route table and default address. +// +// All the route table entries with the same mask are linked +// together in one route area. For example, RouteArea[0] contains +// the default routes. A route table also contains a route cache. +// +typedef struct _IP4_ROUTE_TABLE IP4_ROUTE_TABLE; + +struct _IP4_ROUTE_TABLE { + INTN RefCnt; + UINT32 TotalNum; + NET_LIST_ENTRY RouteArea[IP4_MASK_NUM]; + IP4_ROUTE_TABLE *Next; + IP4_ROUTE_CACHE Cache; +}; + +IP4_ROUTE_TABLE* +Ip4CreateRouteTable ( + VOID + ); + +VOID +Ip4FreeRouteTable ( + IN IP4_ROUTE_TABLE *RouteTable + ); + +EFI_STATUS +Ip4AddRoute ( + IN IP4_ROUTE_TABLE *RtTable, + IN IP4_ADDR Dest, + IN IP4_ADDR Netmask, + IN IP4_ADDR Gateway + ); + +EFI_STATUS +Ip4DelRoute ( + IN IP4_ROUTE_TABLE *RtTable, + IN IP4_ADDR Dest, + IN IP4_ADDR Netmask, + IN IP4_ADDR Gateway + ); + +IP4_ROUTE_CACHE_ENTRY * +Ip4FindRouteCache ( + IN IP4_ROUTE_TABLE *RtTable, + IN IP4_ADDR Dest, + IN IP4_ADDR Src + ); + +VOID +Ip4FreeRouteCacheEntry ( + IN IP4_ROUTE_CACHE_ENTRY *RtCacheEntry + ); + +IP4_ROUTE_CACHE_ENTRY * +Ip4Route ( + IN IP4_ROUTE_TABLE *RtTable, + IN IP4_ADDR Dest, + IN IP4_ADDR Src + ); + +EFI_STATUS +Ip4BuildEfiRouteTable ( + IN IP4_PROTOCOL *IpInstance + ); +#endif diff --git a/MdeModulePkg/Universal/Network/MnpDxe/ComponentName.c b/MdeModulePkg/Universal/Network/MnpDxe/ComponentName.c index 209861c775..b2af53cea7 100644 --- a/MdeModulePkg/Universal/Network/MnpDxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/MnpDxe/ComponentName.c @@ -24,6 +24,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI MnpComponentNameGetDriverName ( @@ -32,6 +71,75 @@ MnpComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI MnpComponentNameGetControllerName ( @@ -42,18 +150,29 @@ MnpComponentNameGetControllerName ( OUT CHAR16 **ControllerName ); + // // EFI Component Name Protocol // -EFI_COMPONENT_NAME_PROTOCOL gMnpComponentName = { +EFI_COMPONENT_NAME_PROTOCOL gMnpComponentName = { MnpComponentNameGetDriverName, MnpComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gMnpComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) MnpComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) MnpComponentNameGetControllerName, + "en" + }; + STATIC EFI_UNICODE_STRING_TABLE mMnpDriverNameTable[] = { { - "eng", + "eng;en", L"MNP Network Service Driver" }, { @@ -62,6 +181,45 @@ STATIC EFI_UNICODE_STRING_TABLE mMnpDriverNameTable[] = { } }; +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI MnpComponentNameGetDriverName ( @@ -69,41 +227,84 @@ MnpComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language - A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - DriverName - A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - Returns: - EFI_SUCCES - The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - DriverName is NULL. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { - return LookupUnicodeString ( - Language, - gMnpComponentName.SupportedLanguages, - mMnpDriverNameTable, - DriverName - ); + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mMnpDriverNameTable, + DriverName, + (BOOLEAN)(This == &gMnpComponentName) + ); } +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI MnpComponentNameGetControllerName ( @@ -113,50 +314,6 @@ MnpComponentNameGetControllerName ( IN CHAR8 *Language, OUT CHAR16 **ControllerName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle - The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle - The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - ControllerName - A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - Returns: - EFI_SUCCESS - The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - ControllerName is NULL. - EFI_UNSUPPORTED - The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/MnpDxe/MnpDebug.h b/MdeModulePkg/Universal/Network/MnpDxe/MnpDebug.h index 72eb59b9b4..063c05b74c 100644 --- a/MdeModulePkg/Universal/Network/MnpDxe/MnpDebug.h +++ b/MdeModulePkg/Universal/Network/MnpDxe/MnpDebug.h @@ -1,28 +1,28 @@ -/** @file - -Copyright (c) 2005 - 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: - - MnpDebug.h - -Abstract: - - -**/ - -#ifndef _MNP_DEBUG_H_ -#define _MNP_DEBUG_H_ - -#define MNP_DEBUG_TRACE(PrintArg) NET_DEBUG_TRACE ("Mnp", PrintArg) -#define MNP_DEBUG_WARN(PrintArg) NET_DEBUG_WARNING ("Mnp", PrintArg) -#define MNP_DEBUG_ERROR(PrintArg) NET_DEBUG_ERROR ("Mnp", PrintArg) - -#endif +/** @file + +Copyright (c) 2005 - 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: + + MnpDebug.h + +Abstract: + + +**/ + +#ifndef _MNP_DEBUG_H_ +#define _MNP_DEBUG_H_ + +#define MNP_DEBUG_TRACE(PrintArg) NET_DEBUG_TRACE ("Mnp", PrintArg) +#define MNP_DEBUG_WARN(PrintArg) NET_DEBUG_WARNING ("Mnp", PrintArg) +#define MNP_DEBUG_ERROR(PrintArg) NET_DEBUG_ERROR ("Mnp", PrintArg) + +#endif diff --git a/MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.c b/MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.c index 7303f6b40e..814566ec56 100644 --- a/MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.c +++ b/MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.c @@ -547,13 +547,12 @@ Returns: --*/ { - return EfiLibInstallAllDriverProtocols ( + return EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, &gMnpDriverBinding, ImageHandle, &gMnpComponentName, - NULL, - NULL + &gMnpComponentName2 ); } diff --git a/MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.h b/MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.h index a387eb05d0..732c56b299 100644 --- a/MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.h +++ b/MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.h @@ -1,137 +1,138 @@ -/** @file - -Copyright (c) 2005 - 2007, 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: - - MnpDriver.h - -Abstract: - - -**/ - -#ifndef _MNP_DRIVER_H_ -#define _MNP_DRIVER_H_ +/** @file + +Copyright (c) 2005 - 2007, 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: + + MnpDriver.h + +Abstract: + + +**/ + +#ifndef _MNP_DRIVER_H_ +#define _MNP_DRIVER_H_ #include #include -#include +#include #include #include #include #include -#include -#include +#include +#include #include -#include -#include - -#include "MnpDebug.h" - -// -// Required Global Variables -// -extern EFI_DRIVER_BINDING_PROTOCOL gMnpDriverBinding; -extern EFI_COMPONENT_NAME_PROTOCOL gMnpComponentName; - -#define MNP_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32 ('M', 'n', 'p', 'S') - -typedef struct _MNP_SERVICE_DATA { - UINT32 Signature; - - EFI_HANDLE ControllerHandle; - - EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; - EFI_SIMPLE_NETWORK_PROTOCOL *Snp; - - UINT32 Mtu; - - NET_LIST_ENTRY ChildrenList; - UINTN ChildrenNumber; - UINTN ConfiguredChildrenNumber; - - NET_LIST_ENTRY GroupAddressList; - UINT32 GroupAddressCount; - - EFI_EVENT TxTimeoutEvent; - - NET_BUF_QUEUE FreeNbufQue; - INTN NbufCnt; - - EFI_EVENT PollTimer; - BOOLEAN EnableSystemPoll; - - EFI_EVENT TimeoutCheckTimer; - - UINT32 UnicastCount; - UINT32 BroadcastCount; - UINT32 MulticastCount; - UINT32 PromiscuousCount; - - // - // The size of the data buffer in the MNP_PACKET_BUFFER used to - // store a packet. - // - UINT32 BufferLength; - UINT32 PaddingSize; - NET_BUF *RxNbufCache; - UINT8 *TxBuf; -} MNP_SERVICE_DATA; - -#define MNP_SERVICE_DATA_FROM_THIS(a) \ - CR ( \ - (a), \ - MNP_SERVICE_DATA, \ - ServiceBinding, \ - MNP_SERVICE_DATA_SIGNATURE \ - ) - -EFI_STATUS -EFIAPI -MnpDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -MnpDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -MnpDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -EFI_STATUS -EFIAPI -MnpServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE *ChildHandle - ); - -EFI_STATUS -EFIAPI -MnpServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ); - -#endif +#include +#include + +#include "MnpDebug.h" + +// +// Required Global Variables +// +extern EFI_DRIVER_BINDING_PROTOCOL gMnpDriverBinding; +extern EFI_COMPONENT_NAME_PROTOCOL gMnpComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gMnpComponentName2; + +#define MNP_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32 ('M', 'n', 'p', 'S') + +typedef struct _MNP_SERVICE_DATA { + UINT32 Signature; + + EFI_HANDLE ControllerHandle; + + EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; + EFI_SIMPLE_NETWORK_PROTOCOL *Snp; + + UINT32 Mtu; + + NET_LIST_ENTRY ChildrenList; + UINTN ChildrenNumber; + UINTN ConfiguredChildrenNumber; + + NET_LIST_ENTRY GroupAddressList; + UINT32 GroupAddressCount; + + EFI_EVENT TxTimeoutEvent; + + NET_BUF_QUEUE FreeNbufQue; + INTN NbufCnt; + + EFI_EVENT PollTimer; + BOOLEAN EnableSystemPoll; + + EFI_EVENT TimeoutCheckTimer; + + UINT32 UnicastCount; + UINT32 BroadcastCount; + UINT32 MulticastCount; + UINT32 PromiscuousCount; + + // + // The size of the data buffer in the MNP_PACKET_BUFFER used to + // store a packet. + // + UINT32 BufferLength; + UINT32 PaddingSize; + NET_BUF *RxNbufCache; + UINT8 *TxBuf; +} MNP_SERVICE_DATA; + +#define MNP_SERVICE_DATA_FROM_THIS(a) \ + CR ( \ + (a), \ + MNP_SERVICE_DATA, \ + ServiceBinding, \ + MNP_SERVICE_DATA_SIGNATURE \ + ) + +EFI_STATUS +EFIAPI +MnpDriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL * This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +MnpDriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL * This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +MnpDriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +EFI_STATUS +EFIAPI +MnpServiceBindingCreateChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE *ChildHandle + ); + +EFI_STATUS +EFIAPI +MnpServiceBindingDestroyChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE ChildHandle + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/MnpDxe/MnpImpl.h b/MdeModulePkg/Universal/Network/MnpDxe/MnpImpl.h index cdb081d2b4..7f6669fba3 100644 --- a/MdeModulePkg/Universal/Network/MnpDxe/MnpImpl.h +++ b/MdeModulePkg/Universal/Network/MnpDxe/MnpImpl.h @@ -1,274 +1,274 @@ -/** @file - -Copyright (c) 2005 - 2007, 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: - - MnpImpl.h - -Abstract: - - -**/ - -#ifndef _MNP_IMPL_H_ -#define _MNP_IMPL_H_ - -#include "MnpDriver.h" -#include "MnpDebug.h" - -#define NET_ETHER_FCS_SIZE 4 - -#define MNP_SYS_POLL_INTERVAL (2 * TICKS_PER_MS) // 2 milliseconds -#define MNP_TIMEOUT_CHECK_INTERVAL (50 * TICKS_PER_MS) // 50 milliseconds -#define MNP_TX_TIMEOUT_TIME (500 * TICKS_PER_MS) // 500 milliseconds -#define MNP_INIT_NET_BUFFER_NUM 512 -#define MNP_NET_BUFFER_INCREASEMENT 64 -#define MNP_MAX_NET_BUFFER_NUM 65536 - -#define MNP_MAX_RCVD_PACKET_QUE_SIZE 256 - -#define MNP_RECEIVE_UNICAST 0x01 -#define MNP_RECEIVE_BROADCAST 0x02 - -#define UNICAST_PACKET MNP_RECEIVE_UNICAST -#define BROADCAST_PACKET MNP_RECEIVE_BROADCAST - -#define MNP_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32 ('M', 'n', 'p', 'I') - -#define MNP_INSTANCE_DATA_FROM_THIS(a) \ - CR ( \ - (a), \ - MNP_INSTANCE_DATA, \ - ManagedNetwork, \ - MNP_INSTANCE_DATA_SIGNATURE \ - ) - -typedef struct _MNP_INSTANCE_DATA { - UINT32 Signature; - - MNP_SERVICE_DATA *MnpServiceData; - - EFI_HANDLE Handle; - - NET_LIST_ENTRY InstEntry; - - EFI_MANAGED_NETWORK_PROTOCOL ManagedNetwork; - - BOOLEAN Configured; - BOOLEAN Destroyed; - - NET_LIST_ENTRY GroupCtrlBlkList; - - NET_MAP RxTokenMap; - - NET_LIST_ENTRY RxDeliveredPacketQueue; - NET_LIST_ENTRY RcvdPacketQueue; - UINTN RcvdPacketQueueSize; - - EFI_MANAGED_NETWORK_CONFIG_DATA ConfigData; - - UINT8 ReceiveFilter; -} MNP_INSTANCE_DATA; - -typedef struct _MNP_GROUP_ADDRESS { - NET_LIST_ENTRY AddrEntry; - EFI_MAC_ADDRESS Address; - INTN RefCnt; -} MNP_GROUP_ADDRESS; - -typedef struct _MNP_GROUP_CONTROL_BLOCK { - NET_LIST_ENTRY CtrlBlkEntry; - MNP_GROUP_ADDRESS *GroupAddress; -} MNP_GROUP_CONTROL_BLOCK; - -typedef struct _MNP_RXDATA_WRAP { - NET_LIST_ENTRY WrapEntry; - MNP_INSTANCE_DATA *Instance; - EFI_MANAGED_NETWORK_RECEIVE_DATA RxData; - NET_BUF *Nbuf; - UINT64 TimeoutTick; -} MNP_RXDATA_WRAP; - -EFI_STATUS -MnpInitializeServiceData ( - IN MNP_SERVICE_DATA *MnpServiceData, - IN EFI_HANDLE ImageHandle, - IN EFI_HANDLE ControllerHandle - ); - -VOID -MnpFlushServiceData ( - MNP_SERVICE_DATA *MnpServiceData - ); - -VOID -MnpInitializeInstanceData ( - IN MNP_SERVICE_DATA *MnpServiceData, - IN MNP_INSTANCE_DATA *Instance - ); - -EFI_STATUS -MnpTokenExist ( - IN NET_MAP *Map, - IN NET_MAP_ITEM *Item, - IN VOID *Arg - ); - -EFI_STATUS -MnpCancelTokens ( - IN NET_MAP *Map, - IN NET_MAP_ITEM *Item, - IN VOID *Arg - ); - -VOID -MnpFlushRcvdDataQueue ( - IN MNP_INSTANCE_DATA *Instance - ); - -EFI_STATUS -MnpConfigureInstance ( - IN MNP_INSTANCE_DATA *Instance, - IN EFI_MANAGED_NETWORK_CONFIG_DATA *ConfigData OPTIONAL - ); - -EFI_STATUS -MnpGroupOp ( - IN MNP_INSTANCE_DATA *Instance, - IN BOOLEAN JoinFlag, - IN EFI_MAC_ADDRESS *MacAddr OPTIONAL, - IN MNP_GROUP_CONTROL_BLOCK *CtrlBlk OPTIONAL - ); - -BOOLEAN -MnpIsValidTxToken ( - IN MNP_INSTANCE_DATA *Instance, - IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN *Token - ); - -VOID -MnpBuildTxPacket ( - IN MNP_SERVICE_DATA *MnpServiceData, - IN EFI_MANAGED_NETWORK_TRANSMIT_DATA *TxData, - OUT UINT8 **PktBuf, - OUT UINT32 *PktLen - ); - -EFI_STATUS -MnpSyncSendPacket ( - IN MNP_SERVICE_DATA *MnpServiceData, - IN UINT8 *Packet, - IN UINT32 Length, - IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN *Token - ); - -EFI_STATUS -MnpInstanceDeliverPacket ( - IN MNP_INSTANCE_DATA *Instance - ); - -VOID -EFIAPI -MnpRecycleRxData ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -EFI_STATUS -MnpReceivePacket ( - IN MNP_SERVICE_DATA *MnpServiceData - ); - -NET_BUF * -MnpAllocNbuf ( - IN MNP_SERVICE_DATA *MnpServiceData - ); - -VOID -MnpFreeNbuf ( - IN MNP_SERVICE_DATA *MnpServiceData, - IN NET_BUF *Nbuf - ); - -VOID -EFIAPI -MnpCheckPacketTimeout ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -VOID -EFIAPI -MnpSystemPoll ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -EFI_STATUS -EFIAPI -MnpGetModeData ( - IN EFI_MANAGED_NETWORK_PROTOCOL *This, - OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, - OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL - ); - -EFI_STATUS -EFIAPI -MnpConfigure ( - IN EFI_MANAGED_NETWORK_PROTOCOL *This, - IN EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL - ); - -EFI_STATUS -EFIAPI -MnpMcastIpToMac ( - IN EFI_MANAGED_NETWORK_PROTOCOL *This, - IN BOOLEAN Ipv6Flag, - IN EFI_IP_ADDRESS *IpAddress, - OUT EFI_MAC_ADDRESS *MacAddress - ); - -EFI_STATUS -EFIAPI -MnpGroups ( - IN EFI_MANAGED_NETWORK_PROTOCOL *This, - IN BOOLEAN JoinFlag, - IN EFI_MAC_ADDRESS *MacAddress OPTIONAL - ); - -EFI_STATUS -EFIAPI -MnpTransmit ( - IN EFI_MANAGED_NETWORK_PROTOCOL *This, - IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN *Token - ); - -EFI_STATUS -EFIAPI -MnpCancel ( - IN EFI_MANAGED_NETWORK_PROTOCOL *This, - IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN *Token OPTIONAL - ); - -EFI_STATUS -EFIAPI -MnpReceive ( - IN EFI_MANAGED_NETWORK_PROTOCOL *This, - IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN *Token - ); - -EFI_STATUS -EFIAPI -MnpPoll ( - IN EFI_MANAGED_NETWORK_PROTOCOL *This - ); - -#endif +/** @file + +Copyright (c) 2005 - 2007, 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: + + MnpImpl.h + +Abstract: + + +**/ + +#ifndef _MNP_IMPL_H_ +#define _MNP_IMPL_H_ + +#include "MnpDriver.h" +#include "MnpDebug.h" + +#define NET_ETHER_FCS_SIZE 4 + +#define MNP_SYS_POLL_INTERVAL (2 * TICKS_PER_MS) // 2 milliseconds +#define MNP_TIMEOUT_CHECK_INTERVAL (50 * TICKS_PER_MS) // 50 milliseconds +#define MNP_TX_TIMEOUT_TIME (500 * TICKS_PER_MS) // 500 milliseconds +#define MNP_INIT_NET_BUFFER_NUM 512 +#define MNP_NET_BUFFER_INCREASEMENT 64 +#define MNP_MAX_NET_BUFFER_NUM 65536 + +#define MNP_MAX_RCVD_PACKET_QUE_SIZE 256 + +#define MNP_RECEIVE_UNICAST 0x01 +#define MNP_RECEIVE_BROADCAST 0x02 + +#define UNICAST_PACKET MNP_RECEIVE_UNICAST +#define BROADCAST_PACKET MNP_RECEIVE_BROADCAST + +#define MNP_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32 ('M', 'n', 'p', 'I') + +#define MNP_INSTANCE_DATA_FROM_THIS(a) \ + CR ( \ + (a), \ + MNP_INSTANCE_DATA, \ + ManagedNetwork, \ + MNP_INSTANCE_DATA_SIGNATURE \ + ) + +typedef struct _MNP_INSTANCE_DATA { + UINT32 Signature; + + MNP_SERVICE_DATA *MnpServiceData; + + EFI_HANDLE Handle; + + NET_LIST_ENTRY InstEntry; + + EFI_MANAGED_NETWORK_PROTOCOL ManagedNetwork; + + BOOLEAN Configured; + BOOLEAN Destroyed; + + NET_LIST_ENTRY GroupCtrlBlkList; + + NET_MAP RxTokenMap; + + NET_LIST_ENTRY RxDeliveredPacketQueue; + NET_LIST_ENTRY RcvdPacketQueue; + UINTN RcvdPacketQueueSize; + + EFI_MANAGED_NETWORK_CONFIG_DATA ConfigData; + + UINT8 ReceiveFilter; +} MNP_INSTANCE_DATA; + +typedef struct _MNP_GROUP_ADDRESS { + NET_LIST_ENTRY AddrEntry; + EFI_MAC_ADDRESS Address; + INTN RefCnt; +} MNP_GROUP_ADDRESS; + +typedef struct _MNP_GROUP_CONTROL_BLOCK { + NET_LIST_ENTRY CtrlBlkEntry; + MNP_GROUP_ADDRESS *GroupAddress; +} MNP_GROUP_CONTROL_BLOCK; + +typedef struct _MNP_RXDATA_WRAP { + NET_LIST_ENTRY WrapEntry; + MNP_INSTANCE_DATA *Instance; + EFI_MANAGED_NETWORK_RECEIVE_DATA RxData; + NET_BUF *Nbuf; + UINT64 TimeoutTick; +} MNP_RXDATA_WRAP; + +EFI_STATUS +MnpInitializeServiceData ( + IN MNP_SERVICE_DATA *MnpServiceData, + IN EFI_HANDLE ImageHandle, + IN EFI_HANDLE ControllerHandle + ); + +VOID +MnpFlushServiceData ( + MNP_SERVICE_DATA *MnpServiceData + ); + +VOID +MnpInitializeInstanceData ( + IN MNP_SERVICE_DATA *MnpServiceData, + IN MNP_INSTANCE_DATA *Instance + ); + +EFI_STATUS +MnpTokenExist ( + IN NET_MAP *Map, + IN NET_MAP_ITEM *Item, + IN VOID *Arg + ); + +EFI_STATUS +MnpCancelTokens ( + IN NET_MAP *Map, + IN NET_MAP_ITEM *Item, + IN VOID *Arg + ); + +VOID +MnpFlushRcvdDataQueue ( + IN MNP_INSTANCE_DATA *Instance + ); + +EFI_STATUS +MnpConfigureInstance ( + IN MNP_INSTANCE_DATA *Instance, + IN EFI_MANAGED_NETWORK_CONFIG_DATA *ConfigData OPTIONAL + ); + +EFI_STATUS +MnpGroupOp ( + IN MNP_INSTANCE_DATA *Instance, + IN BOOLEAN JoinFlag, + IN EFI_MAC_ADDRESS *MacAddr OPTIONAL, + IN MNP_GROUP_CONTROL_BLOCK *CtrlBlk OPTIONAL + ); + +BOOLEAN +MnpIsValidTxToken ( + IN MNP_INSTANCE_DATA *Instance, + IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN *Token + ); + +VOID +MnpBuildTxPacket ( + IN MNP_SERVICE_DATA *MnpServiceData, + IN EFI_MANAGED_NETWORK_TRANSMIT_DATA *TxData, + OUT UINT8 **PktBuf, + OUT UINT32 *PktLen + ); + +EFI_STATUS +MnpSyncSendPacket ( + IN MNP_SERVICE_DATA *MnpServiceData, + IN UINT8 *Packet, + IN UINT32 Length, + IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN *Token + ); + +EFI_STATUS +MnpInstanceDeliverPacket ( + IN MNP_INSTANCE_DATA *Instance + ); + +VOID +EFIAPI +MnpRecycleRxData ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +EFI_STATUS +MnpReceivePacket ( + IN MNP_SERVICE_DATA *MnpServiceData + ); + +NET_BUF * +MnpAllocNbuf ( + IN MNP_SERVICE_DATA *MnpServiceData + ); + +VOID +MnpFreeNbuf ( + IN MNP_SERVICE_DATA *MnpServiceData, + IN NET_BUF *Nbuf + ); + +VOID +EFIAPI +MnpCheckPacketTimeout ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +VOID +EFIAPI +MnpSystemPoll ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +EFI_STATUS +EFIAPI +MnpGetModeData ( + IN EFI_MANAGED_NETWORK_PROTOCOL *This, + OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, + OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL + ); + +EFI_STATUS +EFIAPI +MnpConfigure ( + IN EFI_MANAGED_NETWORK_PROTOCOL *This, + IN EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL + ); + +EFI_STATUS +EFIAPI +MnpMcastIpToMac ( + IN EFI_MANAGED_NETWORK_PROTOCOL *This, + IN BOOLEAN Ipv6Flag, + IN EFI_IP_ADDRESS *IpAddress, + OUT EFI_MAC_ADDRESS *MacAddress + ); + +EFI_STATUS +EFIAPI +MnpGroups ( + IN EFI_MANAGED_NETWORK_PROTOCOL *This, + IN BOOLEAN JoinFlag, + IN EFI_MAC_ADDRESS *MacAddress OPTIONAL + ); + +EFI_STATUS +EFIAPI +MnpTransmit ( + IN EFI_MANAGED_NETWORK_PROTOCOL *This, + IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN *Token + ); + +EFI_STATUS +EFIAPI +MnpCancel ( + IN EFI_MANAGED_NETWORK_PROTOCOL *This, + IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN *Token OPTIONAL + ); + +EFI_STATUS +EFIAPI +MnpReceive ( + IN EFI_MANAGED_NETWORK_PROTOCOL *This, + IN EFI_MANAGED_NETWORK_COMPLETION_TOKEN *Token + ); + +EFI_STATUS +EFIAPI +MnpPoll ( + IN EFI_MANAGED_NETWORK_PROTOCOL *This + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Mtftp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/Mtftp4Dxe/ComponentName.c index 258299418c..626995b687 100644 --- a/MdeModulePkg/Universal/Network/Mtftp4Dxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/Mtftp4Dxe/ComponentName.c @@ -23,6 +23,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Mtftp4ComponentNameGetDriverName ( @@ -31,6 +70,75 @@ Mtftp4ComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Mtftp4ComponentNameGetControllerName ( @@ -41,18 +149,29 @@ Mtftp4ComponentNameGetControllerName ( OUT CHAR16 **ControllerName ); + // // EFI Component Name Protocol // -EFI_COMPONENT_NAME_PROTOCOL gMtftp4ComponentName = { +EFI_COMPONENT_NAME_PROTOCOL gMtftp4ComponentName = { Mtftp4ComponentNameGetDriverName, Mtftp4ComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gMtftp4ComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) Mtftp4ComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) Mtftp4ComponentNameGetControllerName, + "en" + }; + static EFI_UNICODE_STRING_TABLE mMtftp4DriverNameTable[] = { { - "eng", + "eng;en", L"MTFTP4 Network Service" }, { @@ -61,6 +180,45 @@ static EFI_UNICODE_STRING_TABLE mMtftp4DriverNameTable[] = { } }; +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Mtftp4ComponentNameGetDriverName ( @@ -68,41 +226,84 @@ Mtftp4ComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - Arguments: - This : A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language : A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - DriverName : A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - Returns: - EFI_SUCCES : The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - EFI_INVALID_PARAMETER : Language is NULL. - EFI_INVALID_PARAMETER : DriverName is NULL. - EFI_UNSUPPORTED : The driver specified by This does not support the - language specified by Language. - ---*/ { - return LookupUnicodeString ( - Language, - gMtftp4ComponentName.SupportedLanguages, - mMtftp4DriverNameTable, - DriverName - ); + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mMtftp4DriverNameTable, + DriverName, + (BOOLEAN)(This == &gMtftp4ComponentName) + ); } +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI Mtftp4ComponentNameGetControllerName ( @@ -112,50 +313,6 @@ Mtftp4ComponentNameGetControllerName ( IN CHAR8 *Language, OUT CHAR16 **ControllerName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. - - Arguments: - This : A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle :The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle :The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - Language : A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - ControllerName : A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - Returns: - EFI_SUCCESS :The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER : ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER : ChildHandle is not NULL and it is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER : Language is NULL. - EFI_INVALID_PARAMETER : ControllerName is NULL. - EFI_UNSUPPORTED : The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - EFI_UNSUPPORTED :The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.c b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.c index 835dfe0b80..ceabbfe41f 100644 --- a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.c +++ b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.c @@ -58,14 +58,13 @@ Returns: --*/ { - return EfiLibInstallAllDriverProtocols ( + return EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, &gMtftp4DriverBinding, ImageHandle, &gMtftp4ComponentName, - NULL, - NULL + &gMtftp4ComponentName2 ); } diff --git a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.h b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.h index a9b7ac7121..b6eba0cea6 100644 --- a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.h +++ b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Driver.h @@ -1,69 +1,70 @@ -/** @file - -Copyright (c) 2006 - 2007, 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: - - Mtftp4Driver.h - -Abstract: - - -**/ - -#ifndef __EFI_MTFTP4_DRIVER_H__ -#define __EFI_MTFTP4_DRIVER_H__ - -#include - -#include - -#include -#include - - -EFI_STATUS -Mtftp4DriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ); - -EFI_STATUS -Mtftp4DriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ); - -EFI_STATUS -Mtftp4DriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -EFI_STATUS -Mtftp4ServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN OUT EFI_HANDLE *ChildHandle - ); - -EFI_STATUS -Mtftp4ServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ); - -extern EFI_COMPONENT_NAME_PROTOCOL gMtftp4ComponentName; -extern EFI_DRIVER_BINDING_PROTOCOL gMtftp4DriverBinding; - -#endif +/** @file + +Copyright (c) 2006 - 2007, 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: + + Mtftp4Driver.h + +Abstract: + + +**/ + +#ifndef __EFI_MTFTP4_DRIVER_H__ +#define __EFI_MTFTP4_DRIVER_H__ + +#include + +#include + +#include +#include + + +EFI_STATUS +Mtftp4DriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + ); + +EFI_STATUS +Mtftp4DriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + ); + +EFI_STATUS +Mtftp4DriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +EFI_STATUS +Mtftp4ServiceBindingCreateChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN OUT EFI_HANDLE *ChildHandle + ); + +EFI_STATUS +Mtftp4ServiceBindingDestroyChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE ChildHandle + ); + +extern EFI_COMPONENT_NAME_PROTOCOL gMtftp4ComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gMtftp4ComponentName2; +extern EFI_DRIVER_BINDING_PROTOCOL gMtftp4DriverBinding; + +#endif diff --git a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.h b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.h index 22ba7dd705..c12b1dd007 100644 --- a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.h +++ b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.h @@ -1,33 +1,33 @@ -/** @file - -Copyright (c) 2006 - 2007, 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: - - Mtftp4Impl.h - -Abstract: - - Mtftp4 Implementation, it supports the following RFCs: - RFC1350 - THE TFTP PROTOCOL (REVISION 2) - RFC2090 - TFTP Multicast Option - RFC2347 - TFTP Option Extension - RFC2348 - TFTP Blocksize Option - RFC2349 - TFTP Timeout Interval and Transfer Size Options - - -**/ - -#ifndef __EFI_MTFTP4_IMPL_H__ -#define __EFI_MTFTP4_IMPL_H__ - +/** @file + +Copyright (c) 2006 - 2007, 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: + + Mtftp4Impl.h + +Abstract: + + Mtftp4 Implementation, it supports the following RFCs: + RFC1350 - THE TFTP PROTOCOL (REVISION 2) + RFC2090 - TFTP Multicast Option + RFC2347 - TFTP Option Extension + RFC2348 - TFTP Blocksize Option + RFC2349 - TFTP Timeout Interval and Transfer Size Options + + +**/ + +#ifndef __EFI_MTFTP4_IMPL_H__ +#define __EFI_MTFTP4_IMPL_H__ + #include #include @@ -37,142 +37,142 @@ Abstract: #include #include #include -#include -#include -#include -#include - -typedef struct _MTFTP4_SERVICE MTFTP4_SERVICE; -typedef struct _MTFTP4_PROTOCOL MTFTP4_PROTOCOL; - -#include "Mtftp4Driver.h" -#include "Mtftp4Option.h" -#include "Mtftp4Support.h" - -enum { - MTFTP4_SERVICE_SIGNATURE = EFI_SIGNATURE_32 ('T', 'F', 'T', 'P'), - MTFTP4_PROTOCOL_SIGNATURE = EFI_SIGNATURE_32 ('t', 'f', 't', 'p'), - - MTFTP4_DEFAULT_SERVER_PORT = 69, - MTFTP4_DEFAULT_TIMEOUT = 3, - MTFTP4_DEFAULT_RETRY = 5, - MTFTP4_DEFAULT_BLKSIZE = 512, - MTFTP4_TIME_TO_GETMAP = 5, - - MTFTP4_STATE_UNCONFIGED = 0, - MTFTP4_STATE_CONFIGED, - MTFTP4_STATE_DESTORY -}; - -struct _MTFTP4_SERVICE { - UINT32 Signature; - EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; - - BOOLEAN InDestory; - - UINT16 ChildrenNum; - NET_LIST_ENTRY Children; - - EFI_EVENT Timer; // Ticking timer for all the MTFTP clients - EFI_EVENT TimerToGetMap; - - EFI_HANDLE Controller; - EFI_HANDLE Image; - - // - // This UDP child is used to keep the connection between the UDP - // and MTFTP, so MTFTP will be notified when UDP is uninstalled. - // - UDP_IO_PORT *ConnectUdp; -}; - -typedef struct { - EFI_MTFTP4_PACKET **Packet; - UINT32 *PacketLen; - EFI_STATUS Status; -} MTFTP4_GETINFO_STATE; - -struct _MTFTP4_PROTOCOL { - UINT32 Signature; - NET_LIST_ENTRY Link; - EFI_MTFTP4_PROTOCOL Mtftp4; - - INTN State; - BOOLEAN Indestory; - - MTFTP4_SERVICE *Service; - EFI_HANDLE Handle; - - EFI_MTFTP4_CONFIG_DATA Config; - - // - // Operation parameters: token and requested options. - // - EFI_MTFTP4_TOKEN *Token; - MTFTP4_OPTION RequestOption; - UINT16 Operation; - - // - // Blocks is a list of MTFTP4_BLOCK_RANGE which contains - // holes in the file - // - UINT16 BlkSize; - UINT16 LastBlock; - NET_LIST_ENTRY Blocks; - - // - // The server's communication end point: IP and two ports. one for - // initial request, one for its selected port. - // - IP4_ADDR ServerIp; - UINT16 ListeningPort; - UINT16 ConnectedPort; - IP4_ADDR Gateway; - UDP_IO_PORT *UnicastPort; - - // - // Timeout and retransmit status - // - NET_BUF *LastPacket; - UINT32 PacketToLive; - UINT32 CurRetry; - UINT32 MaxRetry; - UINT32 Timeout; - - // - // Parameter used by RRQ's multicast download. - // - IP4_ADDR McastIp; - UINT16 McastPort; - BOOLEAN Master; - UDP_IO_PORT *McastUdpPort; - - MTFTP4_GETINFO_STATE GetInfoState; -}; - -VOID -Mtftp4CleanOperation ( - IN MTFTP4_PROTOCOL *Instance, - IN EFI_STATUS Result - ); - -EFI_STATUS -Mtftp4WrqStart ( - IN MTFTP4_PROTOCOL *Instance, - IN UINT16 Operation - ); - -EFI_STATUS -Mtftp4RrqStart ( - IN MTFTP4_PROTOCOL *Instance, - IN UINT16 Operation - ); - -#define MTFTP4_SERVICE_FROM_THIS(a) \ - CR (a, MTFTP4_SERVICE, ServiceBinding, MTFTP4_SERVICE_SIGNATURE) - -#define MTFTP4_PROTOCOL_FROM_THIS(a) \ - CR (a, MTFTP4_PROTOCOL, Mtftp4, MTFTP4_PROTOCOL_SIGNATURE) - -extern EFI_MTFTP4_PROTOCOL gMtftp4ProtocolTemplate; -#endif +#include +#include +#include +#include + +typedef struct _MTFTP4_SERVICE MTFTP4_SERVICE; +typedef struct _MTFTP4_PROTOCOL MTFTP4_PROTOCOL; + +#include "Mtftp4Driver.h" +#include "Mtftp4Option.h" +#include "Mtftp4Support.h" + +enum { + MTFTP4_SERVICE_SIGNATURE = EFI_SIGNATURE_32 ('T', 'F', 'T', 'P'), + MTFTP4_PROTOCOL_SIGNATURE = EFI_SIGNATURE_32 ('t', 'f', 't', 'p'), + + MTFTP4_DEFAULT_SERVER_PORT = 69, + MTFTP4_DEFAULT_TIMEOUT = 3, + MTFTP4_DEFAULT_RETRY = 5, + MTFTP4_DEFAULT_BLKSIZE = 512, + MTFTP4_TIME_TO_GETMAP = 5, + + MTFTP4_STATE_UNCONFIGED = 0, + MTFTP4_STATE_CONFIGED, + MTFTP4_STATE_DESTORY +}; + +struct _MTFTP4_SERVICE { + UINT32 Signature; + EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; + + BOOLEAN InDestory; + + UINT16 ChildrenNum; + NET_LIST_ENTRY Children; + + EFI_EVENT Timer; // Ticking timer for all the MTFTP clients + EFI_EVENT TimerToGetMap; + + EFI_HANDLE Controller; + EFI_HANDLE Image; + + // + // This UDP child is used to keep the connection between the UDP + // and MTFTP, so MTFTP will be notified when UDP is uninstalled. + // + UDP_IO_PORT *ConnectUdp; +}; + +typedef struct { + EFI_MTFTP4_PACKET **Packet; + UINT32 *PacketLen; + EFI_STATUS Status; +} MTFTP4_GETINFO_STATE; + +struct _MTFTP4_PROTOCOL { + UINT32 Signature; + NET_LIST_ENTRY Link; + EFI_MTFTP4_PROTOCOL Mtftp4; + + INTN State; + BOOLEAN Indestory; + + MTFTP4_SERVICE *Service; + EFI_HANDLE Handle; + + EFI_MTFTP4_CONFIG_DATA Config; + + // + // Operation parameters: token and requested options. + // + EFI_MTFTP4_TOKEN *Token; + MTFTP4_OPTION RequestOption; + UINT16 Operation; + + // + // Blocks is a list of MTFTP4_BLOCK_RANGE which contains + // holes in the file + // + UINT16 BlkSize; + UINT16 LastBlock; + NET_LIST_ENTRY Blocks; + + // + // The server's communication end point: IP and two ports. one for + // initial request, one for its selected port. + // + IP4_ADDR ServerIp; + UINT16 ListeningPort; + UINT16 ConnectedPort; + IP4_ADDR Gateway; + UDP_IO_PORT *UnicastPort; + + // + // Timeout and retransmit status + // + NET_BUF *LastPacket; + UINT32 PacketToLive; + UINT32 CurRetry; + UINT32 MaxRetry; + UINT32 Timeout; + + // + // Parameter used by RRQ's multicast download. + // + IP4_ADDR McastIp; + UINT16 McastPort; + BOOLEAN Master; + UDP_IO_PORT *McastUdpPort; + + MTFTP4_GETINFO_STATE GetInfoState; +}; + +VOID +Mtftp4CleanOperation ( + IN MTFTP4_PROTOCOL *Instance, + IN EFI_STATUS Result + ); + +EFI_STATUS +Mtftp4WrqStart ( + IN MTFTP4_PROTOCOL *Instance, + IN UINT16 Operation + ); + +EFI_STATUS +Mtftp4RrqStart ( + IN MTFTP4_PROTOCOL *Instance, + IN UINT16 Operation + ); + +#define MTFTP4_SERVICE_FROM_THIS(a) \ + CR (a, MTFTP4_SERVICE, ServiceBinding, MTFTP4_SERVICE_SIGNATURE) + +#define MTFTP4_PROTOCOL_FROM_THIS(a) \ + CR (a, MTFTP4_PROTOCOL, Mtftp4, MTFTP4_PROTOCOL_SIGNATURE) + +extern EFI_MTFTP4_PROTOCOL gMtftp4ProtocolTemplate; +#endif diff --git a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Option.h b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Option.h index 3bd7574eb2..2595dc2795 100644 --- a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Option.h +++ b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Option.h @@ -1,73 +1,73 @@ -/** @file - -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: - - Mtftp4Option.h - -Abstract: - - Mtftp4 option process routines. - - -**/ - -#ifndef __EFI_MTFTP4_OPTION_H__ -#define __EFI_MTFTP4_OPTION_H__ - -enum { - MTFTP4_SUPPORTED_OPTIONS = 4, - MTFTP4_OPCODE_LEN = 2, - MTFTP4_ERRCODE_LEN = 2, - MTFTP4_BLKNO_LEN = 2, - MTFTP4_DATA_HEAD_LEN = 4, - - MTFTP4_BLKSIZE_EXIST = 0x01, - MTFTP4_TIMEOUT_EXIST = 0x02, - MTFTP4_TSIZE_EXIST = 0x04, - MTFTP4_MCAST_EXIST = 0x08 -}; - -typedef struct { - UINT16 BlkSize; - UINT8 Timeout; - UINT32 Tsize; - IP4_ADDR McastIp; - UINT16 McastPort; - BOOLEAN Master; - UINT32 Exist; -} MTFTP4_OPTION; - -EFI_STATUS -Mtftp4ExtractOptions ( - IN EFI_MTFTP4_PACKET *Packet, - IN UINT32 PacketLen, - IN OUT UINT32 *OptionCount, - OUT EFI_MTFTP4_OPTION **OptionList OPTIONAL - ); - -EFI_STATUS -Mtftp4ParseOption ( - IN EFI_MTFTP4_OPTION *OptionList, - IN UINT32 Count, - IN BOOLEAN Request, - OUT MTFTP4_OPTION *Option - ); - -EFI_STATUS -Mtftp4ParseOptionOack ( - IN EFI_MTFTP4_PACKET *Packet, - IN UINT32 PacketLen, - OUT MTFTP4_OPTION *Option - ); - -extern UINT8 *mMtftp4SupportedOptions[MTFTP4_SUPPORTED_OPTIONS]; -#endif +/** @file + +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: + + Mtftp4Option.h + +Abstract: + + Mtftp4 option process routines. + + +**/ + +#ifndef __EFI_MTFTP4_OPTION_H__ +#define __EFI_MTFTP4_OPTION_H__ + +enum { + MTFTP4_SUPPORTED_OPTIONS = 4, + MTFTP4_OPCODE_LEN = 2, + MTFTP4_ERRCODE_LEN = 2, + MTFTP4_BLKNO_LEN = 2, + MTFTP4_DATA_HEAD_LEN = 4, + + MTFTP4_BLKSIZE_EXIST = 0x01, + MTFTP4_TIMEOUT_EXIST = 0x02, + MTFTP4_TSIZE_EXIST = 0x04, + MTFTP4_MCAST_EXIST = 0x08 +}; + +typedef struct { + UINT16 BlkSize; + UINT8 Timeout; + UINT32 Tsize; + IP4_ADDR McastIp; + UINT16 McastPort; + BOOLEAN Master; + UINT32 Exist; +} MTFTP4_OPTION; + +EFI_STATUS +Mtftp4ExtractOptions ( + IN EFI_MTFTP4_PACKET *Packet, + IN UINT32 PacketLen, + IN OUT UINT32 *OptionCount, + OUT EFI_MTFTP4_OPTION **OptionList OPTIONAL + ); + +EFI_STATUS +Mtftp4ParseOption ( + IN EFI_MTFTP4_OPTION *OptionList, + IN UINT32 Count, + IN BOOLEAN Request, + OUT MTFTP4_OPTION *Option + ); + +EFI_STATUS +Mtftp4ParseOptionOack ( + IN EFI_MTFTP4_PACKET *Packet, + IN UINT32 PacketLen, + OUT MTFTP4_OPTION *Option + ); + +extern UINT8 *mMtftp4SupportedOptions[MTFTP4_SUPPORTED_OPTIONS]; +#endif diff --git a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Support.h b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Support.h index be186866c5..5e5157be64 100644 --- a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Support.h +++ b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Support.h @@ -1,96 +1,96 @@ -/** @file - -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: - - Mtftp4Support.h - -Abstract: - - Support routines for MTFTP - - -**/ - -#ifndef __EFI_MTFTP4_SUPPORT_H__ -#define __EFI_MTFTP4_SUPPORT_H__ - -// -// The structure representing a range of block numbers, [Start, End]. -// It is used to remember the holes in the MTFTP block space. If all -// the holes are filled in, then the download or upload has completed. -// -typedef struct { - NET_LIST_ENTRY Link; - INTN Start; - INTN End; -} MTFTP4_BLOCK_RANGE; - - -EFI_STATUS -Mtftp4InitBlockRange ( - IN NET_LIST_ENTRY *Head, - IN UINT16 Start, - IN UINT16 End - ); - -INTN -Mtftp4GetNextBlockNum ( - IN NET_LIST_ENTRY *Head - ); - -VOID -Mtftp4SetLastBlockNum ( - IN NET_LIST_ENTRY *Head, - IN UINT16 Last - ); - -EFI_STATUS -Mtftp4RemoveBlockNum ( - IN NET_LIST_ENTRY *Head, - IN UINT16 Num - ); - -VOID -Mtftp4SetTimeout ( - IN MTFTP4_PROTOCOL *Instance - ); - -EFI_STATUS -Mtftp4SendPacket ( - IN MTFTP4_PROTOCOL *Instance, - IN NET_BUF *Packet - ); - -EFI_STATUS -Mtftp4SendRequest ( - IN MTFTP4_PROTOCOL *Instance - ); - -EFI_STATUS -Mtftp4SendError ( - IN MTFTP4_PROTOCOL *Instance, - IN UINT16 ErrCode, - IN UINT8* ErrInfo - ); - -EFI_STATUS -Mtftp4Retransmit ( - IN MTFTP4_PROTOCOL *Instance - ); - -VOID -EFIAPI -Mtftp4OnTimerTick ( - IN EFI_EVENT Event, - IN VOID *Context - ); -#endif +/** @file + +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: + + Mtftp4Support.h + +Abstract: + + Support routines for MTFTP + + +**/ + +#ifndef __EFI_MTFTP4_SUPPORT_H__ +#define __EFI_MTFTP4_SUPPORT_H__ + +// +// The structure representing a range of block numbers, [Start, End]. +// It is used to remember the holes in the MTFTP block space. If all +// the holes are filled in, then the download or upload has completed. +// +typedef struct { + NET_LIST_ENTRY Link; + INTN Start; + INTN End; +} MTFTP4_BLOCK_RANGE; + + +EFI_STATUS +Mtftp4InitBlockRange ( + IN NET_LIST_ENTRY *Head, + IN UINT16 Start, + IN UINT16 End + ); + +INTN +Mtftp4GetNextBlockNum ( + IN NET_LIST_ENTRY *Head + ); + +VOID +Mtftp4SetLastBlockNum ( + IN NET_LIST_ENTRY *Head, + IN UINT16 Last + ); + +EFI_STATUS +Mtftp4RemoveBlockNum ( + IN NET_LIST_ENTRY *Head, + IN UINT16 Num + ); + +VOID +Mtftp4SetTimeout ( + IN MTFTP4_PROTOCOL *Instance + ); + +EFI_STATUS +Mtftp4SendPacket ( + IN MTFTP4_PROTOCOL *Instance, + IN NET_BUF *Packet + ); + +EFI_STATUS +Mtftp4SendRequest ( + IN MTFTP4_PROTOCOL *Instance + ); + +EFI_STATUS +Mtftp4SendError ( + IN MTFTP4_PROTOCOL *Instance, + IN UINT16 ErrCode, + IN UINT8* ErrInfo + ); + +EFI_STATUS +Mtftp4Retransmit ( + IN MTFTP4_PROTOCOL *Instance + ); + +VOID +EFIAPI +Mtftp4OnTimerTick ( + IN EFI_EVENT Event, + IN VOID *Context + ); +#endif diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.c b/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.c index 0c0eeffcff..d14dbd9152 100644 --- a/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.c +++ b/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.c @@ -2381,15 +2381,14 @@ InitializeBCDriver ( // // Initialize EFI library // - Status = EfiLibInstallAllDriverProtocols ( - ImageHandle, - SystemTable, - &mPxeBcDriverBinding, - NULL, - &gPxeBcComponentName, - NULL, - NULL - ); + Status = EfiLibInstallDriverBindingComponentName2 ( + ImageHandle, + SystemTable, + &mPxeBcDriverBinding, + NULL, + &gPxeBcComponentName, + &gPxeBcComponentName2 + ); InitArpHeader (); OptionsStrucInit (); diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.h index e04acc3656..715a9f1562 100644 --- a/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.h +++ b/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.h @@ -1,25 +1,25 @@ -/** @file - -Copyright (c) 2004 - 2007, 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: - bc.h - -Abstract: - - -**/ - -#ifndef _BC_H -#define _BC_H - +/** @file + +Copyright (c) 2004 - 2007, 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: + bc.h + +Abstract: + + +**/ + +#ifndef _BC_H +#define _BC_H + #include #include @@ -29,528 +29,529 @@ Abstract: #include #include #include -#include +#include #include #include -#include +#include #include #include #include #include -#include - -#define CALLBACK_INTERVAL 100 // ten times a second -#define FILTER_BITS (EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP | \ - EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST | \ - EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS | \ - EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST \ - ) - -#define WAIT_TX_TIMEOUT 1000 - -#define SUPPORT_IPV6 0 - -#define PXE_BASECODE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'd') - -// -// Determine the classes of IPv4 address -// -#define IS_CLASSA_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0x80) == 0x00) -#define IS_CLASSB_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xc0) == 0x80) -#define IS_CLASSC_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xe0) == 0xc0) -#define IS_INADDR_UNICAST(x) ((IS_CLASSA_IPADDR(x) || IS_CLASSB_IPADDR(x) || IS_CLASSC_IPADDR(x)) && (((EFI_IP_ADDRESS*)x)->Addr[0] != 0) ) - -// -// Definitions for internet group management protocol version 2 message -// structure -// Per RFC 2236, November 1997 -// -#pragma pack(1) - -typedef struct { - UINT8 Type; - UINT8 MaxRespTime; // in tenths of a second - UINT16 Checksum; // ones complement of ones complement sum of - // 16 bit words of message - UINT32 GroupAddress; // for general query, all systems group, - // for group specific, the group -} IGMPV2_MESSAGE; - -#define IGMP_TYPE_QUERY 0x11 -#define IGMP_TYPE_REPORT 0x16 -#define IGMP_TYPE_V1REPORT 0x12 -#define IGMP_TYPE_LEAVE_GROUP 0x17 - -#define IGMP_DEFAULT_MAX_RESPONSE_TIME 10 // 10 second default -#pragma pack() - -#define MAX_MCAST_GROUPS 8 // most we allow ourselves to join at once -#define MAX_OFFERS 16 - -typedef struct { - UINTN Signature; - EFI_LOCK Lock; - BOOLEAN ShowErrorMessages; - EFI_TCP_PROTOCOL Tcp; - EFI_PXE_BASE_CODE_PROTOCOL EfiBc; - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *CallbackProtocolPtr; - EFI_HANDLE Handle; - - EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *NiiPtr; - EFI_SIMPLE_NETWORK_PROTOCOL *SimpleNetwork; - UINT8 *TransmitBufferPtr; - UINT8 *ReceiveBufferPtr; - EFI_PXE_BASE_CODE_FUNCTION Function; - - UINTN OldestArpEntry; - UINTN MCastGroupCount; - EFI_EVENT Igmpv1TimeoutEvent; - BOOLEAN UseIgmpv1Reporting; - EFI_EVENT IgmpGroupEvent[MAX_MCAST_GROUPS]; - UINT16 RandomPort; - -#if SUPPORT_IPV6 - // - // TBD - // -#else - UINT32 MCastGroup[MAX_MCAST_GROUPS]; -#endif - - BOOLEAN GoodStationIp; - BOOLEAN DidTransmit; - UINTN IpLength; - VOID *DhcpPacketBuffer; - UINTN FileSize; - VOID *BootServerReceiveBuffer; - EFI_IP_ADDRESS ServerIp; - - // - // work area - // for dhcp - // - VOID *ReceiveBuffers; - VOID *TransmitBuffer; - UINTN NumOffersReceived; - UINT16 TotalSeconds; - - // - // arrays for different types of offers - // - UINT8 ServerCount[4]; - UINT8 OfferCount[4][MAX_OFFERS]; - UINT8 GotBootp; - UINT8 GotProxy[4]; - UINT8 BinlProxies[MAX_OFFERS]; - - UINT8 *ArpBuffer; - UINT8 *TftpAckBuffer; - UINT8 *TftpErrorBuffer; - IGMPV2_MESSAGE IgmpMessage; - BOOLEAN BigBlkNumFlag; - UINT8 Timeout; - UINT16 RandomSeed; -} PXE_BASECODE_DEVICE; - -// -// type index -// -#define DHCP_ONLY_IX 0 -#define PXE10_IX 1 -#define WfM11a_IX 2 -#define BINL_IX 3 - -#define PXE_RND_PORT_LOW 2070 - -// -// -// -#define LOADFILE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'l') - -typedef struct { - UINTN Signature; - EFI_LOCK Lock; - EFI_LOAD_FILE_PROTOCOL LoadFile; - PXE_BASECODE_DEVICE *Private; -} LOADFILE_DEVICE; - -#define EFI_BASE_CODE_DEV_FROM_THIS(a) CR (a, PXE_BASECODE_DEVICE, efi_bc, PXE_BASECODE_DEVICE_SIGNATURE); - -#define EFI_BASE_CODE_DEV_FROM_TCP(a) CR (a, PXE_BASECODE_DEVICE, Tcp, PXE_BASECODE_DEVICE_SIGNATURE); - -#define EFI_LOAD_FILE_DEV_FROM_THIS(a) CR (a, LOADFILE_DEVICE, LoadFile, LOADFILE_DEVICE_SIGNATURE) - -EFI_BIS_PROTOCOL * -PxebcBisStart ( - PXE_BASECODE_DEVICE *Private, - BIS_APPLICATION_HANDLE *BisAppHandle, - EFI_BIS_DATA **BisDataSigInfo - ) -; - -VOID -PxebcBisStop ( - EFI_BIS_PROTOCOL *Bis, - BIS_APPLICATION_HANDLE BisAppHandle, - EFI_BIS_DATA *BisDataSigInfo - ) -; - -BOOLEAN -PxebcBisVerify ( - PXE_BASECODE_DEVICE *Private, - VOID *FileBuffer, - UINTN FileBufferLength, - VOID *CredentialBuffer, - UINTN CredentialBufferLength - ) -; - -BOOLEAN -PxebcBisDetect ( - PXE_BASECODE_DEVICE *Private - ) -; - -// -// Global Variables -// -extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName; - -// -// ////////////////////////////////////////////////////////// -// -// prototypes -// - -/** - Initialize the base code drivers and install the driver binding - - Standard EFI Image Entry - - @retval EFI_SUCCESS This driver was successfully bound - -**/ -EFI_STATUS -EFIAPI -InitializeBCDriver ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -; - -EFI_STATUS -EFIAPI -BcStart ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN BOOLEAN UseIpv6 - ) -; - -EFI_STATUS -EFIAPI -BcStop ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This - ) -; - -EFI_STATUS -EFIAPI -BcDhcp ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN BOOLEAN SortOffers - ) -; - -EFI_STATUS -EFIAPI -BcDiscover ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN UINT16 Type, - IN UINT16 *Layer, - IN BOOLEAN UseBis, - IN EFI_PXE_BASE_CODE_DISCOVER_INFO * Info OPTIONAL - ) -; - -EFI_STATUS -EFIAPI -BcMtftp ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, - IN OUT VOID *BufferPtr, - IN BOOLEAN Overwrite, - IN OUT UINT64 *BufferSize, - IN UINTN *BlockSize OPTIONAL, - IN EFI_IP_ADDRESS * ServerIp, - IN UINT8 *Filename, - IN EFI_PXE_BASE_CODE_MTFTP_INFO * Info OPTIONAL, - IN BOOLEAN DontUseBuffer - ) -; - -EFI_STATUS -EFIAPI -BcUdpWrite ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN UINT16 OpFlags, - IN EFI_IP_ADDRESS *DestIp, - IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort, - IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL - IN EFI_IP_ADDRESS *SrcIp, OPTIONAL - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL - IN UINTN *HeaderSize, OPTIONAL - IN VOID *HeaderPtr, OPTIONAL - IN UINTN *BufferSize, - IN VOID *BufferPtr - ) -; - -EFI_STATUS -EFIAPI -BcUdpRead ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN UINT16 OpFlags, - IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort, OPTIONAL - IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL - IN UINTN *HeaderSize, OPTIONAL - IN VOID *HeaderPtr, OPTIONAL - IN OUT UINTN *BufferSize, - IN VOID *BufferPtr - ) -; - -EFI_STATUS -EFIAPI -BcTcpWrite ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN UINT16 OpFlags, - IN UINT16 *UrgentPointer, - IN UINT32 *SequenceNumber, - IN UINT32 *AckNumber, - IN UINT16 *HlenResCode, - IN UINT16 *Window, - IN EFI_IP_ADDRESS *DestIp, - IN EFI_PXE_BASE_CODE_TCP_PORT *DestPort, - IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL - IN EFI_IP_ADDRESS *SrcIp, OPTIONAL - IN OUT EFI_PXE_BASE_CODE_TCP_PORT *SrcPort, OPTIONAL - IN UINTN *HeaderSize, OPTIONAL - IN VOID *HeaderPtr, OPTIONAL - IN UINTN *BufferSize, - IN VOID *BufferPtr - ) -; - -EFI_STATUS -EFIAPI -BcTcpRead ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN UINT16 OpFlags, - IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL - IN OUT EFI_PXE_BASE_CODE_TCP_PORT *DestPort, OPTIONAL - IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL - IN OUT EFI_PXE_BASE_CODE_TCP_PORT *SrcPort, OPTIONAL - IN UINTN *HeaderSize, OPTIONAL - IN VOID *HeaderPtr, OPTIONAL - IN OUT UINTN *BufferSize, - IN VOID *BufferPtr - ) -; - -EFI_STATUS -EFIAPI -BcArp ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN EFI_IP_ADDRESS * IpAddr, - IN EFI_MAC_ADDRESS * MacAddr OPTIONAL - ) -; - -EFI_STATUS -EFIAPI -BcIpFilter ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter - ) -; - -EFI_STATUS -EFIAPI -BcSetParameters ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN BOOLEAN *NewAutoArp, OPTIONAL - IN BOOLEAN *NewSendGUID, OPTIONAL - IN UINT8 *NewTTL, OPTIONAL - IN UINT8 *NewToS, OPTIONAL - IN BOOLEAN *NewMakeCallback OPTIONAL - ) -; - -EFI_STATUS -EFIAPI -BcSetStationIP ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN EFI_IP_ADDRESS * NewStationIp, OPTIONAL - IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL - ) -; - -EFI_STATUS -EFIAPI -BcSetPackets ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - BOOLEAN *NewDhcpDiscoverValid, OPTIONAL - BOOLEAN *NewDhcpAckReceived, OPTIONAL - BOOLEAN *NewProxyOfferReceived, OPTIONAL - BOOLEAN *NewPxeDiscoverValid, OPTIONAL - BOOLEAN *NewPxeReplyReceived, OPTIONAL - BOOLEAN *NewPxeBisReplyReceived, OPTIONAL - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover, OPTIONAL - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck, OPTIONAL - IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer, OPTIONAL - IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover, OPTIONAL - IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply, OPTIONAL - IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL - ) -; - -EFI_STATUS -EFIAPI -LoadFile ( - IN EFI_LOAD_FILE_PROTOCOL *This, - IN EFI_DEVICE_PATH_PROTOCOL *FilePath, - IN BOOLEAN BootPolicy, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ) -; - -EFI_STATUS -PxeBcLibGetSmbiosSystemGuidAndSerialNumber ( - IN EFI_GUID *SystemGuid, - OUT CHAR8 **SystemSerialNumber - ) -; - - -// -// Define SMBIOS tables. -// -#pragma pack(1) -typedef struct { - UINT8 AnchorString[4]; - UINT8 EntryPointStructureChecksum; - UINT8 EntryPointLength; - UINT8 MajorVersion; - UINT8 MinorVersion; - UINT16 MaxStructureSize; - UINT8 EntryPointRevision; - UINT8 FormattedArea[5]; - UINT8 IntermediateAnchorString[5]; - UINT8 IntermediateChecksum; - UINT16 TableLength; - UINT32 TableAddress; - UINT16 NumberOfSmbiosStructures; - UINT8 SmbiosBcdRevision; -} SMBIOS_STRUCTURE_TABLE; - -// -// Please note that SMBIOS structures can be odd byte aligned since the -// unformated section of each record is a set of arbitrary size strings. -// -typedef struct { - UINT8 Type; - UINT8 Length; - UINT8 Handle[2]; -} SMBIOS_HEADER; - -typedef UINT8 SMBIOS_STRING; - -typedef struct { - SMBIOS_HEADER Hdr; - SMBIOS_STRING Vendor; - SMBIOS_STRING BiosVersion; - UINT8 BiosSegment[2]; - SMBIOS_STRING BiosReleaseDate; - UINT8 BiosSize; - UINT8 BiosCharacteristics[8]; -} SMBIOS_TYPE0; - -typedef struct { - SMBIOS_HEADER Hdr; - SMBIOS_STRING Manufacturer; - SMBIOS_STRING ProductName; - SMBIOS_STRING Version; - SMBIOS_STRING SerialNumber; - - // - // always byte copy this data to prevent alignment faults! - // - EFI_GUID Uuid; - - UINT8 WakeUpType; -} SMBIOS_TYPE1; - -typedef struct { - SMBIOS_HEADER Hdr; - SMBIOS_STRING Manufacturer; - SMBIOS_STRING ProductName; - SMBIOS_STRING Version; - SMBIOS_STRING SerialNumber; -} SMBIOS_TYPE2; - -typedef struct { - SMBIOS_HEADER Hdr; - SMBIOS_STRING Manufacturer; - UINT8 Type; - SMBIOS_STRING Version; - SMBIOS_STRING SerialNumber; - SMBIOS_STRING AssetTag; - UINT8 BootupState; - UINT8 PowerSupplyState; - UINT8 ThermalState; - UINT8 SecurityStatus; - UINT8 OemDefined[4]; -} SMBIOS_TYPE3; - -typedef struct { - SMBIOS_HEADER Hdr; - UINT8 Socket; - UINT8 ProcessorType; - UINT8 ProcessorFamily; - SMBIOS_STRING ProcessorManufacture; - UINT8 ProcessorId[8]; - SMBIOS_STRING ProcessorVersion; - UINT8 Voltage; - UINT8 ExternalClock[2]; - UINT8 MaxSpeed[2]; - UINT8 CurrentSpeed[2]; - UINT8 Status; - UINT8 ProcessorUpgrade; - UINT8 L1CacheHandle[2]; - UINT8 L2CacheHandle[2]; - UINT8 L3CacheHandle[2]; -} SMBIOS_TYPE4; - -typedef union { - SMBIOS_HEADER *Hdr; - SMBIOS_TYPE0 *Type0; - SMBIOS_TYPE1 *Type1; - SMBIOS_TYPE2 *Type2; - SMBIOS_TYPE3 *Type3; - SMBIOS_TYPE4 *Type4; - UINT8 *Raw; -} SMBIOS_STRUCTURE_POINTER; -#pragma pack() - -#include "ip.h" -#include "dhcp.h" -#include "tftp.h" - -#endif /* _BC_H */ - -/* EOF - bc.h */ +#include + +#define CALLBACK_INTERVAL 100 // ten times a second +#define FILTER_BITS (EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP | \ + EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST | \ + EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS | \ + EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST \ + ) + +#define WAIT_TX_TIMEOUT 1000 + +#define SUPPORT_IPV6 0 + +#define PXE_BASECODE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'd') + +// +// Determine the classes of IPv4 address +// +#define IS_CLASSA_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0x80) == 0x00) +#define IS_CLASSB_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xc0) == 0x80) +#define IS_CLASSC_IPADDR(x) ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xe0) == 0xc0) +#define IS_INADDR_UNICAST(x) ((IS_CLASSA_IPADDR(x) || IS_CLASSB_IPADDR(x) || IS_CLASSC_IPADDR(x)) && (((EFI_IP_ADDRESS*)x)->Addr[0] != 0) ) + +// +// Definitions for internet group management protocol version 2 message +// structure +// Per RFC 2236, November 1997 +// +#pragma pack(1) + +typedef struct { + UINT8 Type; + UINT8 MaxRespTime; // in tenths of a second + UINT16 Checksum; // ones complement of ones complement sum of + // 16 bit words of message + UINT32 GroupAddress; // for general query, all systems group, + // for group specific, the group +} IGMPV2_MESSAGE; + +#define IGMP_TYPE_QUERY 0x11 +#define IGMP_TYPE_REPORT 0x16 +#define IGMP_TYPE_V1REPORT 0x12 +#define IGMP_TYPE_LEAVE_GROUP 0x17 + +#define IGMP_DEFAULT_MAX_RESPONSE_TIME 10 // 10 second default +#pragma pack() + +#define MAX_MCAST_GROUPS 8 // most we allow ourselves to join at once +#define MAX_OFFERS 16 + +typedef struct { + UINTN Signature; + EFI_LOCK Lock; + BOOLEAN ShowErrorMessages; + EFI_TCP_PROTOCOL Tcp; + EFI_PXE_BASE_CODE_PROTOCOL EfiBc; + EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *CallbackProtocolPtr; + EFI_HANDLE Handle; + + EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *NiiPtr; + EFI_SIMPLE_NETWORK_PROTOCOL *SimpleNetwork; + UINT8 *TransmitBufferPtr; + UINT8 *ReceiveBufferPtr; + EFI_PXE_BASE_CODE_FUNCTION Function; + + UINTN OldestArpEntry; + UINTN MCastGroupCount; + EFI_EVENT Igmpv1TimeoutEvent; + BOOLEAN UseIgmpv1Reporting; + EFI_EVENT IgmpGroupEvent[MAX_MCAST_GROUPS]; + UINT16 RandomPort; + +#if SUPPORT_IPV6 + // + // TBD + // +#else + UINT32 MCastGroup[MAX_MCAST_GROUPS]; +#endif + + BOOLEAN GoodStationIp; + BOOLEAN DidTransmit; + UINTN IpLength; + VOID *DhcpPacketBuffer; + UINTN FileSize; + VOID *BootServerReceiveBuffer; + EFI_IP_ADDRESS ServerIp; + + // + // work area + // for dhcp + // + VOID *ReceiveBuffers; + VOID *TransmitBuffer; + UINTN NumOffersReceived; + UINT16 TotalSeconds; + + // + // arrays for different types of offers + // + UINT8 ServerCount[4]; + UINT8 OfferCount[4][MAX_OFFERS]; + UINT8 GotBootp; + UINT8 GotProxy[4]; + UINT8 BinlProxies[MAX_OFFERS]; + + UINT8 *ArpBuffer; + UINT8 *TftpAckBuffer; + UINT8 *TftpErrorBuffer; + IGMPV2_MESSAGE IgmpMessage; + BOOLEAN BigBlkNumFlag; + UINT8 Timeout; + UINT16 RandomSeed; +} PXE_BASECODE_DEVICE; + +// +// type index +// +#define DHCP_ONLY_IX 0 +#define PXE10_IX 1 +#define WfM11a_IX 2 +#define BINL_IX 3 + +#define PXE_RND_PORT_LOW 2070 + +// +// +// +#define LOADFILE_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'e', 'l') + +typedef struct { + UINTN Signature; + EFI_LOCK Lock; + EFI_LOAD_FILE_PROTOCOL LoadFile; + PXE_BASECODE_DEVICE *Private; +} LOADFILE_DEVICE; + +#define EFI_BASE_CODE_DEV_FROM_THIS(a) CR (a, PXE_BASECODE_DEVICE, efi_bc, PXE_BASECODE_DEVICE_SIGNATURE); + +#define EFI_BASE_CODE_DEV_FROM_TCP(a) CR (a, PXE_BASECODE_DEVICE, Tcp, PXE_BASECODE_DEVICE_SIGNATURE); + +#define EFI_LOAD_FILE_DEV_FROM_THIS(a) CR (a, LOADFILE_DEVICE, LoadFile, LOADFILE_DEVICE_SIGNATURE) + +EFI_BIS_PROTOCOL * +PxebcBisStart ( + PXE_BASECODE_DEVICE *Private, + BIS_APPLICATION_HANDLE *BisAppHandle, + EFI_BIS_DATA **BisDataSigInfo + ) +; + +VOID +PxebcBisStop ( + EFI_BIS_PROTOCOL *Bis, + BIS_APPLICATION_HANDLE BisAppHandle, + EFI_BIS_DATA *BisDataSigInfo + ) +; + +BOOLEAN +PxebcBisVerify ( + PXE_BASECODE_DEVICE *Private, + VOID *FileBuffer, + UINTN FileBufferLength, + VOID *CredentialBuffer, + UINTN CredentialBufferLength + ) +; + +BOOLEAN +PxebcBisDetect ( + PXE_BASECODE_DEVICE *Private + ) +; + +// +// Global Variables +// +extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2; + +// +// ////////////////////////////////////////////////////////// +// +// prototypes +// + +/** + Initialize the base code drivers and install the driver binding + + Standard EFI Image Entry + + @retval EFI_SUCCESS This driver was successfully bound + +**/ +EFI_STATUS +EFIAPI +InitializeBCDriver ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +; + +EFI_STATUS +EFIAPI +BcStart ( + IN EFI_PXE_BASE_CODE_PROTOCOL *This, + IN BOOLEAN UseIpv6 + ) +; + +EFI_STATUS +EFIAPI +BcStop ( + IN EFI_PXE_BASE_CODE_PROTOCOL *This + ) +; + +EFI_STATUS +EFIAPI +BcDhcp ( + IN EFI_PXE_BASE_CODE_PROTOCOL *This, + IN BOOLEAN SortOffers + ) +; + +EFI_STATUS +EFIAPI +BcDiscover ( + IN EFI_PXE_BASE_CODE_PROTOCOL * This, + IN UINT16 Type, + IN UINT16 *Layer, + IN BOOLEAN UseBis, + IN EFI_PXE_BASE_CODE_DISCOVER_INFO * Info OPTIONAL + ) +; + +EFI_STATUS +EFIAPI +BcMtftp ( + IN EFI_PXE_BASE_CODE_PROTOCOL * This, + IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, + IN OUT VOID *BufferPtr, + IN BOOLEAN Overwrite, + IN OUT UINT64 *BufferSize, + IN UINTN *BlockSize OPTIONAL, + IN EFI_IP_ADDRESS * ServerIp, + IN UINT8 *Filename, + IN EFI_PXE_BASE_CODE_MTFTP_INFO * Info OPTIONAL, + IN BOOLEAN DontUseBuffer + ) +; + +EFI_STATUS +EFIAPI +BcUdpWrite ( + IN EFI_PXE_BASE_CODE_PROTOCOL *This, + IN UINT16 OpFlags, + IN EFI_IP_ADDRESS *DestIp, + IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort, + IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL + IN EFI_IP_ADDRESS *SrcIp, OPTIONAL + IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL + IN UINTN *HeaderSize, OPTIONAL + IN VOID *HeaderPtr, OPTIONAL + IN UINTN *BufferSize, + IN VOID *BufferPtr + ) +; + +EFI_STATUS +EFIAPI +BcUdpRead ( + IN EFI_PXE_BASE_CODE_PROTOCOL *This, + IN UINT16 OpFlags, + IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL + IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort, OPTIONAL + IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL + IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL + IN UINTN *HeaderSize, OPTIONAL + IN VOID *HeaderPtr, OPTIONAL + IN OUT UINTN *BufferSize, + IN VOID *BufferPtr + ) +; + +EFI_STATUS +EFIAPI +BcTcpWrite ( + IN EFI_PXE_BASE_CODE_PROTOCOL *This, + IN UINT16 OpFlags, + IN UINT16 *UrgentPointer, + IN UINT32 *SequenceNumber, + IN UINT32 *AckNumber, + IN UINT16 *HlenResCode, + IN UINT16 *Window, + IN EFI_IP_ADDRESS *DestIp, + IN EFI_PXE_BASE_CODE_TCP_PORT *DestPort, + IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL + IN EFI_IP_ADDRESS *SrcIp, OPTIONAL + IN OUT EFI_PXE_BASE_CODE_TCP_PORT *SrcPort, OPTIONAL + IN UINTN *HeaderSize, OPTIONAL + IN VOID *HeaderPtr, OPTIONAL + IN UINTN *BufferSize, + IN VOID *BufferPtr + ) +; + +EFI_STATUS +EFIAPI +BcTcpRead ( + IN EFI_PXE_BASE_CODE_PROTOCOL *This, + IN UINT16 OpFlags, + IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL + IN OUT EFI_PXE_BASE_CODE_TCP_PORT *DestPort, OPTIONAL + IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL + IN OUT EFI_PXE_BASE_CODE_TCP_PORT *SrcPort, OPTIONAL + IN UINTN *HeaderSize, OPTIONAL + IN VOID *HeaderPtr, OPTIONAL + IN OUT UINTN *BufferSize, + IN VOID *BufferPtr + ) +; + +EFI_STATUS +EFIAPI +BcArp ( + IN EFI_PXE_BASE_CODE_PROTOCOL * This, + IN EFI_IP_ADDRESS * IpAddr, + IN EFI_MAC_ADDRESS * MacAddr OPTIONAL + ) +; + +EFI_STATUS +EFIAPI +BcIpFilter ( + IN EFI_PXE_BASE_CODE_PROTOCOL *This, + IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter + ) +; + +EFI_STATUS +EFIAPI +BcSetParameters ( + IN EFI_PXE_BASE_CODE_PROTOCOL * This, + IN BOOLEAN *NewAutoArp, OPTIONAL + IN BOOLEAN *NewSendGUID, OPTIONAL + IN UINT8 *NewTTL, OPTIONAL + IN UINT8 *NewToS, OPTIONAL + IN BOOLEAN *NewMakeCallback OPTIONAL + ) +; + +EFI_STATUS +EFIAPI +BcSetStationIP ( + IN EFI_PXE_BASE_CODE_PROTOCOL * This, + IN EFI_IP_ADDRESS * NewStationIp, OPTIONAL + IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL + ) +; + +EFI_STATUS +EFIAPI +BcSetPackets ( + IN EFI_PXE_BASE_CODE_PROTOCOL * This, + BOOLEAN *NewDhcpDiscoverValid, OPTIONAL + BOOLEAN *NewDhcpAckReceived, OPTIONAL + BOOLEAN *NewProxyOfferReceived, OPTIONAL + BOOLEAN *NewPxeDiscoverValid, OPTIONAL + BOOLEAN *NewPxeReplyReceived, OPTIONAL + BOOLEAN *NewPxeBisReplyReceived, OPTIONAL + IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover, OPTIONAL + IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck, OPTIONAL + IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer, OPTIONAL + IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover, OPTIONAL + IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply, OPTIONAL + IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL + ) +; + +EFI_STATUS +EFIAPI +LoadFile ( + IN EFI_LOAD_FILE_PROTOCOL *This, + IN EFI_DEVICE_PATH_PROTOCOL *FilePath, + IN BOOLEAN BootPolicy, + IN OUT UINTN *BufferSize, + IN VOID *Buffer + ) +; + +EFI_STATUS +PxeBcLibGetSmbiosSystemGuidAndSerialNumber ( + IN EFI_GUID *SystemGuid, + OUT CHAR8 **SystemSerialNumber + ) +; + + +// +// Define SMBIOS tables. +// +#pragma pack(1) +typedef struct { + UINT8 AnchorString[4]; + UINT8 EntryPointStructureChecksum; + UINT8 EntryPointLength; + UINT8 MajorVersion; + UINT8 MinorVersion; + UINT16 MaxStructureSize; + UINT8 EntryPointRevision; + UINT8 FormattedArea[5]; + UINT8 IntermediateAnchorString[5]; + UINT8 IntermediateChecksum; + UINT16 TableLength; + UINT32 TableAddress; + UINT16 NumberOfSmbiosStructures; + UINT8 SmbiosBcdRevision; +} SMBIOS_STRUCTURE_TABLE; + +// +// Please note that SMBIOS structures can be odd byte aligned since the +// unformated section of each record is a set of arbitrary size strings. +// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Handle[2]; +} SMBIOS_HEADER; + +typedef UINT8 SMBIOS_STRING; + +typedef struct { + SMBIOS_HEADER Hdr; + SMBIOS_STRING Vendor; + SMBIOS_STRING BiosVersion; + UINT8 BiosSegment[2]; + SMBIOS_STRING BiosReleaseDate; + UINT8 BiosSize; + UINT8 BiosCharacteristics[8]; +} SMBIOS_TYPE0; + +typedef struct { + SMBIOS_HEADER Hdr; + SMBIOS_STRING Manufacturer; + SMBIOS_STRING ProductName; + SMBIOS_STRING Version; + SMBIOS_STRING SerialNumber; + + // + // always byte copy this data to prevent alignment faults! + // + EFI_GUID Uuid; + + UINT8 WakeUpType; +} SMBIOS_TYPE1; + +typedef struct { + SMBIOS_HEADER Hdr; + SMBIOS_STRING Manufacturer; + SMBIOS_STRING ProductName; + SMBIOS_STRING Version; + SMBIOS_STRING SerialNumber; +} SMBIOS_TYPE2; + +typedef struct { + SMBIOS_HEADER Hdr; + SMBIOS_STRING Manufacturer; + UINT8 Type; + SMBIOS_STRING Version; + SMBIOS_STRING SerialNumber; + SMBIOS_STRING AssetTag; + UINT8 BootupState; + UINT8 PowerSupplyState; + UINT8 ThermalState; + UINT8 SecurityStatus; + UINT8 OemDefined[4]; +} SMBIOS_TYPE3; + +typedef struct { + SMBIOS_HEADER Hdr; + UINT8 Socket; + UINT8 ProcessorType; + UINT8 ProcessorFamily; + SMBIOS_STRING ProcessorManufacture; + UINT8 ProcessorId[8]; + SMBIOS_STRING ProcessorVersion; + UINT8 Voltage; + UINT8 ExternalClock[2]; + UINT8 MaxSpeed[2]; + UINT8 CurrentSpeed[2]; + UINT8 Status; + UINT8 ProcessorUpgrade; + UINT8 L1CacheHandle[2]; + UINT8 L2CacheHandle[2]; + UINT8 L3CacheHandle[2]; +} SMBIOS_TYPE4; + +typedef union { + SMBIOS_HEADER *Hdr; + SMBIOS_TYPE0 *Type0; + SMBIOS_TYPE1 *Type1; + SMBIOS_TYPE2 *Type2; + SMBIOS_TYPE3 *Type3; + SMBIOS_TYPE4 *Type4; + UINT8 *Raw; +} SMBIOS_STRUCTURE_POINTER; +#pragma pack() + +#include "ip.h" +#include "dhcp.h" +#include "tftp.h" + +#endif /* _BC_H */ + +/* EOF - bc.h */ diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/ComponentName.c b/MdeModulePkg/Universal/Network/PxeBcDxe/ComponentName.c index 18dca38408..7aea928fed 100644 --- a/MdeModulePkg/Universal/Network/PxeBcDxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/PxeBcDxe/ComponentName.c @@ -22,6 +22,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI PxeBcComponentNameGetDriverName ( @@ -30,6 +69,75 @@ PxeBcComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI PxeBcComponentNameGetControllerName ( @@ -40,18 +148,29 @@ PxeBcComponentNameGetControllerName ( OUT CHAR16 **ControllerName ); + // // EFI Component Name Protocol // -EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName = { +EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName = { PxeBcComponentNameGetDriverName, PxeBcComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) PxeBcComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) PxeBcComponentNameGetControllerName, + "en" + }; + static EFI_UNICODE_STRING_TABLE mPxeBcDriverNameTable[] = { { - "eng", + "eng;en", L"PXE Base Code Driver" }, { @@ -60,6 +179,45 @@ static EFI_UNICODE_STRING_TABLE mPxeBcDriverNameTable[] = { } }; +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI PxeBcComponentNameGetDriverName ( @@ -67,41 +225,84 @@ PxeBcComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language - A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - DriverName - A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - Returns: - EFI_SUCCESS - The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - DriverName is NULL. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { - return LookupUnicodeString ( - Language, - gPxeBcComponentName.SupportedLanguages, - mPxeBcDriverNameTable, - DriverName - ); + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mPxeBcDriverNameTable, + DriverName, + (BOOLEAN)(This == &gPxeBcComponentName) + ); } +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI PxeBcComponentNameGetControllerName ( @@ -111,50 +312,6 @@ PxeBcComponentNameGetControllerName ( IN CHAR8 *Language, OUT CHAR16 **ControllerName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle - The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle - The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - ControllerName - A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - Returns: - EFI_SUCCESS - The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - ControllerName is NULL. - EFI_UNSUPPORTED - The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Dhcp.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Dhcp.h index 36f71f775a..839a093d9f 100644 --- a/MdeModulePkg/Universal/Network/PxeBcDxe/Dhcp.h +++ b/MdeModulePkg/Universal/Network/PxeBcDxe/Dhcp.h @@ -1,632 +1,632 @@ -/** @file - -Copyright (c) 2004, 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. - - -**/ - -#ifndef _DHCP_H -#define _DHCP_H - -// -// Definitions for DHCP version 4 UDP packet. -// The field names in this structure are defined and described in RFC 2131. -// -#pragma pack(1) - -typedef struct { - UINT8 op; -#define BOOTP_REQUEST 1 -#define BOOTP_REPLY 2 - - UINT8 htype; - UINT8 hlen; - UINT8 hops; - UINT32 xid; - UINT16 secs; - UINT16 flags; -#define DHCP_BROADCAST_FLAG 0x8000 - - UINT32 ciaddr; - UINT32 yiaddr; - UINT32 siaddr; - UINT32 giaddr; - UINT8 chaddr[16]; - UINT8 sname[64]; - UINT8 file[128]; - UINT8 options[312]; -#define OP_PAD 0 -#define OP_END 255 -#define OP_SUBNET_MASK 1 -#define OP_TIME_OFFSET 2 -#define OP_ROUTER_LIST 3 -#define OP_TIME_SERVERS 4 -#define OP_NAME_SERVERS 5 -#define OP_DNS_SERVERS 6 -#define OP_LOG_SERVERS 7 -#define OP_COOKIE_SERVERS 8 -#define OP_LPR_SREVERS 9 -#define OP_IMPRESS_SERVERS 10 -#define OP_RES_LOC_SERVERS 11 -#define OP_HOST_NAME 12 -#define OP_BOOT_FILE_SZ 13 -#define OP_DUMP_FILE 14 -#define OP_DOMAIN_NAME 15 -#define OP_SWAP_SERVER 16 -#define OP_ROOT_PATH 17 -#define OP_EXTENSION_PATH 18 -#define OP_IP_FORWARDING 19 -#define OP_NON_LOCAL_SRC_RTE 20 -#define OP_POLICY_FILTER 21 -#define OP_MAX_DATAGRAM_SZ 22 -#define OP_DEFAULT_TTL 23 -#define OP_MTU_AGING_TIMEOUT 24 -#define OP_MTU_SIZES 25 -#define OP_MTU_TO_USE 26 -#define OP_ALL_SUBNETS_LOCAL 27 -#define OP_BROADCAST_ADD 28 -#define OP_PERFORM_MASK_DISCOVERY 29 -#define OP_RESPOND_TO_MASK_REQ 30 -#define OP_PERFORM_ROUTER_DISCOVERY 31 -#define OP_ROUTER_SOLICIT_ADDRESS 32 -#define OP_STATIC_ROUTER_LIST 33 -#define OP_USE_ARP_TRAILERS 34 -#define OP_ARP_CACHE_TIMEOUT 35 -#define OP_ETHERNET_ENCAPSULATION 36 -#define OP_TCP_DEFAULT_TTL 37 -#define OP_TCP_KEEP_ALIVE_INT 38 -#define OP_KEEP_ALIVE_GARBAGE 39 -#define OP_NIS_DOMAIN_NAME 40 -#define OP_NIS_SERVERS 41 -#define OP_NTP_SERVERS 42 -#define OP_VENDOR_SPECIFIC 43 -#define VEND_PXE_MTFTP_IP 1 -#define VEND_PXE_MTFTP_CPORT 2 -#define VEND_PXE_MTFTP_SPORT 3 -#define VEND_PXE_MTFTP_TMOUT 4 -#define VEND_PXE_MTFTP_DELAY 5 -#define VEND_PXE_DISCOVERY_CONTROL 6 -#define PXE_DISABLE_BROADCAST_DISCOVERY (1 << 0) -#define PXE_DISABLE_MULTICAST_DISCOVERY (1 << 1) -#define PXE_ACCEPT_ONLY_PXE_BOOT_SERVERS (1 << 2) -#define PXE_DO_NOT_PROMPT (1 << 3) -#define VEND_PXE_DISCOVERY_MCAST_ADDR 7 -#define VEND_PXE_BOOT_SERVERS 8 -#define VEND_PXE_BOOT_MENU 9 -#define VEND_PXE_BOOT_PROMPT 10 -#define VEND_PXE_MCAST_ADDRS_ALLOC 11 -#define VEND_PXE_CREDENTIAL_TYPES 12 -#define VEND_PXE_BOOT_ITEM 71 -#define OP_NBNS_SERVERS 44 -#define OP_NBDD_SERVERS 45 -#define OP_NETBIOS_NODE_TYPE 46 -#define OP_NETBIOS_SCOPE 47 -#define OP_XWINDOW_SYSTEM_FONT_SERVERS 48 -#define OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS 49 -#define OP_DHCP_REQ_IP_ADD 50 -#define OP_DHCP_LEASE_TIME 51 -#define OP_DHCP_OPTION_OVERLOAD 52 -#define OVLD_FILE 1 -#define OVLD_SRVR_NAME 2 -#define OP_DHCP_MESSAGE_TYPE 53 -#define DHCPDISCOVER 1 -#define DHCPOFFER 2 -#define DHCPREQUEST 3 -#define DHCPDECLINE 4 -#define DHCPACK 5 -#define DHCPNAK 6 -#define DHCPRELEASE 7 -#define DHCPINFORM 8 -#define OP_DHCP_SERVER_IP 54 -#define OP_DHCP_PARM_REQ_LIST 55 -#define OP_DHCP_ERROR_MESSAGE 56 -#define OP_DHCP_MAX_MESSAGE_SZ 57 -#define OP_DHCP_RENEWAL_TIME 58 -#define OP_DHCP_REBINDING_TIME 59 -#define OP_DHCP_CLASS_IDENTIFIER 60 -#define OP_DHCP_CLIENT_IDENTIFIER 61 -#define OP_NISPLUS_DOMAIN_NAME 64 -#define OP_NISPLUS_SERVERS 65 -#define OP_DHCP_TFTP_SERVER_NAME 66 -#define OP_DHCP_BOOTFILE 67 -#define OP_MOBILE_IP_HOME_AGENTS 68 -#define OP_SMPT_SERVERS 69 -#define OP_POP3_SERVERS 70 -#define OP_NNTP_SERVERS 71 -#define OP_WWW_SERVERS 72 -#define OP_FINGER_SERVERS 73 -#define OP_IRC_SERVERS 74 -#define OP_STREET_TALK_SERVERS 75 -#define OP_STREET_TALK_DIR_ASSIST_SERVERS 76 -#define OP_NDS_SERVERS 85 -#define OP_NDS_TREE_NAME 86 -#define OP_NDS_CONTEXT 87 -#define OP_DHCP_SYSTEM_ARCH 93 -#define OP_DHCP_NETWORK_ARCH 94 -#define OP_DHCP_PLATFORM_ID 97 -} DHCPV4_STRUCT; - -// -// DHCPv4 option header -// -typedef struct { - UINT8 OpCode; - UINT8 Length; - // - // followed by Data[] - // -} DHCPV4_OP_HEADER; - -// -// Generic DHCPv4 option (header followed by data) -// -typedef struct { - DHCPV4_OP_HEADER Header; - UINT8 Data[1]; -} DHCPV4_OP_STRUCT; - -// -// Maximum DHCP packet size on ethernet -// -#define MAX_DHCP_MSG_SZ (MAX_ENET_DATA_SIZE - sizeof (IPV4_HEADER) - sizeof (UDPV4_HEADER)) - -// -// Macros used in pxe_bc_dhcp.c and pxe_loadfile.c -// -#define DHCPV4_TRANSMIT_BUFFER (*(DHCPV4_STRUCT *) (Private->TransmitBuffer)) -#define DHCPV4_OPTIONS_BUFFER (*(struct optionsstr *) DHCPV4_TRANSMIT_BUFFER.options) - -#define DHCPV4_ACK_INDEX 0 -#define PXE_BINL_INDEX 1 -#define PXE_OFFER_INDEX 1 -#define PXE_ACK_INDEX 2 -#define PXE_BIS_INDEX 3 - -#define DHCPV4_ACK_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[DHCPV4_ACK_INDEX] -#define PXE_BINL_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BINL_INDEX] -#define PXE_OFFER_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_OFFER_INDEX] -#define PXE_ACK_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_ACK_INDEX] -#define PXE_BIS_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BIS_INDEX] - -#define DHCPV4_ACK_PACKET DHCPV4_ACK_BUFFER.u.Dhcpv4 -#define PXE_BINL_PACKET PXE_BINL_BUFFER.u.Dhcpv4 -#define PXE_OFFER_PACKET PXE_OFFER_BUFFER.u.Dhcpv4 -#define PXE_ACK_PACKET PXE_ACK_BUFFER.u.Dhcpv4 -#define PXE_BIS_PACKET PXE_BIS_BUFFER.u.Dhcpv4 - -// -// network structure definitions -// -// -// some option definitions -// -#define DHCPV4_OPTION_LENGTH(type) (sizeof (type) - sizeof (DHCPV4_OP_HEADER)) - -typedef struct { - DHCPV4_OP_HEADER Header; - UINT8 Type; -} DHCPV4_OP_MESSAGE_TYPE; - -typedef struct { - DHCPV4_OP_HEADER Header; - UINT8 Overload; -} DHCPV4_OP_OVERLOAD; - -// -// boot server list structure -// one or more contained in a pxe boot servers structure -// -typedef struct { - UINT8 IpCount; - EFI_IPv4_ADDRESS IpList[1]; // IP count of IPs -} PXEV4_SERVER_LIST; - -typedef struct { - UINT8 IpCount; - EFI_IPv6_ADDRESS IpList[1]; // IP count of IPs -} PXEV6_SERVER_LIST; - -typedef union { - PXEV4_SERVER_LIST Ipv4List; - PXEV6_SERVER_LIST Ipv6List; -} PXE_SERVER_LISTS; - -typedef struct { - UINT16 Type; - PXE_SERVER_LISTS u; -} PXE_SERVER_LIST; - -// -// pxe boot servers structure -// -typedef struct { - DHCPV4_OP_HEADER Header; - PXE_SERVER_LIST ServerList[1]; // one or more -} PXE_OP_SERVER_LIST; - -// -// pxe boot item structure -// -typedef struct { - DHCPV4_OP_HEADER Header; - UINT16 Type; - UINT16 Layer; -} PXE_OP_BOOT_ITEM; - -// -// pxe boot menu item structure -// -typedef struct { - UINT16 Type; - UINT8 DataLen; - UINT8 Data[1]; -} PXE_BOOT_MENU_ENTRY; - -// -// pxe boot menu structure -// -typedef struct { - DHCPV4_OP_HEADER Header; - PXE_BOOT_MENU_ENTRY MenuItem[1]; -} PXE_OP_BOOT_MENU; - -// -// pxe boot prompt structure -// -typedef struct { - DHCPV4_OP_HEADER Header; - UINT8 Timeout; - UINT8 Prompt[1]; -} PXE_OP_BOOT_PROMPT; - -#define PXE_BOOT_PROMPT_AUTO_SELECT 0 -#define PXE_BOOT_PROMPT_NO_TIMEOUT 255 - -typedef struct { - DHCPV4_OP_HEADER Header; - UINT8 Class[1]; -} DHCPV4_OP_CLASS; - -typedef struct { - DHCPV4_OP_HEADER Header; - UINT8 File[1]; -} DHCPV4_OP_BOOTFILE; - -typedef struct { - DHCPV4_OP_HEADER Header; - UINT8 VendorOptions[1]; -} DHCPV4_OP_VENDOR_OPTIONS; - -typedef struct { - DHCPV4_OP_HEADER Header; - UINT8 MaxSize[2]; -} DHCPV4_OP_MAX_MESSAGE_SIZE; - -typedef struct { - UINT8 _OP_SUBNET_MASK; /* 1 */ - UINT8 _OP_TIME_OFFSET; /* 2 */ - UINT8 _OP_ROUTER_LIST; /* 3 */ - UINT8 _OP_TIME_SERVERS; /* 4 */ - UINT8 _OP_NAME_SERVERS; /* 5 */ - UINT8 _OP_DNS_SERVERS; /* 6 */ - UINT8 _OP_HOST_NAME; /* 12 */ - UINT8 _OP_BOOT_FILE_SZ; /* 13 */ - UINT8 _OP_DOMAIN_NAME; /* 15 */ - UINT8 _OP_ROOT_PATH; /* 17 */ - UINT8 _OP_EXTENSION_PATH; /* 18 */ - UINT8 _OP_MAX_DATAGRAM_SZ; /* 22 */ - UINT8 _OP_DEFAULT_TTL; /* 23 */ - UINT8 _OP_BROADCAST_ADD; /* 28 */ - UINT8 _OP_NIS_DOMAIN_NAME; /* 40 */ - UINT8 _OP_NIS_SERVERS; /* 41 */ - UINT8 _OP_NTP_SERVERS; /* 42 */ - UINT8 _OP_VENDOR_SPECIFIC; /* 43 */ - UINT8 _OP_DHCP_REQ_IP_ADD; /* 50 */ - UINT8 _OP_DHCP_LEASE_TIME; /* 51 */ - UINT8 _OP_DHCP_SERVER_IP; /* 54 */ - UINT8 _OP_DHCP_RENEWAL_TIME; /* 58 */ - UINT8 _OP_DHCP_REBINDING_TIME; /* 59 */ - UINT8 _OP_DHCP_CLASS_IDENTIFIER; /* 60 */ - UINT8 _OP_DHCP_TFTP_SERVER_NAME; /* 66 */ - UINT8 _OP_DHCP_BOOTFILE; /* 67 */ - UINT8 _OP_DHCP_PLATFORM_ID; /* 97 */ - UINT8 VendorOption128; // vendor option 128 - UINT8 VendorOption129; // vendor option 129 - UINT8 VendorOption130; // vendor option 130 - UINT8 VendorOption131; // vendor option 131 - UINT8 VendorOption132; // vendor option 132 - UINT8 VendorOption133; // vendor option 133 - UINT8 VendorOption134; // vendor option 134 - UINT8 VendorOption135; // vendor option 135 -} DHCPV4_REQUESTED_OPTIONS_DATA; - -typedef struct { - DHCPV4_OP_HEADER Header; - DHCPV4_REQUESTED_OPTIONS_DATA Data; -} DHCPV4_OP_REQUESTED_OPTIONS; - -typedef struct opipstr { - DHCPV4_OP_HEADER Header; - EFI_IPv4_ADDRESS Ip; -} DHCPV4_OP_IP_ADDRESS; - -// -// ip list structure - e.g. router list -// -typedef struct { - DHCPV4_OP_HEADER Header; - EFI_IPv4_ADDRESS IpList[1]; -} DHCPV4_OP_IP_LIST; - -typedef struct { - DHCPV4_OP_HEADER Header; - UINT8 Type; - UINT8 Guid[sizeof (EFI_GUID)]; -} DHCPV4_OP_CLIENT_ID; - -// -// special options start - someday obsolete ??? -// -#define DHCPV4_OP_PLATFORM_ID DHCPV4_OP_CLIENT_ID - -typedef struct { - DHCPV4_OP_HEADER Header; - UINT8 Type; // SNP = 2 - UINT8 MajorVersion; - UINT8 MinorVersion; -} DHCPV4_OP_NETWORK_INTERFACE; - -#define UNDI_TYPE 1 -#define SNP_TYPE 2 - -typedef struct { - DHCPV4_OP_HEADER Header; - UINT16 Type; -} DHCPV4_OP_ARCHITECTURE_TYPE; -// -// special options end - someday obsolete ??? -// -typedef struct { - UINT8 ClassIdentifier[10]; // PXEClient: - UINT8 Lit2[5]; // Arch: - UINT8 ArchitectureType[5]; // 00000 - 65536 - UINT8 Lit3[1]; // : - UINT8 InterfaceName[4]; // e.g. UNDI - UINT8 Lit4[1]; // : - UINT8 UndiMajor[3]; // 000 - 255 - UINT8 UndiMinor[3]; // 000 - 255 -} DHCPV4_CLASS_ID_DATA; - -typedef struct { - DHCPV4_OP_HEADER Header; - DHCPV4_CLASS_ID_DATA Data; -} DHCPV4_OP_CLASS_ID; - -typedef struct { - DHCPV4_OP_HEADER Header; - EFI_IPv4_ADDRESS Ip; -} DHCPV4_OP_REQUESTED_IP; - -typedef struct { - DHCPV4_OP_HEADER Header; - EFI_IPv4_ADDRESS Ip; -} DHCPV4_OP_SERVER_IP; - -typedef struct { - DHCPV4_OP_HEADER Header; - EFI_IPv4_ADDRESS Ip; -} DHCPV4_OP_SUBNET_MASK; - -typedef struct { // oppxedisctlstr { - DHCPV4_OP_HEADER Header; - UINT8 ControlBits; -} PXE_OP_DISCOVERY_CONTROL; - -#define DISABLE_BCAST (1 << 0) -#define DISABLE_MCAST (1 << 1) -#define USE_ACCEPT_LIST (1 << 2) -#define USE_BOOTFILE (1 << 3) - -#pragma pack() -// -// definitions of indices to populate option interest array -// -#define VEND_PXE_MTFTP_IP_IX 1 // multicast IP address of bootfile for MTFTP listen -#define VEND_PXE_MTFTP_CPORT_IX 2 // UDP Port to monitor for MTFTP responses - Intel order -#define VEND_PXE_MTFTP_SPORT_IX 3 // Server UDP Port for MTFTP open - Intel order -#define VEND_PXE_MTFTP_TMOUT_IX 4 // Listen timeout - secs -#define VEND_PXE_MTFTP_DELAY_IX 5 // Transmission timeout - secs -#define VEND_PXE_DISCOVERY_CONTROL_IX 6 // bit field -#define VEND_PXE_DISCOVERY_MCAST_ADDR_IX 7 // boot server discovery multicast address -#define VEND_PXE_BOOT_SERVERS_IX 8 // list of boot servers of form tp(2) cnt(1) ips[cnt] -#define VEND_PXE_BOOT_MENU_IX 9 -#define VEND_PXE_BOOT_PROMPT_IX 10 -#define VEND_PXE_MCAST_ADDRS_ALLOC_IX 0 // not used by PXE client -#define VEND_PXE_CREDENTIAL_TYPES_IX 11 -#define VEND_13_IX 0 // not used by PXE client -#define VEND_14_IX 0 // not used by PXE client -#define VEND_15_IX 0 // not used by PXE client -#define VEND_16_IX 0 // not used by PXE client -#define VEND_17_IX 0 // not used by PXE client -#define VEND_18_IX 0 // not used by PXE client -#define VEND_19_IX 0 // not used by PXE client -#define VEND_20_IX 0 // not used by PXE client -#define VEND_21_IX 0 // not used by PXE client -#define VEND_22_IX 0 // not used by PXE client -#define VEND_23_IX 0 // not used by PXE client -#define VEND_24_IX 0 // not used by PXE client -#define VEND_25_IX 0 // not used by PXE client -#define VEND_26_IX 0 // not used by PXE client -#define VEND_27_IX 0 // not used by PXE client -#define VEND_28_IX 0 // not used by PXE client -#define VEND_29_IX 0 // not used by PXE client -#define VEND_30_IX 0 // not used by PXE client -#define VEND_31_IX 0 // not used by PXE client -#define VEND_32_IX 0 // not used by PXE client -#define VEND_33_IX 0 // not used by PXE client -#define VEND_34_IX 0 // not used by PXE client -#define VEND_35_IX 0 // not used by PXE client -#define VEND_36_IX 0 // not used by PXE client -#define VEND_37_IX 0 // not used by PXE client -#define VEND_38_IX 0 // not used by PXE client -#define VEND_39_IX 0 // not used by PXE client -#define VEND_40_IX 0 // not used by PXE client -#define VEND_41_IX 0 // not used by PXE client -#define VEND_42_IX 0 // not used by PXE client -#define VEND_43_IX 0 // not used by PXE client -#define VEND_44_IX 0 // not used by PXE client -#define VEND_45_IX 0 // not used by PXE client -#define VEND_46_IX 0 // not used by PXE client -#define VEND_47_IX 0 // not used by PXE client -#define VEND_48_IX 0 // not used by PXE client -#define VEND_49_IX 0 // not used by PXE client -#define VEND_50_IX 0 // not used by PXE client -#define VEND_51_IX 0 // not used by PXE client -#define VEND_52_IX 0 // not used by PXE client -#define VEND_53_IX 0 // not used by PXE client -#define VEND_54_IX 0 // not used by PXE client -#define VEND_55_IX 0 // not used by PXE client -#define VEND_56_IX 0 // not used by PXE client -#define VEND_57_IX 0 // not used by PXE client -#define VEND_58_IX 0 // not used by PXE client -#define VEND_59_IX 0 // not used by PXE client -#define VEND_60_IX 0 // not used by PXE client -#define VEND_61_IX 0 // not used by PXE client -#define VEND_62_IX 0 // not used by PXE client -#define VEND_63_IX 0 // not used by PXE client -#define VEND_64_IX 0 // not used by PXE client -#define VEND_65_IX 0 // not used by PXE client -#define VEND_66_IX 0 // not used by PXE client -#define VEND_67_IX 0 // not used by PXE client -#define VEND_68_IX 0 // not used by PXE client -#define VEND_69_IX 0 // not used by PXE client -#define VEND_70_IX 0 // not used by PXE client -#define VEND_PXE_BOOT_ITEM_IX 12 - -#define MAX_OUR_PXE_OPT VEND_PXE_BOOT_ITEM // largest PXE option in which we are interested -#define MAX_OUR_PXE_IX VEND_PXE_BOOT_ITEM_IX // largest PXE option index -// -// define various types by options that are sent -// -#define WfM11a_OPTS ((1<TransmitBuffer)) +#define DHCPV4_OPTIONS_BUFFER (*(struct optionsstr *) DHCPV4_TRANSMIT_BUFFER.options) + +#define DHCPV4_ACK_INDEX 0 +#define PXE_BINL_INDEX 1 +#define PXE_OFFER_INDEX 1 +#define PXE_ACK_INDEX 2 +#define PXE_BIS_INDEX 3 + +#define DHCPV4_ACK_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[DHCPV4_ACK_INDEX] +#define PXE_BINL_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BINL_INDEX] +#define PXE_OFFER_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_OFFER_INDEX] +#define PXE_ACK_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_ACK_INDEX] +#define PXE_BIS_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BIS_INDEX] + +#define DHCPV4_ACK_PACKET DHCPV4_ACK_BUFFER.u.Dhcpv4 +#define PXE_BINL_PACKET PXE_BINL_BUFFER.u.Dhcpv4 +#define PXE_OFFER_PACKET PXE_OFFER_BUFFER.u.Dhcpv4 +#define PXE_ACK_PACKET PXE_ACK_BUFFER.u.Dhcpv4 +#define PXE_BIS_PACKET PXE_BIS_BUFFER.u.Dhcpv4 + +// +// network structure definitions +// +// +// some option definitions +// +#define DHCPV4_OPTION_LENGTH(type) (sizeof (type) - sizeof (DHCPV4_OP_HEADER)) + +typedef struct { + DHCPV4_OP_HEADER Header; + UINT8 Type; +} DHCPV4_OP_MESSAGE_TYPE; + +typedef struct { + DHCPV4_OP_HEADER Header; + UINT8 Overload; +} DHCPV4_OP_OVERLOAD; + +// +// boot server list structure +// one or more contained in a pxe boot servers structure +// +typedef struct { + UINT8 IpCount; + EFI_IPv4_ADDRESS IpList[1]; // IP count of IPs +} PXEV4_SERVER_LIST; + +typedef struct { + UINT8 IpCount; + EFI_IPv6_ADDRESS IpList[1]; // IP count of IPs +} PXEV6_SERVER_LIST; + +typedef union { + PXEV4_SERVER_LIST Ipv4List; + PXEV6_SERVER_LIST Ipv6List; +} PXE_SERVER_LISTS; + +typedef struct { + UINT16 Type; + PXE_SERVER_LISTS u; +} PXE_SERVER_LIST; + +// +// pxe boot servers structure +// +typedef struct { + DHCPV4_OP_HEADER Header; + PXE_SERVER_LIST ServerList[1]; // one or more +} PXE_OP_SERVER_LIST; + +// +// pxe boot item structure +// +typedef struct { + DHCPV4_OP_HEADER Header; + UINT16 Type; + UINT16 Layer; +} PXE_OP_BOOT_ITEM; + +// +// pxe boot menu item structure +// +typedef struct { + UINT16 Type; + UINT8 DataLen; + UINT8 Data[1]; +} PXE_BOOT_MENU_ENTRY; + +// +// pxe boot menu structure +// +typedef struct { + DHCPV4_OP_HEADER Header; + PXE_BOOT_MENU_ENTRY MenuItem[1]; +} PXE_OP_BOOT_MENU; + +// +// pxe boot prompt structure +// +typedef struct { + DHCPV4_OP_HEADER Header; + UINT8 Timeout; + UINT8 Prompt[1]; +} PXE_OP_BOOT_PROMPT; + +#define PXE_BOOT_PROMPT_AUTO_SELECT 0 +#define PXE_BOOT_PROMPT_NO_TIMEOUT 255 + +typedef struct { + DHCPV4_OP_HEADER Header; + UINT8 Class[1]; +} DHCPV4_OP_CLASS; + +typedef struct { + DHCPV4_OP_HEADER Header; + UINT8 File[1]; +} DHCPV4_OP_BOOTFILE; + +typedef struct { + DHCPV4_OP_HEADER Header; + UINT8 VendorOptions[1]; +} DHCPV4_OP_VENDOR_OPTIONS; + +typedef struct { + DHCPV4_OP_HEADER Header; + UINT8 MaxSize[2]; +} DHCPV4_OP_MAX_MESSAGE_SIZE; + +typedef struct { + UINT8 _OP_SUBNET_MASK; /* 1 */ + UINT8 _OP_TIME_OFFSET; /* 2 */ + UINT8 _OP_ROUTER_LIST; /* 3 */ + UINT8 _OP_TIME_SERVERS; /* 4 */ + UINT8 _OP_NAME_SERVERS; /* 5 */ + UINT8 _OP_DNS_SERVERS; /* 6 */ + UINT8 _OP_HOST_NAME; /* 12 */ + UINT8 _OP_BOOT_FILE_SZ; /* 13 */ + UINT8 _OP_DOMAIN_NAME; /* 15 */ + UINT8 _OP_ROOT_PATH; /* 17 */ + UINT8 _OP_EXTENSION_PATH; /* 18 */ + UINT8 _OP_MAX_DATAGRAM_SZ; /* 22 */ + UINT8 _OP_DEFAULT_TTL; /* 23 */ + UINT8 _OP_BROADCAST_ADD; /* 28 */ + UINT8 _OP_NIS_DOMAIN_NAME; /* 40 */ + UINT8 _OP_NIS_SERVERS; /* 41 */ + UINT8 _OP_NTP_SERVERS; /* 42 */ + UINT8 _OP_VENDOR_SPECIFIC; /* 43 */ + UINT8 _OP_DHCP_REQ_IP_ADD; /* 50 */ + UINT8 _OP_DHCP_LEASE_TIME; /* 51 */ + UINT8 _OP_DHCP_SERVER_IP; /* 54 */ + UINT8 _OP_DHCP_RENEWAL_TIME; /* 58 */ + UINT8 _OP_DHCP_REBINDING_TIME; /* 59 */ + UINT8 _OP_DHCP_CLASS_IDENTIFIER; /* 60 */ + UINT8 _OP_DHCP_TFTP_SERVER_NAME; /* 66 */ + UINT8 _OP_DHCP_BOOTFILE; /* 67 */ + UINT8 _OP_DHCP_PLATFORM_ID; /* 97 */ + UINT8 VendorOption128; // vendor option 128 + UINT8 VendorOption129; // vendor option 129 + UINT8 VendorOption130; // vendor option 130 + UINT8 VendorOption131; // vendor option 131 + UINT8 VendorOption132; // vendor option 132 + UINT8 VendorOption133; // vendor option 133 + UINT8 VendorOption134; // vendor option 134 + UINT8 VendorOption135; // vendor option 135 +} DHCPV4_REQUESTED_OPTIONS_DATA; + +typedef struct { + DHCPV4_OP_HEADER Header; + DHCPV4_REQUESTED_OPTIONS_DATA Data; +} DHCPV4_OP_REQUESTED_OPTIONS; + +typedef struct opipstr { + DHCPV4_OP_HEADER Header; + EFI_IPv4_ADDRESS Ip; +} DHCPV4_OP_IP_ADDRESS; + +// +// ip list structure - e.g. router list +// +typedef struct { + DHCPV4_OP_HEADER Header; + EFI_IPv4_ADDRESS IpList[1]; +} DHCPV4_OP_IP_LIST; + +typedef struct { + DHCPV4_OP_HEADER Header; + UINT8 Type; + UINT8 Guid[sizeof (EFI_GUID)]; +} DHCPV4_OP_CLIENT_ID; + +// +// special options start - someday obsolete ??? +// +#define DHCPV4_OP_PLATFORM_ID DHCPV4_OP_CLIENT_ID + +typedef struct { + DHCPV4_OP_HEADER Header; + UINT8 Type; // SNP = 2 + UINT8 MajorVersion; + UINT8 MinorVersion; +} DHCPV4_OP_NETWORK_INTERFACE; + +#define UNDI_TYPE 1 +#define SNP_TYPE 2 + +typedef struct { + DHCPV4_OP_HEADER Header; + UINT16 Type; +} DHCPV4_OP_ARCHITECTURE_TYPE; +// +// special options end - someday obsolete ??? +// +typedef struct { + UINT8 ClassIdentifier[10]; // PXEClient: + UINT8 Lit2[5]; // Arch: + UINT8 ArchitectureType[5]; // 00000 - 65536 + UINT8 Lit3[1]; // : + UINT8 InterfaceName[4]; // e.g. UNDI + UINT8 Lit4[1]; // : + UINT8 UndiMajor[3]; // 000 - 255 + UINT8 UndiMinor[3]; // 000 - 255 +} DHCPV4_CLASS_ID_DATA; + +typedef struct { + DHCPV4_OP_HEADER Header; + DHCPV4_CLASS_ID_DATA Data; +} DHCPV4_OP_CLASS_ID; + +typedef struct { + DHCPV4_OP_HEADER Header; + EFI_IPv4_ADDRESS Ip; +} DHCPV4_OP_REQUESTED_IP; + +typedef struct { + DHCPV4_OP_HEADER Header; + EFI_IPv4_ADDRESS Ip; +} DHCPV4_OP_SERVER_IP; + +typedef struct { + DHCPV4_OP_HEADER Header; + EFI_IPv4_ADDRESS Ip; +} DHCPV4_OP_SUBNET_MASK; + +typedef struct { // oppxedisctlstr { + DHCPV4_OP_HEADER Header; + UINT8 ControlBits; +} PXE_OP_DISCOVERY_CONTROL; + +#define DISABLE_BCAST (1 << 0) +#define DISABLE_MCAST (1 << 1) +#define USE_ACCEPT_LIST (1 << 2) +#define USE_BOOTFILE (1 << 3) + +#pragma pack() +// +// definitions of indices to populate option interest array +// +#define VEND_PXE_MTFTP_IP_IX 1 // multicast IP address of bootfile for MTFTP listen +#define VEND_PXE_MTFTP_CPORT_IX 2 // UDP Port to monitor for MTFTP responses - Intel order +#define VEND_PXE_MTFTP_SPORT_IX 3 // Server UDP Port for MTFTP open - Intel order +#define VEND_PXE_MTFTP_TMOUT_IX 4 // Listen timeout - secs +#define VEND_PXE_MTFTP_DELAY_IX 5 // Transmission timeout - secs +#define VEND_PXE_DISCOVERY_CONTROL_IX 6 // bit field +#define VEND_PXE_DISCOVERY_MCAST_ADDR_IX 7 // boot server discovery multicast address +#define VEND_PXE_BOOT_SERVERS_IX 8 // list of boot servers of form tp(2) cnt(1) ips[cnt] +#define VEND_PXE_BOOT_MENU_IX 9 +#define VEND_PXE_BOOT_PROMPT_IX 10 +#define VEND_PXE_MCAST_ADDRS_ALLOC_IX 0 // not used by PXE client +#define VEND_PXE_CREDENTIAL_TYPES_IX 11 +#define VEND_13_IX 0 // not used by PXE client +#define VEND_14_IX 0 // not used by PXE client +#define VEND_15_IX 0 // not used by PXE client +#define VEND_16_IX 0 // not used by PXE client +#define VEND_17_IX 0 // not used by PXE client +#define VEND_18_IX 0 // not used by PXE client +#define VEND_19_IX 0 // not used by PXE client +#define VEND_20_IX 0 // not used by PXE client +#define VEND_21_IX 0 // not used by PXE client +#define VEND_22_IX 0 // not used by PXE client +#define VEND_23_IX 0 // not used by PXE client +#define VEND_24_IX 0 // not used by PXE client +#define VEND_25_IX 0 // not used by PXE client +#define VEND_26_IX 0 // not used by PXE client +#define VEND_27_IX 0 // not used by PXE client +#define VEND_28_IX 0 // not used by PXE client +#define VEND_29_IX 0 // not used by PXE client +#define VEND_30_IX 0 // not used by PXE client +#define VEND_31_IX 0 // not used by PXE client +#define VEND_32_IX 0 // not used by PXE client +#define VEND_33_IX 0 // not used by PXE client +#define VEND_34_IX 0 // not used by PXE client +#define VEND_35_IX 0 // not used by PXE client +#define VEND_36_IX 0 // not used by PXE client +#define VEND_37_IX 0 // not used by PXE client +#define VEND_38_IX 0 // not used by PXE client +#define VEND_39_IX 0 // not used by PXE client +#define VEND_40_IX 0 // not used by PXE client +#define VEND_41_IX 0 // not used by PXE client +#define VEND_42_IX 0 // not used by PXE client +#define VEND_43_IX 0 // not used by PXE client +#define VEND_44_IX 0 // not used by PXE client +#define VEND_45_IX 0 // not used by PXE client +#define VEND_46_IX 0 // not used by PXE client +#define VEND_47_IX 0 // not used by PXE client +#define VEND_48_IX 0 // not used by PXE client +#define VEND_49_IX 0 // not used by PXE client +#define VEND_50_IX 0 // not used by PXE client +#define VEND_51_IX 0 // not used by PXE client +#define VEND_52_IX 0 // not used by PXE client +#define VEND_53_IX 0 // not used by PXE client +#define VEND_54_IX 0 // not used by PXE client +#define VEND_55_IX 0 // not used by PXE client +#define VEND_56_IX 0 // not used by PXE client +#define VEND_57_IX 0 // not used by PXE client +#define VEND_58_IX 0 // not used by PXE client +#define VEND_59_IX 0 // not used by PXE client +#define VEND_60_IX 0 // not used by PXE client +#define VEND_61_IX 0 // not used by PXE client +#define VEND_62_IX 0 // not used by PXE client +#define VEND_63_IX 0 // not used by PXE client +#define VEND_64_IX 0 // not used by PXE client +#define VEND_65_IX 0 // not used by PXE client +#define VEND_66_IX 0 // not used by PXE client +#define VEND_67_IX 0 // not used by PXE client +#define VEND_68_IX 0 // not used by PXE client +#define VEND_69_IX 0 // not used by PXE client +#define VEND_70_IX 0 // not used by PXE client +#define VEND_PXE_BOOT_ITEM_IX 12 + +#define MAX_OUR_PXE_OPT VEND_PXE_BOOT_ITEM // largest PXE option in which we are interested +#define MAX_OUR_PXE_IX VEND_PXE_BOOT_ITEM_IX // largest PXE option index +// +// define various types by options that are sent +// +#define WfM11a_OPTS ((1<> 8) & 0x00ff)) - -#define HTONL(v) \ - (UINT32) ((((v) << 24) & 0xff000000) + (((v) << 8) & 0x00ff0000) + (((v) >> 8) & 0x0000ff00) + (((v) >> 24) & 0x000000ff)) - -#define HTONLL(v) swap64 (v) - -#define U8PTR(na) ((UINT8 *) &(na)) - -#define NTOHS(ns) ((UINT16) (((*U8PTR (ns)) << 8) +*(U8PTR (ns) + 1))) - -#define NTOHL(ns) \ - ((UINT32) (((*U8PTR (ns)) << 24) + ((*(U8PTR (ns) + 1)) << 16) + ((*(U8PTR (ns) + 2)) << 8) +*(U8PTR (ns) + 3))) - -#endif /* _HTON_H_ */ - -/* EOF - hton.h */ +/** @file + +Copyright (c) 2004, 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: + hton.h + +Abstract: + Byte swapping macros. + + +**/ + +#ifndef _HTON_H_ +#define _HTON_H_ + +// +// Only Intel order functions are defined at this time. +// +#define HTONS(v) (UINT16) ((((v) << 8) & 0xff00) + (((v) >> 8) & 0x00ff)) + +#define HTONL(v) \ + (UINT32) ((((v) << 24) & 0xff000000) + (((v) << 8) & 0x00ff0000) + (((v) >> 8) & 0x0000ff00) + (((v) >> 24) & 0x000000ff)) + +#define HTONLL(v) swap64 (v) + +#define U8PTR(na) ((UINT8 *) &(na)) + +#define NTOHS(ns) ((UINT16) (((*U8PTR (ns)) << 8) +*(U8PTR (ns) + 1))) + +#define NTOHL(ns) \ + ((UINT32) (((*U8PTR (ns)) << 24) + ((*(U8PTR (ns) + 1)) << 16) + ((*(U8PTR (ns) + 2)) << 8) +*(U8PTR (ns) + 3))) + +#endif /* _HTON_H_ */ + +/* EOF - hton.h */ diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Ia32/PxeArch.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Ia32/PxeArch.h index cc878d8dd7..d032f62a91 100644 --- a/MdeModulePkg/Universal/Network/PxeBcDxe/Ia32/PxeArch.h +++ b/MdeModulePkg/Universal/Network/PxeBcDxe/Ia32/PxeArch.h @@ -1,26 +1,26 @@ -/** @file - -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: - PxeArch.h - -Abstract: - Defines PXE Arch type - - -**/ - -#ifndef _EFI_PXE_ARCH_H_ -#define _EFI_PXE_ARCH_H_ - -#define SYS_ARCH 0x6 - -#endif +/** @file + +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: + PxeArch.h + +Abstract: + Defines PXE Arch type + + +**/ + +#ifndef _EFI_PXE_ARCH_H_ +#define _EFI_PXE_ARCH_H_ + +#define SYS_ARCH 0x6 + +#endif diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h index a482eb9cd9..84ffd75bd6 100644 --- a/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h +++ b/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h @@ -1,736 +1,736 @@ -/** @file - -Copyright (c) 2004 - 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. - - -**/ - -#ifndef _IP_H_ -#define _IP_H_ - -#include "hton.h" - -// -// portability macros -// -#define UDP_FILTER_MASK (EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP | \ - EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT | \ - EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP | \ - EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT | \ - EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER \ - ) - -#define PXE_BOOT_LAYER_MASK 0x7FFF -#define PXE_BOOT_LAYER_INITIAL 0x0000 -#define PXE_BOOT_LAYER_CREDENTIAL_FLAG 0x8000 -#define MAX_BOOT_SERVERS 32 - -// -// macro to evaluate IP address as TRUE if it is a multicast IP address -// -#define IS_MULTICAST(ptr) ((*((UINT8 *) ptr) & 0xf0) == 0xe0) - -// -// length macros -// -#define IP_ADDRESS_LENGTH(qp) (((qp)->UsingIpv6) ? sizeof (EFI_IPv6_ADDRESS) : sizeof (EFI_IPv4_ADDRESS)) - -#define MAX_FRAME_DATA_SIZE 1488 -#define ALLOCATE_SIZE(X) (((X) + 7) & 0xfff8) -#define MODE_ALLOCATE_SIZE ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_MODE)) -#define BUFFER_ALLOCATE_SIZE (8192 + 512) -#define ROUTER_ALLOCATE_SIZE ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ROUTE_ENTRY) * PXE_ROUTER_TABLE_SIZE)) -#define ARP_ALLOCATE_SIZE ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ARP_ENTRY) * PXE_ARP_CACHE_SIZE)) -#define FILTER_ALLOCATE_SIZE ALLOCATE_SIZE ((sizeof (EFI_IP_ADDRESS) * PXE_IP_FILTER_SIZE)) -#define PXE_ARP_CACHE_SIZE 8 -#define PXE_ROUTER_TABLE_SIZE 8 -#define PXE_IP_FILTER_SIZE 8 -#define ICMP_ALLOCATE_SIZE ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)) -#define TFTP_ERR_ALLOCATE_SIZE ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_TFTP_ERROR)) - -// -// DHCP discover/request packets are sent to this UDP port. ProxyDHCP -// servers listen on this port for DHCP discover packets that have a -// class identifier (option 60) with 'PXEClient' in the first 9 bytes. -// Bootservers also listen on this port for PXE broadcast discover -// requests from PXE clients. -// -#define DHCP_SERVER_PORT 67 - -// -// When DHCP, proxyDHCP and Bootservers respond to DHCP and PXE broadcast -// discover requests by broadcasting the reply packet, the packet is -// broadcast to this port. -// -#define DHCP_CLIENT_PORT 68 - -// -// TFTP servers listen for TFTP open requests on this port. -// -#define TFTP_OPEN_PORT 69 - -// -// proxyDHCP and Bootservers listen on this port for a PXE unicast and/or -// multicast discover requests from PXE clients. A PXE discover request -// looks like a DHCP discover or DHCP request packet. -// -#define PXE_DISCOVERY_PORT 4011 - -// -// This port is used by the PXE client/server protocol tests. -// -#define PXE_PORT_PXETEST_PORT 0x8080 - -// -// Definitions for Ethertype protocol numbers and interface types -// Per RFC 1700, -// -#define PXE_PROTOCOL_ETHERNET_IP 0x0800 -#define PXE_PROTOCOL_ETHERNET_ARP 0x0806 -#define PXE_PROTOCOL_ETHERNET_RARP 0x8035 - -#define PXE_IFTYPE_ETHERNET 0x01 -#define PXE_IFTYPE_TOKENRING 0x04 -#define PXE_IFTYPE_FIBRE_CHANNEL 0x12 - -// -// Definitions for internet protocol version 4 header -// Per RFC 791, September 1981. -// -#define IPVER4 4 - -#pragma pack(1) // make network structures packed byte alignment -typedef union { - UINT8 B[4]; - UINT32 L; -} IPV4_ADDR; - -#define IPV4_HEADER_LENGTH(IpHeaderPtr) (((IpHeaderPtr)->VersionIhl & 0xf) << 2) - -#define SET_IPV4_VER_HDL(IpHeaderPtr, IpHeaderLen) { \ - (IpHeaderPtr)->VersionIhl = (UINT8) ((IPVER4 << 4) | ((IpHeaderLen) >> 2)); \ - } - -typedef struct { - UINT8 VersionIhl; - UINT8 TypeOfService; - UINT16 TotalLength; - UINT16 Id; - UINT16 FragmentFields; - UINT8 TimeToLive; - UINT8 Protocol; - UINT16 HeaderChecksum; - IPV4_ADDR SrcAddr; - IPV4_ADDR DestAddr; - // - // options are not implemented - // -} IPV4_HEADER; - -#define IP_FRAG_RSVD 0x8000 // reserved bit - must be zero -#define IP_NO_FRAG 0x4000 // do not fragment bit -#define IP_MORE_FRAG 0x2000 // not last fragment -#define IP_FRAG_OFF_MSK 0x1fff // fragment offset in 8 byte chunks -#define DEFAULT_RFC_TTL 64 - -#define PROT_ICMP 1 -#define PROT_IGMP 2 -#define PROT_TCP 6 -#define PROT_UDP 17 - -/* - * Definitions for internet control message protocol version 4 message - * structure. Per RFC 792, September 1981. - */ - -// -// icmp header for all icmp messages -// -typedef struct { - UINT8 Type; // message type - UINT8 Code; // type specific - 0 for types we implement - UINT16 Checksum; // ones complement of ones complement sum of 16 bit words of message -} ICMPV4_HEADER; - -#define ICMP_DEST_UNREACHABLE 3 -#define ICMP_SOURCE_QUENCH 4 -#define ICMP_REDIRECT 5 -#define ICMP_ECHO 8 -#define ICMP_ECHO_REPLY 0 -#define ICMP_ROUTER_ADV 9 -#define ICMP_ROUTER_SOLICIT 10 -#define ICMP_TIME_EXCEEDED 11 -#define ICMP_PARAMETER_PROBLEM 12 -#define ICMP_TIMESTAMP 13 -#define ICMP_TIMESTAMP_REPLY 14 -#define ICMP_INFO_REQ 15 -#define ICMP_INFO_REQ_REPLY 16 -#define ICMP_SUBNET_MASK_REQ 17 -#define ICMP_SUBNET_MASK_REPLY 18 -// -// other ICMP message types ignored in this implementation -// -// icmp general messages -// -typedef struct { - ICMPV4_HEADER Header; - // - // generally unused except byte [0] for - // parameter problem message - // - UINT8 GenerallyUnused[4]; - // - // original message ip header of plus 64 - // bits of data - // - IPV4_HEADER IpHeader; -} ICMPV4_GENERAL_MESSAGE; - -// -// icmp req/rply message header -// -typedef struct { - ICMPV4_HEADER Header; - UINT16 Id; - UINT16 SequenceNumber; -} ICMPV4_REQUEST_REPLY_HEADER; - -// -// icmp echo message -// -typedef struct { - ICMPV4_REQUEST_REPLY_HEADER Header; - UINT8 EchoData[1]; // variable length data to be echoed -} ICMPV4_ECHO_MESSAGE; - -// -// icmp timestamp message - times are milliseconds since midnight UT - -// if non std, set high order bit -// -typedef struct { - ICMPV4_REQUEST_REPLY_HEADER Header; - UINT32 OriginalTime; // originating timestamp - UINT32 ReceiveTime; // receiving timestamp - UINT32 TransmitTime; // transmitting timestamp -} ICMPV4_TIMESTAMP_MESSAGE; - -// -// icmp info request structure - fill in source and dest net ip address on reply -// -typedef struct { - ICMPV4_REQUEST_REPLY_HEADER Header; -} ICMPV4_INFO_MESSAGE; - -// -// Definitions for internet control message protocol version 4 message structure -// Router discovery -// Per RFC 1256, September 1991. -// -// -// icmp router advertisement message -// -typedef struct { - ICMPV4_HEADER Header; - UINT8 NumberEntries; // number of address entries - UINT8 EntrySize; // number of 32 bit words per address entry - UINT16 Lifetime; // seconds to consider info valid - UINT32 RouterIp; - UINT32 Preferance; -} ICMPV4_ROUTER_ADVERTISE_MESSAGE; - -// -// icmp router solicitation message -// -typedef struct { - ICMPV4_HEADER Header; - UINT32 Reserved; -} ICMPV4_ROUTER_SOLICIT_MESSAGE; - -#define MAX_SOLICITATION_DELAY 1 // 1 second -#define SOLICITATION_INTERVAL 3 // 3 seconds -#define MAX_SOLICITATIONS 3 // 3 transmissions -#define V1ROUTER_PRESENT_TIMEOUT 400 // 400 second timeout until v2 reports can be sent -#define UNSOLICITED_REPORT_INTERVAL 10 // 10 seconds between unsolicited reports -#define BROADCAST_IPv4 0xffffffff - -// -// Definitions for address resolution protocol message structure -// Per RFC 826, November 1982 -// -typedef struct { - UINT16 HwType; // hardware type - e.g. ethernet (1) - UINT16 ProtType; // protocol type - for ethernet, 0x800 for IP - UINT8 HwAddLen; // byte length of a hardware address (e.g. 6 for ethernet) - UINT8 ProtAddLen; // byte length of a protocol address (e.g. 4 for ipv4) - UINT16 OpCode; - // - // source and dest hw and prot addresses follow - see example below - // -} ARP_HEADER; - -#define ETHERNET_ADD_SPC 1 - -#define ETHER_TYPE_IP 0x800 - -#define ARP_REQUEST 1 -#define ARP_REPLY 2 - -// -// generic ARP packet -// -typedef struct { - ARP_HEADER ArpHeader; - EFI_MAC_ADDRESS SrcHardwareAddr; - EFI_IP_ADDRESS SrcProtocolAddr; - EFI_MAC_ADDRESS DestHardwareAddr; - EFI_IP_ADDRESS DestProtocolAddr; -} ARP_PACKET; - -#define ENET_HWADDLEN 6 -#define IPV4_PROTADDLEN 4 - -// -// Definitions for user datagram protocol version 4 pseudo header & header -// Per RFC 768, 28 August 1980 -// -typedef struct { - IPV4_ADDR SrcAddr; // source ip address - IPV4_ADDR DestAddr; // dest ip address - UINT8 Zero; // 0 - UINT8 Protocol; // protocol - UINT16 TotalLength; // UDP length - sizeof udpv4hdr + data length -} UDPV4_PSEUDO_HEADER; - -typedef struct { - UINT16 SrcPort; // source port identifier - UINT16 DestPort; // destination port identifier - UINT16 TotalLength; // total length header plus data - // - // ones complement of ones complement sum of 16 bit - // words of pseudo header, UDP header, and data - // zero checksum is transmitted as -0 (ones comp) - // zero transmitted means checksum not computed - // data follows - // - UINT16 Checksum; -} UDPV4_HEADER; - -typedef struct { - UDPV4_PSEUDO_HEADER Udpv4PseudoHeader; - UDPV4_HEADER Udpv4Header; -} UDPV4_HEADERS; - -// -// Definitions for transmission control protocol header -// Per RFC 793, September, 1981 -// -typedef struct { - IPV4_ADDR SrcAddr; // source ip address - IPV4_ADDR DestAddr; // dest ip address - UINT8 Zero; // 0 - UINT8 Protocol; // protocol - UINT16 TotalLength; // TCP length - TCP header length + data length -} TCPV4_PSEUDO_HEADER; - -typedef struct { - UINT16 SrcPort; // source port identifier - UINT16 DestPort; // destination port identifier - UINT32 SeqNumber; // Sequence number - UINT32 AckNumber; // Acknowledgement Number - // - // Nibble of HLEN (length of header in 32-bit multiples) - // 6bits of RESERVED - // Nibble of Code Bits - // - UINT16 HlenResCode; - UINT16 Window; // Software buffer size (sliding window size) in network-standard byte order - // - // ones complement of ones complement sum of 16 bit words of - // pseudo header, TCP header, and data - // zero checksum is transmitted as -0 (ones comp) - // zero transmitted means checksum not computed - // - UINT16 Checksum; - UINT16 UrgentPointer; // pointer to urgent data (allows sender to specify urgent data) -} TCPV4_HEADER; - -typedef struct { - TCPV4_PSEUDO_HEADER Tcpv4PseudoHeader; - TCPV4_HEADER Tcpv4Header; -} TCPV4_HEADERS; - -typedef struct { - UINT8 Kind; // one of the following: - UINT8 Length; // total option length including Kind and Lth - UINT8 Data[1]; // length = Lth - 2 -} TCPV4_OPTION; - -#define TCP_OP_END 0 // only used to pad to end of TCP header -#define TCP_NOP 1 // optional - may be used to pad between options to get alignment -#define TCP_MAX_SEG 2 // maximum receive segment size - only send at initial connection request -#define MAX_MEDIA_HDR_SIZE 64 -#define MIN_ENET_DATA_SIZE 64 -#define MAX_ENET_DATA_SIZE 1500 // temp def - make a network based var -#define MAX_IPV4_PKT_SIZE 65535 // maximum IP packet size -#define MAX_IPV4_DATA_SIZE (MAX_IPV4_PKT_SIZE - sizeof (IPV4_HEADER)) -#define MAX_IPV4_FRAME_DATA_SIZE (MAX_FRAME_DATA_SIZE - sizeof (IPV4_HEADER)) -#define REAS_IPV4_PKT_SIZE 576 // minimum IP packet size all IP host can handle -#define REAS_IPV4_DATA_SIZE (REAS_IPV4_PKT_SIZE - sizeof (IPV4_HEADER)) - -// -// -// -typedef union { - UINT8 Data[MAX_ENET_DATA_SIZE]; - ICMPV4_HEADER IcmpHeader; - IGMPV2_MESSAGE IgmpMessage; - struct { - UDPV4_HEADER UdpHeader; - UINT8 Data[1]; - } Udp; - struct { - TCPV4_HEADER TcpHeader; - UINT8 Data[1]; - } Tcp; -} PROTOCOL_UNION; - -// -// out buffer structure -// -typedef struct { - UINT8 MediaHeader[MAX_MEDIA_HDR_SIZE]; - IPV4_HEADER IpHeader; - // - // following union placement only valid if no option IP header - // - PROTOCOL_UNION u; -} IPV4_BUFFER; - -typedef struct { - IPV4_HEADER IpHeader; - // - // following union placement only valid if no option IP header - // - PROTOCOL_UNION u; -} IPV4_STRUCT; - -#pragma pack() // reset to default - - //////////////////////////////////////////////////////////// -// -// BC IP Filter Routine -// -EFI_STATUS -IpFilter ( - PXE_BASECODE_DEVICE *Private, - IN EFI_PXE_BASE_CODE_IP_FILTER *Filter - ) -; - -// -// ////////////////////////////////////////////////////////////////////// -// -// Udp Write Routine - called by base code - e.g. TFTP - already locked -// -EFI_STATUS -UdpWrite ( - IN PXE_BASECODE_DEVICE *Private, - IN UINT16 OpFlags, - IN EFI_IP_ADDRESS *DestIpPtr, - IN EFI_PXE_BASE_CODE_UDP_PORT *DestPortptr, - IN EFI_IP_ADDRESS *GatewayIpPtr, OPTIONAL - IN EFI_IP_ADDRESS *SrcIpPtr, OPTIONAL - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL - IN UINTN *HeaderSizePtr, OPTIONAL - IN VOID *HeaderPtr, OPTIONAL - IN UINTN *BufferSizePtr, - IN VOID *BufferPtr - ) -; - -// -// ///////////////////////////////////////////////////////////////////// -// -// Udp Read Routine - called by base code - e.g. TFTP - already locked -// -EFI_STATUS -UdpRead ( - IN PXE_BASECODE_DEVICE *Private, - IN UINT16 OpFlags, - IN OUT EFI_IP_ADDRESS *DestIpPtr, OPTIONAL - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPorPtrt, OPTIONAL - IN OUT EFI_IP_ADDRESS *SrcIpPtr, OPTIONAL - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL - IN UINTN *HeaderSizePtr, OPTIONAL - IN VOID *HeaderPtr, OPTIONAL - IN OUT UINTN *BufferSizePtr, - IN VOID *BufferPtr, - IN EFI_EVENT TimeoutEvent - ) -; - -VOID -IgmpLeaveGroup ( - PXE_BASECODE_DEVICE *Private, - EFI_IP_ADDRESS * - ) -; - -VOID -IgmpJoinGroup ( - PXE_BASECODE_DEVICE *Private, - EFI_IP_ADDRESS * - ) -; - -// -// convert number to zero filled ascii value of length lth -// -VOID -CvtNum ( - UINTN Number, - UINT8 *BufferPtr, - INTN BufferLen - ) -; - -// -// convert number to ascii string at ptr -// -VOID -UtoA10 ( - UINTN Number, - UINT8 *BufferPtr - ) -; - -// -// convert ascii numeric string to UINTN -// -UINTN -AtoU ( - UINT8 *BufferPtr - ) -; - -UINT64 -AtoU64 ( - UINT8 *BufferPtr - ) -; - -// -// calculate the internet checksum (RFC 1071) -// return 16 bit ones complement of ones complement sum of 16 bit words -// -UINT16 -IpChecksum ( - UINT16 *MessagePtr, - UINTN ByteLength - ) -; - -// -// do checksum on non contiguous header and data -// -UINT16 -IpChecksum2 ( - UINT16 *Header, - UINTN HeaderLength, - UINT16 *Message, - UINTN MessageLength - ) -; - -// -// update checksum when only a single word changes -// -UINT16 -UpdateChecksum ( - UINT16 OldChecksum, - UINT16 OldWord, - UINT16 NewWord - ) -; - -VOID -SeedRandom ( - IN PXE_BASECODE_DEVICE *Private, - IN UINT16 InitialSeed - ) -; - -UINT16 -Random ( - IN PXE_BASECODE_DEVICE *Private - ) -; - -EFI_STATUS -SendPacket ( - PXE_BASECODE_DEVICE *Private, - VOID *HeaderPtr, - VOID *PacketPtr, - INTN PacketLength, - VOID *HardwareAddress, - UINT16 MediaProtocol, - IN EFI_PXE_BASE_CODE_FUNCTION Function - ) -; - -VOID -HandleArpReceive ( - PXE_BASECODE_DEVICE *Private, - ARP_PACKET *ArpPacketPtr, - VOID *HeaderPtr - ) -; - -VOID -HandleIgmp ( - PXE_BASECODE_DEVICE *Private, - IGMPV2_MESSAGE *IgmpMessageptr, - UINTN IgmpMessageLen - ) -; - -VOID -IgmpCheckTimers ( - PXE_BASECODE_DEVICE *Private - ) -; // poll when doing a receive -// return hw add of IP and TRUE if available, otherwise FALSE -// -BOOLEAN -GetHwAddr ( - IN PXE_BASECODE_DEVICE *Private, - EFI_IP_ADDRESS *ProtocolAddressPtr, - EFI_MAC_ADDRESS *HardwareAddressPtr - ) -; - -EFI_STATUS -DoArp ( - IN PXE_BASECODE_DEVICE *Private, - IN EFI_IP_ADDRESS *ProtocolAddressPtr, - OUT EFI_MAC_ADDRESS *HardwareAddressptr - ) -; - -BOOLEAN -OnSameSubnet ( - UINTN IpAddressLen, - EFI_IP_ADDRESS *Ip1, - EFI_IP_ADDRESS *Ip2, - EFI_IP_ADDRESS *SubnetMask - ) -; - -VOID -IpAddRouter ( - PXE_BASECODE_DEVICE *Private, - EFI_IP_ADDRESS *RouterIp - ) -; - -#define Ip4AddRouter(Private, Ipv4Ptr) IpAddRouter (Private, (EFI_IP_ADDRESS *) Ipv4Ptr) - -// -// routine to send ipv4 packet -// ipv4 + upper protocol header for length TotHdrLth in xmtbuf, ipv4 header length IpHdrLth -// routine fills in ipv4hdr Ver_Hdl, TotLth, and Checksum, moves in Data, and gets dest MAC address -// -EFI_STATUS -Ipv4Xmt ( - PXE_BASECODE_DEVICE *Private, - UINT32 GatewayIP, - UINTN IpHeaderLen, - UINTN TotalHeaderLen, - VOID *Data, - UINTN DataLen, - EFI_PXE_BASE_CODE_FUNCTION Function - ) -; - -// -// send ipv4 packet with ipv4 option -// -EFI_STATUS -Ipv4SendWOp ( - PXE_BASECODE_DEVICE *Private, - UINT32 GatewayIP, - UINT8 *MessagePtr, - UINTN MessageLth, - UINT8 Protocol, - UINT8 *Option, - UINTN OptionLen, - UINT32 DestIp, - EFI_PXE_BASE_CODE_FUNCTION Function - ) -; - -// -// send MsgLth message at MsgPtr - higher level protocol header already in xmtbuf, length HdrSize -// -EFI_STATUS -Ip4Send ( - IN PXE_BASECODE_DEVICE *Private, // pointer to instance data - IN UINTN MayFragment, // - IN UINT8 Protocol, // protocol - IN UINT32 SrcIp, // Source IP address - IN UINT32 DestIp, // Destination IP address - IN UINT32 GatewayIp, // used if not NULL and needed - IN UINTN HeaderSize, // protocol header byte length - IN UINT8 *MsgPtr, // pointer to data - IN UINTN MsgLength - ) -; // data byte length -// receive up to MsgLth message into MsgPtr for protocol Prot -// return message length, src/dest ips if select any, and pointer to protocol header -// -EFI_STATUS -IpReceive ( - IN PXE_BASECODE_DEVICE *Private, // pointer to instance data - UINT16 OpFlags, // Flags to determine if filtering on IP addresses - EFI_IP_ADDRESS *SrcIpPtr, // if filtering, O if accept any - EFI_IP_ADDRESS *DstIpPtr, // if filtering, O if accept any - UINT8 Protocol, // protocol - VOID *HeaderPtr, // address of where to put protocol header - UINTN HeaderSize, // protocol header byte length - UINT8 *MsgPtr, // pointer to data buffer - UINTN *MsgLenPtr, // pointer to data buffer length/ O - returned data length - IN EFI_EVENT TimeoutEvent - ) -; - -#if 0 -VOID -WaitForTxComplete ( - IN PXE_BASECODE_DEVICE *Private - ) -; -#endif -// -// routine to cycle waiting for a receive or timeout -// -EFI_STATUS -WaitForReceive ( - IN PXE_BASECODE_DEVICE *Private, - IN EFI_PXE_BASE_CODE_FUNCTION Function, - IN EFI_EVENT TimeoutEvent, - IN OUT UINTN *HeaderSizePtr, - IN OUT UINTN *BufferSizePtr, - IN OUT UINT16 *ProtocolPtr - ) -; - -#endif /* _IP_H_ */ - -/* EOF - ip.h */ +/** @file + +Copyright (c) 2004 - 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. + + +**/ + +#ifndef _IP_H_ +#define _IP_H_ + +#include "hton.h" + +// +// portability macros +// +#define UDP_FILTER_MASK (EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP | \ + EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT | \ + EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP | \ + EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT | \ + EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER \ + ) + +#define PXE_BOOT_LAYER_MASK 0x7FFF +#define PXE_BOOT_LAYER_INITIAL 0x0000 +#define PXE_BOOT_LAYER_CREDENTIAL_FLAG 0x8000 +#define MAX_BOOT_SERVERS 32 + +// +// macro to evaluate IP address as TRUE if it is a multicast IP address +// +#define IS_MULTICAST(ptr) ((*((UINT8 *) ptr) & 0xf0) == 0xe0) + +// +// length macros +// +#define IP_ADDRESS_LENGTH(qp) (((qp)->UsingIpv6) ? sizeof (EFI_IPv6_ADDRESS) : sizeof (EFI_IPv4_ADDRESS)) + +#define MAX_FRAME_DATA_SIZE 1488 +#define ALLOCATE_SIZE(X) (((X) + 7) & 0xfff8) +#define MODE_ALLOCATE_SIZE ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_MODE)) +#define BUFFER_ALLOCATE_SIZE (8192 + 512) +#define ROUTER_ALLOCATE_SIZE ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ROUTE_ENTRY) * PXE_ROUTER_TABLE_SIZE)) +#define ARP_ALLOCATE_SIZE ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ARP_ENTRY) * PXE_ARP_CACHE_SIZE)) +#define FILTER_ALLOCATE_SIZE ALLOCATE_SIZE ((sizeof (EFI_IP_ADDRESS) * PXE_IP_FILTER_SIZE)) +#define PXE_ARP_CACHE_SIZE 8 +#define PXE_ROUTER_TABLE_SIZE 8 +#define PXE_IP_FILTER_SIZE 8 +#define ICMP_ALLOCATE_SIZE ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)) +#define TFTP_ERR_ALLOCATE_SIZE ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_TFTP_ERROR)) + +// +// DHCP discover/request packets are sent to this UDP port. ProxyDHCP +// servers listen on this port for DHCP discover packets that have a +// class identifier (option 60) with 'PXEClient' in the first 9 bytes. +// Bootservers also listen on this port for PXE broadcast discover +// requests from PXE clients. +// +#define DHCP_SERVER_PORT 67 + +// +// When DHCP, proxyDHCP and Bootservers respond to DHCP and PXE broadcast +// discover requests by broadcasting the reply packet, the packet is +// broadcast to this port. +// +#define DHCP_CLIENT_PORT 68 + +// +// TFTP servers listen for TFTP open requests on this port. +// +#define TFTP_OPEN_PORT 69 + +// +// proxyDHCP and Bootservers listen on this port for a PXE unicast and/or +// multicast discover requests from PXE clients. A PXE discover request +// looks like a DHCP discover or DHCP request packet. +// +#define PXE_DISCOVERY_PORT 4011 + +// +// This port is used by the PXE client/server protocol tests. +// +#define PXE_PORT_PXETEST_PORT 0x8080 + +// +// Definitions for Ethertype protocol numbers and interface types +// Per RFC 1700, +// +#define PXE_PROTOCOL_ETHERNET_IP 0x0800 +#define PXE_PROTOCOL_ETHERNET_ARP 0x0806 +#define PXE_PROTOCOL_ETHERNET_RARP 0x8035 + +#define PXE_IFTYPE_ETHERNET 0x01 +#define PXE_IFTYPE_TOKENRING 0x04 +#define PXE_IFTYPE_FIBRE_CHANNEL 0x12 + +// +// Definitions for internet protocol version 4 header +// Per RFC 791, September 1981. +// +#define IPVER4 4 + +#pragma pack(1) // make network structures packed byte alignment +typedef union { + UINT8 B[4]; + UINT32 L; +} IPV4_ADDR; + +#define IPV4_HEADER_LENGTH(IpHeaderPtr) (((IpHeaderPtr)->VersionIhl & 0xf) << 2) + +#define SET_IPV4_VER_HDL(IpHeaderPtr, IpHeaderLen) { \ + (IpHeaderPtr)->VersionIhl = (UINT8) ((IPVER4 << 4) | ((IpHeaderLen) >> 2)); \ + } + +typedef struct { + UINT8 VersionIhl; + UINT8 TypeOfService; + UINT16 TotalLength; + UINT16 Id; + UINT16 FragmentFields; + UINT8 TimeToLive; + UINT8 Protocol; + UINT16 HeaderChecksum; + IPV4_ADDR SrcAddr; + IPV4_ADDR DestAddr; + // + // options are not implemented + // +} IPV4_HEADER; + +#define IP_FRAG_RSVD 0x8000 // reserved bit - must be zero +#define IP_NO_FRAG 0x4000 // do not fragment bit +#define IP_MORE_FRAG 0x2000 // not last fragment +#define IP_FRAG_OFF_MSK 0x1fff // fragment offset in 8 byte chunks +#define DEFAULT_RFC_TTL 64 + +#define PROT_ICMP 1 +#define PROT_IGMP 2 +#define PROT_TCP 6 +#define PROT_UDP 17 + +/* + * Definitions for internet control message protocol version 4 message + * structure. Per RFC 792, September 1981. + */ + +// +// icmp header for all icmp messages +// +typedef struct { + UINT8 Type; // message type + UINT8 Code; // type specific - 0 for types we implement + UINT16 Checksum; // ones complement of ones complement sum of 16 bit words of message +} ICMPV4_HEADER; + +#define ICMP_DEST_UNREACHABLE 3 +#define ICMP_SOURCE_QUENCH 4 +#define ICMP_REDIRECT 5 +#define ICMP_ECHO 8 +#define ICMP_ECHO_REPLY 0 +#define ICMP_ROUTER_ADV 9 +#define ICMP_ROUTER_SOLICIT 10 +#define ICMP_TIME_EXCEEDED 11 +#define ICMP_PARAMETER_PROBLEM 12 +#define ICMP_TIMESTAMP 13 +#define ICMP_TIMESTAMP_REPLY 14 +#define ICMP_INFO_REQ 15 +#define ICMP_INFO_REQ_REPLY 16 +#define ICMP_SUBNET_MASK_REQ 17 +#define ICMP_SUBNET_MASK_REPLY 18 +// +// other ICMP message types ignored in this implementation +// +// icmp general messages +// +typedef struct { + ICMPV4_HEADER Header; + // + // generally unused except byte [0] for + // parameter problem message + // + UINT8 GenerallyUnused[4]; + // + // original message ip header of plus 64 + // bits of data + // + IPV4_HEADER IpHeader; +} ICMPV4_GENERAL_MESSAGE; + +// +// icmp req/rply message header +// +typedef struct { + ICMPV4_HEADER Header; + UINT16 Id; + UINT16 SequenceNumber; +} ICMPV4_REQUEST_REPLY_HEADER; + +// +// icmp echo message +// +typedef struct { + ICMPV4_REQUEST_REPLY_HEADER Header; + UINT8 EchoData[1]; // variable length data to be echoed +} ICMPV4_ECHO_MESSAGE; + +// +// icmp timestamp message - times are milliseconds since midnight UT - +// if non std, set high order bit +// +typedef struct { + ICMPV4_REQUEST_REPLY_HEADER Header; + UINT32 OriginalTime; // originating timestamp + UINT32 ReceiveTime; // receiving timestamp + UINT32 TransmitTime; // transmitting timestamp +} ICMPV4_TIMESTAMP_MESSAGE; + +// +// icmp info request structure - fill in source and dest net ip address on reply +// +typedef struct { + ICMPV4_REQUEST_REPLY_HEADER Header; +} ICMPV4_INFO_MESSAGE; + +// +// Definitions for internet control message protocol version 4 message structure +// Router discovery +// Per RFC 1256, September 1991. +// +// +// icmp router advertisement message +// +typedef struct { + ICMPV4_HEADER Header; + UINT8 NumberEntries; // number of address entries + UINT8 EntrySize; // number of 32 bit words per address entry + UINT16 Lifetime; // seconds to consider info valid + UINT32 RouterIp; + UINT32 Preferance; +} ICMPV4_ROUTER_ADVERTISE_MESSAGE; + +// +// icmp router solicitation message +// +typedef struct { + ICMPV4_HEADER Header; + UINT32 Reserved; +} ICMPV4_ROUTER_SOLICIT_MESSAGE; + +#define MAX_SOLICITATION_DELAY 1 // 1 second +#define SOLICITATION_INTERVAL 3 // 3 seconds +#define MAX_SOLICITATIONS 3 // 3 transmissions +#define V1ROUTER_PRESENT_TIMEOUT 400 // 400 second timeout until v2 reports can be sent +#define UNSOLICITED_REPORT_INTERVAL 10 // 10 seconds between unsolicited reports +#define BROADCAST_IPv4 0xffffffff + +// +// Definitions for address resolution protocol message structure +// Per RFC 826, November 1982 +// +typedef struct { + UINT16 HwType; // hardware type - e.g. ethernet (1) + UINT16 ProtType; // protocol type - for ethernet, 0x800 for IP + UINT8 HwAddLen; // byte length of a hardware address (e.g. 6 for ethernet) + UINT8 ProtAddLen; // byte length of a protocol address (e.g. 4 for ipv4) + UINT16 OpCode; + // + // source and dest hw and prot addresses follow - see example below + // +} ARP_HEADER; + +#define ETHERNET_ADD_SPC 1 + +#define ETHER_TYPE_IP 0x800 + +#define ARP_REQUEST 1 +#define ARP_REPLY 2 + +// +// generic ARP packet +// +typedef struct { + ARP_HEADER ArpHeader; + EFI_MAC_ADDRESS SrcHardwareAddr; + EFI_IP_ADDRESS SrcProtocolAddr; + EFI_MAC_ADDRESS DestHardwareAddr; + EFI_IP_ADDRESS DestProtocolAddr; +} ARP_PACKET; + +#define ENET_HWADDLEN 6 +#define IPV4_PROTADDLEN 4 + +// +// Definitions for user datagram protocol version 4 pseudo header & header +// Per RFC 768, 28 August 1980 +// +typedef struct { + IPV4_ADDR SrcAddr; // source ip address + IPV4_ADDR DestAddr; // dest ip address + UINT8 Zero; // 0 + UINT8 Protocol; // protocol + UINT16 TotalLength; // UDP length - sizeof udpv4hdr + data length +} UDPV4_PSEUDO_HEADER; + +typedef struct { + UINT16 SrcPort; // source port identifier + UINT16 DestPort; // destination port identifier + UINT16 TotalLength; // total length header plus data + // + // ones complement of ones complement sum of 16 bit + // words of pseudo header, UDP header, and data + // zero checksum is transmitted as -0 (ones comp) + // zero transmitted means checksum not computed + // data follows + // + UINT16 Checksum; +} UDPV4_HEADER; + +typedef struct { + UDPV4_PSEUDO_HEADER Udpv4PseudoHeader; + UDPV4_HEADER Udpv4Header; +} UDPV4_HEADERS; + +// +// Definitions for transmission control protocol header +// Per RFC 793, September, 1981 +// +typedef struct { + IPV4_ADDR SrcAddr; // source ip address + IPV4_ADDR DestAddr; // dest ip address + UINT8 Zero; // 0 + UINT8 Protocol; // protocol + UINT16 TotalLength; // TCP length - TCP header length + data length +} TCPV4_PSEUDO_HEADER; + +typedef struct { + UINT16 SrcPort; // source port identifier + UINT16 DestPort; // destination port identifier + UINT32 SeqNumber; // Sequence number + UINT32 AckNumber; // Acknowledgement Number + // + // Nibble of HLEN (length of header in 32-bit multiples) + // 6bits of RESERVED + // Nibble of Code Bits + // + UINT16 HlenResCode; + UINT16 Window; // Software buffer size (sliding window size) in network-standard byte order + // + // ones complement of ones complement sum of 16 bit words of + // pseudo header, TCP header, and data + // zero checksum is transmitted as -0 (ones comp) + // zero transmitted means checksum not computed + // + UINT16 Checksum; + UINT16 UrgentPointer; // pointer to urgent data (allows sender to specify urgent data) +} TCPV4_HEADER; + +typedef struct { + TCPV4_PSEUDO_HEADER Tcpv4PseudoHeader; + TCPV4_HEADER Tcpv4Header; +} TCPV4_HEADERS; + +typedef struct { + UINT8 Kind; // one of the following: + UINT8 Length; // total option length including Kind and Lth + UINT8 Data[1]; // length = Lth - 2 +} TCPV4_OPTION; + +#define TCP_OP_END 0 // only used to pad to end of TCP header +#define TCP_NOP 1 // optional - may be used to pad between options to get alignment +#define TCP_MAX_SEG 2 // maximum receive segment size - only send at initial connection request +#define MAX_MEDIA_HDR_SIZE 64 +#define MIN_ENET_DATA_SIZE 64 +#define MAX_ENET_DATA_SIZE 1500 // temp def - make a network based var +#define MAX_IPV4_PKT_SIZE 65535 // maximum IP packet size +#define MAX_IPV4_DATA_SIZE (MAX_IPV4_PKT_SIZE - sizeof (IPV4_HEADER)) +#define MAX_IPV4_FRAME_DATA_SIZE (MAX_FRAME_DATA_SIZE - sizeof (IPV4_HEADER)) +#define REAS_IPV4_PKT_SIZE 576 // minimum IP packet size all IP host can handle +#define REAS_IPV4_DATA_SIZE (REAS_IPV4_PKT_SIZE - sizeof (IPV4_HEADER)) + +// +// +// +typedef union { + UINT8 Data[MAX_ENET_DATA_SIZE]; + ICMPV4_HEADER IcmpHeader; + IGMPV2_MESSAGE IgmpMessage; + struct { + UDPV4_HEADER UdpHeader; + UINT8 Data[1]; + } Udp; + struct { + TCPV4_HEADER TcpHeader; + UINT8 Data[1]; + } Tcp; +} PROTOCOL_UNION; + +// +// out buffer structure +// +typedef struct { + UINT8 MediaHeader[MAX_MEDIA_HDR_SIZE]; + IPV4_HEADER IpHeader; + // + // following union placement only valid if no option IP header + // + PROTOCOL_UNION u; +} IPV4_BUFFER; + +typedef struct { + IPV4_HEADER IpHeader; + // + // following union placement only valid if no option IP header + // + PROTOCOL_UNION u; +} IPV4_STRUCT; + +#pragma pack() // reset to default + + //////////////////////////////////////////////////////////// +// +// BC IP Filter Routine +// +EFI_STATUS +IpFilter ( + PXE_BASECODE_DEVICE *Private, + IN EFI_PXE_BASE_CODE_IP_FILTER *Filter + ) +; + +// +// ////////////////////////////////////////////////////////////////////// +// +// Udp Write Routine - called by base code - e.g. TFTP - already locked +// +EFI_STATUS +UdpWrite ( + IN PXE_BASECODE_DEVICE *Private, + IN UINT16 OpFlags, + IN EFI_IP_ADDRESS *DestIpPtr, + IN EFI_PXE_BASE_CODE_UDP_PORT *DestPortptr, + IN EFI_IP_ADDRESS *GatewayIpPtr, OPTIONAL + IN EFI_IP_ADDRESS *SrcIpPtr, OPTIONAL + IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL + IN UINTN *HeaderSizePtr, OPTIONAL + IN VOID *HeaderPtr, OPTIONAL + IN UINTN *BufferSizePtr, + IN VOID *BufferPtr + ) +; + +// +// ///////////////////////////////////////////////////////////////////// +// +// Udp Read Routine - called by base code - e.g. TFTP - already locked +// +EFI_STATUS +UdpRead ( + IN PXE_BASECODE_DEVICE *Private, + IN UINT16 OpFlags, + IN OUT EFI_IP_ADDRESS *DestIpPtr, OPTIONAL + IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPorPtrt, OPTIONAL + IN OUT EFI_IP_ADDRESS *SrcIpPtr, OPTIONAL + IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL + IN UINTN *HeaderSizePtr, OPTIONAL + IN VOID *HeaderPtr, OPTIONAL + IN OUT UINTN *BufferSizePtr, + IN VOID *BufferPtr, + IN EFI_EVENT TimeoutEvent + ) +; + +VOID +IgmpLeaveGroup ( + PXE_BASECODE_DEVICE *Private, + EFI_IP_ADDRESS * + ) +; + +VOID +IgmpJoinGroup ( + PXE_BASECODE_DEVICE *Private, + EFI_IP_ADDRESS * + ) +; + +// +// convert number to zero filled ascii value of length lth +// +VOID +CvtNum ( + UINTN Number, + UINT8 *BufferPtr, + INTN BufferLen + ) +; + +// +// convert number to ascii string at ptr +// +VOID +UtoA10 ( + UINTN Number, + UINT8 *BufferPtr + ) +; + +// +// convert ascii numeric string to UINTN +// +UINTN +AtoU ( + UINT8 *BufferPtr + ) +; + +UINT64 +AtoU64 ( + UINT8 *BufferPtr + ) +; + +// +// calculate the internet checksum (RFC 1071) +// return 16 bit ones complement of ones complement sum of 16 bit words +// +UINT16 +IpChecksum ( + UINT16 *MessagePtr, + UINTN ByteLength + ) +; + +// +// do checksum on non contiguous header and data +// +UINT16 +IpChecksum2 ( + UINT16 *Header, + UINTN HeaderLength, + UINT16 *Message, + UINTN MessageLength + ) +; + +// +// update checksum when only a single word changes +// +UINT16 +UpdateChecksum ( + UINT16 OldChecksum, + UINT16 OldWord, + UINT16 NewWord + ) +; + +VOID +SeedRandom ( + IN PXE_BASECODE_DEVICE *Private, + IN UINT16 InitialSeed + ) +; + +UINT16 +Random ( + IN PXE_BASECODE_DEVICE *Private + ) +; + +EFI_STATUS +SendPacket ( + PXE_BASECODE_DEVICE *Private, + VOID *HeaderPtr, + VOID *PacketPtr, + INTN PacketLength, + VOID *HardwareAddress, + UINT16 MediaProtocol, + IN EFI_PXE_BASE_CODE_FUNCTION Function + ) +; + +VOID +HandleArpReceive ( + PXE_BASECODE_DEVICE *Private, + ARP_PACKET *ArpPacketPtr, + VOID *HeaderPtr + ) +; + +VOID +HandleIgmp ( + PXE_BASECODE_DEVICE *Private, + IGMPV2_MESSAGE *IgmpMessageptr, + UINTN IgmpMessageLen + ) +; + +VOID +IgmpCheckTimers ( + PXE_BASECODE_DEVICE *Private + ) +; // poll when doing a receive +// return hw add of IP and TRUE if available, otherwise FALSE +// +BOOLEAN +GetHwAddr ( + IN PXE_BASECODE_DEVICE *Private, + EFI_IP_ADDRESS *ProtocolAddressPtr, + EFI_MAC_ADDRESS *HardwareAddressPtr + ) +; + +EFI_STATUS +DoArp ( + IN PXE_BASECODE_DEVICE *Private, + IN EFI_IP_ADDRESS *ProtocolAddressPtr, + OUT EFI_MAC_ADDRESS *HardwareAddressptr + ) +; + +BOOLEAN +OnSameSubnet ( + UINTN IpAddressLen, + EFI_IP_ADDRESS *Ip1, + EFI_IP_ADDRESS *Ip2, + EFI_IP_ADDRESS *SubnetMask + ) +; + +VOID +IpAddRouter ( + PXE_BASECODE_DEVICE *Private, + EFI_IP_ADDRESS *RouterIp + ) +; + +#define Ip4AddRouter(Private, Ipv4Ptr) IpAddRouter (Private, (EFI_IP_ADDRESS *) Ipv4Ptr) + +// +// routine to send ipv4 packet +// ipv4 + upper protocol header for length TotHdrLth in xmtbuf, ipv4 header length IpHdrLth +// routine fills in ipv4hdr Ver_Hdl, TotLth, and Checksum, moves in Data, and gets dest MAC address +// +EFI_STATUS +Ipv4Xmt ( + PXE_BASECODE_DEVICE *Private, + UINT32 GatewayIP, + UINTN IpHeaderLen, + UINTN TotalHeaderLen, + VOID *Data, + UINTN DataLen, + EFI_PXE_BASE_CODE_FUNCTION Function + ) +; + +// +// send ipv4 packet with ipv4 option +// +EFI_STATUS +Ipv4SendWOp ( + PXE_BASECODE_DEVICE *Private, + UINT32 GatewayIP, + UINT8 *MessagePtr, + UINTN MessageLth, + UINT8 Protocol, + UINT8 *Option, + UINTN OptionLen, + UINT32 DestIp, + EFI_PXE_BASE_CODE_FUNCTION Function + ) +; + +// +// send MsgLth message at MsgPtr - higher level protocol header already in xmtbuf, length HdrSize +// +EFI_STATUS +Ip4Send ( + IN PXE_BASECODE_DEVICE *Private, // pointer to instance data + IN UINTN MayFragment, // + IN UINT8 Protocol, // protocol + IN UINT32 SrcIp, // Source IP address + IN UINT32 DestIp, // Destination IP address + IN UINT32 GatewayIp, // used if not NULL and needed + IN UINTN HeaderSize, // protocol header byte length + IN UINT8 *MsgPtr, // pointer to data + IN UINTN MsgLength + ) +; // data byte length +// receive up to MsgLth message into MsgPtr for protocol Prot +// return message length, src/dest ips if select any, and pointer to protocol header +// +EFI_STATUS +IpReceive ( + IN PXE_BASECODE_DEVICE *Private, // pointer to instance data + UINT16 OpFlags, // Flags to determine if filtering on IP addresses + EFI_IP_ADDRESS *SrcIpPtr, // if filtering, O if accept any + EFI_IP_ADDRESS *DstIpPtr, // if filtering, O if accept any + UINT8 Protocol, // protocol + VOID *HeaderPtr, // address of where to put protocol header + UINTN HeaderSize, // protocol header byte length + UINT8 *MsgPtr, // pointer to data buffer + UINTN *MsgLenPtr, // pointer to data buffer length/ O - returned data length + IN EFI_EVENT TimeoutEvent + ) +; + +#if 0 +VOID +WaitForTxComplete ( + IN PXE_BASECODE_DEVICE *Private + ) +; +#endif +// +// routine to cycle waiting for a receive or timeout +// +EFI_STATUS +WaitForReceive ( + IN PXE_BASECODE_DEVICE *Private, + IN EFI_PXE_BASE_CODE_FUNCTION Function, + IN EFI_EVENT TimeoutEvent, + IN OUT UINTN *HeaderSizePtr, + IN OUT UINTN *BufferSizePtr, + IN OUT UINT16 *ProtocolPtr + ) +; + +#endif /* _IP_H_ */ + +/* EOF - ip.h */ diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Ipf/PxeArch.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Ipf/PxeArch.h index 6d06045df0..866f486226 100644 --- a/MdeModulePkg/Universal/Network/PxeBcDxe/Ipf/PxeArch.h +++ b/MdeModulePkg/Universal/Network/PxeBcDxe/Ipf/PxeArch.h @@ -1,26 +1,26 @@ -/** @file - -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: - PxeArch.h - -Abstract: - Defines PXE Arch type - - -**/ - -#ifndef _EFI_PXE_ARCH_H_ -#define _EFI_PXE_ARCH_H_ - -#define SYS_ARCH 0x2 - -#endif +/** @file + +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: + PxeArch.h + +Abstract: + Defines PXE Arch type + + +**/ + +#ifndef _EFI_PXE_ARCH_H_ +#define _EFI_PXE_ARCH_H_ + +#define SYS_ARCH 0x2 + +#endif diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Tftp.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Tftp.h index f81d86c163..018af5a400 100644 --- a/MdeModulePkg/Universal/Network/PxeBcDxe/Tftp.h +++ b/MdeModulePkg/Universal/Network/PxeBcDxe/Tftp.h @@ -1,154 +1,154 @@ -/** @file - -Copyright (c) 2004, 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: - tftp.h - -Abstract: - - -**/ - -#ifndef __TFTP_H__ -#define __TFTP_H__ - -// -// Definitions for trivial file transfer protocol functionality with IP v4 -// Per RFC 1350, July 1992 and RFC 2347, 8, and 9, May 1998 -// -#pragma pack(1) -// -// max and min packet sizes -// (all data packets in transmission except last) -// -#define MAX_TFTP_PKT_SIZE (BUFFER_ALLOCATE_SIZE - 512) -#define MIN_TFTP_PKT_SIZE 512 - -// -// TFTPv4 OpCodes -// -#define TFTP_RRQ 1 // read request -#define TFTP_WRQ 2 // write request -#define TFTP_DATA 3 // data -#define TFTP_ACK 4 // acknowledgement -#define TFTP_ERROR 5 // error packet -#define TFTP_OACK 6 // option acknowledge -#define TFTP_DIR 7 // read directory request -#define TFTP_DATA8 8 -#define TFTP_ACK8 9 - -// -// request packet (read or write) -// Fields shown (except file name) are not to be referenced directly, -// since their placement is variable within a request packet. -// All are null terminated case insensitive ascii strings. -// -struct Tftpv4Req { - UINT16 OpCode; // TFTP Op code - UINT8 FileName[2]; // file name - UINT8 Mode[2]; // "netascii" or "octet" - struct { // optionally, one or more option requests - UINT8 Option[2]; // option name - UINT8 Value[2]; // value requested - } OpReq[1]; -}; - -// -// modes -// -#define MODE_ASCII "netascii" -#define MODE_BINARY "octet" - -// -// option strings -// -#define OP_BLKSIZE "blksize" // block size option -#define OP_TIMEOUT "timeout" // time to wait before retransmitting -#define OP_TFRSIZE "tsize" // total transfer size option -#define OP_OVERWRITE "overwrite" // overwrite file option -#define OP_BIGBLKNUM "bigblk#" // big block number -// See RFC 2347, 8, and 9 for more information on TFTP options -// option acknowledge packet (optional) -// options not acknowledged are rejected -// -struct Tftpv4Oack { - UINT16 OpCode; // TFTP Op code - struct { // optionally, one or more option acknowledgements - UINT8 Option[2]; // option name (of those requested) - UINT8 Value[2]; // value acknowledged - } OpAck[1]; -}; - -// -// acknowledge packet -// -struct Tftpv4Ack { - UINT16 OpCode; // TFTP Op code - UINT16 BlockNum; -}; - -// -// data packet -// -struct Tftpv4Data { - struct Tftpv4Ack Header; - UINT8 Data[512]; -}; - -// -// big block number ack packet -// -struct Tftpv4Ack8 { - UINT16 OpCode; - UINT64 BlockNum; -}; - -// -// big block number data packet -// -struct Tftpv4Data8 { - struct Tftpv4Ack8 Header; - UINT8 Data[506]; -}; - -// -// error packet -// -struct Tftpv4Error { - UINT16 OpCode; // TFTP Op code - UINT16 ErrCode; // error code - UINT8 ErrMsg[1]; // error message (nul terminated) -}; - -#pragma pack() -// -// error codes -// -#define TFTP_ERR_UNDEF 0 // Not defined, see error message (if any). -#define TFTP_ERR_NOT_FOUND 1 // File not found. -#define TFTP_ERR_ACCESS 2 // Access violation. -#define TFTP_ERR_FULL 3 // Disk full or allocation exceeded. -#define TFTP_ERR_ILLEGAL 4 // Illegal TFTP operation. -#define TFTP_ERR_BAD_ID 5 // Unknown transfer ID. -#define TFTP_ERR_EXISTS 6 // File already exists. -#define TFTP_ERR_NO_USER 7 // No such user. -#define TFTP_ERR_OPTION 8 // Option negotiation termination -// -// some defines -// -#define REQ_RESP_TIMEOUT 5 // Wait five seconds for request response. -#define ACK_TIMEOUT 4 // Wait four seconds for ack response. -#define NUM_ACK_RETRIES 3 -#define NUM_MTFTP_OPEN_RETRIES 3 - -#endif /* __TFTP_H__ */ - -/* EOF - tftp.h */ +/** @file + +Copyright (c) 2004, 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: + tftp.h + +Abstract: + + +**/ + +#ifndef __TFTP_H__ +#define __TFTP_H__ + +// +// Definitions for trivial file transfer protocol functionality with IP v4 +// Per RFC 1350, July 1992 and RFC 2347, 8, and 9, May 1998 +// +#pragma pack(1) +// +// max and min packet sizes +// (all data packets in transmission except last) +// +#define MAX_TFTP_PKT_SIZE (BUFFER_ALLOCATE_SIZE - 512) +#define MIN_TFTP_PKT_SIZE 512 + +// +// TFTPv4 OpCodes +// +#define TFTP_RRQ 1 // read request +#define TFTP_WRQ 2 // write request +#define TFTP_DATA 3 // data +#define TFTP_ACK 4 // acknowledgement +#define TFTP_ERROR 5 // error packet +#define TFTP_OACK 6 // option acknowledge +#define TFTP_DIR 7 // read directory request +#define TFTP_DATA8 8 +#define TFTP_ACK8 9 + +// +// request packet (read or write) +// Fields shown (except file name) are not to be referenced directly, +// since their placement is variable within a request packet. +// All are null terminated case insensitive ascii strings. +// +struct Tftpv4Req { + UINT16 OpCode; // TFTP Op code + UINT8 FileName[2]; // file name + UINT8 Mode[2]; // "netascii" or "octet" + struct { // optionally, one or more option requests + UINT8 Option[2]; // option name + UINT8 Value[2]; // value requested + } OpReq[1]; +}; + +// +// modes +// +#define MODE_ASCII "netascii" +#define MODE_BINARY "octet" + +// +// option strings +// +#define OP_BLKSIZE "blksize" // block size option +#define OP_TIMEOUT "timeout" // time to wait before retransmitting +#define OP_TFRSIZE "tsize" // total transfer size option +#define OP_OVERWRITE "overwrite" // overwrite file option +#define OP_BIGBLKNUM "bigblk#" // big block number +// See RFC 2347, 8, and 9 for more information on TFTP options +// option acknowledge packet (optional) +// options not acknowledged are rejected +// +struct Tftpv4Oack { + UINT16 OpCode; // TFTP Op code + struct { // optionally, one or more option acknowledgements + UINT8 Option[2]; // option name (of those requested) + UINT8 Value[2]; // value acknowledged + } OpAck[1]; +}; + +// +// acknowledge packet +// +struct Tftpv4Ack { + UINT16 OpCode; // TFTP Op code + UINT16 BlockNum; +}; + +// +// data packet +// +struct Tftpv4Data { + struct Tftpv4Ack Header; + UINT8 Data[512]; +}; + +// +// big block number ack packet +// +struct Tftpv4Ack8 { + UINT16 OpCode; + UINT64 BlockNum; +}; + +// +// big block number data packet +// +struct Tftpv4Data8 { + struct Tftpv4Ack8 Header; + UINT8 Data[506]; +}; + +// +// error packet +// +struct Tftpv4Error { + UINT16 OpCode; // TFTP Op code + UINT16 ErrCode; // error code + UINT8 ErrMsg[1]; // error message (nul terminated) +}; + +#pragma pack() +// +// error codes +// +#define TFTP_ERR_UNDEF 0 // Not defined, see error message (if any). +#define TFTP_ERR_NOT_FOUND 1 // File not found. +#define TFTP_ERR_ACCESS 2 // Access violation. +#define TFTP_ERR_FULL 3 // Disk full or allocation exceeded. +#define TFTP_ERR_ILLEGAL 4 // Illegal TFTP operation. +#define TFTP_ERR_BAD_ID 5 // Unknown transfer ID. +#define TFTP_ERR_EXISTS 6 // File already exists. +#define TFTP_ERR_NO_USER 7 // No such user. +#define TFTP_ERR_OPTION 8 // Option negotiation termination +// +// some defines +// +#define REQ_RESP_TIMEOUT 5 // Wait five seconds for request response. +#define ACK_TIMEOUT 4 // Wait four seconds for ack response. +#define NUM_ACK_RETRIES 3 +#define NUM_MTFTP_OPEN_RETRIES 3 + +#endif /* __TFTP_H__ */ + +/* EOF - tftp.h */ diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/X64/PxeArch.h b/MdeModulePkg/Universal/Network/PxeBcDxe/X64/PxeArch.h index a8fa293a16..33a7b2696f 100644 --- a/MdeModulePkg/Universal/Network/PxeBcDxe/X64/PxeArch.h +++ b/MdeModulePkg/Universal/Network/PxeBcDxe/X64/PxeArch.h @@ -1,26 +1,26 @@ -/** @file - -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: - PxeArch.h - -Abstract: - Defines PXE Arch type - - -**/ - -#ifndef _EFI_PXE_ARCH_H_ -#define _EFI_PXE_ARCH_H_ - -#define SYS_ARCH 0x7 - -#endif +/** @file + +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: + PxeArch.h + +Abstract: + Defines PXE Arch type + + +**/ + +#ifndef _EFI_PXE_ARCH_H_ +#define _EFI_PXE_ARCH_H_ + +#define SYS_ARCH 0x7 + +#endif diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/ComponentName.c index 7186a9f159..6eae594c4d 100644 --- a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/ComponentName.c @@ -25,6 +25,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI PxeDhcp4ComponentNameGetDriverName ( @@ -33,6 +72,75 @@ PxeDhcp4ComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI PxeDhcp4ComponentNameGetControllerName ( @@ -43,20 +151,31 @@ PxeDhcp4ComponentNameGetControllerName ( OUT CHAR16 **ControllerName ); + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // // EFI Component Name Protocol // -EFI_COMPONENT_NAME_PROTOCOL gPxeDhcp4ComponentName = { +EFI_COMPONENT_NAME_PROTOCOL gPxeDhcp4ComponentName = { PxeDhcp4ComponentNameGetDriverName, PxeDhcp4ComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gPxeDhcp4ComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) PxeDhcp4ComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) PxeDhcp4ComponentNameGetControllerName, + "en" + }; + static EFI_UNICODE_STRING_TABLE mPxeDhcp4DriverNameTable[] = { { - "eng", + "eng;en", L"PXE DHCPv4 Driver" }, { @@ -65,7 +184,45 @@ static EFI_UNICODE_STRING_TABLE mPxeDhcp4DriverNameTable[] = { } }; -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI PxeDhcp4ComponentNameGetDriverName ( @@ -73,42 +230,84 @@ PxeDhcp4ComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language - A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - DriverName - A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - Returns: - EFI_SUCCESS - The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - DriverName is NULL. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { - return LookupUnicodeString ( - Language, - gPxeDhcp4ComponentName.SupportedLanguages, - mPxeDhcp4DriverNameTable, - DriverName - ); + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mPxeDhcp4DriverNameTable, + DriverName, + (BOOLEAN)(This == &gPxeDhcp4ComponentName) + ); } -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI PxeDhcp4ComponentNameGetControllerName ( @@ -118,50 +317,6 @@ PxeDhcp4ComponentNameGetControllerName ( IN CHAR8 *Language, OUT CHAR16 **ControllerName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle - The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle - The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - ControllerName - A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - Returns: - EFI_SUCCESS - The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - ControllerName is NULL. - EFI_UNSUPPORTED - The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.c b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.c index 7fcd7c2c17..05a0738794 100644 --- a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.c +++ b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.c @@ -94,15 +94,14 @@ PxeDhcp4DriverEntryPoint ( IN EFI_SYSTEM_TABLE *SystemTable ) { - return EfiLibInstallAllDriverProtocols ( - ImageHandle, - SystemTable, - &gPxeDhcp4DriverBinding, - NULL, - &gPxeDhcp4ComponentName, - NULL, - NULL - ); + return EfiLibInstallDriverBindingComponentName2 ( + ImageHandle, + SystemTable, + &gPxeDhcp4DriverBinding, + NULL, + &gPxeDhcp4ComponentName, + &gPxeDhcp4ComponentName2 + ); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.h b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.h index 7e971d49c9..81021c79b8 100644 --- a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.h +++ b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.h @@ -1,345 +1,346 @@ -/** @file - -Copyright (c) 2004 - 2007, 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: - PxeDhcp4.h - -Abstract: - Common header for PxeDhcp4 protocol driver - - -**/ -#ifndef _PXEDHCP4_H -#define _PXEDHCP4_H - +/** @file + +Copyright (c) 2004 - 2007, 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: + PxeDhcp4.h + +Abstract: + Common header for PxeDhcp4 protocol driver + + +**/ +#ifndef _PXEDHCP4_H +#define _PXEDHCP4_H + #include #include -#include -#include +#include +#include #include #include -#include +#include #include #include #include -#include - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - -// -// PxeDhcp4 protocol instance data -// -typedef struct { - // - // Signature field used to locate beginning of containment record. - // - UINTN Signature; - -#define PXE_DHCP4_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'D', '4') - // - // Device handle the protocol is bound to. - // - EFI_HANDLE Handle; - - // - // Public PxeDhcp4 protocol interface. - // - EFI_PXE_DHCP4_PROTOCOL PxeDhcp4; - - // - // Consumed PxeBc, Snp and PxeDhcp4Callback protocol interfaces. - // - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - EFI_SIMPLE_NETWORK_PROTOCOL *Snp; - EFI_PXE_DHCP4_CALLBACK_PROTOCOL *callback; - - // - // PxeDhcp4 called function for PxeDhcp4Callback. - // - EFI_PXE_DHCP4_FUNCTION function; - - // - // Timeout event and flag for PxeDhcp4Callback. - // - EFI_EVENT TimeoutEvent; - BOOLEAN TimeoutOccurred; - - // - // Periodic event and flag for PxeDhcp4Callback. - // - EFI_EVENT PeriodicEvent; - BOOLEAN PeriodicOccurred; - - // - // DHCP server IP address. - // - UINT32 ServerIp; - - // - // DHCP renewal and rebinding times, in seconds. - // - UINT32 RenewTime; - UINT32 RebindTime; - UINT32 LeaseTime; - - // - // Number of offers received & allocated offer list. - // - UINTN offers; - DHCP4_PACKET *offer_list; - - // - // - // - BOOLEAN StopPxeBc; - -} PXE_DHCP4_PRIVATE_DATA; - -#define PXE_DHCP4_PRIVATE_DATA_FROM_THIS(a) CR (a, PXE_DHCP4_PRIVATE_DATA, PxeDhcp4, PXE_DHCP4_PRIVATE_DATA_SIGNATURE) - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - -// -// Protocol function prototypes. -// -extern -EFI_STATUS -EFIAPI -PxeDhcp4Run ( - IN EFI_PXE_DHCP4_PROTOCOL *This, - IN OPTIONAL UINTN OpLen, - IN OPTIONAL VOID *OpList - ) -; - -extern -EFI_STATUS -EFIAPI -PxeDhcp4Setup ( - IN EFI_PXE_DHCP4_PROTOCOL *This, - IN EFI_PXE_DHCP4_DATA *Data - ) -; - -extern -EFI_STATUS -EFIAPI -PxeDhcp4Init ( - IN EFI_PXE_DHCP4_PROTOCOL *This, - IN UINTN seconds_timeout, - OUT UINTN *offer_list_entries, - OUT DHCP4_PACKET **offer_list - ) -; - -extern -EFI_STATUS -EFIAPI -PxeDhcp4Select ( - IN EFI_PXE_DHCP4_PROTOCOL *This, - IN UINTN seconds_timeout, - IN DHCP4_PACKET *offer_list - ) -; - -extern -EFI_STATUS -EFIAPI -PxeDhcp4Renew ( - IN EFI_PXE_DHCP4_PROTOCOL *This, - UINTN seconds_timeout - ) -; - -extern -EFI_STATUS -EFIAPI -PxeDhcp4Rebind ( - IN EFI_PXE_DHCP4_PROTOCOL *This, - UINTN seconds_timeout - ) -; - -extern -EFI_STATUS -EFIAPI -PxeDhcp4Release ( - IN EFI_PXE_DHCP4_PROTOCOL *This - ) -; - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - -// -// Support function prototypes. -// -extern -UINT16 -htons ( - UINTN n - ) -; - -extern -UINT32 -htonl ( - UINTN n - ) -; - -extern -VOID -EFIAPI -timeout_notify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -; - -extern -VOID -EFIAPI -periodic_notify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -; - -extern -EFI_STATUS -find_opt ( - IN DHCP4_PACKET *Packet, - IN UINT8 OpCode, - IN UINTN Skip, - OUT DHCP4_OP **OpPtr - ) -; - -extern -EFI_STATUS -add_opt ( - IN DHCP4_PACKET *Packet, - IN DHCP4_OP *OpPtr - ) -; - -extern -EFI_STATUS -start_udp ( - IN PXE_DHCP4_PRIVATE_DATA *Private, - IN OPTIONAL EFI_IP_ADDRESS *station_ip, - IN OPTIONAL EFI_IP_ADDRESS *subnet_mask - ) -; - -extern -VOID -stop_udp ( - IN PXE_DHCP4_PRIVATE_DATA *Private - ) -; - -extern -EFI_STATUS -start_receive_events ( - IN PXE_DHCP4_PRIVATE_DATA *Private, - IN UINTN seconds_timeout - ) -; - -extern -VOID -stop_receive_events ( - IN PXE_DHCP4_PRIVATE_DATA *Private - ) -; - -extern -EFI_STATUS -tx_udp ( - IN PXE_DHCP4_PRIVATE_DATA *Private, - IN EFI_IP_ADDRESS *dest_ip, - IN OPTIONAL EFI_IP_ADDRESS *gateway_ip, - IN EFI_IP_ADDRESS *src_ip, - IN VOID *buffer, - IN UINTN BufferSize - ) -; - -extern -EFI_STATUS -rx_udp ( - IN PXE_DHCP4_PRIVATE_DATA *Private, - OUT VOID *buffer, - OUT UINTN *BufferSize, - IN OUT EFI_IP_ADDRESS *dest_ip, - IN OUT EFI_IP_ADDRESS *src_ip, - IN UINT16 op_flags - ) -; - -extern -EFI_STATUS -tx_rx_udp ( - IN PXE_DHCP4_PRIVATE_DATA *Private, - IN OUT EFI_IP_ADDRESS *ServerIp, - IN OPTIONAL EFI_IP_ADDRESS *gateway_ip, - IN OPTIONAL EFI_IP_ADDRESS *client_ip, - IN OPTIONAL EFI_IP_ADDRESS *subnet_mask, - IN DHCP4_PACKET *tx_pkt, - OUT DHCP4_PACKET *rx_pkt, - IN INTN - ( - *rx_vfy) - ( - IN PXE_DHCP4_PRIVATE_DATA *Private, - IN DHCP4_PACKET *tx_pkt, - IN DHCP4_PACKET *rx_pkt, - IN UINTN rx_pkt_size - ), - IN UINTN seconds_timeout - ) -; - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - -// -// Global variable definitions. -// -extern EFI_COMPONENT_NAME_PROTOCOL gPxeDhcp4ComponentName; - -EFI_STATUS -EFIAPI -PxeDhcp4DriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -/*++ - -Routine Description: - Register Driver Binding protocol for this driver. - -Arguments: - (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT) - -Returns: - EFI_SUCCESS - Driver loaded. - other - Driver not loaded. - ---*/ -; - -#endif /* _PXEDHCP4_H */ - -/* EOF - PxeDhcp4.h */ +#include + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +// +// PxeDhcp4 protocol instance data +// +typedef struct { + // + // Signature field used to locate beginning of containment record. + // + UINTN Signature; + +#define PXE_DHCP4_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('p', 'x', 'D', '4') + // + // Device handle the protocol is bound to. + // + EFI_HANDLE Handle; + + // + // Public PxeDhcp4 protocol interface. + // + EFI_PXE_DHCP4_PROTOCOL PxeDhcp4; + + // + // Consumed PxeBc, Snp and PxeDhcp4Callback protocol interfaces. + // + EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; + EFI_SIMPLE_NETWORK_PROTOCOL *Snp; + EFI_PXE_DHCP4_CALLBACK_PROTOCOL *callback; + + // + // PxeDhcp4 called function for PxeDhcp4Callback. + // + EFI_PXE_DHCP4_FUNCTION function; + + // + // Timeout event and flag for PxeDhcp4Callback. + // + EFI_EVENT TimeoutEvent; + BOOLEAN TimeoutOccurred; + + // + // Periodic event and flag for PxeDhcp4Callback. + // + EFI_EVENT PeriodicEvent; + BOOLEAN PeriodicOccurred; + + // + // DHCP server IP address. + // + UINT32 ServerIp; + + // + // DHCP renewal and rebinding times, in seconds. + // + UINT32 RenewTime; + UINT32 RebindTime; + UINT32 LeaseTime; + + // + // Number of offers received & allocated offer list. + // + UINTN offers; + DHCP4_PACKET *offer_list; + + // + // + // + BOOLEAN StopPxeBc; + +} PXE_DHCP4_PRIVATE_DATA; + +#define PXE_DHCP4_PRIVATE_DATA_FROM_THIS(a) CR (a, PXE_DHCP4_PRIVATE_DATA, PxeDhcp4, PXE_DHCP4_PRIVATE_DATA_SIGNATURE) + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +// +// Protocol function prototypes. +// +extern +EFI_STATUS +EFIAPI +PxeDhcp4Run ( + IN EFI_PXE_DHCP4_PROTOCOL *This, + IN OPTIONAL UINTN OpLen, + IN OPTIONAL VOID *OpList + ) +; + +extern +EFI_STATUS +EFIAPI +PxeDhcp4Setup ( + IN EFI_PXE_DHCP4_PROTOCOL *This, + IN EFI_PXE_DHCP4_DATA *Data + ) +; + +extern +EFI_STATUS +EFIAPI +PxeDhcp4Init ( + IN EFI_PXE_DHCP4_PROTOCOL *This, + IN UINTN seconds_timeout, + OUT UINTN *offer_list_entries, + OUT DHCP4_PACKET **offer_list + ) +; + +extern +EFI_STATUS +EFIAPI +PxeDhcp4Select ( + IN EFI_PXE_DHCP4_PROTOCOL *This, + IN UINTN seconds_timeout, + IN DHCP4_PACKET *offer_list + ) +; + +extern +EFI_STATUS +EFIAPI +PxeDhcp4Renew ( + IN EFI_PXE_DHCP4_PROTOCOL *This, + UINTN seconds_timeout + ) +; + +extern +EFI_STATUS +EFIAPI +PxeDhcp4Rebind ( + IN EFI_PXE_DHCP4_PROTOCOL *This, + UINTN seconds_timeout + ) +; + +extern +EFI_STATUS +EFIAPI +PxeDhcp4Release ( + IN EFI_PXE_DHCP4_PROTOCOL *This + ) +; + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +// +// Support function prototypes. +// +extern +UINT16 +htons ( + UINTN n + ) +; + +extern +UINT32 +htonl ( + UINTN n + ) +; + +extern +VOID +EFIAPI +timeout_notify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +; + +extern +VOID +EFIAPI +periodic_notify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +; + +extern +EFI_STATUS +find_opt ( + IN DHCP4_PACKET *Packet, + IN UINT8 OpCode, + IN UINTN Skip, + OUT DHCP4_OP **OpPtr + ) +; + +extern +EFI_STATUS +add_opt ( + IN DHCP4_PACKET *Packet, + IN DHCP4_OP *OpPtr + ) +; + +extern +EFI_STATUS +start_udp ( + IN PXE_DHCP4_PRIVATE_DATA *Private, + IN OPTIONAL EFI_IP_ADDRESS *station_ip, + IN OPTIONAL EFI_IP_ADDRESS *subnet_mask + ) +; + +extern +VOID +stop_udp ( + IN PXE_DHCP4_PRIVATE_DATA *Private + ) +; + +extern +EFI_STATUS +start_receive_events ( + IN PXE_DHCP4_PRIVATE_DATA *Private, + IN UINTN seconds_timeout + ) +; + +extern +VOID +stop_receive_events ( + IN PXE_DHCP4_PRIVATE_DATA *Private + ) +; + +extern +EFI_STATUS +tx_udp ( + IN PXE_DHCP4_PRIVATE_DATA *Private, + IN EFI_IP_ADDRESS *dest_ip, + IN OPTIONAL EFI_IP_ADDRESS *gateway_ip, + IN EFI_IP_ADDRESS *src_ip, + IN VOID *buffer, + IN UINTN BufferSize + ) +; + +extern +EFI_STATUS +rx_udp ( + IN PXE_DHCP4_PRIVATE_DATA *Private, + OUT VOID *buffer, + OUT UINTN *BufferSize, + IN OUT EFI_IP_ADDRESS *dest_ip, + IN OUT EFI_IP_ADDRESS *src_ip, + IN UINT16 op_flags + ) +; + +extern +EFI_STATUS +tx_rx_udp ( + IN PXE_DHCP4_PRIVATE_DATA *Private, + IN OUT EFI_IP_ADDRESS *ServerIp, + IN OPTIONAL EFI_IP_ADDRESS *gateway_ip, + IN OPTIONAL EFI_IP_ADDRESS *client_ip, + IN OPTIONAL EFI_IP_ADDRESS *subnet_mask, + IN DHCP4_PACKET *tx_pkt, + OUT DHCP4_PACKET *rx_pkt, + IN INTN + ( + *rx_vfy) + ( + IN PXE_DHCP4_PRIVATE_DATA *Private, + IN DHCP4_PACKET *tx_pkt, + IN DHCP4_PACKET *rx_pkt, + IN UINTN rx_pkt_size + ), + IN UINTN seconds_timeout + ) +; + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +// +// Global variable definitions. +// +extern EFI_COMPONENT_NAME_PROTOCOL gPxeDhcp4ComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gPxeDhcp4ComponentName2; + +EFI_STATUS +EFIAPI +PxeDhcp4DriverEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + Register Driver Binding protocol for this driver. + +Arguments: + (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT) + +Returns: + EFI_SUCCESS - Driver loaded. + other - Driver not loaded. + +--*/ +; + +#endif /* _PXEDHCP4_H */ + +/* EOF - PxeDhcp4.h */ diff --git a/MdeModulePkg/Universal/Network/SnpDxe/ComponentName.c b/MdeModulePkg/Universal/Network/SnpDxe/ComponentName.c index 6da17a3633..a2dc8e75af 100644 --- a/MdeModulePkg/Universal/Network/SnpDxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/SnpDxe/ComponentName.c @@ -25,6 +25,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI SimpleNetworkComponentNameGetDriverName ( @@ -33,6 +72,75 @@ SimpleNetworkComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI SimpleNetworkComponentNameGetControllerName ( @@ -43,18 +151,29 @@ SimpleNetworkComponentNameGetControllerName ( OUT CHAR16 **ControllerName ); + // // EFI Component Name Protocol // -EFI_COMPONENT_NAME_PROTOCOL gSimpleNetworkComponentName = { +EFI_COMPONENT_NAME_PROTOCOL gSimpleNetworkComponentName = { SimpleNetworkComponentNameGetDriverName, SimpleNetworkComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gSimpleNetworkComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) SimpleNetworkComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) SimpleNetworkComponentNameGetControllerName, + "en" + }; + static EFI_UNICODE_STRING_TABLE mSimpleNetworkDriverNameTable[] = { { - "eng", + "eng;en", L"Simple Network Protocol Driver" }, { @@ -63,6 +182,45 @@ static EFI_UNICODE_STRING_TABLE mSimpleNetworkDriverNameTable[] = { } }; +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI SimpleNetworkComponentNameGetDriverName ( @@ -70,41 +228,84 @@ SimpleNetworkComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language - A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - DriverName - A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - Returns: - EFI_SUCCESS - The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - DriverName is NULL. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { - return LookupUnicodeString ( - Language, - gSimpleNetworkComponentName.SupportedLanguages, - mSimpleNetworkDriverNameTable, - DriverName - ); + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mSimpleNetworkDriverNameTable, + DriverName, + (BOOLEAN)(This == &gSimpleNetworkComponentName) + ); } +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI SimpleNetworkComponentNameGetControllerName ( @@ -114,50 +315,6 @@ SimpleNetworkComponentNameGetControllerName ( IN CHAR8 *Language, OUT CHAR16 **ControllerName ) -/*++ - - Routine Description: - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. - - Arguments: - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle - The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle - The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - ControllerName - A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - Returns: - EFI_SUCCESS - The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - ControllerName is NULL. - EFI_UNSUPPORTED - The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/SnpDxe/snp.c b/MdeModulePkg/Universal/Network/SnpDxe/snp.c index d5055e7642..2f88c71ae8 100644 --- a/MdeModulePkg/Universal/Network/SnpDxe/snp.c +++ b/MdeModulePkg/Universal/Network/SnpDxe/snp.c @@ -1257,13 +1257,12 @@ InitializeSnpNiiDriver ( IN EFI_SYSTEM_TABLE *SystemTable ) { - return EfiLibInstallAllDriverProtocols ( - ImageHandle, - SystemTable, - &mSimpleNetworkDriverBinding, - NULL, - &gSimpleNetworkComponentName, - NULL, - NULL - ); + return EfiLibInstallDriverBindingComponentName2 ( + ImageHandle, + SystemTable, + &mSimpleNetworkDriverBinding, + NULL, + &gSimpleNetworkComponentName, + &gSimpleNetworkComponentName2 + ); } diff --git a/MdeModulePkg/Universal/Network/SnpDxe/snp.h b/MdeModulePkg/Universal/Network/SnpDxe/snp.h index 08c4f4d8df..01f428d2f1 100644 --- a/MdeModulePkg/Universal/Network/SnpDxe/snp.h +++ b/MdeModulePkg/Universal/Network/SnpDxe/snp.h @@ -1,27 +1,27 @@ -/** @file - -Copyright (c) 2004 - 2007, 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: - snp.h - -Abstract: - -Revision history: - - -**/ -#ifndef _SNP_H -#define _SNP_H - - +/** @file + +Copyright (c) 2004 - 2007, 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: + snp.h + +Abstract: + +Revision history: + + +**/ +#ifndef _SNP_H +#define _SNP_H + + #include #include @@ -34,399 +34,400 @@ Revision history: #include #include #include -#include -#include - -#include - -#define FOUR_GIGABYTES (UINT64) 0x100000000ULL - - -#define SNP_DRIVER_SIGNATURE EFI_SIGNATURE_32 ('s', 'n', 'd', 's') -#define MAX_MAP_LENGTH 100 - -#define PCI_BAR_IO_MASK 0x00000003 -#define PCI_BAR_IO_MODE 0x00000001 - -#define PCI_BAR_MEM_MASK 0x0000000F -#define PCI_BAR_MEM_MODE 0x00000000 -#define PCI_BAR_MEM_64BIT 0x00000004 - -typedef struct { - UINT32 Signature; - EFI_LOCK lock; - - EFI_SIMPLE_NETWORK_PROTOCOL snp; - EFI_SIMPLE_NETWORK_MODE mode; - - EFI_HANDLE device_handle; - EFI_DEVICE_PATH_PROTOCOL *device_path; - - // - // Local instance data needed by SNP driver - // - // Pointer to S/W UNDI API entry point - // This will be NULL for H/W UNDI - // - EFI_STATUS (*issue_undi32_command) (UINT64 cdb); - - BOOLEAN is_swundi; - - // - // undi interface number, if one undi manages more nics - // - PXE_IFNUM if_num; - - // - // Allocated tx/rx buffer that was passed to UNDI Initialize. - // - UINT32 tx_rx_bufsize; - VOID *tx_rx_buffer; - // - // mappable buffers for receive and fill header for undi3.0 - // these will be used if the user buffers are above 4GB limit (instead of - // mapping the user buffers) - // - UINT8 *receive_buf; - VOID *ReceiveBufUnmap; - UINT8 *fill_hdr_buf; - VOID *FillHdrBufUnmap; - - EFI_PCI_IO_PROTOCOL *IoFncs; - UINT8 IoBarIndex; - UINT8 MemoryBarIndex; - BOOLEAN IsOldUndi; // true for EFI1.0 UNDI (3.0) drivers - // - // Buffers for command descriptor block, command parameter block - // and data block. - // - PXE_CDB cdb; - VOID *cpb; - VOID *CpbUnmap; - VOID *db; - - // - // UNDI structure, we need to remember the init info for a long time! - // - PXE_DB_GET_INIT_INFO init_info; - - VOID *SnpDriverUnmap; - // - // when ever we map an address, we must remember it's address and the un-map - // cookie so that we can unmap later - // - struct s_map_list { - EFI_PHYSICAL_ADDRESS virt; - VOID *map_cookie; - } map_list[MAX_MAP_LENGTH]; -} -SNP_DRIVER; - -#define EFI_SIMPLE_NETWORK_DEV_FROM_THIS(a) CR (a, SNP_DRIVER, snp, SNP_DRIVER_SIGNATURE) - -// -// Global Variables -// -extern EFI_COMPONENT_NAME_PROTOCOL gSimpleNetworkComponentName; - -// -// Virtual to physical mapping for all UNDI 3.0s. -// -extern struct s_v2p { - struct s_v2p *next; - VOID *vaddr; - UINTN bsize; - EFI_PHYSICAL_ADDRESS paddr; - VOID *unmap; -} -*_v2p; - -EFI_STATUS -add_v2p ( - struct s_v2p **v2p, - EFI_PCI_IO_PROTOCOL_OPERATION type, - VOID *vaddr, - UINTN bsize - ) -; - -EFI_STATUS -find_v2p ( - struct s_v2p **v2p, - VOID *vaddr - ) -; - -EFI_STATUS -del_v2p ( - VOID *vaddr - ) -; - -extern -VOID -snp_undi32_callback_block_30 ( - IN UINT32 Enable - ) -; - -extern -VOID -snp_undi32_callback_delay_30 ( - IN UINT64 MicroSeconds - ) -; - -extern -VOID -snp_undi32_callback_memio_30 ( - IN UINT8 ReadOrWrite, - IN UINT8 NumBytes, - IN UINT64 MemOrPortAddress, - IN OUT UINT64 BufferPtr - ) -; - -extern -VOID -snp_undi32_callback_v2p_30 ( - IN UINT64 CpuAddr, - IN OUT UINT64 DeviceAddrPtr - ) -; - -extern -VOID -snp_undi32_callback_block ( - IN UINT64 UniqueId, - IN UINT32 Enable - ) -; - -extern -VOID -snp_undi32_callback_delay ( - IN UINT64 UniqueId, - IN UINT64 MicroSeconds - ) -; - -extern -VOID -snp_undi32_callback_memio ( - IN UINT64 UniqueId, - IN UINT8 ReadOrWrite, - IN UINT8 NumBytes, - IN UINT64 MemOrPortAddr, - IN OUT UINT64 BufferPtr - ) -; - -extern -VOID -snp_undi32_callback_map ( - IN UINT64 UniqueId, - IN UINT64 CpuAddr, - IN UINT32 NumBytes, - IN UINT32 Direction, - IN OUT UINT64 DeviceAddrPtr - ) -; - -extern -VOID -snp_undi32_callback_unmap ( - IN UINT64 UniqueId, - IN UINT64 CpuAddr, - IN UINT32 NumBytes, - IN UINT32 Direction, - IN UINT64 DeviceAddr // not a pointer to device address - ) -; - -extern -VOID -snp_undi32_callback_sync ( - IN UINT64 UniqueId, - IN UINT64 CpuAddr, - IN UINT32 NumBytes, - IN UINT32 Direction, - IN UINT64 DeviceAddr // not a pointer to device address - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_start ( - IN EFI_SIMPLE_NETWORK_PROTOCOL *this - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_stop ( - IN EFI_SIMPLE_NETWORK_PROTOCOL *this - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_initialize ( - IN EFI_SIMPLE_NETWORK_PROTOCOL *this, - IN UINTN extra_rx_buffer_size OPTIONAL, - IN UINTN extra_tx_buffer_size OPTIONAL - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_reset ( - IN EFI_SIMPLE_NETWORK_PROTOCOL *this, - IN BOOLEAN ExtendedVerification - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_shutdown ( - IN EFI_SIMPLE_NETWORK_PROTOCOL *this - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_receive_filters ( - IN EFI_SIMPLE_NETWORK_PROTOCOL * this, - IN UINT32 enable, - IN UINT32 disable, - IN BOOLEAN reset_mcast_filter, - IN UINTN mcast_filter_count OPTIONAL, - IN EFI_MAC_ADDRESS * mcast_filter OPTIONAL - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_station_address ( - IN EFI_SIMPLE_NETWORK_PROTOCOL * this, - IN BOOLEAN reset, - IN EFI_MAC_ADDRESS *new OPTIONAL - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_statistics ( - IN EFI_SIMPLE_NETWORK_PROTOCOL * this, - IN BOOLEAN reset, - IN OUT UINTN *statistics_size OPTIONAL, - IN OUT EFI_NETWORK_STATISTICS * statistics_table OPTIONAL - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_mcast_ip_to_mac ( - IN EFI_SIMPLE_NETWORK_PROTOCOL *this, - IN BOOLEAN IPv6, - IN EFI_IP_ADDRESS *IP, - OUT EFI_MAC_ADDRESS *MAC - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_nvdata ( - IN EFI_SIMPLE_NETWORK_PROTOCOL *this, - IN BOOLEAN read_write, - IN UINTN offset, - IN UINTN buffer_size, - IN OUT VOID *buffer - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_get_status ( - IN EFI_SIMPLE_NETWORK_PROTOCOL * this, - OUT UINT32 *interrupt_status OPTIONAL, - OUT VOID **tx_buffer OPTIONAL - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_transmit ( - IN EFI_SIMPLE_NETWORK_PROTOCOL * this, - IN UINTN header_size, - IN UINTN buffer_size, - IN VOID *buffer, - IN EFI_MAC_ADDRESS * src_addr OPTIONAL, - IN EFI_MAC_ADDRESS * dest_addr OPTIONAL, - IN UINT16 *protocol OPTIONAL - ) -; - -extern -EFI_STATUS -EFIAPI -snp_undi32_receive ( - IN EFI_SIMPLE_NETWORK_PROTOCOL * this, - OUT UINTN *header_size OPTIONAL, - IN OUT UINTN *buffer_size, - OUT VOID *buffer, - OUT EFI_MAC_ADDRESS * src_addr OPTIONAL, - OUT EFI_MAC_ADDRESS * dest_addr OPTIONAL, - OUT UINT16 *protocol OPTIONAL - ) -; - -typedef -EFI_STATUS -(*issue_undi32_command) ( - UINT64 cdb - ); -typedef -VOID -(*ptr) ( - VOID - ); - - -/** - Install all the driver protocol - - @param ImageHandle Driver image handle - @param SystemTable System services table - - @retval EFI_SUCEESS Initialization routine has found UNDI hardware, loaded it's - ROM, and installed a notify event for the Network - Indentifier Interface Protocol successfully. - @retval Other Return value from HandleProtocol for DeviceIoProtocol or - LoadedImageProtocol - -**/ -EFI_STATUS -EFIAPI -InitializeSnpNiiDriver ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -; - -#define SNP_MEM_PAGES(x) (((x) - 1) / 4096 + 1) - - -#endif /* _SNP_H */ +#include +#include + +#include + +#define FOUR_GIGABYTES (UINT64) 0x100000000ULL + + +#define SNP_DRIVER_SIGNATURE EFI_SIGNATURE_32 ('s', 'n', 'd', 's') +#define MAX_MAP_LENGTH 100 + +#define PCI_BAR_IO_MASK 0x00000003 +#define PCI_BAR_IO_MODE 0x00000001 + +#define PCI_BAR_MEM_MASK 0x0000000F +#define PCI_BAR_MEM_MODE 0x00000000 +#define PCI_BAR_MEM_64BIT 0x00000004 + +typedef struct { + UINT32 Signature; + EFI_LOCK lock; + + EFI_SIMPLE_NETWORK_PROTOCOL snp; + EFI_SIMPLE_NETWORK_MODE mode; + + EFI_HANDLE device_handle; + EFI_DEVICE_PATH_PROTOCOL *device_path; + + // + // Local instance data needed by SNP driver + // + // Pointer to S/W UNDI API entry point + // This will be NULL for H/W UNDI + // + EFI_STATUS (*issue_undi32_command) (UINT64 cdb); + + BOOLEAN is_swundi; + + // + // undi interface number, if one undi manages more nics + // + PXE_IFNUM if_num; + + // + // Allocated tx/rx buffer that was passed to UNDI Initialize. + // + UINT32 tx_rx_bufsize; + VOID *tx_rx_buffer; + // + // mappable buffers for receive and fill header for undi3.0 + // these will be used if the user buffers are above 4GB limit (instead of + // mapping the user buffers) + // + UINT8 *receive_buf; + VOID *ReceiveBufUnmap; + UINT8 *fill_hdr_buf; + VOID *FillHdrBufUnmap; + + EFI_PCI_IO_PROTOCOL *IoFncs; + UINT8 IoBarIndex; + UINT8 MemoryBarIndex; + BOOLEAN IsOldUndi; // true for EFI1.0 UNDI (3.0) drivers + // + // Buffers for command descriptor block, command parameter block + // and data block. + // + PXE_CDB cdb; + VOID *cpb; + VOID *CpbUnmap; + VOID *db; + + // + // UNDI structure, we need to remember the init info for a long time! + // + PXE_DB_GET_INIT_INFO init_info; + + VOID *SnpDriverUnmap; + // + // when ever we map an address, we must remember it's address and the un-map + // cookie so that we can unmap later + // + struct s_map_list { + EFI_PHYSICAL_ADDRESS virt; + VOID *map_cookie; + } map_list[MAX_MAP_LENGTH]; +} +SNP_DRIVER; + +#define EFI_SIMPLE_NETWORK_DEV_FROM_THIS(a) CR (a, SNP_DRIVER, snp, SNP_DRIVER_SIGNATURE) + +// +// Global Variables +// +extern EFI_COMPONENT_NAME_PROTOCOL gSimpleNetworkComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gSimpleNetworkComponentName2; + +// +// Virtual to physical mapping for all UNDI 3.0s. +// +extern struct s_v2p { + struct s_v2p *next; + VOID *vaddr; + UINTN bsize; + EFI_PHYSICAL_ADDRESS paddr; + VOID *unmap; +} +*_v2p; + +EFI_STATUS +add_v2p ( + struct s_v2p **v2p, + EFI_PCI_IO_PROTOCOL_OPERATION type, + VOID *vaddr, + UINTN bsize + ) +; + +EFI_STATUS +find_v2p ( + struct s_v2p **v2p, + VOID *vaddr + ) +; + +EFI_STATUS +del_v2p ( + VOID *vaddr + ) +; + +extern +VOID +snp_undi32_callback_block_30 ( + IN UINT32 Enable + ) +; + +extern +VOID +snp_undi32_callback_delay_30 ( + IN UINT64 MicroSeconds + ) +; + +extern +VOID +snp_undi32_callback_memio_30 ( + IN UINT8 ReadOrWrite, + IN UINT8 NumBytes, + IN UINT64 MemOrPortAddress, + IN OUT UINT64 BufferPtr + ) +; + +extern +VOID +snp_undi32_callback_v2p_30 ( + IN UINT64 CpuAddr, + IN OUT UINT64 DeviceAddrPtr + ) +; + +extern +VOID +snp_undi32_callback_block ( + IN UINT64 UniqueId, + IN UINT32 Enable + ) +; + +extern +VOID +snp_undi32_callback_delay ( + IN UINT64 UniqueId, + IN UINT64 MicroSeconds + ) +; + +extern +VOID +snp_undi32_callback_memio ( + IN UINT64 UniqueId, + IN UINT8 ReadOrWrite, + IN UINT8 NumBytes, + IN UINT64 MemOrPortAddr, + IN OUT UINT64 BufferPtr + ) +; + +extern +VOID +snp_undi32_callback_map ( + IN UINT64 UniqueId, + IN UINT64 CpuAddr, + IN UINT32 NumBytes, + IN UINT32 Direction, + IN OUT UINT64 DeviceAddrPtr + ) +; + +extern +VOID +snp_undi32_callback_unmap ( + IN UINT64 UniqueId, + IN UINT64 CpuAddr, + IN UINT32 NumBytes, + IN UINT32 Direction, + IN UINT64 DeviceAddr // not a pointer to device address + ) +; + +extern +VOID +snp_undi32_callback_sync ( + IN UINT64 UniqueId, + IN UINT64 CpuAddr, + IN UINT32 NumBytes, + IN UINT32 Direction, + IN UINT64 DeviceAddr // not a pointer to device address + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_start ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *this + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_stop ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *this + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_initialize ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *this, + IN UINTN extra_rx_buffer_size OPTIONAL, + IN UINTN extra_tx_buffer_size OPTIONAL + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_reset ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *this, + IN BOOLEAN ExtendedVerification + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_shutdown ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *this + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_receive_filters ( + IN EFI_SIMPLE_NETWORK_PROTOCOL * this, + IN UINT32 enable, + IN UINT32 disable, + IN BOOLEAN reset_mcast_filter, + IN UINTN mcast_filter_count OPTIONAL, + IN EFI_MAC_ADDRESS * mcast_filter OPTIONAL + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_station_address ( + IN EFI_SIMPLE_NETWORK_PROTOCOL * this, + IN BOOLEAN reset, + IN EFI_MAC_ADDRESS *new OPTIONAL + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_statistics ( + IN EFI_SIMPLE_NETWORK_PROTOCOL * this, + IN BOOLEAN reset, + IN OUT UINTN *statistics_size OPTIONAL, + IN OUT EFI_NETWORK_STATISTICS * statistics_table OPTIONAL + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_mcast_ip_to_mac ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *this, + IN BOOLEAN IPv6, + IN EFI_IP_ADDRESS *IP, + OUT EFI_MAC_ADDRESS *MAC + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_nvdata ( + IN EFI_SIMPLE_NETWORK_PROTOCOL *this, + IN BOOLEAN read_write, + IN UINTN offset, + IN UINTN buffer_size, + IN OUT VOID *buffer + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_get_status ( + IN EFI_SIMPLE_NETWORK_PROTOCOL * this, + OUT UINT32 *interrupt_status OPTIONAL, + OUT VOID **tx_buffer OPTIONAL + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_transmit ( + IN EFI_SIMPLE_NETWORK_PROTOCOL * this, + IN UINTN header_size, + IN UINTN buffer_size, + IN VOID *buffer, + IN EFI_MAC_ADDRESS * src_addr OPTIONAL, + IN EFI_MAC_ADDRESS * dest_addr OPTIONAL, + IN UINT16 *protocol OPTIONAL + ) +; + +extern +EFI_STATUS +EFIAPI +snp_undi32_receive ( + IN EFI_SIMPLE_NETWORK_PROTOCOL * this, + OUT UINTN *header_size OPTIONAL, + IN OUT UINTN *buffer_size, + OUT VOID *buffer, + OUT EFI_MAC_ADDRESS * src_addr OPTIONAL, + OUT EFI_MAC_ADDRESS * dest_addr OPTIONAL, + OUT UINT16 *protocol OPTIONAL + ) +; + +typedef +EFI_STATUS +(*issue_undi32_command) ( + UINT64 cdb + ); +typedef +VOID +(*ptr) ( + VOID + ); + + +/** + Install all the driver protocol + + @param ImageHandle Driver image handle + @param SystemTable System services table + + @retval EFI_SUCEESS Initialization routine has found UNDI hardware, loaded it's + ROM, and installed a notify event for the Network + Indentifier Interface Protocol successfully. + @retval Other Return value from HandleProtocol for DeviceIoProtocol or + LoadedImageProtocol + +**/ +EFI_STATUS +EFIAPI +InitializeSnpNiiDriver ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +; + +#define SNP_MEM_PAGES(x) (((x) - 1) / 4096 + 1) + + +#endif /* _SNP_H */ diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c index 477af22e1e..fae269fa16 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c @@ -23,6 +23,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI TcpComponentNameGetDriverName ( @@ -31,28 +70,108 @@ TcpComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI TcpComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName ); + // // EFI Component Name Protocol // -EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName = { +EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName = { TcpComponentNameGetDriverName, TcpComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) TcpComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) TcpComponentNameGetControllerName, + "en" + }; + static EFI_UNICODE_STRING_TABLE mTcpDriverNameTable[] = { { - "eng", + "eng;en", L"Tcp Network Service Driver" }, { @@ -61,6 +180,45 @@ static EFI_UNICODE_STRING_TABLE mTcpDriverNameTable[] = { } }; +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI TcpComponentNameGetDriverName ( @@ -68,102 +226,93 @@ TcpComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ +{ + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mTcpDriverNameTable, + DriverName, + (BOOLEAN)(This == &gTcp4ComponentName) + ); +} -Routine Description: +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. - Retrieves a Unicode string that is the user readable name of the EFI Driver. + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. -Arguments: + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language - A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages - specified in SupportedLanguages. The number of languages - supported by a driver is up to the driver writer. - DriverName - A pointer to the Unicode string to return. This Unicode - string is the name of the driver specified by This in the - language specified by Language. + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. -Returns: + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. - EFI_SUCCES - The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - DriverName is NULL. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. ---*/ -{ - return LookupUnicodeString ( - Language, - gTcp4ComponentName.SupportedLanguages, - mTcpDriverNameTable, - DriverName - ); -} + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI TcpComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName ) -/*++ - -Routine Description: - - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. - -Arguments: - - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle - The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle - The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. - It will be NULL for device drivers. It will also be - NULL for a bus drivers that wish to retrieve the name of - the bus controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a child - controller. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller - name that that the caller is requesting, and it must - match one of the languages specified in supported - languages. The number of languages supported by a driver - is up to the driver writer. - ControllerName - A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language - specified by Language from the point of view of the - driver specified by This. - -Returns: - - EFI_SUCCESS - The Unicode string for the user readable name in - the language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - ControllerName is NULL. - EFI_UNSUPPORTED - The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h index 69a1ac6222..13feea18fa 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h @@ -1,84 +1,84 @@ -/** @file - -Copyright (c) 2005 - 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: - - SockImpl.h - -Abstract: - - -**/ - -#ifndef _SOCK_IMPL_H_ -#define _SOCK_IMPL_H_ - -#include "Socket.h" - -#define SOCK_DEBUG_ERROR(PrintArg) NET_DEBUG_ERROR("Sock", PrintArg) -#define SOCK_DEBUG_WARN(PrintArg) NET_DEBUG_WARNING("Sock", PrintArg) -#define SOCK_DEBUG_TRACE(PrintArg) NET_DEBUG_TRACE("Sock", PrintArg) - -#define SOCK_TRIM_RCV_BUFF(Sock, Len) \ - (NetbufQueTrim ((Sock)->RcvBuffer.DataQueue, (Len))) - -#define SIGNAL_TOKEN(Token, TokenStatus) \ - do { \ - (Token)->Status = (TokenStatus); \ - gBS->SignalEvent ((Token)->Event); \ - } while (0) - -#define SOCK_HEADER_SPACE (60 + 60 + 72) - -// -// Supporting function for both SockImpl and SockInterface -// -VOID -SockFreeFoo ( - IN EFI_EVENT Event - ); - -EFI_STATUS -SockProcessTcpSndData ( - IN SOCKET *Sock, - IN VOID *TcpTxData - ); - -VOID -SockSetTcpRxData ( - IN SOCKET *Sock, - IN VOID *TcpRxData, - IN UINT32 RcvdBytes, - IN BOOLEAN IsOOB - ); - -UINT32 -SockProcessRcvToken ( - IN SOCKET *Sock, - IN SOCK_IO_TOKEN *RcvToken - ); - -VOID -SockConnFlush ( - IN SOCKET *Sock - ); - -SOCKET * -SockCreate ( - IN SOCK_INIT_DATA *SockInitData - ); - -VOID -SockDestroy ( - IN SOCKET *Sock - ); - -#endif +/** @file + +Copyright (c) 2005 - 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: + + SockImpl.h + +Abstract: + + +**/ + +#ifndef _SOCK_IMPL_H_ +#define _SOCK_IMPL_H_ + +#include "Socket.h" + +#define SOCK_DEBUG_ERROR(PrintArg) NET_DEBUG_ERROR("Sock", PrintArg) +#define SOCK_DEBUG_WARN(PrintArg) NET_DEBUG_WARNING("Sock", PrintArg) +#define SOCK_DEBUG_TRACE(PrintArg) NET_DEBUG_TRACE("Sock", PrintArg) + +#define SOCK_TRIM_RCV_BUFF(Sock, Len) \ + (NetbufQueTrim ((Sock)->RcvBuffer.DataQueue, (Len))) + +#define SIGNAL_TOKEN(Token, TokenStatus) \ + do { \ + (Token)->Status = (TokenStatus); \ + gBS->SignalEvent ((Token)->Event); \ + } while (0) + +#define SOCK_HEADER_SPACE (60 + 60 + 72) + +// +// Supporting function for both SockImpl and SockInterface +// +VOID +SockFreeFoo ( + IN EFI_EVENT Event + ); + +EFI_STATUS +SockProcessTcpSndData ( + IN SOCKET *Sock, + IN VOID *TcpTxData + ); + +VOID +SockSetTcpRxData ( + IN SOCKET *Sock, + IN VOID *TcpRxData, + IN UINT32 RcvdBytes, + IN BOOLEAN IsOOB + ); + +UINT32 +SockProcessRcvToken ( + IN SOCKET *Sock, + IN SOCK_IO_TOKEN *RcvToken + ); + +VOID +SockConnFlush ( + IN SOCKET *Sock + ); + +SOCKET * +SockCreate ( + IN SOCK_INIT_DATA *SockInitData + ); + +VOID +SockDestroy ( + IN SOCKET *Sock + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h index 75efa045b1..34b098bcde 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h @@ -1,520 +1,520 @@ -/** @file - -Copyright (c) 2005 - 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: - - Socket.h - -Abstract: - - -**/ - -#ifndef _SOCKET_H_ -#define _SOCKET_H_ - +/** @file + +Copyright (c) 2005 - 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: + + Socket.h + +Abstract: + + +**/ + +#ifndef _SOCKET_H_ +#define _SOCKET_H_ + #include #include -#include +#include #include - + #include #include #include #include #include #include -#include -#include -#include - -#define SOCK_SND_BUF 0 -#define SOCK_RCV_BUF 1 - -#define SOCK_BUFF_LOW_WATER 2 * 1024 -#define SOCK_RCV_BUFF_SIZE 8 * 1024 -#define SOCK_SND_BUFF_SIZE 8 * 1024 -#define SOCK_BACKLOG 5 - -#define PROTO_RESERVED_LEN 20 - -#define SO_NO_MORE_DATA 0x0001 - -// -// -// -// When a socket is created it enters into SO_UNCONFIGURED, -// no actions can be taken on this socket, only after calling -// SockConfigure. The state transition diagram of socket is -// as following: -// -// SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING -// ^ | | -// | ---> SO_LISTENING | -// | | -// |------------------SO_DISCONNECTING<-- SO_CONNECTED -// -// A passive socket can only go into SO_LISTENING and -// SO_UNCONFIGURED state. SO_XXXING state is a middle state -// when a socket is undergoing a protocol procedure such -// as requesting a TCP connection. -// -// -// -typedef enum { - SO_CLOSED = 0, - SO_LISTENING, - SO_CONNECTING, - SO_CONNECTED, - SO_DISCONNECTING -} SOCK_STATE; - -typedef enum { - SO_UNCONFIGURED = 0, - SO_CONFIGURED_ACTIVE, - SO_CONFIGURED_PASSIVE, - SO_NO_MAPPING -} SOCK_CONFIGURE_STATE; - -#define SOCK_NO_MORE_DATA(Sock) ((Sock)->Flag |= SO_NO_MORE_DATA) - -#define SOCK_IS_UNCONFIGURED(Sock) ((Sock)->ConfigureState == SO_UNCONFIGURED) - -#define SOCK_IS_CONFIGURED(Sock) \ - (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \ - ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)) - -#define SOCK_IS_CONFIGURED_ACTIVE(Sock) \ - ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) - -#define SOCK_IS_CONNECTED_PASSIVE(Sock) \ - ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE) - -#define SOCK_IS_NO_MAPPING(Sock) \ - ((Sock)->ConfigureState == SO_NO_MAPPING) - -#define SOCK_IS_CLOSED(Sock) ((Sock)->State == SO_CLOSED) - -#define SOCK_IS_LISTENING(Sock) ((Sock)->State == SO_LISTENING) - -#define SOCK_IS_CONNECTING(Sock) ((Sock)->State == SO_CONNECTING) - -#define SOCK_IS_CONNECTED(Sock) ((Sock)->State == SO_CONNECTED) - -#define SOCK_IS_DISCONNECTING(Sock) ((Sock)->State == SO_DISCONNECTING) - -#define SOCK_IS_NO_MORE_DATA(Sock) (0 != ((Sock)->Flag & SO_NO_MORE_DATA)) - -#define SOCK_SIGNATURE EFI_SIGNATURE_32 ('S', 'O', 'C', 'K') - -#define SOCK_FROM_THIS(a) CR ((a), SOCKET, NetProtocol, SOCK_SIGNATURE) - -#define SET_RCV_BUFFSIZE(Sock, Size) ((Sock)->RcvBuffer.HighWater = (Size)) - -#define GET_RCV_BUFFSIZE(Sock) ((Sock)->RcvBuffer.HighWater) - -#define GET_RCV_DATASIZE(Sock) (((Sock)->RcvBuffer.DataQueue)->BufSize) - -#define SET_SND_BUFFSIZE(Sock, Size) ((Sock)->SndBuffer.HighWater = (Size)) - -#define GET_SND_BUFFSIZE(Sock) ((Sock)->SndBuffer.HighWater) - -#define GET_SND_DATASIZE(Sock) (((Sock)->SndBuffer.DataQueue)->BufSize) - -#define SET_BACKLOG(Sock, Value) ((Sock)->BackLog = (Value)) - -#define GET_BACKLOG(Sock) ((Sock)->BackLog) - -#define SOCK_ERROR(Sock, Error) ((Sock)->SockError = (Error)) - -#define SND_BUF_HDR_LEN(Sock) \ - ((SockBufFirst (&((Sock)->SndBuffer)))->TotalSize) - -#define RCV_BUF_HDR_LEN(Sock) \ - ((SockBufFirst (&((Sock)->RcvBuffer)))->TotalSize) - -#define SOCK_FROM_TOKEN(Token) (((SOCK_TOKEN *) (Token))->Sock) - -#define PROTO_TOKEN_FORM_SOCK(SockToken, Type) \ - ((Type *) (((SOCK_TOKEN *) (SockToken))->Token)) - -typedef struct _SOCKET SOCKET; - -typedef struct _SOCK_COMPLETION_TOKEN { - EFI_EVENT Event; - EFI_STATUS Status; -} SOCK_COMPLETION_TOKEN; - -typedef struct _SOCK_IO_TOKEN { - SOCK_COMPLETION_TOKEN Token; - union { - VOID *RxData; - VOID *TxData; - } Packet; -} SOCK_IO_TOKEN; - -// -// the request issued from socket layer to protocol layer -// -typedef enum { - SOCK_ATTACH, // attach current socket to a new PCB - SOCK_DETACH, // detach current socket from the PCB - SOCK_CONFIGURE, // configure attached PCB - SOCK_FLUSH, // flush attached PCB - SOCK_SND, // need protocol to send something - SOCK_SNDPUSH, // need protocol to send pushed data - SOCK_SNDURG, // need protocol to send urgent data - SOCK_CONSUMED, // application has retrieved data from socket - SOCK_CONNECT, // need to connect to a peer - SOCK_CLOSE, // need to close the protocol process - SOCK_ABORT, // need to reset the protocol process - SOCK_POLL, // need to poll to the protocol layer - SOCK_ROUTE, // need to add a route information - SOCK_MODE, // need to get the mode data of the protocol - SOCK_GROUP // need to join a mcast group -} SOCK_REQUEST; - -// -// the socket type -// -typedef enum { - SOCK_DGRAM, // this socket providing datagram service - SOCK_STREAM // this socket providing stream service -} SOCK_TYPE; - -// -// the handler of protocol for request from socket -// -typedef -EFI_STATUS -(*SOCK_PROTO_HANDLER) ( - IN SOCKET * Socket, // the socket issuing the request to protocol - IN SOCK_REQUEST Request, // the request issued by socket - IN VOID *RequestData // the request related data - ); - -// -// the buffer structure of rcvd data and send data used by socket -// -typedef struct _SOCK_BUFFER { - UINT32 HighWater; // the buffersize upper limit of sock_buffer - UINT32 LowWater; // the low warter mark of sock_buffer - NET_BUF_QUEUE *DataQueue; // the queue to buffer data -} SOCK_BUFFER; - -// -// the initialize data for create a new socket -// -typedef struct _SOCK_INIT_DATA { - SOCK_TYPE Type; - SOCK_STATE State; - - SOCKET *Parent; // the parent of this socket - UINT32 BackLog; // the connection limit for listening socket - UINT32 SndBufferSize; // the high warter mark of send buffer - UINT32 RcvBufferSize; // the high warter mark of receive buffer - VOID *Protocol; // the pointer to protocol function template - // wanted to install on socket - - SOCK_PROTO_HANDLER ProtoHandler; - - EFI_HANDLE DriverBinding; // the driver binding handle -} SOCK_INIT_DATA; - -// -// socket provided oprerations for low layer protocol -// - -// -// socket provided operations for user interface -// -VOID -SockSetState ( - IN SOCKET *Sock, - IN SOCK_STATE State - ); - -// -// when the connection establishment process for a Sock -// is finished low layer protocol calling this function -// to notify socket layer -// -VOID -SockConnEstablished ( - IN SOCKET *Sock - ); - -VOID -SockConnClosed ( - IN SOCKET *Sock - ); - -// -// called by low layer protocol to trim send buffer of -// Sock, when Count data is sent out completely -// -VOID -SockDataSent ( - IN SOCKET *Sock, - IN UINT32 Count - ); - -// -// called by low layer protocol to get Len of data from -// socket to send and copy it in Dest -// -UINT32 -SockGetDataToSend ( - IN SOCKET *Sock, - IN UINT32 Offset, - IN UINT32 Len, - IN UINT8 *Dest - ); - -// -// called by low layer protocol to notify socket no more data can be -// received -// -VOID -SockNoMoreData ( - IN SOCKET *Sock - ); - -// -// called by low layer protocol to append a NetBuffer -// to rcv buffer of sock -// -VOID -SockDataRcvd ( - IN SOCKET *Sock, - IN NET_BUF *NetBuffer, - IN UINT32 UrgLen - ); - -UINT32 -SockGetFreeSpace ( - IN SOCKET *Sock, - IN UINT32 Which - ); - -SOCKET * -SockClone ( - IN SOCKET *Sock - ); - -VOID -SockRcvdErr ( - IN SOCKET *Sock, - IN EFI_STATUS Error - ); - -// -// the socket structure representing a network service access point -// -struct _SOCKET { - - // - // socket description information - // - UINT32 Signature; - EFI_HANDLE SockHandle; // the virtual handle of the socket - EFI_HANDLE DriverBinding; // socket't driver binding protocol - EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - SOCK_CONFIGURE_STATE ConfigureState; - SOCK_TYPE Type; - SOCK_STATE State; - UINT16 Flag; - NET_LOCK Lock; // the lock of socket - SOCK_BUFFER SndBuffer; // send buffer of application's data - SOCK_BUFFER RcvBuffer; // receive buffer of received data - EFI_STATUS SockError; // the error returned by low layer protocol - BOOLEAN IsDestroyed; - - // - // fields used to manage the connection request - // - UINT32 BackLog; // the limit of connection to this socket - UINT32 ConnCnt; // the current count of connections to it - SOCKET *Parent; // listening parent that accept the connection - NET_LIST_ENTRY ConnectionList; // the connections maintained by this socket - // - // the queue to buffer application's asynchronous token - // - NET_LIST_ENTRY ListenTokenList; - NET_LIST_ENTRY RcvTokenList; - NET_LIST_ENTRY SndTokenList; - NET_LIST_ENTRY ProcessingSndTokenList; - - SOCK_COMPLETION_TOKEN *ConnectionToken; // app's token to signal if connected - SOCK_COMPLETION_TOKEN *CloseToken; // app's token to signal if closed - - // - // interface for low level protocol - // - SOCK_PROTO_HANDLER ProtoHandler; // the request handler of protocol - UINT8 ProtoReserved[PROTO_RESERVED_LEN]; // Data fields reserved for protocol - union { - EFI_TCP4_PROTOCOL TcpProtocol; - EFI_UDP4_PROTOCOL UdpProtocol; - } NetProtocol; -}; - -// -// the token structure buffered in socket layer -// -typedef struct _SOCK_TOKEN { - NET_LIST_ENTRY TokenList; // the entry to add in the token list - SOCK_COMPLETION_TOKEN *Token; // The application's token - UINT32 RemainDataLen; // unprocessed data length - SOCKET *Sock; // the poninter to the socket this token - // belongs to -} SOCK_TOKEN; - -// -// reserved data to access the NET_BUF delivered by UDP driver -// -typedef struct _UDP_RSV_DATA { - EFI_TIME TimeStamp; - EFI_UDP4_SESSION_DATA Session; -} UDP_RSV_DATA; - -// -// reserved data to access the NET_BUF delivered by TCP driver -// -typedef struct _TCP_RSV_DATA { - UINT32 UrgLen; -} TCP_RSV_DATA; - -// -// call it to creat a socket and attach it to a PCB -// -SOCKET * -SockCreateChild ( - IN SOCK_INIT_DATA *SockInitData, - IN VOID *ProtoData, - IN UINT32 Len - ); - -// -// call it to destroy a socket and its related PCB -// -EFI_STATUS -SockDestroyChild ( - IN SOCKET *Sock - ); - -// -// call it to configure a socket and its related PCB -// -EFI_STATUS -SockConfigure ( - IN SOCKET *Sock, - IN VOID *ConfigData - ); - -// -// call it to connect a socket to the peer -// -EFI_STATUS -SockConnect ( - IN SOCKET *Sock, - IN VOID *Token - ); - -// -// call it to issue an asynchronous listen token to the socket -// -EFI_STATUS -SockAccept ( - IN SOCKET *Sock, - IN VOID *Token - ); - -// -// Call it to send data using this socket -// -EFI_STATUS -SockSend ( - IN SOCKET *Sock, - IN VOID *Token - ); - -// -// Call it to receive data from this socket -// -EFI_STATUS -SockRcv ( - IN SOCKET *Sock, - IN VOID *Token - ); - -// -// Call it to flush a socket -// -EFI_STATUS -SockFlush ( - IN SOCKET *Sock - ); - -// -// Call it to close a socket in the light of policy in Token -// -EFI_STATUS -SockClose ( - IN SOCKET *Sock, - IN VOID *Token, - IN BOOLEAN OnAbort - ); - -// -// Call it to get the mode data of low layer protocol -// -EFI_STATUS -SockGetMode ( - IN SOCKET *Sock, - IN VOID *Mode - ); - -// -// call it to add this socket instance into a group -// -EFI_STATUS -SockGroup ( - IN SOCKET *Sock, - IN VOID *GroupInfo - ); - -// -// call it to add a route entry for this socket instance -// -EFI_STATUS -SockRoute ( - IN SOCKET *Sock, - IN VOID *RouteInfo - ); - -// -// Supporting function to operate on socket buffer -// -NET_BUF * -SockBufFirst ( - IN SOCK_BUFFER *Sockbuf - ); - -NET_BUF * -SockBufNext ( - IN SOCK_BUFFER *Sockbuf, - IN NET_BUF *SockEntry - ); - -#endif +#include +#include +#include + +#define SOCK_SND_BUF 0 +#define SOCK_RCV_BUF 1 + +#define SOCK_BUFF_LOW_WATER 2 * 1024 +#define SOCK_RCV_BUFF_SIZE 8 * 1024 +#define SOCK_SND_BUFF_SIZE 8 * 1024 +#define SOCK_BACKLOG 5 + +#define PROTO_RESERVED_LEN 20 + +#define SO_NO_MORE_DATA 0x0001 + +// +// +// +// When a socket is created it enters into SO_UNCONFIGURED, +// no actions can be taken on this socket, only after calling +// SockConfigure. The state transition diagram of socket is +// as following: +// +// SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING +// ^ | | +// | ---> SO_LISTENING | +// | | +// |------------------SO_DISCONNECTING<-- SO_CONNECTED +// +// A passive socket can only go into SO_LISTENING and +// SO_UNCONFIGURED state. SO_XXXING state is a middle state +// when a socket is undergoing a protocol procedure such +// as requesting a TCP connection. +// +// +// +typedef enum { + SO_CLOSED = 0, + SO_LISTENING, + SO_CONNECTING, + SO_CONNECTED, + SO_DISCONNECTING +} SOCK_STATE; + +typedef enum { + SO_UNCONFIGURED = 0, + SO_CONFIGURED_ACTIVE, + SO_CONFIGURED_PASSIVE, + SO_NO_MAPPING +} SOCK_CONFIGURE_STATE; + +#define SOCK_NO_MORE_DATA(Sock) ((Sock)->Flag |= SO_NO_MORE_DATA) + +#define SOCK_IS_UNCONFIGURED(Sock) ((Sock)->ConfigureState == SO_UNCONFIGURED) + +#define SOCK_IS_CONFIGURED(Sock) \ + (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \ + ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)) + +#define SOCK_IS_CONFIGURED_ACTIVE(Sock) \ + ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) + +#define SOCK_IS_CONNECTED_PASSIVE(Sock) \ + ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE) + +#define SOCK_IS_NO_MAPPING(Sock) \ + ((Sock)->ConfigureState == SO_NO_MAPPING) + +#define SOCK_IS_CLOSED(Sock) ((Sock)->State == SO_CLOSED) + +#define SOCK_IS_LISTENING(Sock) ((Sock)->State == SO_LISTENING) + +#define SOCK_IS_CONNECTING(Sock) ((Sock)->State == SO_CONNECTING) + +#define SOCK_IS_CONNECTED(Sock) ((Sock)->State == SO_CONNECTED) + +#define SOCK_IS_DISCONNECTING(Sock) ((Sock)->State == SO_DISCONNECTING) + +#define SOCK_IS_NO_MORE_DATA(Sock) (0 != ((Sock)->Flag & SO_NO_MORE_DATA)) + +#define SOCK_SIGNATURE EFI_SIGNATURE_32 ('S', 'O', 'C', 'K') + +#define SOCK_FROM_THIS(a) CR ((a), SOCKET, NetProtocol, SOCK_SIGNATURE) + +#define SET_RCV_BUFFSIZE(Sock, Size) ((Sock)->RcvBuffer.HighWater = (Size)) + +#define GET_RCV_BUFFSIZE(Sock) ((Sock)->RcvBuffer.HighWater) + +#define GET_RCV_DATASIZE(Sock) (((Sock)->RcvBuffer.DataQueue)->BufSize) + +#define SET_SND_BUFFSIZE(Sock, Size) ((Sock)->SndBuffer.HighWater = (Size)) + +#define GET_SND_BUFFSIZE(Sock) ((Sock)->SndBuffer.HighWater) + +#define GET_SND_DATASIZE(Sock) (((Sock)->SndBuffer.DataQueue)->BufSize) + +#define SET_BACKLOG(Sock, Value) ((Sock)->BackLog = (Value)) + +#define GET_BACKLOG(Sock) ((Sock)->BackLog) + +#define SOCK_ERROR(Sock, Error) ((Sock)->SockError = (Error)) + +#define SND_BUF_HDR_LEN(Sock) \ + ((SockBufFirst (&((Sock)->SndBuffer)))->TotalSize) + +#define RCV_BUF_HDR_LEN(Sock) \ + ((SockBufFirst (&((Sock)->RcvBuffer)))->TotalSize) + +#define SOCK_FROM_TOKEN(Token) (((SOCK_TOKEN *) (Token))->Sock) + +#define PROTO_TOKEN_FORM_SOCK(SockToken, Type) \ + ((Type *) (((SOCK_TOKEN *) (SockToken))->Token)) + +typedef struct _SOCKET SOCKET; + +typedef struct _SOCK_COMPLETION_TOKEN { + EFI_EVENT Event; + EFI_STATUS Status; +} SOCK_COMPLETION_TOKEN; + +typedef struct _SOCK_IO_TOKEN { + SOCK_COMPLETION_TOKEN Token; + union { + VOID *RxData; + VOID *TxData; + } Packet; +} SOCK_IO_TOKEN; + +// +// the request issued from socket layer to protocol layer +// +typedef enum { + SOCK_ATTACH, // attach current socket to a new PCB + SOCK_DETACH, // detach current socket from the PCB + SOCK_CONFIGURE, // configure attached PCB + SOCK_FLUSH, // flush attached PCB + SOCK_SND, // need protocol to send something + SOCK_SNDPUSH, // need protocol to send pushed data + SOCK_SNDURG, // need protocol to send urgent data + SOCK_CONSUMED, // application has retrieved data from socket + SOCK_CONNECT, // need to connect to a peer + SOCK_CLOSE, // need to close the protocol process + SOCK_ABORT, // need to reset the protocol process + SOCK_POLL, // need to poll to the protocol layer + SOCK_ROUTE, // need to add a route information + SOCK_MODE, // need to get the mode data of the protocol + SOCK_GROUP // need to join a mcast group +} SOCK_REQUEST; + +// +// the socket type +// +typedef enum { + SOCK_DGRAM, // this socket providing datagram service + SOCK_STREAM // this socket providing stream service +} SOCK_TYPE; + +// +// the handler of protocol for request from socket +// +typedef +EFI_STATUS +(*SOCK_PROTO_HANDLER) ( + IN SOCKET * Socket, // the socket issuing the request to protocol + IN SOCK_REQUEST Request, // the request issued by socket + IN VOID *RequestData // the request related data + ); + +// +// the buffer structure of rcvd data and send data used by socket +// +typedef struct _SOCK_BUFFER { + UINT32 HighWater; // the buffersize upper limit of sock_buffer + UINT32 LowWater; // the low warter mark of sock_buffer + NET_BUF_QUEUE *DataQueue; // the queue to buffer data +} SOCK_BUFFER; + +// +// the initialize data for create a new socket +// +typedef struct _SOCK_INIT_DATA { + SOCK_TYPE Type; + SOCK_STATE State; + + SOCKET *Parent; // the parent of this socket + UINT32 BackLog; // the connection limit for listening socket + UINT32 SndBufferSize; // the high warter mark of send buffer + UINT32 RcvBufferSize; // the high warter mark of receive buffer + VOID *Protocol; // the pointer to protocol function template + // wanted to install on socket + + SOCK_PROTO_HANDLER ProtoHandler; + + EFI_HANDLE DriverBinding; // the driver binding handle +} SOCK_INIT_DATA; + +// +// socket provided oprerations for low layer protocol +// + +// +// socket provided operations for user interface +// +VOID +SockSetState ( + IN SOCKET *Sock, + IN SOCK_STATE State + ); + +// +// when the connection establishment process for a Sock +// is finished low layer protocol calling this function +// to notify socket layer +// +VOID +SockConnEstablished ( + IN SOCKET *Sock + ); + +VOID +SockConnClosed ( + IN SOCKET *Sock + ); + +// +// called by low layer protocol to trim send buffer of +// Sock, when Count data is sent out completely +// +VOID +SockDataSent ( + IN SOCKET *Sock, + IN UINT32 Count + ); + +// +// called by low layer protocol to get Len of data from +// socket to send and copy it in Dest +// +UINT32 +SockGetDataToSend ( + IN SOCKET *Sock, + IN UINT32 Offset, + IN UINT32 Len, + IN UINT8 *Dest + ); + +// +// called by low layer protocol to notify socket no more data can be +// received +// +VOID +SockNoMoreData ( + IN SOCKET *Sock + ); + +// +// called by low layer protocol to append a NetBuffer +// to rcv buffer of sock +// +VOID +SockDataRcvd ( + IN SOCKET *Sock, + IN NET_BUF *NetBuffer, + IN UINT32 UrgLen + ); + +UINT32 +SockGetFreeSpace ( + IN SOCKET *Sock, + IN UINT32 Which + ); + +SOCKET * +SockClone ( + IN SOCKET *Sock + ); + +VOID +SockRcvdErr ( + IN SOCKET *Sock, + IN EFI_STATUS Error + ); + +// +// the socket structure representing a network service access point +// +struct _SOCKET { + + // + // socket description information + // + UINT32 Signature; + EFI_HANDLE SockHandle; // the virtual handle of the socket + EFI_HANDLE DriverBinding; // socket't driver binding protocol + EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + SOCK_CONFIGURE_STATE ConfigureState; + SOCK_TYPE Type; + SOCK_STATE State; + UINT16 Flag; + NET_LOCK Lock; // the lock of socket + SOCK_BUFFER SndBuffer; // send buffer of application's data + SOCK_BUFFER RcvBuffer; // receive buffer of received data + EFI_STATUS SockError; // the error returned by low layer protocol + BOOLEAN IsDestroyed; + + // + // fields used to manage the connection request + // + UINT32 BackLog; // the limit of connection to this socket + UINT32 ConnCnt; // the current count of connections to it + SOCKET *Parent; // listening parent that accept the connection + NET_LIST_ENTRY ConnectionList; // the connections maintained by this socket + // + // the queue to buffer application's asynchronous token + // + NET_LIST_ENTRY ListenTokenList; + NET_LIST_ENTRY RcvTokenList; + NET_LIST_ENTRY SndTokenList; + NET_LIST_ENTRY ProcessingSndTokenList; + + SOCK_COMPLETION_TOKEN *ConnectionToken; // app's token to signal if connected + SOCK_COMPLETION_TOKEN *CloseToken; // app's token to signal if closed + + // + // interface for low level protocol + // + SOCK_PROTO_HANDLER ProtoHandler; // the request handler of protocol + UINT8 ProtoReserved[PROTO_RESERVED_LEN]; // Data fields reserved for protocol + union { + EFI_TCP4_PROTOCOL TcpProtocol; + EFI_UDP4_PROTOCOL UdpProtocol; + } NetProtocol; +}; + +// +// the token structure buffered in socket layer +// +typedef struct _SOCK_TOKEN { + NET_LIST_ENTRY TokenList; // the entry to add in the token list + SOCK_COMPLETION_TOKEN *Token; // The application's token + UINT32 RemainDataLen; // unprocessed data length + SOCKET *Sock; // the poninter to the socket this token + // belongs to +} SOCK_TOKEN; + +// +// reserved data to access the NET_BUF delivered by UDP driver +// +typedef struct _UDP_RSV_DATA { + EFI_TIME TimeStamp; + EFI_UDP4_SESSION_DATA Session; +} UDP_RSV_DATA; + +// +// reserved data to access the NET_BUF delivered by TCP driver +// +typedef struct _TCP_RSV_DATA { + UINT32 UrgLen; +} TCP_RSV_DATA; + +// +// call it to creat a socket and attach it to a PCB +// +SOCKET * +SockCreateChild ( + IN SOCK_INIT_DATA *SockInitData, + IN VOID *ProtoData, + IN UINT32 Len + ); + +// +// call it to destroy a socket and its related PCB +// +EFI_STATUS +SockDestroyChild ( + IN SOCKET *Sock + ); + +// +// call it to configure a socket and its related PCB +// +EFI_STATUS +SockConfigure ( + IN SOCKET *Sock, + IN VOID *ConfigData + ); + +// +// call it to connect a socket to the peer +// +EFI_STATUS +SockConnect ( + IN SOCKET *Sock, + IN VOID *Token + ); + +// +// call it to issue an asynchronous listen token to the socket +// +EFI_STATUS +SockAccept ( + IN SOCKET *Sock, + IN VOID *Token + ); + +// +// Call it to send data using this socket +// +EFI_STATUS +SockSend ( + IN SOCKET *Sock, + IN VOID *Token + ); + +// +// Call it to receive data from this socket +// +EFI_STATUS +SockRcv ( + IN SOCKET *Sock, + IN VOID *Token + ); + +// +// Call it to flush a socket +// +EFI_STATUS +SockFlush ( + IN SOCKET *Sock + ); + +// +// Call it to close a socket in the light of policy in Token +// +EFI_STATUS +SockClose ( + IN SOCKET *Sock, + IN VOID *Token, + IN BOOLEAN OnAbort + ); + +// +// Call it to get the mode data of low layer protocol +// +EFI_STATUS +SockGetMode ( + IN SOCKET *Sock, + IN VOID *Mode + ); + +// +// call it to add this socket instance into a group +// +EFI_STATUS +SockGroup ( + IN SOCKET *Sock, + IN VOID *GroupInfo + ); + +// +// call it to add a route entry for this socket instance +// +EFI_STATUS +SockRoute ( + IN SOCKET *Sock, + IN VOID *RouteInfo + ); + +// +// Supporting function to operate on socket buffer +// +NET_BUF * +SockBufFirst ( + IN SOCK_BUFFER *Sockbuf + ); + +NET_BUF * +SockBufNext ( + IN SOCK_BUFFER *Sockbuf, + IN NET_BUF *SockEntry + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c index bbd5a30a7b..a8185b0b92 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c @@ -22,7 +22,8 @@ Abstract: UINT16 mTcp4RandomPort; -extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName; +extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2; TCP4_HEARTBEAT_TIMER mTcp4Timer = { NULL, @@ -176,14 +177,13 @@ Returns: // // Install the TCP4 Driver Binding Protocol // - Status = EfiLibInstallAllDriverProtocols ( + Status = EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, &mTcp4DriverBinding, ImageHandle, &gTcp4ComponentName, - NULL, - NULL + &gTcp4ComponentName2 ); ASSERT_EFI_ERROR (Status); // diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h index af3444ef58..28fe53dc5a 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h @@ -1,141 +1,141 @@ -/** @file - -Copyright (c) 2005 - 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: - - Tcp4Driver.h - -Abstract: - - -**/ - -#ifndef _TCP4_DRIVER_H_ -#define _TCP4_DRIVER_H_ - -#include -#include - -#define TCP4_DRIVER_SIGNATURE EFI_SIGNATURE_32 ('T', 'C', 'P', '4') - -#define TCP4_PORT_KNOWN 1024 -#define TCP4_PORT_USER_RESERVED 65535 - -typedef struct _TCP4_HEARTBEAT_TIMER { - EFI_EVENT TimerEvent; - INTN RefCnt; -} TCP4_HEARTBEAT_TIMER; - -typedef struct _TCP4_SERVICE_DATA { - UINT32 Signature; - EFI_HANDLE ControllerHandle; - IP_IO *IpIo; // IP Io consumed by TCP4 - EFI_SERVICE_BINDING_PROTOCOL Tcp4ServiceBinding; - EFI_HANDLE DriverBindingHandle; - CHAR16 *MacString; -} TCP4_SERVICE_DATA; - -// -// Prototype for TCP4 driver Rcv callback function registered to IP_IO -// -VOID -Tcp4RxCallback ( - IN EFI_STATUS Status, - IN ICMP_ERROR IcmpErr, - IN EFI_NET_SESSION_DATA *NetSession, - IN NET_BUF *Pkt, - IN VOID *Context OPTIONAL - ); - -INTN -TcpSendIpPacket ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dest - ); - -EFI_STATUS -Tcp4Dispatcher ( - IN SOCKET *Sock, - IN SOCK_REQUEST Request, - IN VOID *Data OPTIONAL - ); - -typedef struct _TCP4_PROTO_DATA { - TCP4_SERVICE_DATA *TcpService; - TCP_CB *TcpPcb; -} TCP4_PROTO_DATA; - -#define TCP4_FROM_THIS(a) \ - CR ( \ - (a), \ - TCP4_SERVICE_DATA, \ - Tcp4ServiceBinding, \ - TCP4_DRIVER_SIGNATURE \ - ) - -// -// Function prototype for the driver's entry point -// -EFI_STATUS -EFIAPI -Tcp4DriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); - -// -// Function prototypes for the Drivr Binding Protocol -// -EFI_STATUS -EFIAPI -Tcp4DriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -Tcp4DriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -Tcp4DriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -// -// Function ptototypes for the ServiceBinding Prococol -// -EFI_STATUS -EFIAPI -Tcp4ServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE *ChildHandle - ); - -EFI_STATUS -EFIAPI -Tcp4ServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ); - -#endif +/** @file + +Copyright (c) 2005 - 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: + + Tcp4Driver.h + +Abstract: + + +**/ + +#ifndef _TCP4_DRIVER_H_ +#define _TCP4_DRIVER_H_ + +#include +#include + +#define TCP4_DRIVER_SIGNATURE EFI_SIGNATURE_32 ('T', 'C', 'P', '4') + +#define TCP4_PORT_KNOWN 1024 +#define TCP4_PORT_USER_RESERVED 65535 + +typedef struct _TCP4_HEARTBEAT_TIMER { + EFI_EVENT TimerEvent; + INTN RefCnt; +} TCP4_HEARTBEAT_TIMER; + +typedef struct _TCP4_SERVICE_DATA { + UINT32 Signature; + EFI_HANDLE ControllerHandle; + IP_IO *IpIo; // IP Io consumed by TCP4 + EFI_SERVICE_BINDING_PROTOCOL Tcp4ServiceBinding; + EFI_HANDLE DriverBindingHandle; + CHAR16 *MacString; +} TCP4_SERVICE_DATA; + +// +// Prototype for TCP4 driver Rcv callback function registered to IP_IO +// +VOID +Tcp4RxCallback ( + IN EFI_STATUS Status, + IN ICMP_ERROR IcmpErr, + IN EFI_NET_SESSION_DATA *NetSession, + IN NET_BUF *Pkt, + IN VOID *Context OPTIONAL + ); + +INTN +TcpSendIpPacket ( + IN TCP_CB *Tcb, + IN NET_BUF *Nbuf, + IN UINT32 Src, + IN UINT32 Dest + ); + +EFI_STATUS +Tcp4Dispatcher ( + IN SOCKET *Sock, + IN SOCK_REQUEST Request, + IN VOID *Data OPTIONAL + ); + +typedef struct _TCP4_PROTO_DATA { + TCP4_SERVICE_DATA *TcpService; + TCP_CB *TcpPcb; +} TCP4_PROTO_DATA; + +#define TCP4_FROM_THIS(a) \ + CR ( \ + (a), \ + TCP4_SERVICE_DATA, \ + Tcp4ServiceBinding, \ + TCP4_DRIVER_SIGNATURE \ + ) + +// +// Function prototype for the driver's entry point +// +EFI_STATUS +EFIAPI +Tcp4DriverEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +// +// Function prototypes for the Drivr Binding Protocol +// +EFI_STATUS +EFIAPI +Tcp4DriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL * This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +Tcp4DriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL * This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +Tcp4DriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +// +// Function ptototypes for the ServiceBinding Prococol +// +EFI_STATUS +EFIAPI +Tcp4ServiceBindingCreateChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE *ChildHandle + ); + +EFI_STATUS +EFIAPI +Tcp4ServiceBindingDestroyChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE ChildHandle + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h index be99f3bf47..5bfdf2612d 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h @@ -1,358 +1,358 @@ -/** @file - -Copyright (c) 2005 - 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: - - Tcp4Func.h - -Abstract: - - -**/ - -#ifndef _TCP4_FUNC_H_ -#define _TCP4_FUNC_H_ - -// -// Declaration of all the functions in TCP -// protocol. It is intended to keep tcp.h -// clear. -// - -// -// Functions in tcp.c -// -BOOLEAN -TcpFindTcbByPeer ( - IN EFI_IPv4_ADDRESS *Addr, - IN TCP_PORTNO Port - ); - -TCP_CB * -TcpLocateTcb ( - IN TCP_PORTNO LocalPort, - IN UINT32 LocalIp, - IN TCP_PORTNO RemotePort, - IN UINT32 RemoteIp, - IN BOOLEAN Syn - ); - -INTN -TcpInsertTcb ( - IN TCP_CB *Tcb - ); - -TCP_CB * -TcpCloneTcb ( - IN TCP_CB *Tcb - ); - -TCP_SEQNO -TcpGetIss ( - VOID - ); - -VOID -TcpInitTcbLocal ( - IN TCP_CB *Tcb - ); - -VOID -TcpInitTcbPeer ( - IN TCP_CB *Tcb, - IN TCP_SEG *Seg, - IN TCP_OPTION *Opt - ); - -UINT16 -TcpGetRcvMss ( - IN SOCKET *Sock - ); - -VOID -TcpSetState ( - IN TCP_CB *Tcb, - IN UINT8 State - ); - -// -// Functions in Tcp4Output.c -// -INTN -TcpSendIpPacket ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dst - ); - -INTN -TcpToSendData ( - IN TCP_CB *Tcb, - IN INTN Force - ); - -VOID -TcpToSendAck ( - IN TCP_CB *Tcb - ); - -VOID -TcpSendAck ( - IN TCP_CB *Tcb - ); - -INTN -TcpSendZeroProbe ( - IN TCP_CB *Tcb - ); - -INTN -TcpDeliverData ( - IN TCP_CB *Tcb - ); - -INTN -TcpSendReset ( - IN TCP_CB *Tcb, - IN TCP_HEAD *Head, - IN INT32 Len, - IN UINT32 Local, - IN UINT32 Remote - ); - -UINT32 -TcpRcvWinOld ( - IN TCP_CB *Tcb - ); - -UINT32 -TcpRcvWinNow ( - IN TCP_CB *Tcb - ); - -INTN -TcpRetransmit ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq - ); - -UINT32 -TcpDataToSend ( - IN TCP_CB *Tcb, - IN INTN Force - ); - -INTN -TcpVerifySegment ( - IN NET_BUF *Nbuf - ); - -INTN -TcpCheckSndQue ( - IN NET_LIST_ENTRY *Head - ); - -NET_BUF * -TcpGetSegmentSndQue ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ); - -NET_BUF * -TcpGetSegmentSock ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ); - -NET_BUF * -TcpGetSegment ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ); - -TCP_SEQNO -TcpGetMaxSndNxt ( - IN TCP_CB *Tcb - ); - -// -// Functions from Tcp4Input.c -// -VOID -TcpIcmpInput ( - IN NET_BUF *Nbuf, - IN ICMP_ERROR IcmpErr, - IN UINT32 Src, - IN UINT32 Dst - ); - -INTN -TcpInput ( - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dst - ); - -INTN -TcpSeqAcceptable ( - IN TCP_CB *Tcb, - IN TCP_SEG *Seg - ); - -VOID -TcpFastRecover ( - IN TCP_CB *Tcb, - IN TCP_SEG *Seg - ); - -VOID -TcpFastLossRecover ( - IN TCP_CB *Tcb, - IN TCP_SEG *Seg - ); - -VOID -TcpComputeRtt ( - IN TCP_CB *Tcb, - IN UINT32 Measure - ); - -INTN -TcpTrimInWnd ( - IN TCP_CB *Tcb, - IN NET_BUF *Buf - ); - -VOID -TcpQueueData ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ); - -VOID -TcpAdjustSndQue ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Ack - ); - -// -// Functions from Tcp4Misc.c -// -UINT16 -TcpChecksum ( - IN NET_BUF *Buf, - IN UINT16 HeadChecksum - ); - -TCP_SEG * -TcpFormatNetbuf ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ); - -VOID -TcpOnAppConnect ( - IN TCP_CB *Tcb - ); - -INTN -TcpOnAppConsume ( - IN TCP_CB *Tcb - ); - -VOID -TcpOnAppClose ( - IN TCP_CB *Tcb - ); - -INTN -TcpOnAppSend ( - IN TCP_CB *Tcb - ); - -VOID -TcpOnAppAbort ( - IN TCP_CB *Tcb - ); - -VOID -TcpResetConnection ( - IN TCP_CB *Tcb - ); - -// -// Functions in Tcp4Timer.c -// -VOID -TcpClose ( - IN TCP_CB *Tcb - ); - -VOID -EFIAPI -TcpTicking ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -VOID -TcpSetTimer ( - IN TCP_CB *Tcb, - IN UINT16 Timer, - IN UINT32 TimeOut - ); - -VOID -TcpClearTimer ( - IN TCP_CB *Tcb, - IN UINT16 Timer - ); - -VOID -TcpClearAllTimer ( - IN TCP_CB *Tcb - ); - -VOID -TcpSetProbeTimer ( - IN TCP_CB *Tcb - ); - -VOID -TcpSetKeepaliveTimer ( - IN TCP_CB *Tcb - ); - -VOID -TcpBackoffRto ( - IN TCP_CB *Tcb - ); - -EFI_STATUS -TcpSetVariableData ( - IN TCP4_SERVICE_DATA *Tcp4Service - ); - -VOID -TcpClearVariableData ( - IN TCP4_SERVICE_DATA *Tcp4Service - ); - -EFI_STATUS -TcpInstallDevicePath ( - IN SOCKET *Sock - ); - -#endif +/** @file + +Copyright (c) 2005 - 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: + + Tcp4Func.h + +Abstract: + + +**/ + +#ifndef _TCP4_FUNC_H_ +#define _TCP4_FUNC_H_ + +// +// Declaration of all the functions in TCP +// protocol. It is intended to keep tcp.h +// clear. +// + +// +// Functions in tcp.c +// +BOOLEAN +TcpFindTcbByPeer ( + IN EFI_IPv4_ADDRESS *Addr, + IN TCP_PORTNO Port + ); + +TCP_CB * +TcpLocateTcb ( + IN TCP_PORTNO LocalPort, + IN UINT32 LocalIp, + IN TCP_PORTNO RemotePort, + IN UINT32 RemoteIp, + IN BOOLEAN Syn + ); + +INTN +TcpInsertTcb ( + IN TCP_CB *Tcb + ); + +TCP_CB * +TcpCloneTcb ( + IN TCP_CB *Tcb + ); + +TCP_SEQNO +TcpGetIss ( + VOID + ); + +VOID +TcpInitTcbLocal ( + IN TCP_CB *Tcb + ); + +VOID +TcpInitTcbPeer ( + IN TCP_CB *Tcb, + IN TCP_SEG *Seg, + IN TCP_OPTION *Opt + ); + +UINT16 +TcpGetRcvMss ( + IN SOCKET *Sock + ); + +VOID +TcpSetState ( + IN TCP_CB *Tcb, + IN UINT8 State + ); + +// +// Functions in Tcp4Output.c +// +INTN +TcpSendIpPacket ( + IN TCP_CB *Tcb, + IN NET_BUF *Nbuf, + IN UINT32 Src, + IN UINT32 Dst + ); + +INTN +TcpToSendData ( + IN TCP_CB *Tcb, + IN INTN Force + ); + +VOID +TcpToSendAck ( + IN TCP_CB *Tcb + ); + +VOID +TcpSendAck ( + IN TCP_CB *Tcb + ); + +INTN +TcpSendZeroProbe ( + IN TCP_CB *Tcb + ); + +INTN +TcpDeliverData ( + IN TCP_CB *Tcb + ); + +INTN +TcpSendReset ( + IN TCP_CB *Tcb, + IN TCP_HEAD *Head, + IN INT32 Len, + IN UINT32 Local, + IN UINT32 Remote + ); + +UINT32 +TcpRcvWinOld ( + IN TCP_CB *Tcb + ); + +UINT32 +TcpRcvWinNow ( + IN TCP_CB *Tcb + ); + +INTN +TcpRetransmit ( + IN TCP_CB *Tcb, + IN TCP_SEQNO Seq + ); + +UINT32 +TcpDataToSend ( + IN TCP_CB *Tcb, + IN INTN Force + ); + +INTN +TcpVerifySegment ( + IN NET_BUF *Nbuf + ); + +INTN +TcpCheckSndQue ( + IN NET_LIST_ENTRY *Head + ); + +NET_BUF * +TcpGetSegmentSndQue ( + IN TCP_CB *Tcb, + IN TCP_SEQNO Seq, + IN UINT32 Len + ); + +NET_BUF * +TcpGetSegmentSock ( + IN TCP_CB *Tcb, + IN TCP_SEQNO Seq, + IN UINT32 Len + ); + +NET_BUF * +TcpGetSegment ( + IN TCP_CB *Tcb, + IN TCP_SEQNO Seq, + IN UINT32 Len + ); + +TCP_SEQNO +TcpGetMaxSndNxt ( + IN TCP_CB *Tcb + ); + +// +// Functions from Tcp4Input.c +// +VOID +TcpIcmpInput ( + IN NET_BUF *Nbuf, + IN ICMP_ERROR IcmpErr, + IN UINT32 Src, + IN UINT32 Dst + ); + +INTN +TcpInput ( + IN NET_BUF *Nbuf, + IN UINT32 Src, + IN UINT32 Dst + ); + +INTN +TcpSeqAcceptable ( + IN TCP_CB *Tcb, + IN TCP_SEG *Seg + ); + +VOID +TcpFastRecover ( + IN TCP_CB *Tcb, + IN TCP_SEG *Seg + ); + +VOID +TcpFastLossRecover ( + IN TCP_CB *Tcb, + IN TCP_SEG *Seg + ); + +VOID +TcpComputeRtt ( + IN TCP_CB *Tcb, + IN UINT32 Measure + ); + +INTN +TcpTrimInWnd ( + IN TCP_CB *Tcb, + IN NET_BUF *Buf + ); + +VOID +TcpQueueData ( + IN TCP_CB *Tcb, + IN NET_BUF *Nbuf + ); + +VOID +TcpAdjustSndQue ( + IN TCP_CB *Tcb, + IN TCP_SEQNO Ack + ); + +// +// Functions from Tcp4Misc.c +// +UINT16 +TcpChecksum ( + IN NET_BUF *Buf, + IN UINT16 HeadChecksum + ); + +TCP_SEG * +TcpFormatNetbuf ( + IN TCP_CB *Tcb, + IN NET_BUF *Nbuf + ); + +VOID +TcpOnAppConnect ( + IN TCP_CB *Tcb + ); + +INTN +TcpOnAppConsume ( + IN TCP_CB *Tcb + ); + +VOID +TcpOnAppClose ( + IN TCP_CB *Tcb + ); + +INTN +TcpOnAppSend ( + IN TCP_CB *Tcb + ); + +VOID +TcpOnAppAbort ( + IN TCP_CB *Tcb + ); + +VOID +TcpResetConnection ( + IN TCP_CB *Tcb + ); + +// +// Functions in Tcp4Timer.c +// +VOID +TcpClose ( + IN TCP_CB *Tcb + ); + +VOID +EFIAPI +TcpTicking ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +VOID +TcpSetTimer ( + IN TCP_CB *Tcb, + IN UINT16 Timer, + IN UINT32 TimeOut + ); + +VOID +TcpClearTimer ( + IN TCP_CB *Tcb, + IN UINT16 Timer + ); + +VOID +TcpClearAllTimer ( + IN TCP_CB *Tcb + ); + +VOID +TcpSetProbeTimer ( + IN TCP_CB *Tcb + ); + +VOID +TcpSetKeepaliveTimer ( + IN TCP_CB *Tcb + ); + +VOID +TcpBackoffRto ( + IN TCP_CB *Tcb + ); + +EFI_STATUS +TcpSetVariableData ( + IN TCP4_SERVICE_DATA *Tcp4Service + ); + +VOID +TcpClearVariableData ( + IN TCP4_SERVICE_DATA *Tcp4Service + ); + +EFI_STATUS +TcpInstallDevicePath ( + IN SOCKET *Sock + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h index 3e6575be92..3e0b9db498 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h @@ -1,175 +1,175 @@ -/** @file - -Copyright (c) 2005 - 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: - - Tcp4Main.h - -Abstract: - - -**/ - -#ifndef _TCP4_MAIN_H_ -#define _TCP4_MAIN_H_ - -#include "Socket.h" - -#include "Tcp4Proto.h" -#include "Tcp4Driver.h" - - -extern UINT16 mTcp4RandomPort; - -// -// Driver Produced Protocol Prototypes -// - -#define TCP4_DEBUG_ERROR(PrintArg) NET_DEBUG_ERROR ("Tcp", PrintArg) -#define TCP4_DEBUG_WARN(PrintArg) NET_DEBUG_WARNING ("Tcp", PrintArg) -#define TCP4_DEBUG_TRACE(PrintArg) NET_DEBUG_TRACE ("Tcp", PrintArg) - -// -// Function prototype for the Tcp4 socket request handler -// -EFI_STATUS -Tcp4Dispatcher ( - IN SOCKET *Sock, - IN SOCK_REQUEST Request, - IN VOID *Data OPTIONAL - ); - -typedef struct _TCP4_MODE_DATA { - EFI_TCP4_CONNECTION_STATE *Tcp4State; - EFI_TCP4_CONFIG_DATA *Tcp4ConfigData; - EFI_IP4_MODE_DATA *Ip4ModeData; - EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData; - EFI_SIMPLE_NETWORK_MODE *SnpModeData; -} TCP4_MODE_DATA; - -typedef struct _TCP4_ROUTE_INFO { - BOOLEAN DeleteRoute; - EFI_IPv4_ADDRESS *SubnetAddress; - EFI_IPv4_ADDRESS *SubnetMask; - EFI_IPv4_ADDRESS *GatewayAddress; -} TCP4_ROUTE_INFO; - -// -// Get the mode data of a TCP instance -// -EFI_STATUS -EFIAPI -Tcp4GetModeData ( - IN CONST EFI_TCP4_PROTOCOL * This, - OUT EFI_TCP4_CONNECTION_STATE * Tcp4State OPTIONAL, - OUT EFI_TCP4_CONFIG_DATA * Tcp4ConfigData OPTIONAL, - OUT EFI_IP4_MODE_DATA * Ip4ModeData OPTIONAL, - OUT EFI_MANAGED_NETWORK_CONFIG_DATA * MnpConfigData OPTIONAL, - OUT EFI_SIMPLE_NETWORK_MODE * SnpModeData OPTIONAL - ); - -// -// Initialize or reset a TCP instance -// -EFI_STATUS -EFIAPI -Tcp4Configure ( - IN EFI_TCP4_PROTOCOL * This, - IN EFI_TCP4_CONFIG_DATA * TcpConfigData OPTIONAL - ); - -// -// Add a route entry to the route table -// -EFI_STATUS -EFIAPI -Tcp4Routes ( - IN EFI_TCP4_PROTOCOL *This, - IN BOOLEAN DeleteRoute, - IN EFI_IPv4_ADDRESS *SubnetAddress, - IN EFI_IPv4_ADDRESS *SubnetMask, - IN EFI_IPv4_ADDRESS *GatewayAddress - ); - -// -// Issue an asynchronous connection establishment -// request to the peer -// -EFI_STATUS -EFIAPI -Tcp4Connect ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken - ); - -// -// Issue an asynchronous listent token to accept an -// incoming connection reques -// -EFI_STATUS -EFIAPI -Tcp4Accept ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_LISTEN_TOKEN *ListenToken - ); - -// -// Issue an asynchronous IO token to transmit some data -// through this TCP instance -// -EFI_STATUS -EFIAPI -Tcp4Transmit ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_IO_TOKEN *Token - ); - -// -// Issue an asynchronous IO token to receive some data -// through this TCP instance -// -EFI_STATUS -Tcp4Receive ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_IO_TOKEN *Token - ); - -// -// Issue an asynchronous CloseToken to close a TCP -// connection represented by instance -// -EFI_STATUS -EFIAPI -Tcp4Close ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CLOSE_TOKEN *CloseToken - ); - -// -// cancle an connect, listent or IO token -// -EFI_STATUS -EFIAPI -Tcp4Cancel ( - IN EFI_TCP4_PROTOCOL * This, - IN EFI_TCP4_COMPLETION_TOKEN * Token OPTIONAL - ); - -// -// poll data from NIC for receive -// -EFI_STATUS -EFIAPI -Tcp4Poll ( - IN EFI_TCP4_PROTOCOL *This - ); - -#endif +/** @file + +Copyright (c) 2005 - 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: + + Tcp4Main.h + +Abstract: + + +**/ + +#ifndef _TCP4_MAIN_H_ +#define _TCP4_MAIN_H_ + +#include "Socket.h" + +#include "Tcp4Proto.h" +#include "Tcp4Driver.h" + + +extern UINT16 mTcp4RandomPort; + +// +// Driver Produced Protocol Prototypes +// + +#define TCP4_DEBUG_ERROR(PrintArg) NET_DEBUG_ERROR ("Tcp", PrintArg) +#define TCP4_DEBUG_WARN(PrintArg) NET_DEBUG_WARNING ("Tcp", PrintArg) +#define TCP4_DEBUG_TRACE(PrintArg) NET_DEBUG_TRACE ("Tcp", PrintArg) + +// +// Function prototype for the Tcp4 socket request handler +// +EFI_STATUS +Tcp4Dispatcher ( + IN SOCKET *Sock, + IN SOCK_REQUEST Request, + IN VOID *Data OPTIONAL + ); + +typedef struct _TCP4_MODE_DATA { + EFI_TCP4_CONNECTION_STATE *Tcp4State; + EFI_TCP4_CONFIG_DATA *Tcp4ConfigData; + EFI_IP4_MODE_DATA *Ip4ModeData; + EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData; + EFI_SIMPLE_NETWORK_MODE *SnpModeData; +} TCP4_MODE_DATA; + +typedef struct _TCP4_ROUTE_INFO { + BOOLEAN DeleteRoute; + EFI_IPv4_ADDRESS *SubnetAddress; + EFI_IPv4_ADDRESS *SubnetMask; + EFI_IPv4_ADDRESS *GatewayAddress; +} TCP4_ROUTE_INFO; + +// +// Get the mode data of a TCP instance +// +EFI_STATUS +EFIAPI +Tcp4GetModeData ( + IN CONST EFI_TCP4_PROTOCOL * This, + OUT EFI_TCP4_CONNECTION_STATE * Tcp4State OPTIONAL, + OUT EFI_TCP4_CONFIG_DATA * Tcp4ConfigData OPTIONAL, + OUT EFI_IP4_MODE_DATA * Ip4ModeData OPTIONAL, + OUT EFI_MANAGED_NETWORK_CONFIG_DATA * MnpConfigData OPTIONAL, + OUT EFI_SIMPLE_NETWORK_MODE * SnpModeData OPTIONAL + ); + +// +// Initialize or reset a TCP instance +// +EFI_STATUS +EFIAPI +Tcp4Configure ( + IN EFI_TCP4_PROTOCOL * This, + IN EFI_TCP4_CONFIG_DATA * TcpConfigData OPTIONAL + ); + +// +// Add a route entry to the route table +// +EFI_STATUS +EFIAPI +Tcp4Routes ( + IN EFI_TCP4_PROTOCOL *This, + IN BOOLEAN DeleteRoute, + IN EFI_IPv4_ADDRESS *SubnetAddress, + IN EFI_IPv4_ADDRESS *SubnetMask, + IN EFI_IPv4_ADDRESS *GatewayAddress + ); + +// +// Issue an asynchronous connection establishment +// request to the peer +// +EFI_STATUS +EFIAPI +Tcp4Connect ( + IN EFI_TCP4_PROTOCOL *This, + IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken + ); + +// +// Issue an asynchronous listent token to accept an +// incoming connection reques +// +EFI_STATUS +EFIAPI +Tcp4Accept ( + IN EFI_TCP4_PROTOCOL *This, + IN EFI_TCP4_LISTEN_TOKEN *ListenToken + ); + +// +// Issue an asynchronous IO token to transmit some data +// through this TCP instance +// +EFI_STATUS +EFIAPI +Tcp4Transmit ( + IN EFI_TCP4_PROTOCOL *This, + IN EFI_TCP4_IO_TOKEN *Token + ); + +// +// Issue an asynchronous IO token to receive some data +// through this TCP instance +// +EFI_STATUS +Tcp4Receive ( + IN EFI_TCP4_PROTOCOL *This, + IN EFI_TCP4_IO_TOKEN *Token + ); + +// +// Issue an asynchronous CloseToken to close a TCP +// connection represented by instance +// +EFI_STATUS +EFIAPI +Tcp4Close ( + IN EFI_TCP4_PROTOCOL *This, + IN EFI_TCP4_CLOSE_TOKEN *CloseToken + ); + +// +// cancle an connect, listent or IO token +// +EFI_STATUS +EFIAPI +Tcp4Cancel ( + IN EFI_TCP4_PROTOCOL * This, + IN EFI_TCP4_COMPLETION_TOKEN * Token OPTIONAL + ); + +// +// poll data from NIC for receive +// +EFI_STATUS +EFIAPI +Tcp4Poll ( + IN EFI_TCP4_PROTOCOL *This + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h index cae0e885cf..ad856c777a 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h @@ -1,107 +1,107 @@ -/** @file - -Copyright (c) 2005 - 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: - - Tcp4Option.h - -Abstract: - - -**/ - -#ifndef _TCP4_OPTION_H_ -#define _TCP4_OPTION_H_ - -// -// The structure to store the parse option value. -// ParseOption only parse the options, don't process them. -// -typedef struct s_TCP_OPTION { - UINT8 Flag; // flag such as TCP_OPTION_RCVD_MSS - UINT8 WndScale; // the WndScale received - UINT16 Mss; // the Mss received - UINT32 TSVal; // the TSVal field in a timestamp option - UINT32 TSEcr; // the TSEcr field in a timestamp option -} TCP_OPTION; - -enum { - - // - // supported TCP option type and their length - // - TCP_OPTION_EOP = 0, // End Of oPtion - TCP_OPTION_NOP = 1, // No-Option. - TCP_OPTION_MSS = 2, // Maximum Segment Size - TCP_OPTION_WS = 3, // Window scale - TCP_OPTION_TS = 8, // Timestamp - TCP_OPTION_MSS_LEN = 4, // length of MSS option - TCP_OPTION_WS_LEN = 3, // length of window scale option - TCP_OPTION_TS_LEN = 10, // length of timestamp option - TCP_OPTION_WS_ALIGNED_LEN = 4, // length of window scale option, aligned - TCP_OPTION_TS_ALIGNED_LEN = 12, // length of timestamp option, aligned - - // - // recommend format of timestamp window scale - // option for fast process. - // - TCP_OPTION_TS_FAST = ((TCP_OPTION_NOP << 24) | - (TCP_OPTION_NOP << 16) | - (TCP_OPTION_TS << 8) | - TCP_OPTION_TS_LEN), - - TCP_OPTION_WS_FAST = ((TCP_OPTION_NOP << 24) | - (TCP_OPTION_WS << 16) | - (TCP_OPTION_WS_LEN << 8)), - - TCP_OPTION_MSS_FAST = ((TCP_OPTION_MSS << 24) | - (TCP_OPTION_MSS_LEN << 16)), - - // - // Other misc definations - // - TCP_OPTION_MAX_WS = 14, // Maxium window scale value - TCP_OPTION_MAX_WIN = 0xffff, // max window size in TCP header - TCP_OPTION_RCVD_MSS = 0x01, - TCP_OPTION_RCVD_WS = 0x02, - TCP_OPTION_RCVD_TS = 0x04 -}; - -UINT8 -TcpComputeScale ( - IN TCP_CB *Tcb - ); - -UINT16 -TcpSynBuildOption ( - IN TCP_CB *Tcb, - IN NET_BUF *Buf - ); - -UINT16 -TcpBuildOption ( - IN TCP_CB *Tcb, - IN NET_BUF *Buf - ); - -INTN -TcpParseOption ( - IN TCP_HEAD *Tcp, - IN TCP_OPTION *Option - ); - -UINT32 -TcpPawsOK ( - IN TCP_CB *Tcb, - IN UINT32 TSVal - ); - -#endif +/** @file + +Copyright (c) 2005 - 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: + + Tcp4Option.h + +Abstract: + + +**/ + +#ifndef _TCP4_OPTION_H_ +#define _TCP4_OPTION_H_ + +// +// The structure to store the parse option value. +// ParseOption only parse the options, don't process them. +// +typedef struct s_TCP_OPTION { + UINT8 Flag; // flag such as TCP_OPTION_RCVD_MSS + UINT8 WndScale; // the WndScale received + UINT16 Mss; // the Mss received + UINT32 TSVal; // the TSVal field in a timestamp option + UINT32 TSEcr; // the TSEcr field in a timestamp option +} TCP_OPTION; + +enum { + + // + // supported TCP option type and their length + // + TCP_OPTION_EOP = 0, // End Of oPtion + TCP_OPTION_NOP = 1, // No-Option. + TCP_OPTION_MSS = 2, // Maximum Segment Size + TCP_OPTION_WS = 3, // Window scale + TCP_OPTION_TS = 8, // Timestamp + TCP_OPTION_MSS_LEN = 4, // length of MSS option + TCP_OPTION_WS_LEN = 3, // length of window scale option + TCP_OPTION_TS_LEN = 10, // length of timestamp option + TCP_OPTION_WS_ALIGNED_LEN = 4, // length of window scale option, aligned + TCP_OPTION_TS_ALIGNED_LEN = 12, // length of timestamp option, aligned + + // + // recommend format of timestamp window scale + // option for fast process. + // + TCP_OPTION_TS_FAST = ((TCP_OPTION_NOP << 24) | + (TCP_OPTION_NOP << 16) | + (TCP_OPTION_TS << 8) | + TCP_OPTION_TS_LEN), + + TCP_OPTION_WS_FAST = ((TCP_OPTION_NOP << 24) | + (TCP_OPTION_WS << 16) | + (TCP_OPTION_WS_LEN << 8)), + + TCP_OPTION_MSS_FAST = ((TCP_OPTION_MSS << 24) | + (TCP_OPTION_MSS_LEN << 16)), + + // + // Other misc definations + // + TCP_OPTION_MAX_WS = 14, // Maxium window scale value + TCP_OPTION_MAX_WIN = 0xffff, // max window size in TCP header + TCP_OPTION_RCVD_MSS = 0x01, + TCP_OPTION_RCVD_WS = 0x02, + TCP_OPTION_RCVD_TS = 0x04 +}; + +UINT8 +TcpComputeScale ( + IN TCP_CB *Tcb + ); + +UINT16 +TcpSynBuildOption ( + IN TCP_CB *Tcb, + IN NET_BUF *Buf + ); + +UINT16 +TcpBuildOption ( + IN TCP_CB *Tcb, + IN NET_BUF *Buf + ); + +INTN +TcpParseOption ( + IN TCP_HEAD *Tcp, + IN TCP_OPTION *Option + ); + +UINT32 +TcpPawsOK ( + IN TCP_CB *Tcb, + IN UINT32 TSVal + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h index a35a51b3cc..cfefdf2ea3 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h @@ -1,355 +1,355 @@ -/** @file - -Copyright (c) 2005 - 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: - - Tcp4Proto.h - -Abstract: - - -**/ - -#ifndef _TCP4_PROTO_H_ -#define _TCP4_PROTO_H_ - -typedef struct _TCP_CB TCP_CB; - -#include "Tcp4Driver.h" -#include "Socket.h" -#include "Tcp4Option.h" - -// -// tcp states, Don't change their order, it is used as -// index to mTcpOutFlag and other macros -// -enum { - TCP_CLOSED = 0, - TCP_LISTEN, - TCP_SYN_SENT, - TCP_SYN_RCVD, - TCP_ESTABLISHED, - TCP_FIN_WAIT_1, - TCP_FIN_WAIT_2, - TCP_CLOSING, - TCP_TIME_WAIT, - TCP_CLOSE_WAIT, - TCP_LAST_ACK -}; - -// -// flags in the TCP header -// -enum { - - TCP_FLG_FIN = 0x01, - TCP_FLG_SYN = 0x02, - TCP_FLG_RST = 0x04, - TCP_FLG_PSH = 0x08, - TCP_FLG_ACK = 0x10, - TCP_FLG_URG = 0x20, - TCP_FLG_FLAG = 0x3F // mask for all the flags -}; - -enum { - - // - // TCP error status - // - TCP_CONNECT_REFUSED = -1, - TCP_CONNECT_RESET = -2, - TCP_CONNECT_CLOSED = -3, - - // - // Current congestion status as suggested by RFC3782. - // - TCP_CONGEST_RECOVER = 1, // during the NewReno fast recovery - TCP_CONGEST_LOSS = 2, // retxmit because of retxmit time out - TCP_CONGEST_OPEN = 3, // TCP is opening its congestion window - - // - // TCP control flags - // - TCP_CTRL_NO_NAGLE = 0x0001, // disable Nagle algorithm - TCP_CTRL_NO_KEEPALIVE = 0x0002, // disable keepalive timer - TCP_CTRL_NO_WS = 0x0004, // disable window scale option - TCP_CTRL_RCVD_WS = 0x0008, // rcvd a wnd scale option in syn - TCP_CTRL_NO_TS = 0x0010, // disable Timestamp option - TCP_CTRL_RCVD_TS = 0x0020, // rcvd a Timestamp option in syn - TCP_CTRL_SND_TS = 0x0040, // Send Timestamp option to remote - TCP_CTRL_SND_URG = 0x0080, // in urgent send mode - TCP_CTRL_RCVD_URG = 0x0100, // in urgent receive mode - TCP_CTRL_SND_PSH = 0x0200, // in PUSH send mode - TCP_CTRL_FIN_SENT = 0x0400, // FIN is sent - TCP_CTRL_FIN_ACKED = 0x0800, // FIN is ACKed. - TCP_CTRL_TIMER_ON = 0x1000, // At least one of the timer is on - TCP_CTRL_RTT_ON = 0x2000, // The RTT measurement is on - TCP_CTRL_ACK_NOW = 0x4000, // Send the ACK now, don't delay - - // - // Timer related values - // - TCP_TIMER_CONNECT = 0, // Connection establishment timer - TCP_TIMER_REXMIT = 1, // retransmit timer - TCP_TIMER_PROBE = 2, // Window probe timer - TCP_TIMER_KEEPALIVE = 3, // Keepalive timer - TCP_TIMER_FINWAIT2 = 4, // FIN_WAIT_2 timer - TCP_TIMER_2MSL = 5, // TIME_WAIT tiemr - TCP_TIMER_NUMBER = 6, // the total number of TCP timer. - TCP_TICK = 200, // every TCP tick is 200ms - TCP_TICK_HZ = 5, // the frequence of TCP tick - TCP_RTT_SHIFT = 3, // SRTT & RTTVAR scaled by 8 - TCP_RTO_MIN = TCP_TICK_HZ, // the minium value of RTO - TCP_RTO_MAX = TCP_TICK_HZ *60, // the maxium value of RTO - TCP_FOLD_RTT = 4, // timeout threshod to fold RTT - - // - // default values for some timers - // - TCP_MAX_LOSS = 12, // default max times to retxmit - TCP_KEEPALIVE_IDLE_MIN = TCP_TICK_HZ *60 *60 *2, // First keep alive - TCP_KEEPALIVE_PERIOD = TCP_TICK_HZ *60, - TCP_MAX_KEEPALIVE = 8, - TCP_FIN_WAIT2_TIME = 2 *TCP_TICK_HZ, // * 60, - TCP_TIME_WAIT_TIME = 2 *TCP_TICK_HZ, - TCP_PAWS_24DAY = 24 *24 *60 *60 *TCP_TICK_HZ, - TCP_CONNECT_TIME = 75 *TCP_TICK_HZ, - - // - // The header space to be reserved before TCP data to accomodate : - // 60byte IP head + 60byte TCP head + link layer head - // - TCP_MAX_HEAD = 192, - - // - // value ranges for some control option - // - TCP_RCV_BUF_SIZE = 2 *1024 *1024, - TCP_RCV_BUF_SIZE_MIN = 8 *1024, - TCP_SND_BUF_SIZE = 2 *1024 *1024, - TCP_SND_BUF_SIZE_MIN = 8 *1024, - TCP_BACKLOG = 10, - TCP_BACKLOG_MIN = 5, - TCP_MAX_LOSS_MIN = 6, - TCP_CONNECT_TIME_MIN = 60 *TCP_TICK_HZ, - TCP_MAX_KEEPALIVE_MIN = 4, - TCP_KEEPALIVE_IDLE_MAX = TCP_TICK_HZ *60 *60 *4, - TCP_KEEPALIVE_PERIOD_MIN= TCP_TICK_HZ *30, - TCP_FIN_WAIT2_TIME_MAX = 4 *TCP_TICK_HZ, - TCP_TIME_WAIT_TIME_MAX = 60 *TCP_TICK_HZ -}; - -typedef struct _TCP_SEG { - TCP_SEQNO Seq; // Starting sequence number - TCP_SEQNO End; // The sequence of the last byte + 1, - // include SYN/FIN. End-Seq = SEG.LEN - TCP_SEQNO Ack; // ACK fild in the segment - UINT8 Flag; // TCP header flags - UINT16 Urg; // Valid if URG flag is set. - UINT32 Wnd; // TCP window size field -} TCP_SEG; - -typedef struct _TCP_PEER { - UINT32 Ip; // Network byte order - TCP_PORTNO Port; // Network byte order -} TCP_PEER; - -// -// tcp control block, it includes various states -// -struct _TCP_CB { - NET_LIST_ENTRY List; - TCP_CB *Parent; - - SOCKET *Sk; - TCP_PEER LocalEnd; - TCP_PEER RemoteEnd; - - NET_LIST_ENTRY SndQue; // retxmission queue - NET_LIST_ENTRY RcvQue; // reassemble queue - UINT32 CtrlFlag; // control flags, such as NO_NAGLE - INT32 Error; // soft error status,TCP_CONNECT_RESET... - - // - // RFC793 and RFC1122 defined variables - // - UINT8 State; // TCP state, such as SYN_SENT, LISTEN - UINT8 DelayedAck; // number of delayed ACKs - UINT16 HeadSum; // checksum of the fixed parts of pesudo - // header: Src IP, Dst IP, 0, Protocol, - // not include the TCP length. - - TCP_SEQNO Iss; // Initial Sending Sequence - TCP_SEQNO SndUna; // first unacknowledged data - TCP_SEQNO SndNxt; // next data sequence to send. - TCP_SEQNO SndPsh; // Send PUSH point - TCP_SEQNO SndUp; // Send urgent point - UINT32 SndWnd; // Window advertised by the remote peer - UINT32 SndWndMax; // max send window advertised by the peer - TCP_SEQNO SndWl1; // Seq number used for last window update - TCP_SEQNO SndWl2; // ack no of last window update - UINT16 SndMss; // Max send segment size - TCP_SEQNO RcvNxt; // Next sequence no to receive - UINT32 RcvWnd; // Window advertised by the local peer - TCP_SEQNO RcvWl2; // The RcvNxt (or ACK) of last window update. - // It is necessary because of delayed ACK - - TCP_SEQNO RcvUp; // urgent point; - TCP_SEQNO Irs; // Initial Receiving Sequence - UINT16 RcvMss; // Max receive segment size - UINT16 EnabledTimer; // which timer is currently enabled - UINT32 Timer[TCP_TIMER_NUMBER]; // when the timer will expire - INT32 NextExpire; // count down offset for the nearest timer - UINT32 Idle; // How long the connection is in idle - UINT32 ProbeTime; // the time out value for current window prober - - // - // RFC1323 defined variables, about window scale, - // timestamp and PAWS - // - UINT8 SndWndScale; // Wndscale received from the peer - UINT8 RcvWndScale; // Wndscale used to scale local buffer - UINT32 TsRecent; // TsRecent to echo to the remote peer - UINT32 TsRecentAge; // When this TsRecent is updated - - // TCP_SEQNO LastAckSent; - // It isn't necessary to add LastAckSent here, - // since it is the same as RcvWl2 - - // - // RFC2988 defined variables. about RTT measurement - // - TCP_SEQNO RttSeq; // the seq of measured segment now - UINT32 RttMeasure; // currently measured RTT in heart beats - UINT32 SRtt; // Smoothed RTT, scaled by 8 - UINT32 RttVar; // RTT variance, scaled by 8 - UINT32 Rto; // Current RTO, not scaled - - // - // RFC2581, and 3782 variables. - // Congestion control + NewReno fast recovery. - // - UINT32 CWnd; // Sender's congestion window - UINT32 Ssthresh; // Slow start threshold. - TCP_SEQNO Recover; // recover point for NewReno - UINT16 DupAck; // number of duplicate ACKs - UINT8 CongestState; // the current congestion state(RFC3782) - UINT8 LossTimes; // number of retxmit timeouts in a row - TCP_SEQNO LossRecover; // recover point for retxmit - - // - // configuration parameters, for EFI_TCP4_PROTOCOL specification - // - UINT32 KeepAliveIdle; // idle time before sending first probe - UINT32 KeepAlivePeriod; // interval for subsequent keep alive probe - UINT8 MaxKeepAlive; // Maxium keep alive probe times. - UINT8 KeepAliveProbes; // the number of keep alive probe. - UINT16 MaxRexmit; // The maxium number of retxmit before abort - UINT32 FinWait2Timeout; // The FIN_WAIT_2 time out - UINT32 TimeWaitTimeout; // The TIME_WAIT time out - UINT32 ConnectTimeout; - - // - // configuration for tcp provided by user - // - BOOLEAN UseDefaultAddr; - UINT8 TOS; - UINT8 TTL; - EFI_IPv4_ADDRESS SubnetMask; - - // - // pointer reference to Ip used to send pkt - // - IP_IO_IP_INFO *IpInfo; -}; - -extern NET_LIST_ENTRY mTcpRunQue; -extern NET_LIST_ENTRY mTcpListenQue; -extern TCP_SEQNO mTcpGlobalIss; -extern UINT32 mTcpTick; - -// -// TCP_CONNECTED: both ends have synchronized their ISN. -// -#define TCP_CONNECTED(state) ((state) > TCP_SYN_RCVD) - -#define TCP_FIN_RCVD(State) \ - (((State) == TCP_CLOSE_WAIT) || \ - ((State) == TCP_LAST_ACK) || \ - ((State) == TCP_CLOSING) || \ - ((State) == TCP_TIME_WAIT)) - -#define TCP_LOCAL_CLOSED(State) \ - (((State) == TCP_FIN_WAIT_1) || \ - ((State) == TCP_FIN_WAIT_2) || \ - ((State) == TCP_CLOSING) || \ - ((State) == TCP_TIME_WAIT) || \ - ((State) == TCP_LAST_ACK)) - -// -// Get the TCP_SEG point from a net buffer's ProtoData -// -#define TCPSEG_NETBUF(NBuf) ((TCP_SEG *) ((NBuf)->ProtoData)) - -// -// macros to compare sequence no -// -#define TCP_SEQ_LT(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) < 0) -#define TCP_SEQ_LEQ(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) <= 0) -#define TCP_SEQ_GT(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) < 0) -#define TCP_SEQ_GEQ(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) <= 0) - -// -// TCP_SEQ_BETWEEN return whether b <= m <= e -// -#define TCP_SEQ_BETWEEN(b, m, e) ((e) - (b) >= (m) - (b)) - -// -// TCP_SUB_SEQ returns Seq1 - Seq2. Make sure Seq1 >= Seq2 -// -#define TCP_SUB_SEQ(Seq1, Seq2) ((UINT32) ((Seq1) - (Seq2))) - -#define TCP_FLG_ON(Value, Flag) ((BOOLEAN) (((Value) & (Flag)) != 0)) -#define TCP_SET_FLG(Value, Flag) ((Value) |= (Flag)) -#define TCP_CLEAR_FLG(Value, Flag) ((Value) &= ~(Flag)) - -// -// test whether two peers are equal -// -#define TCP_PEER_EQUAL(Pa, Pb) \ - (((Pa)->Ip == (Pb)->Ip) && ((Pa)->Port == (Pb)->Port)) - -// -// test whether Pa matches Pb, or Pa is more specific -// than pb. Zero means wildcard. -// -#define TCP_PEER_MATCH(Pa, Pb) \ - ((((Pb)->Ip == 0) || ((Pb)->Ip == (Pa)->Ip)) && \ - (((Pb)->Port == 0) || ((Pb)->Port == (Pa)->Port))) - -#define TCP_TIMER_ON(Flag, Timer) ((Flag) & (1 << (Timer))) -#define TCP_SET_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) | (1 << (Timer)))) -#define TCP_CLEAR_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) & (~(1 << (Timer))))) - -#define TCP_TIME_LT(Ta, Tb) ((INT32) ((Ta) - (Tb)) < 0) -#define TCP_TIME_LEQ(Ta, Tb) ((INT32) ((Ta) - (Tb)) <= 0) -#define TCP_SUB_TIME(Ta, Tb) ((UINT32) ((Ta) - (Tb))) - -#define TCP_MAX_WIN 0xFFFFU - -typedef -VOID -(*TCP_TIMER_HANDLER) ( - IN TCP_CB * Tcb - ); - -#include "Tcp4Func.h" -#endif +/** @file + +Copyright (c) 2005 - 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: + + Tcp4Proto.h + +Abstract: + + +**/ + +#ifndef _TCP4_PROTO_H_ +#define _TCP4_PROTO_H_ + +typedef struct _TCP_CB TCP_CB; + +#include "Tcp4Driver.h" +#include "Socket.h" +#include "Tcp4Option.h" + +// +// tcp states, Don't change their order, it is used as +// index to mTcpOutFlag and other macros +// +enum { + TCP_CLOSED = 0, + TCP_LISTEN, + TCP_SYN_SENT, + TCP_SYN_RCVD, + TCP_ESTABLISHED, + TCP_FIN_WAIT_1, + TCP_FIN_WAIT_2, + TCP_CLOSING, + TCP_TIME_WAIT, + TCP_CLOSE_WAIT, + TCP_LAST_ACK +}; + +// +// flags in the TCP header +// +enum { + + TCP_FLG_FIN = 0x01, + TCP_FLG_SYN = 0x02, + TCP_FLG_RST = 0x04, + TCP_FLG_PSH = 0x08, + TCP_FLG_ACK = 0x10, + TCP_FLG_URG = 0x20, + TCP_FLG_FLAG = 0x3F // mask for all the flags +}; + +enum { + + // + // TCP error status + // + TCP_CONNECT_REFUSED = -1, + TCP_CONNECT_RESET = -2, + TCP_CONNECT_CLOSED = -3, + + // + // Current congestion status as suggested by RFC3782. + // + TCP_CONGEST_RECOVER = 1, // during the NewReno fast recovery + TCP_CONGEST_LOSS = 2, // retxmit because of retxmit time out + TCP_CONGEST_OPEN = 3, // TCP is opening its congestion window + + // + // TCP control flags + // + TCP_CTRL_NO_NAGLE = 0x0001, // disable Nagle algorithm + TCP_CTRL_NO_KEEPALIVE = 0x0002, // disable keepalive timer + TCP_CTRL_NO_WS = 0x0004, // disable window scale option + TCP_CTRL_RCVD_WS = 0x0008, // rcvd a wnd scale option in syn + TCP_CTRL_NO_TS = 0x0010, // disable Timestamp option + TCP_CTRL_RCVD_TS = 0x0020, // rcvd a Timestamp option in syn + TCP_CTRL_SND_TS = 0x0040, // Send Timestamp option to remote + TCP_CTRL_SND_URG = 0x0080, // in urgent send mode + TCP_CTRL_RCVD_URG = 0x0100, // in urgent receive mode + TCP_CTRL_SND_PSH = 0x0200, // in PUSH send mode + TCP_CTRL_FIN_SENT = 0x0400, // FIN is sent + TCP_CTRL_FIN_ACKED = 0x0800, // FIN is ACKed. + TCP_CTRL_TIMER_ON = 0x1000, // At least one of the timer is on + TCP_CTRL_RTT_ON = 0x2000, // The RTT measurement is on + TCP_CTRL_ACK_NOW = 0x4000, // Send the ACK now, don't delay + + // + // Timer related values + // + TCP_TIMER_CONNECT = 0, // Connection establishment timer + TCP_TIMER_REXMIT = 1, // retransmit timer + TCP_TIMER_PROBE = 2, // Window probe timer + TCP_TIMER_KEEPALIVE = 3, // Keepalive timer + TCP_TIMER_FINWAIT2 = 4, // FIN_WAIT_2 timer + TCP_TIMER_2MSL = 5, // TIME_WAIT tiemr + TCP_TIMER_NUMBER = 6, // the total number of TCP timer. + TCP_TICK = 200, // every TCP tick is 200ms + TCP_TICK_HZ = 5, // the frequence of TCP tick + TCP_RTT_SHIFT = 3, // SRTT & RTTVAR scaled by 8 + TCP_RTO_MIN = TCP_TICK_HZ, // the minium value of RTO + TCP_RTO_MAX = TCP_TICK_HZ *60, // the maxium value of RTO + TCP_FOLD_RTT = 4, // timeout threshod to fold RTT + + // + // default values for some timers + // + TCP_MAX_LOSS = 12, // default max times to retxmit + TCP_KEEPALIVE_IDLE_MIN = TCP_TICK_HZ *60 *60 *2, // First keep alive + TCP_KEEPALIVE_PERIOD = TCP_TICK_HZ *60, + TCP_MAX_KEEPALIVE = 8, + TCP_FIN_WAIT2_TIME = 2 *TCP_TICK_HZ, // * 60, + TCP_TIME_WAIT_TIME = 2 *TCP_TICK_HZ, + TCP_PAWS_24DAY = 24 *24 *60 *60 *TCP_TICK_HZ, + TCP_CONNECT_TIME = 75 *TCP_TICK_HZ, + + // + // The header space to be reserved before TCP data to accomodate : + // 60byte IP head + 60byte TCP head + link layer head + // + TCP_MAX_HEAD = 192, + + // + // value ranges for some control option + // + TCP_RCV_BUF_SIZE = 2 *1024 *1024, + TCP_RCV_BUF_SIZE_MIN = 8 *1024, + TCP_SND_BUF_SIZE = 2 *1024 *1024, + TCP_SND_BUF_SIZE_MIN = 8 *1024, + TCP_BACKLOG = 10, + TCP_BACKLOG_MIN = 5, + TCP_MAX_LOSS_MIN = 6, + TCP_CONNECT_TIME_MIN = 60 *TCP_TICK_HZ, + TCP_MAX_KEEPALIVE_MIN = 4, + TCP_KEEPALIVE_IDLE_MAX = TCP_TICK_HZ *60 *60 *4, + TCP_KEEPALIVE_PERIOD_MIN= TCP_TICK_HZ *30, + TCP_FIN_WAIT2_TIME_MAX = 4 *TCP_TICK_HZ, + TCP_TIME_WAIT_TIME_MAX = 60 *TCP_TICK_HZ +}; + +typedef struct _TCP_SEG { + TCP_SEQNO Seq; // Starting sequence number + TCP_SEQNO End; // The sequence of the last byte + 1, + // include SYN/FIN. End-Seq = SEG.LEN + TCP_SEQNO Ack; // ACK fild in the segment + UINT8 Flag; // TCP header flags + UINT16 Urg; // Valid if URG flag is set. + UINT32 Wnd; // TCP window size field +} TCP_SEG; + +typedef struct _TCP_PEER { + UINT32 Ip; // Network byte order + TCP_PORTNO Port; // Network byte order +} TCP_PEER; + +// +// tcp control block, it includes various states +// +struct _TCP_CB { + NET_LIST_ENTRY List; + TCP_CB *Parent; + + SOCKET *Sk; + TCP_PEER LocalEnd; + TCP_PEER RemoteEnd; + + NET_LIST_ENTRY SndQue; // retxmission queue + NET_LIST_ENTRY RcvQue; // reassemble queue + UINT32 CtrlFlag; // control flags, such as NO_NAGLE + INT32 Error; // soft error status,TCP_CONNECT_RESET... + + // + // RFC793 and RFC1122 defined variables + // + UINT8 State; // TCP state, such as SYN_SENT, LISTEN + UINT8 DelayedAck; // number of delayed ACKs + UINT16 HeadSum; // checksum of the fixed parts of pesudo + // header: Src IP, Dst IP, 0, Protocol, + // not include the TCP length. + + TCP_SEQNO Iss; // Initial Sending Sequence + TCP_SEQNO SndUna; // first unacknowledged data + TCP_SEQNO SndNxt; // next data sequence to send. + TCP_SEQNO SndPsh; // Send PUSH point + TCP_SEQNO SndUp; // Send urgent point + UINT32 SndWnd; // Window advertised by the remote peer + UINT32 SndWndMax; // max send window advertised by the peer + TCP_SEQNO SndWl1; // Seq number used for last window update + TCP_SEQNO SndWl2; // ack no of last window update + UINT16 SndMss; // Max send segment size + TCP_SEQNO RcvNxt; // Next sequence no to receive + UINT32 RcvWnd; // Window advertised by the local peer + TCP_SEQNO RcvWl2; // The RcvNxt (or ACK) of last window update. + // It is necessary because of delayed ACK + + TCP_SEQNO RcvUp; // urgent point; + TCP_SEQNO Irs; // Initial Receiving Sequence + UINT16 RcvMss; // Max receive segment size + UINT16 EnabledTimer; // which timer is currently enabled + UINT32 Timer[TCP_TIMER_NUMBER]; // when the timer will expire + INT32 NextExpire; // count down offset for the nearest timer + UINT32 Idle; // How long the connection is in idle + UINT32 ProbeTime; // the time out value for current window prober + + // + // RFC1323 defined variables, about window scale, + // timestamp and PAWS + // + UINT8 SndWndScale; // Wndscale received from the peer + UINT8 RcvWndScale; // Wndscale used to scale local buffer + UINT32 TsRecent; // TsRecent to echo to the remote peer + UINT32 TsRecentAge; // When this TsRecent is updated + + // TCP_SEQNO LastAckSent; + // It isn't necessary to add LastAckSent here, + // since it is the same as RcvWl2 + + // + // RFC2988 defined variables. about RTT measurement + // + TCP_SEQNO RttSeq; // the seq of measured segment now + UINT32 RttMeasure; // currently measured RTT in heart beats + UINT32 SRtt; // Smoothed RTT, scaled by 8 + UINT32 RttVar; // RTT variance, scaled by 8 + UINT32 Rto; // Current RTO, not scaled + + // + // RFC2581, and 3782 variables. + // Congestion control + NewReno fast recovery. + // + UINT32 CWnd; // Sender's congestion window + UINT32 Ssthresh; // Slow start threshold. + TCP_SEQNO Recover; // recover point for NewReno + UINT16 DupAck; // number of duplicate ACKs + UINT8 CongestState; // the current congestion state(RFC3782) + UINT8 LossTimes; // number of retxmit timeouts in a row + TCP_SEQNO LossRecover; // recover point for retxmit + + // + // configuration parameters, for EFI_TCP4_PROTOCOL specification + // + UINT32 KeepAliveIdle; // idle time before sending first probe + UINT32 KeepAlivePeriod; // interval for subsequent keep alive probe + UINT8 MaxKeepAlive; // Maxium keep alive probe times. + UINT8 KeepAliveProbes; // the number of keep alive probe. + UINT16 MaxRexmit; // The maxium number of retxmit before abort + UINT32 FinWait2Timeout; // The FIN_WAIT_2 time out + UINT32 TimeWaitTimeout; // The TIME_WAIT time out + UINT32 ConnectTimeout; + + // + // configuration for tcp provided by user + // + BOOLEAN UseDefaultAddr; + UINT8 TOS; + UINT8 TTL; + EFI_IPv4_ADDRESS SubnetMask; + + // + // pointer reference to Ip used to send pkt + // + IP_IO_IP_INFO *IpInfo; +}; + +extern NET_LIST_ENTRY mTcpRunQue; +extern NET_LIST_ENTRY mTcpListenQue; +extern TCP_SEQNO mTcpGlobalIss; +extern UINT32 mTcpTick; + +// +// TCP_CONNECTED: both ends have synchronized their ISN. +// +#define TCP_CONNECTED(state) ((state) > TCP_SYN_RCVD) + +#define TCP_FIN_RCVD(State) \ + (((State) == TCP_CLOSE_WAIT) || \ + ((State) == TCP_LAST_ACK) || \ + ((State) == TCP_CLOSING) || \ + ((State) == TCP_TIME_WAIT)) + +#define TCP_LOCAL_CLOSED(State) \ + (((State) == TCP_FIN_WAIT_1) || \ + ((State) == TCP_FIN_WAIT_2) || \ + ((State) == TCP_CLOSING) || \ + ((State) == TCP_TIME_WAIT) || \ + ((State) == TCP_LAST_ACK)) + +// +// Get the TCP_SEG point from a net buffer's ProtoData +// +#define TCPSEG_NETBUF(NBuf) ((TCP_SEG *) ((NBuf)->ProtoData)) + +// +// macros to compare sequence no +// +#define TCP_SEQ_LT(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) < 0) +#define TCP_SEQ_LEQ(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) <= 0) +#define TCP_SEQ_GT(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) < 0) +#define TCP_SEQ_GEQ(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) <= 0) + +// +// TCP_SEQ_BETWEEN return whether b <= m <= e +// +#define TCP_SEQ_BETWEEN(b, m, e) ((e) - (b) >= (m) - (b)) + +// +// TCP_SUB_SEQ returns Seq1 - Seq2. Make sure Seq1 >= Seq2 +// +#define TCP_SUB_SEQ(Seq1, Seq2) ((UINT32) ((Seq1) - (Seq2))) + +#define TCP_FLG_ON(Value, Flag) ((BOOLEAN) (((Value) & (Flag)) != 0)) +#define TCP_SET_FLG(Value, Flag) ((Value) |= (Flag)) +#define TCP_CLEAR_FLG(Value, Flag) ((Value) &= ~(Flag)) + +// +// test whether two peers are equal +// +#define TCP_PEER_EQUAL(Pa, Pb) \ + (((Pa)->Ip == (Pb)->Ip) && ((Pa)->Port == (Pb)->Port)) + +// +// test whether Pa matches Pb, or Pa is more specific +// than pb. Zero means wildcard. +// +#define TCP_PEER_MATCH(Pa, Pb) \ + ((((Pb)->Ip == 0) || ((Pb)->Ip == (Pa)->Ip)) && \ + (((Pb)->Port == 0) || ((Pb)->Port == (Pa)->Port))) + +#define TCP_TIMER_ON(Flag, Timer) ((Flag) & (1 << (Timer))) +#define TCP_SET_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) | (1 << (Timer)))) +#define TCP_CLEAR_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) & (~(1 << (Timer))))) + +#define TCP_TIME_LT(Ta, Tb) ((INT32) ((Ta) - (Tb)) < 0) +#define TCP_TIME_LEQ(Ta, Tb) ((INT32) ((Ta) - (Tb)) <= 0) +#define TCP_SUB_TIME(Ta, Tb) ((UINT32) ((Ta) - (Tb))) + +#define TCP_MAX_WIN 0xFFFFU + +typedef +VOID +(*TCP_TIMER_HANDLER) ( + IN TCP_CB * Tcb + ); + +#include "Tcp4Func.h" +#endif diff --git a/MdeModulePkg/Universal/Network/Udp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/Udp4Dxe/ComponentName.c index b934765207..7fb1ce9bd7 100644 --- a/MdeModulePkg/Universal/Network/Udp4Dxe/ComponentName.c +++ b/MdeModulePkg/Universal/Network/Udp4Dxe/ComponentName.c @@ -24,6 +24,45 @@ Abstract: // // EFI Component Name Functions // +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI UdpComponentNameGetDriverName ( @@ -32,28 +71,108 @@ UdpComponentNameGetDriverName ( OUT CHAR16 **DriverName ); + +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. + + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. + + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. + + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI UdpComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName ); + // // EFI Component Name Protocol // -EFI_COMPONENT_NAME_PROTOCOL gUdp4ComponentName = { +EFI_COMPONENT_NAME_PROTOCOL gUdp4ComponentName = { UdpComponentNameGetDriverName, UdpComponentNameGetControllerName, "eng" -}; + }; + +// +// EFI Component Name 2 Protocol +// +EFI_COMPONENT_NAME2_PROTOCOL gUdp4ComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) UdpComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) UdpComponentNameGetControllerName, + "en" + }; + static EFI_UNICODE_STRING_TABLE mUdpDriverNameTable[] = { { - "eng", + "eng;en", L"UDP Network Service Driver" }, { @@ -62,6 +181,45 @@ static EFI_UNICODE_STRING_TABLE mUdpDriverNameTable[] = { } }; +/** + Retrieves a Unicode string that is the user readable name of the driver. + + This function retrieves the user readable name of a driver in the form of a + Unicode string. If the driver specified by This has a user readable name in + the language specified by Language, then a pointer to the driver name is + returned in DriverName, and EFI_SUCCESS is returned. If the driver specified + by This does not support the language specified by Language, + then EFI_UNSUPPORTED is returned. + + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. + + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified + in RFC 3066 or ISO 639-2 language code format. + + @param DriverName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + driver specified by This in the language + specified by Language. + + @retval EFI_SUCCESS The Unicode string for the Driver specified by + This and the language specified by Language was + returned in DriverName. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER DriverName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI UdpComponentNameGetDriverName ( @@ -69,100 +227,93 @@ UdpComponentNameGetDriverName ( IN CHAR8 *Language, OUT CHAR16 **DriverName ) -/*++ +{ + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mUdpDriverNameTable, + DriverName, + (BOOLEAN)(This == &gUdp4ComponentName) + ); +} -Routine Description: +/** + Retrieves a Unicode string that is the user readable name of the controller + that is being managed by a driver. - Retrieves a Unicode string that is the user readable name of the EFI Driver. + This function retrieves the user readable name of the controller specified by + ControllerHandle and ChildHandle in the form of a Unicode string. If the + driver specified by This has a user readable name in the language specified by + Language, then a pointer to the controller name is returned in ControllerName, + and EFI_SUCCESS is returned. If the driver specified by This is not currently + managing the controller specified by ControllerHandle and ChildHandle, + then EFI_UNSUPPORTED is returned. If the driver specified by This does not + support the language specified by Language, then EFI_UNSUPPORTED is returned. -Arguments: + @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or + EFI_COMPONENT_NAME_PROTOCOL instance. - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - Language - A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - DriverName - A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. + @param ControllerHandle[in] The handle of a controller that the driver + specified by This is managing. This handle + specifies the controller whose name is to be + returned. -Returns: + @param ChildHandle[in] The handle of the child controller to retrieve + the name of. This is an optional parameter that + may be NULL. It will be NULL for device + drivers. It will also be NULL for a bus drivers + that wish to retrieve the name of the bus + controller. It will not be NULL for a bus + driver that wishes to retrieve the name of a + child controller. - EFI_SUCCES - The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - DriverName is NULL. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. + @param Language[in] A pointer to a Null-terminated ASCII string + array indicating the language. This is the + language of the driver name that the caller is + requesting, and it must match one of the + languages specified in SupportedLanguages. The + number of languages supported by a driver is up + to the driver writer. Language is specified in + RFC 3066 or ISO 639-2 language code format. ---*/ -{ - return LookupUnicodeString ( - Language, - gUdp4ComponentName.SupportedLanguages, - mUdpDriverNameTable, - DriverName - ); -} + @param ControllerName[out] A pointer to the Unicode string to return. + This Unicode string is the name of the + controller specified by ControllerHandle and + ChildHandle in the language specified by + Language from the point of view of the driver + specified by This. + + @retval EFI_SUCCESS The Unicode string for the user readable name in + the language specified by Language for the + driver specified by This was returned in + DriverName. + + @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid + EFI_HANDLE. + + @retval EFI_INVALID_PARAMETER Language is NULL. + + @retval EFI_INVALID_PARAMETER ControllerName is NULL. + + @retval EFI_UNSUPPORTED The driver specified by This is not currently + managing the controller specified by + ControllerHandle and ChildHandle. + @retval EFI_UNSUPPORTED The driver specified by This does not support + the language specified by Language. + +**/ EFI_STATUS EFIAPI UdpComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName ) -/*++ - -Routine Description: - - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. - -Arguments: - - This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - ControllerHandle - The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - ChildHandle - The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - Language - A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - ControllerName - A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - -Returns: - - EFI_SUCCESS - The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE. - EFI_INVALID_PARAMETER - Language is NULL. - EFI_INVALID_PARAMETER - ControllerName is NULL. - EFI_UNSUPPORTED - The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - EFI_UNSUPPORTED - The driver specified by This does not support the - language specified by Language. - ---*/ { return EFI_UNSUPPORTED; } diff --git a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.c b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.c index dc6fd48ebf..7e2bc451ae 100644 --- a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.c +++ b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.c @@ -504,14 +504,13 @@ Returns: // // Install the Udp4DriverBinding and Udp4ComponentName protocols. // - Status = EfiLibInstallAllDriverProtocols ( + Status = EfiLibInstallDriverBindingComponentName2 ( ImageHandle, SystemTable, &gUdp4DriverBinding, ImageHandle, &gUdp4ComponentName, - NULL, - NULL + &gUdp4ComponentName2 ); if (!EFI_ERROR (Status)) { // diff --git a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.h b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.h index 59acb44452..2e0b7f33c8 100644 --- a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.h +++ b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.h @@ -1,70 +1,70 @@ -/** @file - -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: - - Udp4Driver.h - -Abstract: - - -**/ - -#ifndef _UDP4_DRIVER_H_ -#define _UDP4_DRIVER_H_ - -#include -#include -#include -#include -#include - -EFI_STATUS -EFIAPI -Udp4DriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -Udp4DriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -EFI_STATUS -EFIAPI -Udp4DriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -EFI_STATUS -EFIAPI -Udp4ServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE *ChildHandle - ); - -EFI_STATUS -EFIAPI -Udp4ServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ); - -#endif - +/** @file + +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: + + Udp4Driver.h + +Abstract: + + +**/ + +#ifndef _UDP4_DRIVER_H_ +#define _UDP4_DRIVER_H_ + +#include +#include +#include +#include +#include + +EFI_STATUS +EFIAPI +Udp4DriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +Udp4DriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ); + +EFI_STATUS +EFIAPI +Udp4DriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +EFI_STATUS +EFIAPI +Udp4ServiceBindingCreateChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE *ChildHandle + ); + +EFI_STATUS +EFIAPI +Udp4ServiceBindingDestroyChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE ChildHandle + ); + +#endif + diff --git a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.h b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.h index 7825624090..bdc855b52c 100644 --- a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.h +++ b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.h @@ -1,299 +1,300 @@ -/** @file - -Copyright (c) 2006 - 2007, 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: - - Udp4Impl.h - -Abstract: - - EFI UDPv4 protocol implementation - - -**/ - -#ifndef _UDP4_IMPL_H_ -#define _UDP4_IMPL_H_ - +/** @file + +Copyright (c) 2006 - 2007, 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: + + Udp4Impl.h + +Abstract: + + EFI UDPv4 protocol implementation + + +**/ + +#ifndef _UDP4_IMPL_H_ +#define _UDP4_IMPL_H_ + #include #include #include - + #include #include #include #include #include #include -#include -#include -#include - -#include "Udp4Driver.h" - - -extern EFI_COMPONENT_NAME_PROTOCOL gUdp4ComponentName; -extern EFI_SERVICE_BINDING_PROTOCOL mUdp4ServiceBinding; -extern EFI_UDP4_PROTOCOL mUdp4Protocol; -extern UINT16 mUdp4RandomPort; - -#define ICMP_ERROR_PACKET_LENGTH 8 - -#define UDP4_TIMEOUT_INTERVAL (50 * TICKS_PER_MS) // 50 milliseconds - -#define UDP4_HEADER_SIZE sizeof (EFI_UDP4_HEADER) -#define UDP4_MAX_DATA_SIZE 65507 - -#define UDP4_PORT_KNOWN 1024 - -#define UDP4_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32('U', 'd', 'p', '4') - -#define UDP4_SERVICE_DATA_FROM_THIS(a) \ - CR ( \ - (a), \ - UDP4_SERVICE_DATA, \ - ServiceBinding, \ - UDP4_SERVICE_DATA_SIGNATURE \ - ) - -typedef struct _UDP4_SERVICE_DATA_ { - UINT32 Signature; - EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; - EFI_HANDLE ImageHandle; - EFI_HANDLE ControllerHandle; - NET_LIST_ENTRY ChildrenList; - UINTN ChildrenNumber; - IP_IO *IpIo; - - EFI_EVENT TimeoutEvent; - - CHAR16 *MacString; -} UDP4_SERVICE_DATA; - -#define UDP4_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32('U', 'd', 'p', 'I') - -#define UDP4_INSTANCE_DATA_FROM_THIS(a) \ - CR ( \ - (a), \ - UDP4_INSTANCE_DATA, \ - Udp4Proto, \ - UDP4_INSTANCE_DATA_SIGNATURE \ - ) - -typedef struct _UDP4_INSTANCE_DATA_ { - UINT32 Signature; - NET_LIST_ENTRY Link; - - UDP4_SERVICE_DATA *Udp4Service; - EFI_UDP4_PROTOCOL Udp4Proto; - EFI_UDP4_CONFIG_DATA ConfigData; - EFI_HANDLE ChildHandle; - BOOLEAN Configured; - BOOLEAN IsNoMapping; - - NET_MAP TxTokens; - NET_MAP RxTokens; - - NET_MAP McastIps; - - NET_LIST_ENTRY RcvdDgramQue; - NET_LIST_ENTRY DeliveredDgramQue; - - UINT16 HeadSum; - - EFI_STATUS IcmpError; - - IP_IO_IP_INFO *IpInfo; - - BOOLEAN Destroyed; -} UDP4_INSTANCE_DATA; - -typedef struct _UDP4_RXDATA_WRAP_ { - NET_LIST_ENTRY Link; - NET_BUF *Packet; - UINT32 TimeoutTick; - EFI_UDP4_RECEIVE_DATA RxData; -} UDP4_RXDATA_WRAP; - -EFI_STATUS -EFIAPI -Udp4GetModeData ( - IN EFI_UDP4_PROTOCOL *This, - OUT EFI_UDP4_CONFIG_DATA *Udp4ConfigData OPTIONAL, - OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, - OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, - OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL - ); - -EFI_STATUS -EFIAPI -Udp4Configure ( - IN EFI_UDP4_PROTOCOL *This, - IN EFI_UDP4_CONFIG_DATA *UdpConfigData OPTIONAL - ); - -EFI_STATUS -EFIAPI -Udp4Groups ( - IN EFI_UDP4_PROTOCOL *This, - IN BOOLEAN JoinFlag, - IN EFI_IPv4_ADDRESS *MulticastAddress OPTIONAL - ); - -EFI_STATUS -EFIAPI -Udp4Routes ( - IN EFI_UDP4_PROTOCOL *This, - IN BOOLEAN DeleteRoute, - IN EFI_IPv4_ADDRESS *SubnetAddress, - IN EFI_IPv4_ADDRESS *SubnetMask, - IN EFI_IPv4_ADDRESS *GatewayAddress - ); - -EFI_STATUS -EFIAPI -Udp4Transmit ( - IN EFI_UDP4_PROTOCOL *This, - IN EFI_UDP4_COMPLETION_TOKEN *Token - ); - -EFI_STATUS -EFIAPI -Udp4Receive ( - IN EFI_UDP4_PROTOCOL *This, - IN EFI_UDP4_COMPLETION_TOKEN *Token - ); - -EFI_STATUS -EFIAPI -Udp4Cancel ( - IN EFI_UDP4_PROTOCOL *This, - IN EFI_UDP4_COMPLETION_TOKEN *Token OPTIONAL - ); - -EFI_STATUS -EFIAPI -Udp4Poll ( - IN EFI_UDP4_PROTOCOL *This - ); - -EFI_STATUS -Udp4CreateService ( - IN UDP4_SERVICE_DATA *Udp4Service, - IN EFI_HANDLE ImageHandle, - IN EFI_HANDLE ControllerHandle - ); - -VOID -Udp4CleanService ( - IN UDP4_SERVICE_DATA *Udp4Service - ); - -VOID -Udp4InitInstance ( - IN UDP4_SERVICE_DATA *Udp4Service, - IN UDP4_INSTANCE_DATA *Instance - ); - -VOID -Udp4CleanInstance ( - IN UDP4_INSTANCE_DATA *Instance - ); - -EFI_STATUS -Udp4Bind ( - IN NET_LIST_ENTRY *InstanceList, - IN EFI_UDP4_CONFIG_DATA *ConfigData - ); - -BOOLEAN -Udp4IsReconfigurable ( - IN EFI_UDP4_CONFIG_DATA *OldConfigData, - IN EFI_UDP4_CONFIG_DATA *NewConfigData - ); - -VOID -Udp4BuildIp4ConfigData ( - IN EFI_UDP4_CONFIG_DATA *Udp4ConfigData, - IN EFI_IP4_CONFIG_DATA *Ip4ConfigData - ); - -EFI_STATUS -Udp4ValidateTxToken ( - IN UDP4_INSTANCE_DATA *Instance, - IN EFI_UDP4_COMPLETION_TOKEN *TxToken - ); - -EFI_STATUS -Udp4TokenExist ( - IN NET_MAP *Map, - IN NET_MAP_ITEM *Item, - IN VOID *Context - ); - -UINT16 -Udp4Checksum ( - IN NET_BUF *Packet, - IN UINT16 HeadSum - ); - -EFI_STATUS -Udp4RemoveToken ( - IN NET_MAP *TokenMap, - IN EFI_UDP4_COMPLETION_TOKEN *Token - ); - -EFI_STATUS -Udp4LeaveGroup ( - IN NET_MAP *Map, - IN NET_MAP_ITEM *Item, - IN VOID *Arg OPTIONAL - ); - -VOID -Udp4FlushRxData ( - IN NET_LIST_ENTRY *RcvdDgramQue - ); - -EFI_STATUS -Udp4InstanceCancelToken ( - IN UDP4_INSTANCE_DATA *Instance, - IN EFI_UDP4_COMPLETION_TOKEN *Token OPTIONAL - ); - -VOID -Udp4InstanceDeliverDgram ( - IN UDP4_INSTANCE_DATA *Instance - ); - -VOID -Udp4ReportIcmpError ( - IN UDP4_INSTANCE_DATA *Instance - ); - -VOID -Udp4NetVectorExtFree ( - VOID *Context - ); - -EFI_STATUS -Udp4SetVariableData ( - IN UDP4_SERVICE_DATA *Udp4Service - ); - -VOID -Udp4ClearVariableData ( - IN UDP4_SERVICE_DATA *Udp4Service - ); - -#endif - +#include +#include +#include + +#include "Udp4Driver.h" + + +extern EFI_COMPONENT_NAME_PROTOCOL gUdp4ComponentName; +extern EFI_COMPONENT_NAME2_PROTOCOL gUdp4ComponentName2; +extern EFI_SERVICE_BINDING_PROTOCOL mUdp4ServiceBinding; +extern EFI_UDP4_PROTOCOL mUdp4Protocol; +extern UINT16 mUdp4RandomPort; + +#define ICMP_ERROR_PACKET_LENGTH 8 + +#define UDP4_TIMEOUT_INTERVAL (50 * TICKS_PER_MS) // 50 milliseconds + +#define UDP4_HEADER_SIZE sizeof (EFI_UDP4_HEADER) +#define UDP4_MAX_DATA_SIZE 65507 + +#define UDP4_PORT_KNOWN 1024 + +#define UDP4_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32('U', 'd', 'p', '4') + +#define UDP4_SERVICE_DATA_FROM_THIS(a) \ + CR ( \ + (a), \ + UDP4_SERVICE_DATA, \ + ServiceBinding, \ + UDP4_SERVICE_DATA_SIGNATURE \ + ) + +typedef struct _UDP4_SERVICE_DATA_ { + UINT32 Signature; + EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; + EFI_HANDLE ImageHandle; + EFI_HANDLE ControllerHandle; + NET_LIST_ENTRY ChildrenList; + UINTN ChildrenNumber; + IP_IO *IpIo; + + EFI_EVENT TimeoutEvent; + + CHAR16 *MacString; +} UDP4_SERVICE_DATA; + +#define UDP4_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32('U', 'd', 'p', 'I') + +#define UDP4_INSTANCE_DATA_FROM_THIS(a) \ + CR ( \ + (a), \ + UDP4_INSTANCE_DATA, \ + Udp4Proto, \ + UDP4_INSTANCE_DATA_SIGNATURE \ + ) + +typedef struct _UDP4_INSTANCE_DATA_ { + UINT32 Signature; + NET_LIST_ENTRY Link; + + UDP4_SERVICE_DATA *Udp4Service; + EFI_UDP4_PROTOCOL Udp4Proto; + EFI_UDP4_CONFIG_DATA ConfigData; + EFI_HANDLE ChildHandle; + BOOLEAN Configured; + BOOLEAN IsNoMapping; + + NET_MAP TxTokens; + NET_MAP RxTokens; + + NET_MAP McastIps; + + NET_LIST_ENTRY RcvdDgramQue; + NET_LIST_ENTRY DeliveredDgramQue; + + UINT16 HeadSum; + + EFI_STATUS IcmpError; + + IP_IO_IP_INFO *IpInfo; + + BOOLEAN Destroyed; +} UDP4_INSTANCE_DATA; + +typedef struct _UDP4_RXDATA_WRAP_ { + NET_LIST_ENTRY Link; + NET_BUF *Packet; + UINT32 TimeoutTick; + EFI_UDP4_RECEIVE_DATA RxData; +} UDP4_RXDATA_WRAP; + +EFI_STATUS +EFIAPI +Udp4GetModeData ( + IN EFI_UDP4_PROTOCOL *This, + OUT EFI_UDP4_CONFIG_DATA *Udp4ConfigData OPTIONAL, + OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, + OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, + OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL + ); + +EFI_STATUS +EFIAPI +Udp4Configure ( + IN EFI_UDP4_PROTOCOL *This, + IN EFI_UDP4_CONFIG_DATA *UdpConfigData OPTIONAL + ); + +EFI_STATUS +EFIAPI +Udp4Groups ( + IN EFI_UDP4_PROTOCOL *This, + IN BOOLEAN JoinFlag, + IN EFI_IPv4_ADDRESS *MulticastAddress OPTIONAL + ); + +EFI_STATUS +EFIAPI +Udp4Routes ( + IN EFI_UDP4_PROTOCOL *This, + IN BOOLEAN DeleteRoute, + IN EFI_IPv4_ADDRESS *SubnetAddress, + IN EFI_IPv4_ADDRESS *SubnetMask, + IN EFI_IPv4_ADDRESS *GatewayAddress + ); + +EFI_STATUS +EFIAPI +Udp4Transmit ( + IN EFI_UDP4_PROTOCOL *This, + IN EFI_UDP4_COMPLETION_TOKEN *Token + ); + +EFI_STATUS +EFIAPI +Udp4Receive ( + IN EFI_UDP4_PROTOCOL *This, + IN EFI_UDP4_COMPLETION_TOKEN *Token + ); + +EFI_STATUS +EFIAPI +Udp4Cancel ( + IN EFI_UDP4_PROTOCOL *This, + IN EFI_UDP4_COMPLETION_TOKEN *Token OPTIONAL + ); + +EFI_STATUS +EFIAPI +Udp4Poll ( + IN EFI_UDP4_PROTOCOL *This + ); + +EFI_STATUS +Udp4CreateService ( + IN UDP4_SERVICE_DATA *Udp4Service, + IN EFI_HANDLE ImageHandle, + IN EFI_HANDLE ControllerHandle + ); + +VOID +Udp4CleanService ( + IN UDP4_SERVICE_DATA *Udp4Service + ); + +VOID +Udp4InitInstance ( + IN UDP4_SERVICE_DATA *Udp4Service, + IN UDP4_INSTANCE_DATA *Instance + ); + +VOID +Udp4CleanInstance ( + IN UDP4_INSTANCE_DATA *Instance + ); + +EFI_STATUS +Udp4Bind ( + IN NET_LIST_ENTRY *InstanceList, + IN EFI_UDP4_CONFIG_DATA *ConfigData + ); + +BOOLEAN +Udp4IsReconfigurable ( + IN EFI_UDP4_CONFIG_DATA *OldConfigData, + IN EFI_UDP4_CONFIG_DATA *NewConfigData + ); + +VOID +Udp4BuildIp4ConfigData ( + IN EFI_UDP4_CONFIG_DATA *Udp4ConfigData, + IN EFI_IP4_CONFIG_DATA *Ip4ConfigData + ); + +EFI_STATUS +Udp4ValidateTxToken ( + IN UDP4_INSTANCE_DATA *Instance, + IN EFI_UDP4_COMPLETION_TOKEN *TxToken + ); + +EFI_STATUS +Udp4TokenExist ( + IN NET_MAP *Map, + IN NET_MAP_ITEM *Item, + IN VOID *Context + ); + +UINT16 +Udp4Checksum ( + IN NET_BUF *Packet, + IN UINT16 HeadSum + ); + +EFI_STATUS +Udp4RemoveToken ( + IN NET_MAP *TokenMap, + IN EFI_UDP4_COMPLETION_TOKEN *Token + ); + +EFI_STATUS +Udp4LeaveGroup ( + IN NET_MAP *Map, + IN NET_MAP_ITEM *Item, + IN VOID *Arg OPTIONAL + ); + +VOID +Udp4FlushRxData ( + IN NET_LIST_ENTRY *RcvdDgramQue + ); + +EFI_STATUS +Udp4InstanceCancelToken ( + IN UDP4_INSTANCE_DATA *Instance, + IN EFI_UDP4_COMPLETION_TOKEN *Token OPTIONAL + ); + +VOID +Udp4InstanceDeliverDgram ( + IN UDP4_INSTANCE_DATA *Instance + ); + +VOID +Udp4ReportIcmpError ( + IN UDP4_INSTANCE_DATA *Instance + ); + +VOID +Udp4NetVectorExtFree ( + VOID *Context + ); + +EFI_STATUS +Udp4SetVariableData ( + IN UDP4_SERVICE_DATA *Udp4Service + ); + +VOID +Udp4ClearVariableData ( + IN UDP4_SERVICE_DATA *Udp4Service + ); + +#endif +