From e5e12de7d0a67111060c77723df39885c91a8ea5 Mon Sep 17 00:00:00 2001 From: vanjeff Date: Mon, 27 Aug 2007 09:17:26 +0000 Subject: 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 --- MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h | 2 + .../Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c | 32 +++++++- .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | 32 ++++++++ MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 3 +- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h | 5 ++ MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c | 87 ++++++++++++++++++++++ MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.c | 2 +- 7 files changed, 157 insertions(+), 6 deletions(-) (limited to 'MdeModulePkg/Universal') diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h index 7c219e3b9b..75efa045b1 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h @@ -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; diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c index c714dd3dae..0b845ee9ad 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c @@ -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 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; diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c index 3ae8a2091c..1eefb38f91 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c @@ -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. // diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf index 44f3623695..86c88a9506 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf @@ -2,7 +2,7 @@ # Component name for module Tcp4 # # FIX ME! -# Copyright (c) 2006, Intel Corporation. +# Copyright (c) 2006, Intel Corporation. # # All rights reserved. This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -68,6 +68,7 @@ DebugLib NetLib IpIoLib + DevicePathLib [Protocols] gEfiIp4ProtocolGuid # PROTOCOL ALWAYS_CONSUMED diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h index 6441c13c64..be99f3bf47 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h @@ -350,4 +350,9 @@ TcpClearVariableData ( IN TCP4_SERVICE_DATA *Tcp4Service ); +EFI_STATUS +TcpInstallDevicePath ( + IN SOCKET *Sock + ); + #endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c index fdd64ef9f4..2eaf0ccec5 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c @@ -23,6 +23,8 @@ Abstract: #include "Tcp4Main.h" +#include + 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; +} diff --git a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.c b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.c index 5cf87c7921..dd4ed1bf32 100644 --- a/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.c +++ b/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Impl.c @@ -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; } -- cgit v1.2.3