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:
vanjeff
2007-08-27 09:17:26 +00:00
parent 98376cc51d
commit e5e12de7d0
10 changed files with 274 additions and 11 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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.
//

View File

@@ -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

View File

@@ -350,4 +350,9 @@ TcpClearVariableData (
IN TCP4_SERVICE_DATA *Tcp4Service
);
EFI_STATUS
TcpInstallDevicePath (
IN SOCKET *Sock
);
#endif

View File

@@ -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;
}

View File

@@ -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;
}