X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FNetwork%2FTcp4Dxe%2FSockImpl.c;h=b744f6892036c9a6b757db1842f14cc569f145b0;hb=e48e37fce2611df7a52aff271835ff72ee396d9b;hp=585d91bfa5cd14e2a18e751130db6ddc4f2c1cae;hpb=36ee91ca3661d3d020a7841aacbf858d885c4728;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c index 585d91bfa5..b744f68920 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c @@ -262,7 +262,7 @@ SockProcessTcpSndData ( ); if (NULL == SndData) { - SOCK_DEBUG_ERROR (("SockKProcessSndData: Failed to" + DEBUG ((EFI_D_ERROR, "SockKProcessSndData: Failed to" " call NetBufferFromExt\n")); return EFI_OUT_OF_RESOURCES; @@ -316,7 +316,7 @@ STATIC VOID SockFlushPendingToken ( IN SOCKET *Sock, - IN NET_LIST_ENTRY *PendingTokenList + IN LIST_ENTRY *PendingTokenList ) { SOCK_TOKEN *SockToken; @@ -324,7 +324,7 @@ SockFlushPendingToken ( ASSERT (Sock && PendingTokenList); - while (!NetListIsEmpty (PendingTokenList)) { + while (!IsListEmpty (PendingTokenList)) { SockToken = NET_LIST_HEAD ( PendingTokenList, SOCK_TOKEN, @@ -334,8 +334,8 @@ SockFlushPendingToken ( Token = SockToken->Token; SIGNAL_TOKEN (Token, Sock->SockError); - NetListRemoveEntry (&(SockToken->TokenList)); - NetFreePool (SockToken); + RemoveEntryList (&(SockToken->TokenList)); + gBS->FreePool (SockToken); } } @@ -392,7 +392,7 @@ SockWakeListenToken ( ASSERT (Parent && SOCK_IS_LISTENING (Parent) && SOCK_IS_CONNECTED (Sock)); - if (!NetListIsEmpty (&Parent->ListenTokenList)) { + if (!IsListEmpty (&Parent->ListenTokenList)) { SockToken = NET_LIST_HEAD ( &Parent->ListenTokenList, SOCK_TOKEN, @@ -404,14 +404,13 @@ SockWakeListenToken ( SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS); - NetListRemoveEntry (&SockToken->TokenList); - NetFreePool (SockToken); + RemoveEntryList (&SockToken->TokenList); + gBS->FreePool (SockToken); - NetListRemoveEntry (&Sock->ConnectionList); + RemoveEntryList (&Sock->ConnectionList); Parent->ConnCnt--; - SOCK_DEBUG_WARN (("SockWakeListenToken: accept a socket," - "now conncnt is %d", Parent->ConnCnt)); + DEBUG ((EFI_D_WARN, "SockWakeListenToken: accept a socket, now conncnt is %d", Parent->ConnCnt)); Sock->Parent = NULL; } @@ -443,7 +442,7 @@ SockWakeRcvToken ( ASSERT (RcvdBytes > 0); - while (RcvdBytes > 0 && !NetListIsEmpty (&Sock->RcvTokenList)) { + while (RcvdBytes > 0 && !IsListEmpty (&Sock->RcvTokenList)) { SockToken = NET_LIST_HEAD ( &Sock->RcvTokenList, @@ -458,8 +457,8 @@ SockWakeRcvToken ( return ; } - NetListRemoveEntry (&(SockToken->TokenList)); - NetFreePool (SockToken); + RemoveEntryList (&(SockToken->TokenList)); + gBS->FreePool (SockToken); RcvdBytes -= TokenRcvdBytes; } } @@ -495,7 +494,7 @@ SockProcessSndToken ( // socket layer flow control policy // while ((FreeSpace >= Sock->SndBuffer.LowWater) && - !NetListIsEmpty (&Sock->SndTokenList)) { + !IsListEmpty (&Sock->SndTokenList)) { SockToken = NET_LIST_HEAD ( &(Sock->SndTokenList), @@ -506,8 +505,8 @@ SockProcessSndToken ( // // process this token // - NetListRemoveEntry (&(SockToken->TokenList)); - NetListInsertTail ( + RemoveEntryList (&(SockToken->TokenList)); + InsertTailList ( &(Sock->ProcessingSndTokenList), &(SockToken->TokenList) ); @@ -538,9 +537,9 @@ SockProcessSndToken ( OnError: - NetListRemoveEntry (&SockToken->TokenList); + RemoveEntryList (&SockToken->TokenList); SIGNAL_TOKEN (SockToken->Token, Status); - NetFreePool (SockToken); + gBS->FreePool (SockToken); } @@ -563,12 +562,14 @@ SockCreate ( ASSERT (SockInitData && SockInitData->ProtoHandler); ASSERT (SockInitData->Type == SOCK_STREAM); + ASSERT (SockInitData->ProtoData && (SockInitData->DataSize <= PROTO_RESERVED_LEN)); Parent = SockInitData->Parent; if (Parent && (Parent->ConnCnt == Parent->BackLog)) { - SOCK_DEBUG_ERROR ( - ("SockCreate: Socket parent has " + DEBUG ( + (EFI_D_ERROR, + "SockCreate: Socket parent has " "reached its connection limit with %d ConnCnt and %d BackLog\n", Parent->ConnCnt, Parent->BackLog) @@ -577,24 +578,25 @@ SockCreate ( return NULL; } - Sock = NetAllocateZeroPool (sizeof (SOCKET)); + Sock = AllocateZeroPool (sizeof (SOCKET)); if (NULL == Sock) { - SOCK_DEBUG_ERROR (("SockCreate: No resource to create a new socket\n")); + DEBUG ((EFI_D_ERROR, "SockCreate: No resource to create a new socket\n")); return NULL; } - NetListInit (&Sock->ConnectionList); - NetListInit (&Sock->ListenTokenList); - NetListInit (&Sock->RcvTokenList); - NetListInit (&Sock->SndTokenList); - NetListInit (&Sock->ProcessingSndTokenList); + InitializeListHead (&Sock->Link); + InitializeListHead (&Sock->ConnectionList); + InitializeListHead (&Sock->ListenTokenList); + InitializeListHead (&Sock->RcvTokenList); + InitializeListHead (&Sock->SndTokenList); + InitializeListHead (&Sock->ProcessingSndTokenList); - NET_LOCK_INIT (&(Sock->Lock)); + EfiInitializeLock (&(Sock->Lock), TPL_CALLBACK); Sock->SndBuffer.DataQueue = NetbufQueAlloc (); if (NULL == Sock->SndBuffer.DataQueue) { - SOCK_DEBUG_ERROR (("SockCreate: No resource to allocate" + DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate" " SndBuffer for new socket\n")); goto OnError; @@ -602,7 +604,7 @@ SockCreate ( Sock->RcvBuffer.DataQueue = NetbufQueAlloc (); if (NULL == Sock->RcvBuffer.DataQueue) { - SOCK_DEBUG_ERROR (("SockCreate: No resource to allocate " + DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate " "RcvBuffer for new socket\n")); goto OnError; @@ -618,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; @@ -626,12 +631,17 @@ SockCreate ( // // Install protocol on Sock->SockHandle // - NetCopyMem ( + CopyMem ( &(Sock->NetProtocol.TcpProtocol), SockInitData->Protocol, sizeof (EFI_TCP4_PROTOCOL) ); + // + // copy the protodata into socket + // + CopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData->DataSize); + Status = gBS->InstallMultipleProtocolInterfaces ( &Sock->SockHandle, &gEfiTcp4ProtocolGuid, @@ -640,7 +650,7 @@ SockCreate ( ); if (EFI_ERROR (Status)) { - SOCK_DEBUG_ERROR (("SockCreate: Install TCP protocol in " + DEBUG ((EFI_D_ERROR, "SockCreate: Install TCP protocol in " "socket failed with %r\n", Status)); goto OnError; @@ -656,28 +666,45 @@ SockCreate ( // Parent->ConnCnt++; - SOCK_DEBUG_WARN (("SockCreate: Create a new socket and" - "add to parent, now conncnt is %d\n", Parent->ConnCnt)); + DEBUG ( + (EFI_D_WARN, + "SockCreate: Create a new socket and add to parent, now conncnt is %d\n", + Parent->ConnCnt) + ); + + InsertTailList (&Parent->ConnectionList, &Sock->ConnectionList); + } - 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); } + gBS->FreePool (Sock); + return NULL; } @@ -701,6 +728,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 @@ -723,11 +754,15 @@ SockDestroy ( // if (Sock->Parent) { - NetListRemoveEntry (&(Sock->ConnectionList)); + RemoveEntryList (&(Sock->ConnectionList)); (Sock->Parent->ConnCnt)--; - SOCK_DEBUG_WARN (("SockDestory: Delete a unaccepted socket from parent" - "now conncnt is %d\n", Sock->Parent->ConnCnt)); + DEBUG ( + (EFI_D_WARN, + "SockDestory: Delete a unaccepted socket from parent" + "now conncnt is %d\n", + Sock->Parent->ConnCnt) + ); Sock->Parent = NULL; } @@ -752,7 +787,7 @@ SockDestroy ( if (EFI_ERROR (Status)) { - SOCK_DEBUG_ERROR (("SockDestroy: Open protocol installed " + DEBUG ((EFI_D_ERROR, "SockDestroy: Open protocol installed " "on socket failed with %r\n", Status)); goto FreeSock; @@ -770,7 +805,7 @@ SockDestroy ( ); FreeSock: - NetFreePool (Sock); + gBS->FreePool (Sock); return ; } @@ -825,7 +860,7 @@ SockConnFlush ( // Destroy the pending connection, if it is a listening socket // if (SOCK_IS_LISTENING (Sock)) { - while (!NetListIsEmpty (&Sock->ConnectionList)) { + while (!IsListEmpty (&Sock->ConnectionList)) { Child = NET_LIST_HEAD ( &Sock->ConnectionList, SOCKET, @@ -887,20 +922,19 @@ 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); if (NULL == ClonedSock) { - SOCK_DEBUG_ERROR (("SockClone: no resource to create a cloned sock\n")); + DEBUG ((EFI_D_ERROR, "SockClone: no resource to create a cloned sock\n")); return NULL; } - NetCopyMem ( - ClonedSock->ProtoReserved, - Sock->ProtoReserved, - PROTO_RESERVED_LEN - ); - SockSetState (ClonedSock, SO_CONNECTING); ClonedSock->ConfigureState = Sock->ConfigureState; @@ -992,7 +1026,7 @@ SockDataSent ( SOCK_TOKEN *SockToken; SOCK_COMPLETION_TOKEN *SndToken; - ASSERT (!NetListIsEmpty (&Sock->ProcessingSndTokenList)); + ASSERT (!IsListEmpty (&Sock->ProcessingSndTokenList)); ASSERT (Count <= (Sock->SndBuffer.DataQueue)->BufSize); NetbufQueTrim (Sock->SndBuffer.DataQueue, Count); @@ -1011,10 +1045,10 @@ SockDataSent ( if (SockToken->RemainDataLen <= Count) { - NetListRemoveEntry (&(SockToken->TokenList)); + RemoveEntryList (&(SockToken->TokenList)); SIGNAL_TOKEN (SndToken, EFI_SUCCESS); Count -= SockToken->RemainDataLen; - NetFreePool (SockToken); + gBS->FreePool (SockToken); } else { SockToken->RemainDataLen -= Count; @@ -1154,7 +1188,7 @@ SockRcvdErr ( { SOCK_TOKEN *SockToken; - if (!NetListIsEmpty (&Sock->RcvTokenList)) { + if (!IsListEmpty (&Sock->RcvTokenList)) { SockToken = NET_LIST_HEAD ( &Sock->RcvTokenList, @@ -1162,11 +1196,11 @@ SockRcvdErr ( TokenList ); - NetListRemoveEntry (&SockToken->TokenList); + RemoveEntryList (&SockToken->TokenList); SIGNAL_TOKEN (SockToken->Token, Error); - NetFreePool (SockToken); + gBS->FreePool (SockToken); } else { SOCK_ERROR (Sock, Error); @@ -1195,7 +1229,7 @@ SockNoMoreData ( SOCK_NO_MORE_DATA (Sock); - if (!NetListIsEmpty (&Sock->RcvTokenList)) { + if (!IsListEmpty (&Sock->RcvTokenList)) { ASSERT (0 == GET_RCV_DATASIZE (Sock)); @@ -1225,11 +1259,11 @@ SockBufFirst ( IN SOCK_BUFFER *Sockbuf ) { - NET_LIST_ENTRY *NetbufList; + LIST_ENTRY *NetbufList; NetbufList = &(Sockbuf->DataQueue->BufList); - if (NetListIsEmpty (NetbufList)) { + if (IsListEmpty (NetbufList)) { return NULL; } @@ -1253,7 +1287,7 @@ SockBufNext ( IN NET_BUF *SockEntry ) { - NET_LIST_ENTRY *NetbufList; + LIST_ENTRY *NetbufList; NetbufList = &(Sockbuf->DataQueue->BufList);