On 07/22/15 02:57, Wang Fan wrote:
> v3:
> * Update the macro of Ip4 device path node length and Ip6 device path node 
> length.
> 
> GatewayIpAddress and SubnetMask do not exist in old IPv4_DEVICE_PATH, 
> IPAddressOrigin, PrefixLength and GatewayIPAddress do not exist in old 
> IPv6_DEVICE_PATH. This will lead new IScsiDxe to error without updating 
> IPv4_DEVICE_PATH and IPv6_DEVICE_PATH in system.
> Following UEFI2.5 spec of IPv4_DEVICE_PATH do a check before accessing fields 
> only defined in new version's IPv4_DEVICE_PATH, and revise the same issue for 
> IPv6_DEVICE_PATH in Iscsi driver.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: fanwang2 <fan.w...@intel.com>
> ---
>  NetworkPkg/IScsiDxe/IScsiMisc.c | 62 
> +++++++++++++++++++++++++++++++++--------
>  NetworkPkg/IScsiDxe/IScsiMisc.h | 18 +++++++++++-
>  2 files changed, 67 insertions(+), 13 deletions(-)
> 
> diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c
> index aeb99e5..010d2a4 100644
> --- a/NetworkPkg/IScsiDxe/IScsiMisc.c
> +++ b/NetworkPkg/IScsiDxe/IScsiMisc.c
> @@ -1,9 +1,9 @@
>  /** @file
>    Miscellaneous routines for iSCSI driver.
>  
> -Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2015, 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
>  http://opensource.org/licenses/bsd-license.php
>  
> @@ -1350,10 +1350,11 @@ IScsiGetTcpConnDevicePath (
>  {
>    ISCSI_CONNECTION          *Conn;
>    EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
>    EFI_STATUS                Status;
>    EFI_DEV_PATH              *DPathNode;
> +  UINTN                     PathLen;
>  
>    if (Session->State != SESSION_STATE_LOGGED_IN) {
>      return NULL;
>    }
>  
> @@ -1388,25 +1389,62 @@ IScsiGetTcpConnDevicePath (
>          DPathNode->Ipv4.LocalPort       = 0;
>  
>          DPathNode->Ipv4.StaticIpAddress = 
>            (BOOLEAN) 
> (!Session->ConfigData->SessionConfigData.InitiatorInfoFromDhcp);
>  
> -        IP4_COPY_ADDRESS (
> -          &DPathNode->Ipv4.GatewayIpAddress,
> -          &Session->ConfigData->SessionConfigData.Gateway
> -          );
> +        //
> +        //  Add a judgement here to support previous versions of 
> IPv4_DEVICE_PATH.
> +        //  In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and 
> SubnetMask
> +        //  do not exist.
> +        //  In new version of IPv4_DEVICE_PATH, structcure length is 27.
> +        //
>  
> -        IP4_COPY_ADDRESS (
> -          &DPathNode->Ipv4.SubnetMask,
> -          &Session->ConfigData->SessionConfigData.SubnetMask
> -          );
> +        PathLen = DevicePathNodeLength (&DPathNode->Ipv4);
> +        
> +        if (PathLen == IPv4_NODE_LEN_NEW_VERSIONS) {  
> +            
> +          IP4_COPY_ADDRESS (
> +            &DPathNode->Ipv4.GatewayIpAddress,
> +            &Session->ConfigData->SessionConfigData.Gateway
> +            );
> +
> +          IP4_COPY_ADDRESS (
> +            &DPathNode->Ipv4.SubnetMask,
> +            &Session->ConfigData->SessionConfigData.SubnetMask
> +            );
> +        }
> +        
>          break;
>        } else if (Conn->Ipv6Flag && DevicePathSubType (&DPathNode->DevPath) 
> == MSG_IPv6_DP) {
>          DPathNode->Ipv6.LocalPort       = 0;
> -        DPathNode->Ipv6.IpAddressOrigin = 0;
> -        DPathNode->Ipv6.PrefixLength    = IP6_PREFIX_LENGTH;
> -        ZeroMem (&DPathNode->Ipv6.GatewayIpAddress, sizeof 
> (EFI_IPv6_ADDRESS));
> +
> +        //
> +        //  Add a judgement here to support previous versions of 
> IPv6_DEVICE_PATH.
> +        //  In previous versions of IPv6_DEVICE_PATH, IpAddressOrigin, 
> PrefixLength
> +        //  and GatewayIpAddress do not exist.
> +        //  In new version of IPv6_DEVICE_PATH, structure length is 60, 
> while in 
> +        //  old versions, the length is 43.
> +        //
> +
> +        PathLen = DevicePathNodeLength (&DPathNode->Ipv6);
> +        
> +        if (PathLen == IPv6_NODE_LEN_NEW_VERSIONS ) { 
> +
> +          DPathNode->Ipv6.IpAddressOrigin = 0;
> +          DPathNode->Ipv6.PrefixLength    = IP6_PREFIX_LENGTH;
> +          ZeroMem (&DPathNode->Ipv6.GatewayIpAddress, sizeof 
> (EFI_IPv6_ADDRESS));
> +        }
> +        else if (PathLen == IPv6_NODE_LEN_OLD_VERSIONS) { 
> +
> +          //
> +          //  StaticIPAddress is a field in old versions of 
> IPv6_DEVICE_PATH, while ignored in new 
> +          //  version. Set StaticIPAddress through its' offset in old 
> IPv6_DEVICE_PATH.
> +          //
> +          *((UINT8 *)(&DPathNode->Ipv6) + IPv6_OLD_IPADDRESS_OFFSET) = 
> +            (BOOLEAN) 
> (!Session->ConfigData->SessionConfigData.InitiatorInfoFromDhcp);
> +        }
> +        
>          break;
>        }
>      }
>  
>      DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode->DevPath);
> diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h
> index fd9e3af..0a3b449 100644
> --- a/NetworkPkg/IScsiDxe/IScsiMisc.h
> +++ b/NetworkPkg/IScsiDxe/IScsiMisc.h
> @@ -1,9 +1,9 @@
>  /** @file
>    Miscellaneous definitions for iSCSI driver.
>  
> -Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2015, 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
>  http://opensource.org/licenses/bsd-license.php
>  
> @@ -15,10 +15,26 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
> EXPRESS OR IMPLIED.
>  #ifndef _ISCSI_MISC_H_
>  #define _ISCSI_MISC_H_
>  
>  typedef struct _ISCSI_DRIVER_DATA ISCSI_DRIVER_DATA;
>  
> +///
> +/// IPv4 Device Path Node Length
> +///
> +#define IPv4_NODE_LEN_NEW_VERSIONS    27
> +
> +///
> +/// IPv6 Device Path Node Length
> +///
> +#define IPv6_NODE_LEN_OLD_VERSIONS    43
> +#define IPv6_NODE_LEN_NEW_VERSIONS    60
> +
> +///
> +/// The ignored field StaticIpAddress's offset in old IPv6 Device Path
> +///
> +#define IPv6_OLD_IPADDRESS_OFFSET      42;
> +
>  #pragma pack(1)
>  typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
>    UINT16            TargetPort;
>    UINT8             Enabled;
>    UINT8             IpMode;
> 

Until the SVN outage at sourceforge.net gets resolved, we plan to commit
patches that are ready for merging to the "master" branch of the git
repository at <https://github.com/tianocore/edk2-svn-offline.git>.
Please see the announcement:

  http://thread.gmane.org/gmane.comp.bios.edk2.devel/227

This particular patch (or series) appears ready for merging, therefore
it is being picked up:

  http://thread.gmane.org/gmane.comp.bios.edk2.devel/227/focus=251

Further development should be based on edk2-svn-offline/master, until
the SVN outage is fixed. At that point the accumulated patches will be
mass-committed from edk2-svn-offline/master to SVN.

Thanks
Laszlo


------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to