mirror of https://github.com/acidanthera/audk.git
Fix ping command issue in IP4 driver.
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@14314 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
bf1400b9ad
commit
d0ccf55e34
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
The driver binding and service binding protocol for IP4 driver.
|
The driver binding and service binding protocol for IP4 driver.
|
||||||
|
|
||||||
Copyright (c) 2005 - 2012, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2005 - 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
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -572,6 +572,8 @@ Ip4DriverBindingStop (
|
||||||
INTN State;
|
INTN State;
|
||||||
LIST_ENTRY *List;
|
LIST_ENTRY *List;
|
||||||
IP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
|
IP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
|
||||||
|
IP4_INTERFACE *IpIf;
|
||||||
|
IP4_ROUTE_TABLE *RouteTable;
|
||||||
|
|
||||||
//
|
//
|
||||||
// IP4 driver opens the MNP child, ARP children or the IP4_CONFIG protocol
|
// IP4 driver opens the MNP child, ARP children or the IP4_CONFIG protocol
|
||||||
|
@ -681,6 +683,35 @@ Ip4DriverBindingStop (
|
||||||
&Context,
|
&Context,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
} else if (IpSb->DefaultInterface->ArpHandle == ControllerHandle) {
|
||||||
|
//
|
||||||
|
// The ARP protocol for the default interface is being uninstalled and all
|
||||||
|
// its IP child handles should have been destroyed before. So, release the
|
||||||
|
// default interface and route table, create a new one and mark it as not started.
|
||||||
|
//
|
||||||
|
Ip4CancelReceive (IpSb->DefaultInterface);
|
||||||
|
Ip4FreeInterface (IpSb->DefaultInterface, NULL);
|
||||||
|
Ip4FreeRouteTable (IpSb->DefaultRouteTable);
|
||||||
|
|
||||||
|
IpIf = Ip4CreateInterface (IpSb->Mnp, IpSb->Controller, IpSb->Image);
|
||||||
|
if (IpIf == NULL) {
|
||||||
|
goto ON_ERROR;
|
||||||
|
}
|
||||||
|
RouteTable = Ip4CreateRouteTable ();
|
||||||
|
if (RouteTable == NULL) {
|
||||||
|
Ip4FreeInterface (IpIf, NULL);
|
||||||
|
goto ON_ERROR;;
|
||||||
|
}
|
||||||
|
|
||||||
|
IpSb->DefaultInterface = IpIf;
|
||||||
|
InsertHeadList (&IpSb->Interfaces, &IpIf->Link);
|
||||||
|
IpSb->DefaultRouteTable = RouteTable;
|
||||||
|
Ip4ReceiveFrame (IpIf, NULL, Ip4AccpetFrame, IpSb);
|
||||||
|
|
||||||
|
if (IpSb->Ip4Config != NULL && IpSb->State != IP4_SERVICE_DESTROY) {
|
||||||
|
IpSb->Ip4Config->Stop (IpSb->Ip4Config);
|
||||||
|
}
|
||||||
|
IpSb->State = IP4_SERVICE_UNSTARTED;
|
||||||
} else if (IsListEmpty (&IpSb->Children)) {
|
} else if (IsListEmpty (&IpSb->Children)) {
|
||||||
State = IpSb->State;
|
State = IpSb->State;
|
||||||
IpSb->State = IP4_SERVICE_DESTROY;
|
IpSb->State = IP4_SERVICE_DESTROY;
|
||||||
|
|
|
@ -740,11 +740,24 @@ Ip4FreeInterface (
|
||||||
//
|
//
|
||||||
Ip4CancelFrames (Interface, EFI_ABORTED, Ip4CancelInstanceFrame, IpInstance);
|
Ip4CancelFrames (Interface, EFI_ABORTED, Ip4CancelInstanceFrame, IpInstance);
|
||||||
|
|
||||||
|
if (--Interface->RefCnt > 0) {
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Destroy the ARP instance if this is the last IP instance that
|
// Destroy the interface if this is the last IP instance that
|
||||||
// has the address.
|
// has the address. Remove all the system transmitted packets
|
||||||
|
// from this interface, cancel the receive request if there is
|
||||||
|
// one, and destroy the ARP requests.
|
||||||
//
|
//
|
||||||
if (Interface->Arp != NULL && IsListEmpty (&Interface->IpInstances)) {
|
Ip4CancelFrames (Interface, EFI_ABORTED, Ip4CancelInstanceFrame, NULL);
|
||||||
|
Ip4CancelReceive (Interface);
|
||||||
|
|
||||||
|
ASSERT (IsListEmpty (&Interface->IpInstances));
|
||||||
|
ASSERT (IsListEmpty (&Interface->ArpQues));
|
||||||
|
ASSERT (IsListEmpty (&Interface->SentFrames));
|
||||||
|
|
||||||
|
if (Interface->Arp != NULL) {
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
Interface->ArpHandle,
|
Interface->ArpHandle,
|
||||||
&gEfiArpProtocolGuid,
|
&gEfiArpProtocolGuid,
|
||||||
|
@ -758,25 +771,8 @@ Ip4FreeInterface (
|
||||||
&gEfiArpServiceBindingProtocolGuid,
|
&gEfiArpServiceBindingProtocolGuid,
|
||||||
Interface->ArpHandle
|
Interface->ArpHandle
|
||||||
);
|
);
|
||||||
Interface->Arp = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (--Interface->RefCnt > 0) {
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Destroy the interface if it is not referenced by any IP instance (for common Interface)
|
|
||||||
// or the IP service (for the DefaultInterface). Remove all the system transmitted packets
|
|
||||||
// from this interface, cancel the receive request if there is one.
|
|
||||||
//
|
|
||||||
Ip4CancelFrames (Interface, EFI_ABORTED, Ip4CancelInstanceFrame, NULL);
|
|
||||||
Ip4CancelReceive (Interface);
|
|
||||||
|
|
||||||
ASSERT (IsListEmpty (&Interface->IpInstances));
|
|
||||||
ASSERT (IsListEmpty (&Interface->ArpQues));
|
|
||||||
ASSERT (IsListEmpty (&Interface->SentFrames));
|
|
||||||
|
|
||||||
RemoveEntryList (&Interface->Link);
|
RemoveEntryList (&Interface->Link);
|
||||||
FreePool (Interface);
|
FreePool (Interface);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue