EFIAPI NetbufClone ( IN NET_BUF *Nbuf ) { NET_BUF *Clone; NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE); Clone = AllocatePool (NET_BUF_SIZE (Nbuf->BlockOpNum)); if (Clone == NULL) { return NULL; } Clone->Signature = NET_BUF_SIGNATURE; Clone->RefCnt = 1; InitializeListHead (&Clone->List); Clone->Ip = Nbuf->Ip; Clone->Tcp = Nbuf->Tcp; CopyMem (Clone->ProtoData, Nbuf->ProtoData, NET_PROTO_DATA); NET_GET_REF (Nbuf->Vector); Clone->Vector = Nbuf->Vector; Clone->BlockOpNum = Nbuf->BlockOpNum; Clone->TotalSize = Nbuf->TotalSize; CopyMem (Clone->BlockOp, Nbuf->BlockOp, sizeof (NET_BLOCK_OP) * Nbuf->BlockOpNum); return Clone; }
/** Called by the low layer protocol to deliver received data to socket layer. This function will append the data to the socket receive buffer, set the urgent data length, and then check if any receive token can be signaled. @param[in, out] Sock Pointer to the socket. @param[in, out] NetBuffer Pointer to the buffer that contains the received data. @param[in] UrgLen The length of the urgent data in the received data. **/ VOID SockDataRcvd ( IN OUT SOCKET *Sock, IN OUT NET_BUF *NetBuffer, IN UINT32 UrgLen ) { ASSERT ((Sock != NULL) && (Sock->RcvBuffer.DataQueue != NULL) && UrgLen <= NetBuffer->TotalSize); NET_GET_REF (NetBuffer); ((TCP_RSV_DATA *) (NetBuffer->ProtoData))->UrgLen = UrgLen; NetbufQueAppend (Sock->RcvBuffer.DataQueue, NetBuffer); SockWakeRcvToken (Sock); }