summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Universal/Network
diff options
context:
space:
mode:
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>2008-01-29 08:47:42 +0000
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>2008-01-29 08:47:42 +0000
commit4f6e31e47bc014da5055fa03779888d87c5e4c2a (patch)
treef87852509f5a6b7fb41eed36cd0f795b27835fdb /MdeModulePkg/Universal/Network
parent7a372cf045d44f7653e5a34e2ad3cc4cde572c5b (diff)
downloadedk2-4f6e31e47bc014da5055fa03779888d87c5e4c2a.tar.gz
edk2-4f6e31e47bc014da5055fa03779888d87c5e4c2a.tar.bz2
edk2-4f6e31e47bc014da5055fa03779888d87c5e4c2a.zip
Sync the bug that list node is free before it is removed from the list. That made the list invalid.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4641 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg/Universal/Network')
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c54
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c15
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h74
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c193
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h12
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c30
6 files changed, 217 insertions, 161 deletions
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
index a7fa3b627a..46c6ba492c 100644
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
+++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
@@ -563,6 +563,7 @@ SockCreate (
ASSERT (SockInitData && SockInitData->ProtoHandler);
ASSERT (SockInitData->Type == SOCK_STREAM);
+ ASSERT (SockInitData->ProtoData && (SockInitData->DataSize <= PROTO_RESERVED_LEN));
Parent = SockInitData->Parent;
@@ -619,6 +620,9 @@ SockCreate (
Sock->Type = SockInitData->Type;
Sock->DriverBinding = SockInitData->DriverBinding;
Sock->State = SockInitData->State;
+ Sock->CreateCallback = SockInitData->CreateCallback;
+ Sock->DestroyCallback = SockInitData->DestroyCallback;
+ Sock->Context = SockInitData->Context;
Sock->SockError = EFI_ABORTED;
Sock->SndBuffer.LowWater = SOCK_BUFF_LOW_WATER;
@@ -633,6 +637,11 @@ SockCreate (
sizeof (EFI_TCP4_PROTOCOL)
);
+ //
+ // copy the protodata into socket
+ //
+ NetCopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData->DataSize);
+
Status = gBS->InstallMultipleProtocolInterfaces (
&Sock->SockHandle,
&gEfiTcp4ProtocolGuid,
@@ -663,22 +672,36 @@ SockCreate (
NetListInsertTail (&Parent->ConnectionList, &Sock->ConnectionList);
}
+ if (Sock->CreateCallback != NULL) {
+ Status = Sock->CreateCallback (Sock, Sock->Context);
+ if (EFI_ERROR (Status)) {
+ goto OnError;
+ }
+ }
+
return Sock;
OnError:
- if (NULL != Sock) {
- if (NULL != Sock->SndBuffer.DataQueue) {
- NetbufQueFree (Sock->SndBuffer.DataQueue);
- }
+ if (Sock->SockHandle != NULL) {
+ gBS->UninstallMultipleProtocolInterfaces (
+ Sock->SockHandle,
+ &gEfiTcp4ProtocolGuid,
+ &(Sock->NetProtocol.TcpProtocol),
+ NULL
+ );
+ }
- if (NULL != Sock->RcvBuffer.DataQueue) {
- NetbufQueFree (Sock->RcvBuffer.DataQueue);
- }
+ if (NULL != Sock->SndBuffer.DataQueue) {
+ NetbufQueFree (Sock->SndBuffer.DataQueue);
+ }
- NetFreePool (Sock);
+ if (NULL != Sock->RcvBuffer.DataQueue) {
+ NetbufQueFree (Sock->RcvBuffer.DataQueue);
}
+ NetFreePool (Sock);
+
return NULL;
}
@@ -702,6 +725,10 @@ SockDestroy (
ASSERT (SOCK_STREAM == Sock->Type);
+ if (Sock->DestroyCallback != NULL) {
+ Sock->DestroyCallback (Sock, Sock->Context);
+ }
+
//
// Flush the completion token buffered
// by sock and rcv, snd buffer
@@ -888,6 +915,11 @@ SockClone (
InitData.SndBufferSize = Sock->SndBuffer.HighWater;
InitData.DriverBinding = Sock->DriverBinding;
InitData.Protocol = &(Sock->NetProtocol);
+ InitData.CreateCallback = Sock->CreateCallback;
+ InitData.DestroyCallback = Sock->DestroyCallback;
+ InitData.Context = Sock->Context;
+ InitData.ProtoData = Sock->ProtoReserved;
+ InitData.DataSize = sizeof (Sock->ProtoReserved);
ClonedSock = SockCreate (&InitData);
@@ -896,12 +928,6 @@ SockClone (
return NULL;
}
- NetCopyMem (
- ClonedSock->ProtoReserved,
- Sock->ProtoReserved,
- PROTO_RESERVED_LEN
- );
-
SockSetState (ClonedSock, SO_CONNECTING);
ClonedSock->ConfigureState = Sock->ConfigureState;
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c
index cde02b2bec..5d25124ebd 100644
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c
+++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c
@@ -214,16 +214,12 @@ SockDestroyChild (
**/
SOCKET *
SockCreateChild (
- IN SOCK_INIT_DATA *SockInitData,
- IN VOID *ProtoData,
- IN UINT32 Len
+ IN SOCK_INIT_DATA *SockInitData
)
{
SOCKET *Sock;
EFI_STATUS Status;
- ASSERT (ProtoData && (Len <= PROTO_RESERVED_LEN));
-
//
// create a new socket
//
@@ -236,15 +232,6 @@ SockCreateChild (
return NULL;
}
- //
- // Open the
- //
-
- //
- // copy the protodata into socket
- //
- NetCopyMem (Sock->ProtoReserved, ProtoData, Len);
-
Status = NET_TRYLOCK (&(Sock->Lock));
if (EFI_ERROR (Status)) {
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h
index b63eaa0106..2e35f5ecd7 100644
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h
+++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h
@@ -211,24 +211,6 @@ typedef struct _SOCK_BUFFER {
NET_BUF_QUEUE *DataQueue; // the queue to buffer data
} SOCK_BUFFER;
-//
-// the initialize data for create a new socket
-//
-typedef struct _SOCK_INIT_DATA {
- SOCK_TYPE Type;
- SOCK_STATE State;
-
- SOCKET *Parent; // the parent of this socket
- UINT32 BackLog; // the connection limit for listening socket
- UINT32 SndBufferSize; // the high warter mark of send buffer
- UINT32 RcvBufferSize; // the high warter mark of receive buffer
- VOID *Protocol; // the pointer to protocol function template
- // wanted to install on socket
-
- SOCK_PROTO_HANDLER ProtoHandler;
-
- EFI_HANDLE DriverBinding; // the driver binding handle
-} SOCK_INIT_DATA;
//
// socket provided oprerations for low layer protocol
@@ -317,6 +299,51 @@ SockRcvdErr (
IN EFI_STATUS Error
);
+typedef
+EFI_STATUS
+(*SOCK_CREATE_CALLBACK) (
+ IN SOCKET *This,
+ IN VOID *Context
+ );
+
+typedef
+VOID
+(*SOCK_DESTROY_CALLBACK) (
+ IN SOCKET *This,
+ IN VOID *Context
+ );
+
+//
+// the initialize data for create a new socket
+//
+typedef struct _SOCK_INIT_DATA {
+ SOCK_TYPE Type;
+ SOCK_STATE State;
+
+ SOCKET *Parent; // the parent of this socket
+ UINT32 BackLog; // the connection limit for listening socket
+ UINT32 SndBufferSize; // the high warter mark of send buffer
+ UINT32 RcvBufferSize; // the high warter mark of receive buffer
+ VOID *Protocol; // the pointer to protocol function template
+ // wanted to install on socket
+
+ //
+ // Callbacks after socket is created and before socket is to be destroyed.
+ //
+ SOCK_CREATE_CALLBACK CreateCallback;
+ SOCK_DESTROY_CALLBACK DestroyCallback;
+ VOID *Context;
+
+ //
+ // Opaque protocol data.
+ //
+ VOID *ProtoData;
+ UINT32 DataSize;
+
+ SOCK_PROTO_HANDLER ProtoHandler;
+
+ EFI_HANDLE DriverBinding; // the driver binding handle
+} SOCK_INIT_DATA;
//
// the socket structure representing a network service access point
//
@@ -368,6 +395,13 @@ struct _SOCKET {
EFI_TCP4_PROTOCOL TcpProtocol;
EFI_UDP4_PROTOCOL UdpProtocol;
} NetProtocol;
+
+ //
+ // Callbacks.
+ //
+ SOCK_CREATE_CALLBACK CreateCallback;
+ SOCK_DESTROY_CALLBACK DestroyCallback;
+ VOID *Context;
};
//
@@ -401,9 +435,7 @@ typedef struct _TCP_RSV_DATA {
//
SOCKET *
SockCreateChild (
- IN SOCK_INIT_DATA *SockInitData,
- IN VOID *ProtoData,
- IN UINT32 Len
+ IN SOCK_INIT_DATA *SockInitData
);
//
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c
index e2a78b7a9d..8102b32182 100644
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c
+++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c
@@ -51,6 +51,11 @@ SOCK_INIT_DATA mTcp4DefaultSockData = {
TCP_SND_BUF_SIZE,
TCP_RCV_BUF_SIZE,
&mTcp4ProtocolTemplate,
+ Tcp4CreateSocketCallback,
+ Tcp4DestroySocketCallback,
+ NULL,
+ NULL,
+ 0,
Tcp4Dispatcher,
NULL,
};
@@ -471,6 +476,97 @@ Tcp4DriverBindingStop (
return Status;
}
+EFI_STATUS
+Tcp4CreateSocketCallback (
+ IN SOCKET *This,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+ TCP4_SERVICE_DATA *TcpServiceData;
+ EFI_IP4_PROTOCOL *Ip4;
+
+ TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;
+
+ //
+ // Open the default Ip4 protocol of IP_IO BY_DRIVER.
+ //
+ Status = gBS->OpenProtocol (
+ TcpServiceData->IpIo->ChildHandle,
+ &gEfiIp4ProtocolGuid,
+ (VOID **) &Ip4,
+ TcpServiceData->DriverBindingHandle,
+ This->SockHandle,
+ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ //
+ // Open the device path on the handle where service binding resides on.
+ //
+ Status = gBS->OpenProtocol (
+ TcpServiceData->ControllerHandle,
+ &gEfiDevicePathProtocolGuid,
+ (VOID **) &This->ParentDevicePath,
+ TcpServiceData->DriverBindingHandle,
+ This->SockHandle,
+ EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
+ );
+ if (EFI_ERROR (Status)) {
+ gBS->CloseProtocol (
+ TcpServiceData->IpIo->ChildHandle,
+ &gEfiIp4ProtocolGuid,
+ TcpServiceData->DriverBindingHandle,
+ This->SockHandle
+ );
+ } else {
+ //
+ // Insert this socket into the SocketList.
+ //
+ NetListInsertTail (&TcpServiceData->SocketList, &This->Link);
+ }
+
+ return Status;
+}
+
+VOID
+Tcp4DestroySocketCallback (
+ IN SOCKET *This,
+ IN VOID *Context
+ )
+{
+ TCP4_SERVICE_DATA *TcpServiceData;
+
+ TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;
+
+ //
+ // Remove this node from the list.
+ //
+ NetListRemoveEntry (&This->Link);
+
+ //
+ // Close the device path protocol
+ //
+ gBS->CloseProtocol (
+ TcpServiceData->ControllerHandle,
+ &gEfiDevicePathProtocolGuid,
+ TcpServiceData->DriverBindingHandle,
+ This->SockHandle
+ );
+
+ //
+ // Close the Ip4 protocol.
+ //
+ gBS->CloseProtocol (
+ TcpServiceData->IpIo->ChildHandle,
+ &gEfiIp4ProtocolGuid,
+ TcpServiceData->DriverBindingHandle,
+ This->SockHandle
+ );
+}
+
/**
Creates a child handle with a set of TCP4 services.
@@ -497,7 +593,6 @@ Tcp4ServiceBindingCreateChild (
TCP4_SERVICE_DATA *TcpServiceData;
TCP4_PROTO_DATA TcpProto;
EFI_STATUS Status;
- VOID *Ip4;
EFI_TPL OldTpl;
if (NULL == This || NULL == ChildHandle) {
@@ -505,6 +600,7 @@ Tcp4ServiceBindingCreateChild (
}
OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);
+ Status = EFI_SUCCESS;
TcpServiceData = TCP4_FROM_THIS (This);
TcpProto.TcpService = TcpServiceData;
TcpProto.TcpPcb = NULL;
@@ -513,60 +609,20 @@ Tcp4ServiceBindingCreateChild (
// Create a tcp instance with defualt Tcp default
// sock init data and TcpProto
//
+ mTcp4DefaultSockData.ProtoData = &TcpProto;
+ mTcp4DefaultSockData.DataSize = sizeof (TCP4_PROTO_DATA);
mTcp4DefaultSockData.DriverBinding = TcpServiceData->DriverBindingHandle;
-
- Sock = SockCreateChild (&mTcp4DefaultSockData, &TcpProto, sizeof (TCP4_PROTO_DATA));
+
+ Sock = SockCreateChild (&mTcp4DefaultSockData);
if (NULL == Sock) {
TCP4_DEBUG_ERROR (("Tcp4DriverBindingCreateChild: "
"No resource to create a Tcp Child\n"));
Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
-
- *ChildHandle = Sock->SockHandle;
-
- //
- // Open the default Ip4 protocol of IP_IO BY_DRIVER.
- //
- Status = gBS->OpenProtocol (
- TcpServiceData->IpIo->ChildHandle,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Ip4,
- TcpServiceData->DriverBindingHandle,
- Sock->SockHandle,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
- 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);
} else {
- NetListInsertTail (&TcpServiceData->SocketList, &Sock->Link);
+ *ChildHandle = Sock->SockHandle;
}
-ON_EXIT:
-
NET_RESTORE_TPL (OldTpl);
return Status;
}
@@ -594,8 +650,6 @@ Tcp4ServiceBindingDestroyChild (
EFI_STATUS Status;
EFI_TCP4_PROTOCOL *Tcp4;
SOCKET *Sock;
- TCP4_PROTO_DATA *TcpProtoData;
- TCP4_SERVICE_DATA *TcpServiceData;
EFI_TPL OldTpl;
if (NULL == This || NULL == ChildHandle) {
@@ -617,42 +671,17 @@ Tcp4ServiceBindingDestroyChild (
);
if (EFI_ERROR (Status)) {
Status = EFI_UNSUPPORTED;
- goto ON_EXIT;
- }
-
- //
- // destroy this sock and related Tcp protocol control
- // block
- //
- Sock = SOCK_FROM_THIS (Tcp4);
- TcpProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
- TcpServiceData = TcpProtoData->TcpService;
-
- NetListRemoveEntry (&Sock->Link);
-
- SockDestroyChild (Sock);
-
- //
- // Close the device path protocol
- //
- gBS->CloseProtocol (
- TcpServiceData->ControllerHandle,
- &gEfiDevicePathProtocolGuid,
- TcpServiceData->DriverBindingHandle,
- ChildHandle
- );
+ } else {
+ //
+ // destroy this sock and related Tcp protocol control
+ // block
+ //
+ Sock = SOCK_FROM_THIS (Tcp4);
- //
- // Close the Ip4 protocol.
- //
- gBS->CloseProtocol (
- TcpServiceData->IpIo->ChildHandle,
- &gEfiIp4ProtocolGuid,
- TcpServiceData->DriverBindingHandle,
- ChildHandle
- );
+ SockDestroyChild (Sock);
+ }
-ON_EXIT:
NET_RESTORE_TPL (OldTpl);
return Status;
}
+
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h
index 9478a7b550..47ca324017 100644
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h
+++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h
@@ -122,6 +122,18 @@ Tcp4DriverBindingStop (
IN EFI_HANDLE *ChildHandleBuffer
);
+EFI_STATUS
+Tcp4CreateSocketCallback (
+ IN SOCKET *This,
+ IN VOID *Context
+ );
+
+VOID
+Tcp4DestroySocketCallback (
+ IN SOCKET *This,
+ IN VOID *Context
+ );
+
//
// Function ptototypes for the ServiceBinding Prococol
//
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
index 3930539d77..863ebc1ea0 100644
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
+++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
@@ -425,8 +425,6 @@ TcpCloneTcb (
)
{
TCP_CB *Clone;
- TCP4_SERVICE_DATA *TcpService;
- EFI_IP4_PROTOCOL *Ip4;
Clone = NetAllocatePool (sizeof (TCP_CB));
@@ -455,34 +453,6 @@ TcpCloneTcb (
((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpPcb = Clone;
- TcpService = ((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpService;
-
- NetListInsertTail (&TcpService->SocketList, &Clone->Sk->Link);
-
- //
- // Open the device path on the handle where service binding resides on.
- //
- gBS->OpenProtocol (
- TcpService->ControllerHandle,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &Clone->Sk->ParentDevicePath,
- TcpService->DriverBindingHandle,
- Clone->Sk->SockHandle,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
-
- //
- // Open the ip protocol by child controller.
- //
- gBS->OpenProtocol (
- TcpService->IpIo->ChildHandle,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Ip4,
- TcpService->DriverBindingHandle,
- Clone->Sk->SockHandle,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
-
return Clone;
}