Reviewed-by: Fu Siyuan <siyuan...@intel.com>

> -----Original Message-----
> From: Wu, Jiaxin
> Sent: Tuesday, March 20, 2018 9:10 AM
> To: edk2-devel@lists.01.org
> Cc: Fu, Siyuan <siyuan...@intel.com>; Ye, Ting <ting...@intel.com>
> Subject: [Patch] NetworkPkg/UefiPxeBcDxe: Configure the ARP
> Instance/RouteTable with new address
> 
> After completed a DHCP D.O.R.A process and got the new address, the ARP
> Instance
> and RouteTable should be configured so as to avoid the later Pxe.Arp
> failure.
> 
> Cc: Fu Siyuan <siyuan...@intel.com>
> Cc: Ye Ting <ting...@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jiaxin Wu <jiaxin...@intel.com>
> ---
>  NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c    | 26 +++-----------
>  NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c | 66 ++++++++++++++++++++++++-----
> -----
>  2 files changed, 52 insertions(+), 40 deletions(-)
> 
> diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c
> b/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c
> index d3146c3a7e..b828d24288 100644
> --- a/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c
> +++ b/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c
> @@ -2001,11 +2001,10 @@ EfiPxeBcSetStationIP (
>    )
>  {
>    EFI_STATUS              Status;
>    PXEBC_PRIVATE_DATA      *Private;
>    EFI_PXE_BASE_CODE_MODE  *Mode;
> -  EFI_ARP_CONFIG_DATA     ArpConfigData;
> 
>    if (This == NULL) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
> @@ -2041,31 +2040,10 @@ EfiPxeBcSetStationIP (
>      //
>      Status = PxeBcRegisterIp6Address (Private, &NewStationIp->v6);
>      if (EFI_ERROR (Status)) {
>        goto ON_EXIT;
>      }
> -  } else if (!Mode->UsingIpv6 && NewStationIp != NULL) {
> -    //
> -    // Configure the corresponding ARP with the IPv4 address.
> -    //
> -    ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));
> -
> -    ArpConfigData.SwAddressType   = 0x0800;
> -    ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS);
> -    ArpConfigData.StationAddress  = &NewStationIp->v4;
> -
> -    Private->Arp->Configure (Private->Arp, NULL);
> -    Private->Arp->Configure (Private->Arp, &ArpConfigData);
> -
> -    if (NewSubnetMask != NULL) {
> -      Mode->RouteTableEntries                = 1;
> -      Mode->RouteTable[0].IpAddr.Addr[0]     = NewStationIp->Addr[0] &
> NewSubnetMask->Addr[0];
> -      Mode->RouteTable[0].SubnetMask.Addr[0] = NewSubnetMask->Addr[0];
> -      Mode->RouteTable[0].GwAddr.Addr[0]     = 0;
> -    }
> -
> -    Private->IsAddressOk = TRUE;
>    }
> 
>    if (NewStationIp != NULL) {
>      CopyMem (&Mode->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS));
>      CopyMem (&Private->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS));
> @@ -2075,10 +2053,14 @@ EfiPxeBcSetStationIP (
>      CopyMem (&Mode->SubnetMask, NewSubnetMask, sizeof (EFI_IP_ADDRESS));
>      CopyMem (&Private->SubnetMask ,NewSubnetMask, sizeof
> (EFI_IP_ADDRESS));
>    }
> 
>    Status = PxeBcFlushStationIp (Private, NewStationIp, NewSubnetMask);
> +  if (!EFI_ERROR (Status)) {
> +    Private->IsAddressOk = TRUE;
> +  }
> +
>  ON_EXIT:
>    return Status;
>  }
> 
> 
> diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c
> b/NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c
> index 47bb7c5dbb..4b6f8c9c7f 100644
> --- a/NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c
> +++ b/NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c
> @@ -1,9 +1,9 @@
>  /** @file
>    Support functions implementation for UefiPxeBc Driver.
> 
> -  Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2007 - 2018, 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.
> @@ -34,21 +34,23 @@ PxeBcFlushStationIp (
>    EFI_IP_ADDRESS           *SubnetMask     OPTIONAL
>    )
>  {
>    EFI_PXE_BASE_CODE_MODE   *Mode;
>    EFI_STATUS               Status;
> +  EFI_ARP_CONFIG_DATA      ArpConfigData;
> 
>    Mode   = Private->PxeBc.Mode;
>    Status = EFI_SUCCESS;
> +  ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));
> 
> -  if (Mode->UsingIpv6) {
> -
> -    if (StationIp != NULL) {
> -      CopyMem (&Private->Udp6CfgData.StationAddress, StationIp, sizeof
> (EFI_IPv6_ADDRESS));
> -      CopyMem (&Private->Ip6CfgData.StationAddress, StationIp, sizeof
> (EFI_IPv6_ADDRESS));
> -    }
> -
> +  if (Mode->UsingIpv6 && StationIp != NULL) {
> +    //
> +    // Overwrite Udp6CfgData/Ip6CfgData StationAddress.
> +    //
> +    CopyMem (&Private->Udp6CfgData.StationAddress, StationIp, sizeof
> (EFI_IPv6_ADDRESS));
> +    CopyMem (&Private->Ip6CfgData.StationAddress, StationIp, sizeof
> (EFI_IPv6_ADDRESS));
> +
>      //
>      // Reconfigure the Ip6 instance to capture background ICMP6 packets
> with new station Ip address.
>      //
>      Private->Ip6->Cancel (Private->Ip6, &Private->Icmp6Token);
>      Private->Ip6->Configure (Private->Ip6, NULL);
> @@ -59,31 +61,59 @@ PxeBcFlushStationIp (
>      }
> 
>      Status = Private->Ip6->Receive (Private->Ip6, &Private->Icmp6Token);
>    } else {
>      if (StationIp != NULL) {
> +      //
> +      // Reconfigure the ARP instance with station Ip address.
> +      //
> +      ArpConfigData.SwAddressType   = 0x0800;
> +      ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS);
> +      ArpConfigData.StationAddress = StationIp;
> +
> +      Private->Arp->Configure (Private->Arp, NULL);
> +      Private->Arp->Configure (Private->Arp, &ArpConfigData);
> +
> +      //
> +      // Overwrite Udp4CfgData/Ip4CfgData StationAddress.
> +      //
>        CopyMem (&Private->Udp4CfgData.StationAddress, StationIp, sizeof
> (EFI_IPv4_ADDRESS));
>        CopyMem (&Private->Ip4CfgData.StationAddress, StationIp, sizeof
> (EFI_IPv4_ADDRESS));
>      }
> 
>      if (SubnetMask != NULL) {
> +      //
> +      // Overwrite Udp4CfgData/Ip4CfgData SubnetMask.
> +      //
>        CopyMem (&Private->Udp4CfgData.SubnetMask, SubnetMask, sizeof
> (EFI_IPv4_ADDRESS));
>        CopyMem (&Private->Ip4CfgData.SubnetMask, SubnetMask, sizeof
> (EFI_IPv4_ADDRESS));
>      }
> 
> -    //
> -    // Reconfigure the Ip4 instance to capture background ICMP packets
> with new station Ip address.
> -    //
> -    Private->Ip4->Cancel (Private->Ip4, &Private->IcmpToken);
> -    Private->Ip4->Configure (Private->Ip4, NULL);
> -
> -    Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4CfgData);
> -    if (EFI_ERROR (Status)) {
> -      goto ON_EXIT;
> +    if (StationIp != NULL && SubnetMask != NULL) {
> +      //
> +      // Updated the route table.
> +      //
> +      Mode->RouteTableEntries                = 1;
> +      Mode->RouteTable[0].IpAddr.Addr[0]     = StationIp->Addr[0] &
> SubnetMask->Addr[0];
> +      Mode->RouteTable[0].SubnetMask.Addr[0] = SubnetMask->Addr[0];
> +      Mode->RouteTable[0].GwAddr.Addr[0]     = 0;
>      }
> +
> +    if (StationIp != NULL || SubnetMask != NULL) {
> +      //
> +      // Reconfigure the Ip4 instance to capture background ICMP packets
> with new station Ip address.
> +      //
> +      Private->Ip4->Cancel (Private->Ip4, &Private->IcmpToken);
> +      Private->Ip4->Configure (Private->Ip4, NULL);
> 
> -    Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpToken);
> +      Status = Private->Ip4->Configure (Private->Ip4, &Private-
> >Ip4CfgData);
> +      if (EFI_ERROR (Status)) {
> +        goto ON_EXIT;
> +      }
> +
> +      Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpToken);
> +    }
>    }
> 
>  ON_EXIT:
>    return Status;
>  }
> --
> 2.16.2.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to