Update IPv6 configuration UI: 1) keep addresses blank when enter ‘Advanced Configuration’ page; 2) Save parameters in ‘Advanced Configuration’ immediately when user press ‘Commit Changes and Exit’ .

Signed-off-by: Ye Ting  <ting.ye@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Ouyang Qian <qian.ouyang@intel.com>

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14047 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
tye1 2013-01-15 02:19:42 +00:00
parent 5ecab66086
commit 130df89019
2 changed files with 228 additions and 259 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
Helper functions for configuring or obtaining the parameters relating to IP6. Helper functions for configuring or obtaining the parameters relating to IP6.
Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR> Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -669,9 +669,8 @@ Error:
/** /**
This function converts the interface info to string and draws it to the IP6 UI. This function converts the interface info to string and draws it to the IP6 UI.
The interface information includes interface name, interface type, hardware address, The interface information includes interface name, interface type, hardware
address info, and route table information. The address information is also used as the address and route table information.
content of manual addresses in IP6 UI.
@param[in] IfInfo The pointer of EFI_IP6_CONFIG_INTERFACE_INFO. @param[in] IfInfo The pointer of EFI_IP6_CONFIG_INTERFACE_INFO.
@param[in] HiiHandle The handle that was previously registered in the @param[in] HiiHandle The handle that was previously registered in the
@ -693,7 +692,6 @@ Ip6ConvertInterfaceInfoToString (
UINT32 Index; UINT32 Index;
UINTN Number; UINTN Number;
CHAR16 *String; CHAR16 *String;
CHAR16 *LinkLocalStr;
CHAR16 PortString[ADDRESS_STR_MAX_SIZE]; CHAR16 PortString[ADDRESS_STR_MAX_SIZE];
CHAR16 FormatString[8]; CHAR16 FormatString[8];
EFI_STRING_ID StringId; EFI_STRING_ID StringId;
@ -782,43 +780,6 @@ Ip6ConvertInterfaceInfoToString (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
//
// Print the host address Information.
//
Status = Ip6ConvertAddressListToString (
PortString,
HiiHandle,
Ip6ConfigNvHostAddress,
IfInfo->AddressInfo,
IfInfo->AddressInfoCount
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Copy the Host Address Info to manual address field.
// Do not copy the link local address.
//
LinkLocalStr = StrStr (PortString, IP6_LINK_LOCAL_PREFIX);
if (LinkLocalStr != NULL) {
Number = LinkLocalStr - PortString;
if (Number > 0) {
CopyMem (IfrNvData->ManualAddress, PortString, Number * sizeof (CHAR16));
}
while ((*LinkLocalStr != L' ') && (*LinkLocalStr != L'\0')) {
LinkLocalStr++;
}
if (*LinkLocalStr != L'\0') {
LinkLocalStr++;
StrCat (IfrNvData->ManualAddress, LinkLocalStr);
}
} else {
StrCpy (IfrNvData->ManualAddress, PortString);
}
// //
// Print the route table information. // Print the route table information.
// //
@ -1033,75 +994,6 @@ Ip6ConvertConfigNvDataToIfrNvData (
IfrNvData->DadTransmitCount = DadXmits.DupAddrDetectTransmits; IfrNvData->DadTransmitCount = DadXmits.DupAddrDetectTransmits;
//
// Get DNS server list.
//
FreePool (Data);
Data = NULL;
DataSize = 0;
Status = Ip6ConfigNvGetData (
Ip6Config,
Ip6ConfigDataTypeDnsServer,
&DataSize,
(VOID **) &Data
);
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
goto Exit;
}
if (DataSize > 0) {
//
// Convert the DNS server address to string and draw it to UI.
//
Status = Ip6ConvertAddressListToString (
IfrNvData->DnsAddress,
HiiHandle,
Ip6ConfigNvDnsAddress,
Data,
DataSize / sizeof (EFI_IPv6_ADDRESS)
);
if (EFI_ERROR (Status)) {
goto Exit;
}
FreePool (Data);
Data = NULL;
}
//
// Get gateway adderss list.
//
DataSize = 0;
Status = Ip6ConfigNvGetData (
Ip6Config,
Ip6ConfigDataTypeGateway,
&DataSize,
(VOID **) &Data
);
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
goto Exit;
}
if (DataSize > 0) {
//
// Convert the gateway address to string and draw it to UI.
//
Status = Ip6ConvertAddressListToString (
IfrNvData->GatewayAddress,
HiiHandle,
Ip6ConfigNvGatewayAddress,
Data,
DataSize / sizeof (EFI_IPv6_ADDRESS)
);
if (EFI_ERROR (Status)) {
goto Exit;
}
}
Status = EFI_SUCCESS;
Exit: Exit:
if (Data != NULL) { if (Data != NULL) {
FreePool (Data); FreePool (Data);
@ -1112,8 +1004,7 @@ Exit:
/** /**
Convert IFR data into IP6 configuration data. The policy, alternative interface Convert IFR data into IP6 configuration data. The policy, alternative interface
ID, and DAD transmit counts, and will be saved. If under manual policy, the configured ID, and DAD transmit counts, and will be saved.
manual address, gateway address, and DNS server address will be saved.
@param[in] IfrNvData The IFR NV data. @param[in] IfrNvData The IFR NV data.
@param[in, out] Instance The IP6 config instance data. @param[in, out] Instance The IP6 config instance data.
@ -1124,7 +1015,7 @@ Exit:
**/ **/
EFI_STATUS EFI_STATUS
Ip6ConvertIfrNvDataToConfigNvData ( Ip6ConvertIfrNvDataToConfigNvDataGeneral (
IN IP6_CONFIG_IFR_NVDATA *IfrNvData, IN IP6_CONFIG_IFR_NVDATA *IfrNvData,
IN OUT IP6_CONFIG_INSTANCE *Instance IN OUT IP6_CONFIG_INSTANCE *Instance
) )
@ -1132,12 +1023,6 @@ Ip6ConvertIfrNvDataToConfigNvData (
IP6_CONFIG_NVDATA *Ip6NvData; IP6_CONFIG_NVDATA *Ip6NvData;
EFI_IP6_CONFIG_PROTOCOL *Ip6Config; EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
EFI_STATUS Status; EFI_STATUS Status;
EFI_IP6_CONFIG_MANUAL_ADDRESS *ManualAddress;
EFI_IPv6_ADDRESS *Address;
BOOLEAN IsAddressOk;
EFI_EVENT SetAddressEvent;
EFI_EVENT TimeoutEvent;
UINTN DataSize;
if ((IfrNvData == NULL) || (Instance == NULL)) { if ((IfrNvData == NULL) || (Instance == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -1197,11 +1082,67 @@ Ip6ConvertIfrNvDataToConfigNvData (
return Status; return Status;
} }
return EFI_SUCCESS;
}
if (Ip6NvData->Policy == Ip6ConfigPolicyAutomatic) { /**
Convert IFR data into IP6 configuration data. The policy, configured
manual address, gateway address, and DNS server address will be saved.
@param[in] IfrNvData The IFR NV data.
@param[in, out] Instance The IP6 config instance data.
@retval EFI_SUCCESS The operation finished successfully.
@retval EFI_INVALID_PARAMETER Any input parameter is invalid.
@retval Others Other errors as indicated.
**/
EFI_STATUS
Ip6ConvertIfrNvDataToConfigNvDataAdvanced (
IN IP6_CONFIG_IFR_NVDATA *IfrNvData,
IN OUT IP6_CONFIG_INSTANCE *Instance
)
{
IP6_CONFIG_NVDATA *Ip6NvData;
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
EFI_STATUS Status;
EFI_IP6_CONFIG_MANUAL_ADDRESS *ManualAddress;
EFI_IPv6_ADDRESS *Address;
BOOLEAN IsAddressOk;
EFI_EVENT SetAddressEvent;
EFI_EVENT TimeoutEvent;
UINTN DataSize;
if ((IfrNvData == NULL) || (Instance == NULL)) {
return EFI_INVALID_PARAMETER;
}
if (IfrNvData->Policy == IP6_POLICY_AUTO) {
return EFI_SUCCESS; return EFI_SUCCESS;
} }
NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);
Ip6NvData = &Instance->Ip6NvData;
Ip6Config = &Instance->Ip6Config;
//
// Update those fields which don't have INTERACTIVE attribute.
//
Ip6NvData->Policy = Ip6ConfigPolicyManual;
//
// Set the configured policy.
//
Status = Ip6Config->SetData (
Ip6Config,
Ip6ConfigDataTypePolicy,
sizeof (EFI_IP6_CONFIG_POLICY),
&Ip6NvData->Policy
);
if (EFI_ERROR (Status)) {
return Status;
}
// //
// Create events & timers for asynchronous settings. // Create events & timers for asynchronous settings.
// //
@ -1358,6 +1299,7 @@ Exit:
return Status; return Status;
} }
/** /**
This function allows the caller to request the current This function allows the caller to request the current
configuration for one or more named elements. The resulting configuration for one or more named elements. The resulting
@ -1587,6 +1529,160 @@ Ip6FormRouteConfig (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/**
Display host addresses, route table, DNS addresses and gateway addresses in
"IPv6 Current Setting" page.
@param[in] Instance The IP6 config instance data.
@retval EFI_SUCCESS The operation finished successfully.
@retval Others Other errors as indicated.
**/
EFI_STATUS
Ip6GetCurrentSetting (
IN IP6_CONFIG_INSTANCE *Instance
)
{
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
EFI_HII_HANDLE HiiHandle;
EFI_IP6_CONFIG_INTERFACE_INFO *Data;
UINTN DataSize;
EFI_STATUS Status;
CHAR16 PortString[ADDRESS_STR_MAX_SIZE];
EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;
Ip6Config = &Instance->Ip6Config;
HiiHandle = Instance->CallbackInfo.RegisteredHandle;
Data = NULL;
//
// Get current interface info.
//
Status = Ip6ConfigNvGetData (
Ip6Config,
Ip6ConfigDataTypeInterfaceInfo,
&DataSize,
(VOID **) &Data
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Generate dynamic text opcode for host address and draw it.
//
IfInfo = (EFI_IP6_CONFIG_INTERFACE_INFO *) Data;
Status = Ip6ConvertAddressListToString (
PortString,
HiiHandle,
Ip6ConfigNvHostAddress,
IfInfo->AddressInfo,
IfInfo->AddressInfoCount
);
if (EFI_ERROR (Status)) {
FreePool (Data);
return Status;
}
//
// Generate the dynamic text opcode for route table and draw it.
//
Status = Ip6ConvertAddressListToString (
PortString,
HiiHandle,
Ip6ConfigNvRouteTable,
IfInfo->RouteTable,
IfInfo->RouteCount
);
if (EFI_ERROR (Status)) {
FreePool (Data);
return Status;
}
//
// Get DNS server list.
//
FreePool (Data);
DataSize = 0;
Data = NULL;
Status = Ip6ConfigNvGetData (
Ip6Config,
Ip6ConfigDataTypeDnsServer,
&DataSize,
(VOID **) &Data
);
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
if (Data != NULL) {
FreePool (Data);
}
return Status;
}
if (DataSize > 0) {
//
// Generate the dynamic text opcode for DNS server and draw it.
//
Status = Ip6ConvertAddressListToString (
PortString,
HiiHandle,
Ip6ConfigNvDnsAddress,
Data,
DataSize / sizeof (EFI_IPv6_ADDRESS)
);
if (EFI_ERROR (Status)) {
FreePool (Data);
return Status;
}
}
//
// Get gateway adderss list.
//
if (Data != NULL) {
FreePool (Data);
}
DataSize = 0;
Data = NULL;
Status = Ip6ConfigNvGetData (
Ip6Config,
Ip6ConfigDataTypeGateway,
&DataSize,
(VOID **) &Data
);
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
if (Data != NULL) {
FreePool (Data);
}
return Status;
}
if (DataSize > 0) {
//
// Generate the dynamic text opcode for gateway and draw it.
//
Status = Ip6ConvertAddressListToString (
PortString,
HiiHandle,
Ip6ConfigNvGatewayAddress,
Data,
DataSize / sizeof (EFI_IPv6_ADDRESS)
);
if (EFI_ERROR (Status)) {
FreePool (Data);
return Status;
}
}
if (Data != NULL) {
FreePool (Data);
}
return EFI_SUCCESS;
}
/** /**
This function is called to provide results data to the driver. This function is called to provide results data to the driver.
This data consists of a unique key that is used to identify This data consists of a unique key that is used to identify
@ -1632,12 +1728,6 @@ Ip6FormCallback (
EFI_INPUT_KEY Key; EFI_INPUT_KEY Key;
IP6_CONFIG_INSTANCE *Instance; IP6_CONFIG_INSTANCE *Instance;
IP6_CONFIG_NVDATA *Ip6NvData; IP6_CONFIG_NVDATA *Ip6NvData;
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
EFI_IP6_CONFIG_INTERFACE_INFO *Data;
UINTN DataSize;
CHAR16 PortString[ADDRESS_STR_MAX_SIZE];
EFI_HII_HANDLE HiiHandle;
EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;
if (This == NULL) { if (This == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -1676,135 +1766,7 @@ Ip6FormCallback (
if (Action == EFI_BROWSER_ACTION_CHANGING) { if (Action == EFI_BROWSER_ACTION_CHANGING) {
switch (QuestionId) { switch (QuestionId) {
case KEY_GET_CURRENT_SETTING: case KEY_GET_CURRENT_SETTING:
Ip6Config = &Instance->Ip6Config; Status = Ip6GetCurrentSetting (Instance);
HiiHandle = Instance->CallbackInfo.RegisteredHandle;
Data = NULL;
//
// Get current interface info.
//
Status = Ip6ConfigNvGetData (
Ip6Config,
Ip6ConfigDataTypeInterfaceInfo,
&DataSize,
(VOID **) &Data
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Generate dynamic text opcode for host address and draw it.
//
IfInfo = (EFI_IP6_CONFIG_INTERFACE_INFO *) Data;
Status = Ip6ConvertAddressListToString (
PortString,
HiiHandle,
Ip6ConfigNvHostAddress,
IfInfo->AddressInfo,
IfInfo->AddressInfoCount
);
if (EFI_ERROR (Status)) {
FreePool (Data);
return Status;
}
//
// Generate the dynamic text opcode for route table and draw it.
//
Status = Ip6ConvertAddressListToString (
PortString,
HiiHandle,
Ip6ConfigNvRouteTable,
IfInfo->RouteTable,
IfInfo->RouteCount
);
if (EFI_ERROR (Status)) {
FreePool (Data);
return Status;
}
//
// Get DNS server list.
//
FreePool (Data);
DataSize = 0;
Data = NULL;
Status = Ip6ConfigNvGetData (
Ip6Config,
Ip6ConfigDataTypeDnsServer,
&DataSize,
(VOID **) &Data
);
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
if (Data != NULL) {
FreePool (Data);
}
return Status;
}
if (DataSize > 0) {
//
// Generate the dynamic text opcode for DNS server and draw it.
//
Status = Ip6ConvertAddressListToString (
PortString,
HiiHandle,
Ip6ConfigNvDnsAddress,
Data,
DataSize / sizeof (EFI_IPv6_ADDRESS)
);
if (EFI_ERROR (Status)) {
FreePool (Data);
return Status;
}
}
//
// Get gateway adderss list.
//
if (Data != NULL) {
FreePool (Data);
}
DataSize = 0;
Data = NULL;
Status = Ip6ConfigNvGetData (
Ip6Config,
Ip6ConfigDataTypeGateway,
&DataSize,
(VOID **) &Data
);
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
if (Data != NULL) {
FreePool (Data);
}
return Status;
}
if (DataSize > 0) {
//
// Generate the dynamic text opcode for gateway and draw it.
//
Status = Ip6ConvertAddressListToString (
PortString,
HiiHandle,
Ip6ConfigNvGatewayAddress,
Data,
DataSize / sizeof (EFI_IPv6_ADDRESS)
);
if (EFI_ERROR (Status)) {
FreePool (Data);
return Status;
}
}
if (Data != NULL) {
FreePool (Data);
}
Status = EFI_SUCCESS;
break; break;
default: default:
@ -1813,6 +1775,13 @@ Ip6FormCallback (
} else if (Action == EFI_BROWSER_ACTION_CHANGED) { } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
switch (QuestionId) { switch (QuestionId) {
case KEY_SAVE_CONFIG_CHANGES: case KEY_SAVE_CONFIG_CHANGES:
Status = Ip6ConvertIfrNvDataToConfigNvDataAdvanced (IfrNvData, Instance);
if (EFI_ERROR (Status)) {
break;
}
Status = Ip6GetCurrentSetting (Instance);
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT; *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;
break; break;
@ -1829,7 +1798,7 @@ Ip6FormCallback (
break; break;
case KEY_SAVE_CHANGES: case KEY_SAVE_CHANGES:
Status = Ip6ConvertIfrNvDataToConfigNvData (IfrNvData, Instance); Status = Ip6ConvertIfrNvDataToConfigNvDataGeneral (IfrNvData, Instance);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
break; break;
} }

View File

@ -1,7 +1,7 @@
/** @file /** @file
NVData structure used by the IP6 configuration component. NVData structure used by the IP6 configuration component.
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -43,7 +43,7 @@
#define INTERFACE_ID_STR_MIN_SIZE 1 #define INTERFACE_ID_STR_MIN_SIZE 1
#define INTERFACE_ID_STR_MAX_SIZE 23 #define INTERFACE_ID_STR_MAX_SIZE 23
#define INTERFACE_ID_STR_STORAGE 24 #define INTERFACE_ID_STR_STORAGE 25
#define IP6_STR_MAX_SIZE 40 #define IP6_STR_MAX_SIZE 40
#define ADDRESS_STR_MIN_SIZE 2 #define ADDRESS_STR_MIN_SIZE 2
#define ADDRESS_STR_MAX_SIZE 255 #define ADDRESS_STR_MAX_SIZE 255