1. Fix a bug in PXE driver that the PXE boot do not restart if a new boot option on the different IP stack is selected.
2. Retrieve the IP information after iSCSI TCPv6 connection established and fill it into iBFT table. 3. Generate a random IAID for each NIC port to require different IPv6 address in PXE driver. 4. Update function EfiMtftp6Configure() and Mtftp6RrqHandleOack() to allocate at most one UdpIo. 5. Fix a typo from “destory” to “destroy” in network code. Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com> Reviewed-by: Ouyang Qian <qian.ouyang@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13859 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
Implementation for iSCSI Boot Firmware Table publication.
|
||||
|
||||
Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
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
|
||||
@@ -310,18 +310,18 @@ IScsiFillNICAndTargetSections (
|
||||
//
|
||||
// Map the various v4 addresses into v6 addresses.
|
||||
//
|
||||
IScsiMapV4ToV6Addr (&NvData->LocalIp, &Nic->Ip);
|
||||
IScsiMapV4ToV6Addr (&NvData->Gateway, &Nic->Gateway);
|
||||
IScsiMapV4ToV6Addr (&NvData->LocalIp.v4, &Nic->Ip);
|
||||
IScsiMapV4ToV6Addr (&NvData->Gateway.v4, &Nic->Gateway);
|
||||
IScsiMapV4ToV6Addr (&Attempt->PrimaryDns.v4, &Nic->PrimaryDns);
|
||||
IScsiMapV4ToV6Addr (&Attempt->SecondaryDns.v4, &Nic->SecondaryDns);
|
||||
IScsiMapV4ToV6Addr (&Attempt->DhcpServer.v4, &Nic->DhcpServer);
|
||||
|
||||
} else if (NvData->IpMode == IP_MODE_IP6 || NvData->IpMode == IP_MODE_AUTOCONFIG) {
|
||||
//
|
||||
// TODO: The subnet mask/local ip/gateway/dhcpserver for iBFT-IPv6 needs to be
|
||||
// confirmed with spec owner.
|
||||
//
|
||||
|
||||
Nic->SubnetMaskPrefixLength = NvData->PrefixLength;
|
||||
CopyMem (&Nic->Ip, &NvData->LocalIp, sizeof (EFI_IPv6_ADDRESS));
|
||||
CopyMem (&Nic->Gateway, &NvData->Gateway, sizeof (EFI_IPv6_ADDRESS));
|
||||
|
||||
CopyMem (&Nic->PrimaryDns, &Attempt->PrimaryDns, sizeof (EFI_IPv6_ADDRESS));
|
||||
CopyMem (&Nic->SecondaryDns, &Attempt->SecondaryDns, sizeof (EFI_IPv6_ADDRESS));
|
||||
//
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
The shared head file for iSCSI driver.
|
||||
|
||||
Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
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
|
||||
@@ -23,6 +23,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#include <Protocol/DevicePath.h>
|
||||
#include <Protocol/HiiConfigAccess.h>
|
||||
|
||||
#include <Protocol/Ip6.h>
|
||||
#include <Protocol/Dhcp4.h>
|
||||
#include <Protocol/Dhcp6.h>
|
||||
#include <Protocol/Tcp4.h>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
Miscellaneous definitions for iSCSI driver.
|
||||
|
||||
Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
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
|
||||
@@ -23,14 +23,15 @@ typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
|
||||
UINT8 Enabled;
|
||||
UINT8 IpMode;
|
||||
|
||||
EFI_IPv4_ADDRESS LocalIp;
|
||||
EFI_IP_ADDRESS LocalIp;
|
||||
EFI_IPv4_ADDRESS SubnetMask;
|
||||
EFI_IPv4_ADDRESS Gateway;
|
||||
EFI_IP_ADDRESS Gateway;
|
||||
|
||||
BOOLEAN InitiatorInfoFromDhcp;
|
||||
BOOLEAN TargetInfoFromDhcp;
|
||||
CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
|
||||
EFI_IP_ADDRESS TargetIp;
|
||||
UINT8 PrefixLength;
|
||||
UINT8 BootLun[8];
|
||||
|
||||
UINT16 ConnectTimeout; ///< timout value in milliseconds
|
||||
|
@@ -308,6 +308,98 @@ IScsiDestroyConnection (
|
||||
FreePool (Conn);
|
||||
}
|
||||
|
||||
/**
|
||||
Retrieve the IPv6 Address/Prefix/Gateway from the established TCP connection, these informations
|
||||
will be filled in the iSCSI Boot Firmware Table.
|
||||
|
||||
@param[in] Conn The connection used in the iSCSI login phase.
|
||||
|
||||
@retval EFI_SUCCESS Get the NIC information successfully.
|
||||
@retval Others Other errors as indicated.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
IScsiGetIp6NicInfo (
|
||||
IN ISCSI_CONNECTION *Conn
|
||||
)
|
||||
{
|
||||
ISCSI_SESSION_CONFIG_NVDATA *NvData;
|
||||
EFI_TCP6_PROTOCOL *Tcp6;
|
||||
EFI_IP6_MODE_DATA Ip6ModeData;
|
||||
EFI_STATUS Status;
|
||||
EFI_IPv6_ADDRESS *TargetIp;
|
||||
UINTN Index;
|
||||
UINT8 SubnetPrefixLength;
|
||||
UINTN RouteEntry;
|
||||
|
||||
NvData = &Conn->Session->ConfigData->SessionConfigData;
|
||||
TargetIp = &NvData->TargetIp.v6;
|
||||
Tcp6 = Conn->TcpIo.Tcp.Tcp6;
|
||||
|
||||
ZeroMem (&Ip6ModeData, sizeof (EFI_IP6_MODE_DATA));
|
||||
Status = Tcp6->GetModeData (
|
||||
Tcp6,
|
||||
NULL,
|
||||
NULL,
|
||||
&Ip6ModeData,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (!Ip6ModeData.IsConfigured) {
|
||||
Status = EFI_ABORTED;
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
IP6_COPY_ADDRESS (&NvData->LocalIp, &Ip6ModeData.ConfigData.StationAddress);
|
||||
|
||||
NvData->PrefixLength = 0;
|
||||
for (Index = 0; Index < Ip6ModeData.AddressCount; Index++) {
|
||||
if (EFI_IP6_EQUAL (&NvData->LocalIp.v6, &Ip6ModeData.AddressList[Index].Address)) {
|
||||
NvData->PrefixLength = Ip6ModeData.AddressList[Index].PrefixLength;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
SubnetPrefixLength = 0;
|
||||
RouteEntry = Ip6ModeData.RouteCount;
|
||||
for (Index = 0; Index < Ip6ModeData.RouteCount; Index++) {
|
||||
if (NetIp6IsNetEqual (TargetIp, &Ip6ModeData.RouteTable[Index].Destination, Ip6ModeData.RouteTable[Index].PrefixLength)) {
|
||||
if (SubnetPrefixLength < Ip6ModeData.RouteTable[Index].PrefixLength) {
|
||||
SubnetPrefixLength = Ip6ModeData.RouteTable[Index].PrefixLength;
|
||||
RouteEntry = Index;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (RouteEntry != Ip6ModeData.RouteCount) {
|
||||
IP6_COPY_ADDRESS (&NvData->Gateway, &Ip6ModeData.RouteTable[RouteEntry].Gateway);
|
||||
}
|
||||
|
||||
ON_EXIT:
|
||||
if (Ip6ModeData.AddressList != NULL) {
|
||||
FreePool (Ip6ModeData.AddressList);
|
||||
}
|
||||
if (Ip6ModeData.GroupTable!= NULL) {
|
||||
FreePool (Ip6ModeData.GroupTable);
|
||||
}
|
||||
if (Ip6ModeData.RouteTable!= NULL) {
|
||||
FreePool (Ip6ModeData.RouteTable);
|
||||
}
|
||||
if (Ip6ModeData.NeighborCache!= NULL) {
|
||||
FreePool (Ip6ModeData.NeighborCache);
|
||||
}
|
||||
if (Ip6ModeData.PrefixTable!= NULL) {
|
||||
FreePool (Ip6ModeData.PrefixTable);
|
||||
}
|
||||
if (Ip6ModeData.IcmpTypeList!= NULL) {
|
||||
FreePool (Ip6ModeData.IcmpTypeList);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Login the iSCSI session.
|
||||
@@ -395,6 +487,10 @@ IScsiSessionLogin (
|
||||
);
|
||||
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
if (mPrivate->Ipv6Flag) {
|
||||
Status = IScsiGetIp6NicInfo (Conn);
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
|
Reference in New Issue
Block a user