From 779ae3579848a36319d67a6ba012b4b9aa88aa6b Mon Sep 17 00:00:00 2001 From: xdu2 Date: Wed, 30 Dec 2009 13:47:55 +0000 Subject: Add VLAN support. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9649 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Network/VlanConfigDxe/ComponentName.c | 171 +++++++ .../Universal/Network/VlanConfigDxe/VlanConfig.vfr | 68 +++ .../Network/VlanConfigDxe/VlanConfigDriver.c | 305 ++++++++++++ .../Network/VlanConfigDxe/VlanConfigDxe.inf | 59 +++ .../Network/VlanConfigDxe/VlanConfigImpl.c | 551 +++++++++++++++++++++ .../Network/VlanConfigDxe/VlanConfigImpl.h | 385 ++++++++++++++ .../Network/VlanConfigDxe/VlanConfigNvData.h | 50 ++ .../Network/VlanConfigDxe/VlanConfigStrings.uni | Bin 0 -> 3566 bytes 8 files changed, 1589 insertions(+) create mode 100644 MdeModulePkg/Universal/Network/VlanConfigDxe/ComponentName.c create mode 100644 MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfig.vfr create mode 100644 MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c create mode 100644 MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf create mode 100644 MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.c create mode 100644 MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.h create mode 100644 MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigNvData.h create mode 100644 MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigStrings.uni (limited to 'MdeModulePkg/Universal/Network/VlanConfigDxe') diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/ComponentName.c b/MdeModulePkg/Universal/Network/VlanConfigDxe/ComponentName.c new file mode 100644 index 0000000000..7ff566c817 --- /dev/null +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/ComponentName.c @@ -0,0 +1,171 @@ +/** @file + UEFI Component Name(2) protocol implementation for VlanConfigDxe driver. + +Copyright (c) 2009, 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. + +**/ + +#include "VlanConfigImpl.h" + +// +// EFI Component Name Protocol +// +GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gVlanConfigComponentName = { + VlanConfigComponentNameGetDriverName, + VlanConfigComponentNameGetControllerName, + "eng" +}; + +// +// EFI Component Name 2 Protocol +// +GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gVlanConfigComponentName2 = { + (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) VlanConfigComponentNameGetDriverName, + (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) VlanConfigComponentNameGetControllerName, + "en" +}; + +GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mVlanConfigDriverNameTable[] = { + { + "eng;en", + L"VLAN Configuration Driver" + }, + { + NULL, + NULL + } +}; + +// +// 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 4646 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 +VlanConfigComponentNameGetDriverName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN CHAR8 *Language, + OUT CHAR16 **DriverName + ) +{ + return LookupUnicodeString2 ( + Language, + This->SupportedLanguages, + mVlanConfigDriverNameTable, + DriverName, + (BOOLEAN)(This == &gVlanConfigComponentName) + ); +} + +/** + 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 4646 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 +VlanConfigComponentNameGetControllerName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfig.vfr b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfig.vfr new file mode 100644 index 0000000000..f08a87e6e1 --- /dev/null +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfig.vfr @@ -0,0 +1,68 @@ +///** @file +// VLAN configuration formset. +// +// Copyright (c) 2009, 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. +// +//**/ + +#include "VlanConfigNvData.h" + +formset + guid = VLAN_CONFIG_PRIVATE_GUID, + title = STRING_TOKEN(STR_VLAN_FORM_SET_TITLE), + help = STRING_TOKEN(STR_VLAN_FORM_SET_TITLE_HELP), + classguid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID, + + varstore VLAN_CONFIGURATION, + varid = VLAN_CONFIGURATION_VARSTORE_ID, + name = VlanNvData, + guid = VLAN_CONFIG_PRIVATE_GUID; + + form formid = VLAN_CONFIGURATION_FORM_ID, + title = STRING_TOKEN(STR_VLAN_FORM_TITLE); + + subtitle text = STRING_TOKEN(STR_VLAN_CREATE_VLAN); + + numeric varid = VlanNvData.VlanId, + prompt = STRING_TOKEN(STR_VLAN_VID_PROMPT), + help = STRING_TOKEN(STR_VLAN_VID_HELP), + minimum = 0, + maximum = 4094, + endnumeric; + + numeric varid = VlanNvData.Priority, + prompt = STRING_TOKEN(STR_VLAN_PRIORITY_PROMPT), + help = STRING_TOKEN(STR_VLAN_PRIORITY_HELP), + minimum = 0, + maximum = 7, + endnumeric; + + text + help = STRING_TOKEN(STR_VLAN_ADD_VLAN_HELP), + text = STRING_TOKEN(STR_VLAN_ADD_VLAN_PROMPT), + flags = INTERACTIVE, + key = VLAN_ADD_QUESTION_ID; + + subtitle text = STRING_TOKEN(STR_VLAN_NULL_STRING); + subtitle text = STRING_TOKEN(STR_VLAN_VLAN_LIST); + + label LABEL_VLAN_LIST; + label LABEL_END; + + text + help = STRING_TOKEN(STR_VLAN_REMOVE_VLAN_HELP), + text = STRING_TOKEN(STR_VLAN_REMOVE_VLAN_PROMPT), + flags = INTERACTIVE, + key = VLAN_REMOVE_QUESTION_ID; + + endform; + +endformset; diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c new file mode 100644 index 0000000000..f0c3ebbc26 --- /dev/null +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c @@ -0,0 +1,305 @@ +/** @file + The driver binding for VLAN configuration module. + +Copyright (c) 2009, 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. + +**/ + +#include "VlanConfigImpl.h" + +EFI_GUID gVlanConfigPrivateGuid = VLAN_CONFIG_PRIVATE_GUID; + +EFI_DRIVER_BINDING_PROTOCOL gVlanConfigDriverBinding = { + VlanConfigDriverBindingSupported, + VlanConfigDriverBindingStart, + VlanConfigDriverBindingStop, + 0xa, + NULL, + NULL +}; + +/** + The entry point for IP4 config driver which install the driver + binding and component name protocol on its image. + + @param[in] ImageHandle The image handle of the driver. + @param[in] SystemTable The system table. + + @retval EFI_SUCCES All the related protocols are installed on the driver. + @retval Others Failed to install protocols. + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EfiLibInstallDriverBindingComponentName2 ( + ImageHandle, + SystemTable, + &gVlanConfigDriverBinding, + ImageHandle, + &gVlanConfigComponentName, + &gVlanConfigComponentName2 + ); +} + + +/** + Test to see if this driver supports ControllerHandle. + + @param[in] This Protocol instance pointer. + @param[in] ControllerHandle Handle of device to test + @param[in] RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCES This driver supports this device + @retval EFI_ALREADY_STARTED This driver is already running on this device + @retval other This driver does not support this device + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ) +{ + EFI_STATUS Status; + EFI_VLAN_CONFIG_PROTOCOL *VlanConfig; + + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiVlanConfigProtocolGuid, + (VOID **) &VlanConfig, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Close the VlanConfig protocol opened for supported test + // + gBS->CloseProtocol ( + ControllerHandle, + &gEfiVlanConfigProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + + return Status; +} + + +/** + Start this driver on ControllerHandle. + + @param[in] This Protocol instance pointer. + @param[in] ControllerHandle Handle of device to bind driver to + @param[in] RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCES This driver is added to ControllerHandle + @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle + @retval other This driver does not support this device + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ) +{ + EFI_STATUS Status; + EFI_VLAN_CONFIG_PROTOCOL *VlanConfig; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + VLAN_CONFIG_PRIVATE_DATA *PrivateData; + + // + // Check for multiple start + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gVlanConfigPrivateGuid, + (VOID **) &PrivateData, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (!EFI_ERROR (Status)) { + return EFI_ALREADY_STARTED; + } + + // + // Open VlanConfig protocol by driver + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiVlanConfigProtocolGuid, + (VOID **) &VlanConfig, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get parent device path + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + (VOID **) &DevicePath, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + goto ErrorExit; + } + + // + // Create a private data for this network device + // + PrivateData = AllocateCopyPool (sizeof (VLAN_CONFIG_PRIVATE_DATA), &mVlanConfigPrivateDateTemplate); + if (PrivateData == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto ErrorExit; + } + + PrivateData->ImageHandle = This->DriverBindingHandle; + PrivateData->ControllerHandle = ControllerHandle; + PrivateData->VlanConfig = VlanConfig; + PrivateData->ParentDevicePath = DevicePath; + + // + // Install VLAN configuration form + // + Status = InstallVlanConfigForm (PrivateData); + if (EFI_ERROR (Status)) { + goto ErrorExit; + } + + // + // Install private GUID + // + Status = gBS->InstallMultipleProtocolInterfaces ( + &ControllerHandle, + &gVlanConfigPrivateGuid, + PrivateData, + NULL + ); + if (EFI_ERROR (Status)) { + goto ErrorExit; + } + return Status; + +ErrorExit: + gBS->CloseProtocol ( + ControllerHandle, + &gEfiVlanConfigProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + + gBS->CloseProtocol ( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + + if (PrivateData != NULL) { + UninstallVlanConfigForm (PrivateData); + FreePool (PrivateData); + } + + return Status; +} + + +/** + Stop this driver on ControllerHandle. + + @param[in] This Protocol instance pointer. + @param[in] ControllerHandle Handle of device to stop driver on + @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number + of children is zero stop the entire bus driver. + @param[in] ChildHandleBuffer List of Child Handles to Stop. + + @retval EFI_SUCCES This driver is removed ControllerHandle + @retval other This driver was not removed from this device + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ) +{ + EFI_STATUS Status; + VLAN_CONFIG_PRIVATE_DATA *PrivateData; + + // + // Retrieve the PrivateData from ControllerHandle + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gVlanConfigPrivateGuid, + (VOID **) &PrivateData, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + return Status; + } + ASSERT (PrivateData->Signature == VLAN_CONFIG_PRIVATE_DATA_SIGNATURE); + + // + // Uninstall VLAN configuration Form + // + UninstallVlanConfigForm (PrivateData); + + // + // Uninstall the private GUID + // + Status = gBS->UninstallMultipleProtocolInterfaces ( + ControllerHandle, + &gVlanConfigPrivateGuid, + PrivateData, + NULL + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = gBS->CloseProtocol ( + ControllerHandle, + &gEfiVlanConfigProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + return Status; +} diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf new file mode 100644 index 0000000000..40b0433e7b --- /dev/null +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf @@ -0,0 +1,59 @@ +## @file +# Component description file for VLAN configuration module. +# +# Copyright (c) 2009, 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. +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = VlanConfigDxe + FILE_GUID = E4F61863-FE2C-4b56-A8F4-08519BC439DF + MODULE_TYPE = UEFI_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = VlanConfigDriverEntryPoint + UNLOAD_IMAGE = NetLibDefaultUnload + + +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +[Sources.common] + ComponentName.c + VlanConfigDriver.c + VlanConfigImpl.c + VlanConfigImpl.h + VlanConfig.vfr + VlanConfigStrings.uni + VlanConfigNvData.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + MemoryAllocationLib + UefiLib + UefiBootServicesTableLib + UefiDriverEntryPoint + DebugLib + NetLib + HiiLib + +[Guids] + gEfiIfrTianoGuid + +[Protocols] + gEfiHiiConfigAccessProtocolGuid ## PRODUCES + gEfiHiiConfigRoutingProtocolGuid ## CONSUMES + gEfiVlanConfigProtocolGuid ## CONSUMES diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.c b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.c new file mode 100644 index 0000000000..8d72f585d0 --- /dev/null +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.c @@ -0,0 +1,551 @@ +/** @file + HII Config Access protocol implementation of VLAN configuration module. + +Copyright (c) 2009, 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. + +**/ + +#include "VlanConfigImpl.h" + +EFI_GUID mVlanFormSetGuid = VLAN_CONFIG_PRIVATE_GUID; +CHAR16 mVlanStorageName[] = L"VlanNvData"; +EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting = NULL; + +VLAN_CONFIG_PRIVATE_DATA mVlanConfigPrivateDateTemplate = { + VLAN_CONFIG_PRIVATE_DATA_SIGNATURE, + { + VlanExtractConfig, + VlanRouteConfig, + VlanCallback + } +}; + +VENDOR_DEVICE_PATH mHiiVendorDevicePathNode = { + { + HARDWARE_DEVICE_PATH, + HW_VENDOR_DP, + { + (UINT8) (sizeof (VENDOR_DEVICE_PATH)), + (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) + } + }, + VLAN_CONFIG_PRIVATE_GUID +}; + +/** + This function allows a caller to extract the current configuration for one + or more named elements from the target driver. + + @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. + @param[in] Request A null-terminated Unicode string in + format. + @param[out] Progress On return, points to a character in the Request + string. Points to the string's null terminator if + request was successful. Points to the most recent + '&' before the first failing name/value pair (or + the beginning of the string if the failure is in + the first name/value pair) if the request was not + successful. + @param[out] Results A null-terminated Unicode string in + format which has all values filled + in for the names in the Request string. String to + be allocated by the called function. + + @retval EFI_SUCCESS The Results is filled with the requested values. + @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results. + @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name. + @retval EFI_NOT_FOUND Routing data doesn't match any storage in this + driver. + +**/ +EFI_STATUS +EFIAPI +VlanExtractConfig ( + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN CONST EFI_STRING Request, + OUT EFI_STRING *Progress, + OUT EFI_STRING *Results + ) +{ + EFI_STATUS Status; + UINTN BufferSize; + VLAN_CONFIGURATION Configuration; + + if (Request == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // Retrieve the pointer to the UEFI HII Config Routing Protocol + // + if (mHiiConfigRouting == NULL) { + gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &mHiiConfigRouting); + } + ASSERT (mHiiConfigRouting != NULL); + + // + // Convert buffer data to by helper function BlockToConfig() + // + ZeroMem (&Configuration, sizeof (VLAN_CONFIGURATION)); + BufferSize = sizeof (VLAN_CONFIG_PRIVATE_DATA); + Status = mHiiConfigRouting->BlockToConfig ( + mHiiConfigRouting, + Request, + (UINT8 *) &Configuration, + BufferSize, + Results, + Progress + ); + return Status; +} + + +/** + This function processes the results of changes in configuration. + + @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. + @param[in] Configuration A null-terminated Unicode string in + format. + @param[out] Progress A pointer to a string filled in with the offset of + the most recent '&' before the first failing + name/value pair (or the beginning of the string if + the failure is in the first name/value pair) or + the terminating NULL if all was successful. + + @retval EFI_SUCCESS The Results is processed successfully. + @retval EFI_INVALID_PARAMETER Configuration is NULL. + @retval EFI_NOT_FOUND Routing data doesn't match any storage in this + driver. + +**/ +EFI_STATUS +EFIAPI +VlanRouteConfig ( + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN CONST EFI_STRING Configuration, + OUT EFI_STRING *Progress + ) +{ + if (Configuration == NULL || Progress == NULL) { + return EFI_INVALID_PARAMETER; + } + + *Progress = Configuration; + if (!HiiIsConfigHdrMatch (Configuration, &mVlanFormSetGuid, mVlanStorageName)) { + return EFI_NOT_FOUND; + } + + *Progress = Configuration + StrLen (Configuration); + return EFI_SUCCESS; +} + +/** + This function processes the results of changes in configuration. + + @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. + @param[in] Action Specifies the type of action taken by the browser. + @param[in] QuestionId A unique value which is sent to the original + exporting driver so that it can identify the type + of data to expect. + @param[in] Type The type of value for the question. + @param[in] Value A pointer to the data being sent to the original + exporting driver. + @param[out] ActionRequest On return, points to the action requested by the + callback function. + + @retval EFI_SUCCESS The callback successfully handled the action. + @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the + variable and its data. + @retval EFI_DEVICE_ERROR The variable could not be saved. + @retval EFI_UNSUPPORTED The specified Action is not supported by the + callback. + +**/ +EFI_STATUS +EFIAPI +VlanCallback ( + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN EFI_BROWSER_ACTION Action, + IN EFI_QUESTION_ID QuestionId, + IN UINT8 Type, + IN EFI_IFR_TYPE_VALUE *Value, + OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest + ) +{ + VLAN_CONFIG_PRIVATE_DATA *PrivateData; + VLAN_CONFIGURATION *Configuration; + EFI_VLAN_CONFIG_PROTOCOL *VlanConfig; + UINTN Index; + EFI_HANDLE VlanHandle; + + PrivateData = VLAN_CONFIG_PRIVATE_DATA_FROM_THIS (This); + + if (Action == EFI_BROWSER_ACTION_FORM_OPEN) { + // + // On FORM_OPEN event, update current VLAN list + // + VlanUpdateForm (PrivateData); + + return EFI_SUCCESS; + } + + // + // Get Browser data + // + Configuration = AllocateZeroPool (sizeof (VLAN_CONFIGURATION)); + ASSERT (Configuration != NULL); + HiiGetBrowserData (&mVlanFormSetGuid, mVlanStorageName, sizeof (VLAN_CONFIGURATION), (UINT8 *) Configuration); + + VlanConfig = PrivateData->VlanConfig; + + switch (QuestionId) { + case VLAN_ADD_QUESTION_ID: + // + // Add a VLAN + // + VlanConfig->Set (VlanConfig, Configuration->VlanId, Configuration->Priority); + VlanUpdateForm (PrivateData); + + // + // Connect the newly created VLAN device + // + VlanHandle = NetLibGetVlanHandle (PrivateData->ControllerHandle, Configuration->VlanId); + if (VlanHandle == NULL) { + // + // There may be no child handle created for VLAN ID 0, connect the parent handle + // + VlanHandle = PrivateData->ControllerHandle; + } + gBS->ConnectController (VlanHandle, NULL, NULL, TRUE); + + // + // Clear UI data + // + *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT; + Configuration->VlanId = 0; + Configuration->Priority = 0; + break; + + case VLAN_REMOVE_QUESTION_ID: + // + // Remove VLAN + // + for (Index = 0; Index < PrivateData->NumberOfVlan; Index++) { + if (Configuration->VlanList[Index] != 0) { + // + // Checkbox is selected, need remove this VLAN + // + VlanConfig->Remove (VlanConfig, PrivateData->VlanId[Index]); + } + } + + VlanUpdateForm (PrivateData); + if (PrivateData->NumberOfVlan == 0) { + // + // No VLAN device now, connect the physical NIC handle. + // Note: PrivateData->NumberOfVlan has been updated by VlanUpdateForm() + // + gBS->ConnectController (PrivateData->ControllerHandle, NULL, NULL, TRUE); + } + + *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT; + ZeroMem (Configuration->VlanList, MAX_VLAN_NUMBER); + break; + + default: + break; + } + + HiiSetBrowserData (&mVlanFormSetGuid, mVlanStorageName, sizeof (VLAN_CONFIGURATION), (UINT8 *) Configuration, NULL); + FreePool (Configuration); + return EFI_SUCCESS; +} + + +/** + This function update VLAN list in the VLAN configuration Form. + + @param[in, out] PrivateData Points to VLAN configuration private data. + +**/ +VOID +VlanUpdateForm ( + IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData + ) +{ + EFI_VLAN_CONFIG_PROTOCOL *VlanConfig; + UINT16 NumberOfVlan; + UINTN Index; + EFI_VLAN_FIND_DATA *VlanData; + VOID *StartOpCodeHandle; + EFI_IFR_GUID_LABEL *StartLabel; + VOID *EndOpCodeHandle; + EFI_IFR_GUID_LABEL *EndLabel; + CHAR16 *String; + CHAR16 VlanStr[30]; + CHAR16 VlanIdStr[6]; + UINTN DigitalCount; + EFI_STRING_ID StringId; + + // + // Find current VLAN configuration + // + VlanData = NULL; + NumberOfVlan = 0; + VlanConfig = PrivateData->VlanConfig; + VlanConfig->Find (VlanConfig, NULL, &NumberOfVlan, &VlanData); + + // + // Update VLAN configuration in PrivateData + // + if (NumberOfVlan > MAX_VLAN_NUMBER) { + NumberOfVlan = MAX_VLAN_NUMBER; + } + PrivateData->NumberOfVlan = NumberOfVlan; + + // + // Init OpCode Handle + // + StartOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (StartOpCodeHandle != NULL); + + EndOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (EndOpCodeHandle != NULL); + + // + // Create Hii Extend Label OpCode as the start opcode + // + StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode ( + StartOpCodeHandle, + &gEfiIfrTianoGuid, + NULL, + sizeof (EFI_IFR_GUID_LABEL) + ); + StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; + StartLabel->Number = LABEL_VLAN_LIST; + + // + // Create Hii Extend Label OpCode as the end opcode + // + EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode ( + EndOpCodeHandle, + &gEfiIfrTianoGuid, + NULL, + sizeof (EFI_IFR_GUID_LABEL) + ); + EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; + EndLabel->Number = LABEL_END; + + ZeroMem (PrivateData->VlanId, MAX_VLAN_NUMBER); + for (Index = 0; Index < NumberOfVlan; Index++) { + String = VlanStr; + + StrCpy (String, L" VLAN ID:"); + String += 10; + // + // Pad VlanId string up to 4 characters with space + // + DigitalCount = UnicodeValueToString (VlanIdStr, 0, VlanData[Index].VlanId, 5); + SetMem16 (String, (4 - DigitalCount) * sizeof (CHAR16), L' '); + StrCpy (String + 4 - DigitalCount, VlanIdStr); + String += 4; + + StrCpy (String, L", Priority:"); + String += 11; + String += UnicodeValueToString (String, 0, VlanData[Index].Priority, 4); + *String = 0; + + StringId = HiiSetString (PrivateData->HiiHandle, 0, VlanStr, NULL); + ASSERT (StringId != 0); + + HiiCreateCheckBoxOpCode ( + StartOpCodeHandle, + (EFI_QUESTION_ID) (VLAN_LIST_VAR_OFFSET + Index), + VLAN_CONFIGURATION_VARSTORE_ID, + (UINT16) (VLAN_LIST_VAR_OFFSET + Index), + StringId, + STRING_TOKEN (STR_VLAN_VLAN_LIST_HELP), + 0, + 0, + NULL + ); + + // + // Save VLAN id to private data + // + PrivateData->VlanId[Index] = VlanData[Index].VlanId; + } + + HiiUpdateForm ( + PrivateData->HiiHandle, // HII handle + &mVlanFormSetGuid, // Formset GUID + VLAN_CONFIGURATION_FORM_ID, // Form ID + StartOpCodeHandle, // Label for where to insert opcodes + EndOpCodeHandle // Replace data + ); + + HiiFreeOpCodeHandle (StartOpCodeHandle); + HiiFreeOpCodeHandle (EndOpCodeHandle); + + if (VlanData != NULL) { + FreePool (VlanData); + } +} + + +/** + This function publish the VLAN configuration Form for a network device. The + HII Config Access protocol will be installed on a child handle of the network + device. + + @param[in, out] PrivateData Points to VLAN configuration private data. + + @retval EFI_SUCCESS HII Form is installed for this network device. + @retval EFI_OUT_OF_RESOURCES Not enough resource for HII Form installation. + @retval Others Other errors as indicated. + +**/ +EFI_STATUS +InstallVlanConfigForm ( + IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData + ) +{ + EFI_STATUS Status; + EFI_HII_HANDLE HiiHandle; + EFI_HANDLE DriverHandle; + CHAR16 Str[40]; + CHAR16 *MacString; + EFI_DEVICE_PATH_PROTOCOL *ChildDevicePath; + EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess; + + // + // Create child handle and install HII Config Access Protocol + // + ChildDevicePath = AppendDevicePathNode ( + PrivateData->ParentDevicePath, + (CONST EFI_DEVICE_PATH_PROTOCOL *) &mHiiVendorDevicePathNode + ); + if (ChildDevicePath == NULL) { + return EFI_OUT_OF_RESOURCES; + } + PrivateData->ChildDevicePath = ChildDevicePath; + + DriverHandle = NULL; + ConfigAccess = &PrivateData->ConfigAccess; + Status = gBS->InstallMultipleProtocolInterfaces ( + &DriverHandle, + &gEfiDevicePathProtocolGuid, + ChildDevicePath, + &gEfiHiiConfigAccessProtocolGuid, + ConfigAccess, + NULL + ); + if (EFI_ERROR (Status)) { + return Status; + } + PrivateData->DriverHandle = DriverHandle; + + // + // Publish the HII package list + // + HiiHandle = HiiAddPackages ( + &mVlanFormSetGuid, + DriverHandle, + VlanConfigDxeStrings, + VlanConfigBin, + NULL + ); + if (HiiHandle == NULL) { + return EFI_OUT_OF_RESOURCES; + } + PrivateData->HiiHandle = HiiHandle; + + // + // Update formset title + // + MacString = NULL; + Status = NetLibGetMacString (PrivateData->ControllerHandle, PrivateData->ImageHandle, &MacString); + if (EFI_ERROR (Status)) { + return Status; + } + PrivateData->MacString = MacString; + + StrCpy (Str, L"VLAN Configuration (MAC:"); + StrCat (Str, MacString); + StrCat (Str, L")"); + HiiSetString ( + HiiHandle, + STRING_TOKEN (STR_VLAN_FORM_SET_TITLE), + Str, + NULL + ); + + // + // Update form title + // + HiiSetString ( + HiiHandle, + STRING_TOKEN (STR_VLAN_FORM_TITLE), + Str, + NULL + ); + + return EFI_SUCCESS; +} + +/** + This function remove the VLAN configuration Form for a network device. The + child handle for HII Config Access protocol will be destroyed. + + @param[in, out] PrivateData Points to VLAN configuration private data. + +**/ +VOID +UninstallVlanConfigForm ( + IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData + ) +{ + // + // Free MAC string + // + if (PrivateData->MacString != NULL) { + FreePool (PrivateData->MacString); + PrivateData->MacString = NULL; + } + + // + // Uninstall HII package list + // + if (PrivateData->HiiHandle != NULL) { + HiiRemovePackages (PrivateData->HiiHandle); + PrivateData->HiiHandle = NULL; + } + + // + // Uninstall HII Config Access Protocol + // + if (PrivateData->DriverHandle != NULL) { + gBS->UninstallMultipleProtocolInterfaces ( + PrivateData->DriverHandle, + &gEfiDevicePathProtocolGuid, + PrivateData->ChildDevicePath, + &gEfiHiiConfigAccessProtocolGuid, + &PrivateData->ConfigAccess, + NULL + ); + PrivateData->DriverHandle = NULL; + + if (PrivateData->ChildDevicePath != NULL) { + FreePool (PrivateData->ChildDevicePath); + PrivateData->ChildDevicePath = NULL; + } + } +} diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.h b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.h new file mode 100644 index 0000000000..00fcdcedb0 --- /dev/null +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.h @@ -0,0 +1,385 @@ +/** @file + Header file for driver binding protocol and HII config access protocol. + +Copyright (c) 2009, 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 __VLAN_CONFIG_IMPL_H__ +#define __VLAN_CONFIG_IMPL_H__ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "VlanConfigNvData.h" + +extern EFI_COMPONENT_NAME2_PROTOCOL gVlanConfigComponentName2; +extern EFI_COMPONENT_NAME_PROTOCOL gVlanConfigComponentName; + +// +// Tool generated IFR binary data and String package data +// +extern UINT8 VlanConfigBin[]; +extern UINT8 VlanConfigDxeStrings[]; + +#define VLAN_LIST_VAR_OFFSET ((UINT16) OFFSET_OF (VLAN_CONFIGURATION, VlanList)) + +typedef struct { + UINTN Signature; + + EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess; + EFI_HII_HANDLE HiiHandle; + EFI_HANDLE DriverHandle; + EFI_DEVICE_PATH_PROTOCOL *ChildDevicePath; + + EFI_HANDLE ControllerHandle; + EFI_HANDLE ImageHandle; + EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; + EFI_VLAN_CONFIG_PROTOCOL *VlanConfig; + CHAR16 *MacString; + + UINT16 NumberOfVlan; + UINT16 VlanId[MAX_VLAN_NUMBER]; +} VLAN_CONFIG_PRIVATE_DATA; + +#define VLAN_CONFIG_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('V', 'C', 'P', 'D') +#define VLAN_CONFIG_PRIVATE_DATA_FROM_THIS(a) CR (a, VLAN_CONFIG_PRIVATE_DATA, ConfigAccess, VLAN_CONFIG_PRIVATE_DATA_SIGNATURE) + +extern VLAN_CONFIG_PRIVATE_DATA mVlanConfigPrivateDateTemplate; + + +/** + 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 4646 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 +VlanConfigComponentNameGetDriverName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN CHAR8 *Language, + 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 4646 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 +VlanConfigComponentNameGetControllerName ( + IN EFI_COMPONENT_NAME_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName + ); + +/** + Test to see if this driver supports ControllerHandle. + + @param[in] This Protocol instance pointer. + @param[in] ControllerHandle Handle of device to test + @param[in] RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCES This driver supports this device + @retval EFI_ALREADY_STARTED This driver is already running on this device + @retval other This driver does not support this device + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ); + +/** + Start this driver on ControllerHandle. + + @param[in] This Protocol instance pointer. + @param[in] ControllerHandle Handle of device to bind driver to + @param[in] RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCES This driver is added to ControllerHandle + @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle + @retval other This driver does not support this device + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ); + +/** + Stop this driver on ControllerHandle. + + @param[in] This Protocol instance pointer. + @param[in] ControllerHandle Handle of device to stop driver on + @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number + of children is zero stop the entire bus driver. + @param[in] ChildHandleBuffer List of Child Handles to Stop. + + @retval EFI_SUCCES This driver is removed ControllerHandle + @retval other This driver was not removed from this device + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +/** + This function update VLAN list in the VLAN configuration Form. + + @param[in, out] PrivateData Points to VLAN configuration private data. + +**/ +VOID +VlanUpdateForm ( + IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData + ); + +/** + This function publish the VLAN configuration Form for a network device. The + HII Config Access protocol will be installed on a child handle of the network + device. + + @param[in, out] PrivateData Points to VLAN configuration private data. + + @retval EFI_SUCCESS HII Form is installed for this network device. + @retval EFI_OUT_OF_RESOURCES Not enough resource for HII Form installation. + @retval Others Other errors as indicated. + +**/ +EFI_STATUS +InstallVlanConfigForm ( + IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData + ); + +/** + This function remove the VLAN configuration Form for a network device. The + child handle for HII Config Access protocol will be destroyed. + + @param[in, out] PrivateData Points to VLAN configuration private data. + +**/ +VOID +UninstallVlanConfigForm ( + IN OUT VLAN_CONFIG_PRIVATE_DATA *PrivateData + ); + +/** + This function allows a caller to extract the current configuration for one + or more named elements from the target driver. + + @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. + @param[in] Request A null-terminated Unicode string in + format. + @param[out] Progress On return, points to a character in the Request + string. Points to the string's null terminator if + request was successful. Points to the most recent + '&' before the first failing name/value pair (or + the beginning of the string if the failure is in + the first name/value pair) if the request was not + successful. + @param[out] Results A null-terminated Unicode string in + format which has all values filled + in for the names in the Request string. String to + be allocated by the called function. + + @retval EFI_SUCCESS The Results is filled with the requested values. + @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results. + @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name. + @retval EFI_NOT_FOUND Routing data doesn't match any storage in this + driver. + +**/ +EFI_STATUS +EFIAPI +VlanExtractConfig ( + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN CONST EFI_STRING Request, + OUT EFI_STRING *Progress, + OUT EFI_STRING *Results + ); + +/** + This function processes the results of changes in configuration. + + @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. + @param[in] Configuration A null-terminated Unicode string in + format. + @param[out] Progress A pointer to a string filled in with the offset of + the most recent '&' before the first failing + name/value pair (or the beginning of the string if + the failure is in the first name/value pair) or + the terminating NULL if all was successful. + + @retval EFI_SUCCESS The Results is processed successfully. + @retval EFI_INVALID_PARAMETER Configuration is NULL. + @retval EFI_NOT_FOUND Routing data doesn't match any storage in this + driver. + +**/ +EFI_STATUS +EFIAPI +VlanRouteConfig ( + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN CONST EFI_STRING Configuration, + OUT EFI_STRING *Progress + ); + +/** + This function processes the results of changes in configuration. + + @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. + @param[in] Action Specifies the type of action taken by the browser. + @param[in] QuestionId A unique value which is sent to the original + exporting driver so that it can identify the type + of data to expect. + @param[in] Type The type of value for the question. + @param[in] Value A pointer to the data being sent to the original + exporting driver. + @param[out] ActionRequest On return, points to the action requested by the + callback function. + + @retval EFI_SUCCESS The callback successfully handled the action. + @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the + variable and its data. + @retval EFI_DEVICE_ERROR The variable could not be saved. + @retval EFI_UNSUPPORTED The specified Action is not supported by the + callback. + +**/ +EFI_STATUS +EFIAPI +VlanCallback ( + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN EFI_BROWSER_ACTION Action, + IN EFI_QUESTION_ID QuestionId, + IN UINT8 Type, + IN EFI_IFR_TYPE_VALUE *Value, + OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest + ); + +#endif diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigNvData.h b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigNvData.h new file mode 100644 index 0000000000..7de3af03a7 --- /dev/null +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigNvData.h @@ -0,0 +1,50 @@ +/** @file + Header file for NV data structure definition. + +Copyright (c) 2009, 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 __VLAN_CONFIG_NV_DATA_H__ +#define __VLAN_CONFIG_NV_DATA_H__ + +#include + + +#define VLAN_CONFIG_PRIVATE_GUID \ + { \ + 0xd79df6b0, 0xef44, 0x43bd, {0x97, 0x97, 0x43, 0xe9, 0x3b, 0xcf, 0x5f, 0xa8 } \ + } + +#define VLAN_CONFIGURATION_VARSTORE_ID 0x0001 +#define VLAN_CONFIGURATION_FORM_ID 0x0001 + +#define VLAN_ADD_QUESTION_ID 0x1000 +#define VLAN_REMOVE_QUESTION_ID 0x2000 + +#define LABEL_VLAN_LIST 0x0001 +#define LABEL_END 0xffff + +// +// The maximum number of VLAN that will be displayed on the menu +// +#define MAX_VLAN_NUMBER 100 + +// +// Nv Data structure referenced by IFR +// +typedef struct { + UINT16 VlanId; + UINT8 Priority; + UINT8 VlanList[MAX_VLAN_NUMBER]; +} VLAN_CONFIGURATION; + +#endif diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigStrings.uni b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigStrings.uni new file mode 100644 index 0000000000..51e7dd8d68 Binary files /dev/null and b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigStrings.uni differ -- cgit v1.2.3