From: "Fu, Siyuan" <siyuan.fu@intel.com>
To: "Wu, Jiaxin" <jiaxin.wu@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Ye, Ting" <ting.ye@intel.com>
Subject: Re: [Patch] NetworkPkg/UefiPxeBcDxe: Configure the ARP Instance/RouteTable with new address
Date: Wed, 21 Mar 2018 01:18:20 +0000 [thread overview]
Message-ID: <B1FF2E9001CE9041BD10B825821D5BC58B468F11@SHSMSX103.ccr.corp.intel.com> (raw)
In-Reply-To: <20180320010937.11272-1-jiaxin.wu@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@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.fu@intel.com>; Ye, Ting <ting.ye@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.fu@intel.com>
> Cc: Ye Ting <ting.ye@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jiaxin Wu <jiaxin.wu@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
prev parent reply other threads:[~2018-03-21 1:12 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-20 1:09 [Patch] NetworkPkg/UefiPxeBcDxe: Configure the ARP Instance/RouteTable with new address Jiaxin Wu
2018-03-21 1:18 ` Fu, Siyuan [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=B1FF2E9001CE9041BD10B825821D5BC58B468F11@SHSMSX103.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox