mirror of https://github.com/acidanthera/audk.git
1. Sync the latest network stack. Add NetLibCreateIPv4DPathNode () in netlib library.
2. Fixed one porting bug in Udp4Impl.c git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3717 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
98376cc51d
commit
e5e12de7d0
|
@ -457,6 +457,18 @@ NetLibGetMacString (
|
|||
IN OUT CHAR16 **MacString
|
||||
);
|
||||
|
||||
VOID
|
||||
NetLibCreateIPv4DPathNode (
|
||||
IN OUT IPv4_DEVICE_PATH *Node,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN IP4_ADDR LocalIp,
|
||||
IN UINT16 LocalPort,
|
||||
IN IP4_ADDR RemoteIp,
|
||||
IN UINT16 RemotePort,
|
||||
IN UINT16 Protocol,
|
||||
IN BOOLEAN UseDefaultAddress
|
||||
);
|
||||
|
||||
EFI_HANDLE
|
||||
NetLibGetNicHandle (
|
||||
IN EFI_HANDLE Controller,
|
||||
|
|
|
@ -24,6 +24,7 @@ Abstract:
|
|||
#include <Protocol/ServiceBinding.h>
|
||||
#include <Protocol/SimpleNetwork.h>
|
||||
#include <Protocol/LoadedImage.h>
|
||||
#include <Protocol/NicIp4Config.h>
|
||||
|
||||
#include <Library/NetLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
|
@ -838,11 +839,7 @@ NetLibDefaultUnload (
|
|||
UINTN DeviceHandleCount;
|
||||
UINTN Index;
|
||||
EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;
|
||||
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName;
|
||||
#else
|
||||
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
||||
#endif
|
||||
EFI_DRIVER_CONFIGURATION_PROTOCOL *DriverConfiguration;
|
||||
EFI_DRIVER_DIAGNOSTICS_PROTOCOL *DriverDiagnostics;
|
||||
|
||||
|
@ -1123,6 +1120,109 @@ NetLibGetMacString (
|
|||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Check the default address used by the IPv4 driver is static or dynamic (acquired
|
||||
from DHCP).
|
||||
|
||||
@param Controller The controller handle which has the NIC Ip4 Config Protocol
|
||||
relative with the default address to judge.
|
||||
|
||||
@retval TRUE If the default address is static.
|
||||
@retval FALSE If the default address is acquired from DHCP.
|
||||
|
||||
**/
|
||||
STATIC
|
||||
BOOLEAN
|
||||
NetLibDefaultAddressIsStatic (
|
||||
IN EFI_HANDLE Controller
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_NIC_IP4_CONFIG_PROTOCOL *NicIp4;
|
||||
UINTN Len;
|
||||
NIC_IP4_CONFIG_INFO *ConfigInfo;
|
||||
BOOLEAN IsStatic;
|
||||
|
||||
Status = gBS->HandleProtocol (
|
||||
Controller,
|
||||
&gEfiNicIp4ConfigProtocolGuid,
|
||||
(VOID **) &NicIp4
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Len = 0;
|
||||
Status = NicIp4->GetInfo (NicIp4, &Len, NULL);
|
||||
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
ConfigInfo = NetAllocatePool (Len);
|
||||
if (ConfigInfo == NULL) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
IsStatic = TRUE;
|
||||
Status = NicIp4->GetInfo (NicIp4, &Len, ConfigInfo);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
IsStatic = (BOOLEAN) (ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC);
|
||||
|
||||
ON_EXIT:
|
||||
|
||||
NetFreePool (ConfigInfo);
|
||||
|
||||
return IsStatic;
|
||||
}
|
||||
|
||||
/**
|
||||
Create an IPv4 device path node.
|
||||
|
||||
@param Node Pointer to the IPv4 device path node.
|
||||
@param Controller The handle where the NIC IP4 config protocol resides.
|
||||
@param LocalIp The local IPv4 address.
|
||||
@param LocalPort The local port.
|
||||
@param RemoteIp The remote IPv4 address.
|
||||
@param RemotePort The remote port.
|
||||
@param Protocol The protocol type in the IP header.
|
||||
@param UseDefaultAddress Whether this instance is using default address or not.
|
||||
|
||||
@retval None
|
||||
**/
|
||||
VOID
|
||||
NetLibCreateIPv4DPathNode (
|
||||
IN OUT IPv4_DEVICE_PATH *Node,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN IP4_ADDR LocalIp,
|
||||
IN UINT16 LocalPort,
|
||||
IN IP4_ADDR RemoteIp,
|
||||
IN UINT16 RemotePort,
|
||||
IN UINT16 Protocol,
|
||||
IN BOOLEAN UseDefaultAddress
|
||||
)
|
||||
{
|
||||
Node->Header.Type = MESSAGING_DEVICE_PATH;
|
||||
Node->Header.SubType = MSG_IPv4_DP;
|
||||
SetDevicePathNodeLength (&Node->Header, 19);
|
||||
|
||||
NetCopyMem (&Node->LocalIpAddress, &LocalIp, sizeof (EFI_IPv4_ADDRESS));
|
||||
NetCopyMem (&Node->RemoteIpAddress, &RemoteIp, sizeof (EFI_IPv4_ADDRESS));
|
||||
|
||||
Node->LocalPort = LocalPort;
|
||||
Node->RemotePort = RemotePort;
|
||||
|
||||
Node->Protocol = Protocol;
|
||||
|
||||
if (!UseDefaultAddress) {
|
||||
Node->StaticIpAddress = TRUE;
|
||||
} else {
|
||||
Node->StaticIpAddress = NetLibDefaultAddressIsStatic (Controller);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Find the UNDI/SNP handle from controller and protocol GUID.
|
||||
|
|
|
@ -54,4 +54,4 @@
|
|||
|
||||
[Protocols]
|
||||
gEfiSimpleNetworkProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
|
||||
gEfiNicIp4ConfigProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
|
|
|
@ -328,6 +328,8 @@ struct _SOCKET {
|
|||
UINT32 Signature;
|
||||
EFI_HANDLE SockHandle; // the virtual handle of the socket
|
||||
EFI_HANDLE DriverBinding; // socket't driver binding protocol
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
SOCK_CONFIGURE_STATE ConfigureState;
|
||||
SOCK_TYPE Type;
|
||||
SOCK_STATE State;
|
||||
|
|
|
@ -248,6 +248,16 @@ Tcp4FlushPcb (
|
|||
if (SOCK_IS_CONFIGURED (Sock)) {
|
||||
NetListRemoveEntry (&Tcb->List);
|
||||
|
||||
//
|
||||
// Uninstall the device path protocl.
|
||||
//
|
||||
gBS->UninstallProtocolInterface (
|
||||
Sock->SockHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
Sock->DevicePath
|
||||
);
|
||||
NetFreePool (Sock->DevicePath);
|
||||
|
||||
TcpSetVariableData (TcpProto->TcpService);
|
||||
}
|
||||
|
||||
|
@ -428,12 +438,19 @@ Tcp4ConfigurePcb (
|
|||
Tcb->TTL = CfgData->TimeToLive;
|
||||
Tcb->TOS = CfgData->TypeOfService;
|
||||
|
||||
Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress;
|
||||
|
||||
NetCopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, sizeof (IP4_ADDR));
|
||||
Tcb->LocalEnd.Port = HTONS (CfgData->AccessPoint.StationPort);
|
||||
Tcb->SubnetMask = CfgData->AccessPoint.SubnetMask;
|
||||
|
||||
NetCopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));
|
||||
Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort);
|
||||
if (CfgData->AccessPoint.ActiveFlag) {
|
||||
NetCopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));
|
||||
Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort);
|
||||
} else {
|
||||
Tcb->RemoteEnd.Ip = 0;
|
||||
Tcb->RemoteEnd.Port = 0;
|
||||
}
|
||||
|
||||
Option = CfgData->ControlOption;
|
||||
|
||||
|
@ -537,6 +554,15 @@ Tcp4ConfigurePcb (
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// The socket is bound, the <SrcIp, SrcPort, DstIp, DstPort> is
|
||||
// determined, construct the IP device path and install it.
|
||||
//
|
||||
Status = TcpInstallDevicePath (Sk);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto OnExit;
|
||||
}
|
||||
|
||||
//
|
||||
// update state of Tcb and socket
|
||||
//
|
||||
|
@ -681,8 +707,6 @@ Tcp4Dispatcher (
|
|||
|
||||
return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data);
|
||||
|
||||
default:
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
|
|
@ -586,6 +586,28 @@ Tcp4ServiceBindingCreateChild (
|
|||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
SockDestroyChild (Sock);
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
//
|
||||
// Open the device path on the handle where service binding resides on.
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
TcpServiceData->ControllerHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &Sock->ParentDevicePath,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
Sock->SockHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->CloseProtocol (
|
||||
TcpServiceData->IpIo->ChildHandle,
|
||||
&gEfiIp4ProtocolGuid,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
Sock->SockHandle
|
||||
);
|
||||
SockDestroyChild (Sock);
|
||||
}
|
||||
|
||||
ON_EXIT:
|
||||
|
@ -652,6 +674,16 @@ Tcp4ServiceBindingDestroyChild (
|
|||
|
||||
Status = SockDestroyChild (Sock);
|
||||
|
||||
//
|
||||
// Close the device path protocol
|
||||
//
|
||||
gBS->CloseProtocol (
|
||||
TcpServiceData->ControllerHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
TcpServiceData->DriverBindingHandle,
|
||||
ChildHandle
|
||||
);
|
||||
|
||||
//
|
||||
// Close the Ip4 protocol.
|
||||
//
|
||||
|
|
|
@ -68,6 +68,7 @@
|
|||
DebugLib
|
||||
NetLib
|
||||
IpIoLib
|
||||
DevicePathLib
|
||||
|
||||
[Protocols]
|
||||
gEfiIp4ProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
|
|
|
@ -350,4 +350,9 @@ TcpClearVariableData (
|
|||
IN TCP4_SERVICE_DATA *Tcp4Service
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
TcpInstallDevicePath (
|
||||
IN SOCKET *Sock
|
||||
);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -23,6 +23,8 @@ Abstract:
|
|||
|
||||
#include "Tcp4Main.h"
|
||||
|
||||
#include <Library/DevicePathLib.h>
|
||||
|
||||
NET_LIST_ENTRY mTcpRunQue = {
|
||||
&mTcpRunQue,
|
||||
&mTcpRunQue
|
||||
|
@ -423,6 +425,7 @@ TcpCloneTcb (
|
|||
)
|
||||
{
|
||||
TCP_CB *Clone;
|
||||
TCP4_SERVICE_DATA *TcpService;
|
||||
|
||||
Clone = NetAllocatePool (sizeof (TCP_CB));
|
||||
|
||||
|
@ -451,6 +454,19 @@ TcpCloneTcb (
|
|||
|
||||
((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpPcb = Clone;
|
||||
|
||||
//
|
||||
// Open the device path on the handle where service binding resides on.
|
||||
//
|
||||
TcpService = ((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpService;
|
||||
gBS->OpenProtocol (
|
||||
TcpService->ControllerHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &Clone->Sk->ParentDevicePath,
|
||||
TcpService->DriverBindingHandle,
|
||||
Clone->Sk->SockHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
|
||||
return Clone;
|
||||
}
|
||||
|
||||
|
@ -530,6 +546,15 @@ TcpSetState (
|
|||
case TCP_ESTABLISHED:
|
||||
|
||||
SockConnEstablished (Tcb->Sk);
|
||||
|
||||
if (Tcb->Parent != NULL) {
|
||||
//
|
||||
// A new connection is accepted by a listening socket, install
|
||||
// the device path.
|
||||
//
|
||||
TcpInstallDevicePath (Tcb->Sk);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case TCP_CLOSED:
|
||||
|
@ -1091,3 +1116,65 @@ TcpClearVariableData (
|
|||
Tcp4Service->MacString = NULL;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
TcpInstallDevicePath (
|
||||
IN SOCKET *Sock
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Install the device path protocol on the TCP instance.
|
||||
|
||||
Arguments:
|
||||
|
||||
Sock - Pointer to the socket representing the TCP instance.
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS - The device path protocol is installed.
|
||||
other - Failed to install the device path protocol.
|
||||
|
||||
--*/
|
||||
{
|
||||
TCP4_PROTO_DATA *TcpProto;
|
||||
TCP4_SERVICE_DATA *TcpService;
|
||||
TCP_CB *Tcb;
|
||||
IPv4_DEVICE_PATH Ip4DPathNode;
|
||||
EFI_STATUS Status;
|
||||
|
||||
TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
|
||||
TcpService = TcpProto->TcpService;
|
||||
Tcb = TcpProto->TcpPcb;
|
||||
|
||||
NetLibCreateIPv4DPathNode (
|
||||
&Ip4DPathNode,
|
||||
TcpService->ControllerHandle,
|
||||
Tcb->LocalEnd.Ip,
|
||||
NTOHS (Tcb->LocalEnd.Port),
|
||||
Tcb->RemoteEnd.Ip,
|
||||
NTOHS (Tcb->RemoteEnd.Port),
|
||||
EFI_IP_PROTO_TCP,
|
||||
Tcb->UseDefaultAddr
|
||||
);
|
||||
|
||||
Sock->DevicePath = AppendDevicePathNode (
|
||||
Sock->ParentDevicePath,
|
||||
(EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode
|
||||
);
|
||||
if (Sock->DevicePath == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Status = gBS->InstallProtocolInterface (
|
||||
&Sock->SockHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
EFI_NATIVE_INTERFACE,
|
||||
Sock->DevicePath
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
NetFreePool (Sock->DevicePath);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
|
|
@ -1349,7 +1349,7 @@ Udp4EnqueueDgram (
|
|||
//
|
||||
// Wrap the RxData and put this Wrap into the instances RcvdDgramQue.
|
||||
//
|
||||
CopyMem (&Wrap, Udp4WrapRxData (Instance, Packet, RxData), sizeof (Wrap));
|
||||
Wrap = Udp4WrapRxData (Instance, Packet, RxData);
|
||||
if (Wrap == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue