/** 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); }
/** Process the TCP send data, buffer the tcp txdata and append the buffer to socket send buffer,then try to send it. @param Sock Pointer to the socket. @param TcpTxData Pointer to the application provided send buffer. @retval EFI_SUCCESS The operation is completed successfully. @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. **/ EFI_STATUS SockProcessTcpSndData ( IN SOCKET *Sock, IN VOID *TcpTxData ) { NET_BUF *SndData; EFI_STATUS Status; EFI_TCP4_TRANSMIT_DATA *TxData; TxData = (EFI_TCP4_TRANSMIT_DATA *) TcpTxData; // // transform this TxData into a NET_BUFFER // and insert it into Sock->SndBuffer // SndData = NetbufFromExt ( (NET_FRAGMENT *) TxData->FragmentTable, (UINT32) TxData->FragmentCount, 0, 0, SockFreeFoo, NULL ); if (NULL == SndData) { DEBUG ((EFI_D_ERROR, "SockKProcessSndData: Failed to" " call NetBufferFromExt\n")); return EFI_OUT_OF_RESOURCES; } NetbufQueAppend (Sock->SndBuffer.DataQueue, SndData); // // notify the low layer protocol to handle this send token // if (TxData->Urgent) { Status = Sock->ProtoHandler (Sock, SOCK_SNDURG, NULL); if (EFI_ERROR (Status)) { return Status; } } if (TxData->Push) { Status = Sock->ProtoHandler (Sock, SOCK_SNDPUSH, NULL); if (EFI_ERROR (Status)) { return Status; } } // // low layer protocol should really handle the sending // process when catching SOCK_SND request // Status = Sock->ProtoHandler (Sock, SOCK_SND, NULL); if (EFI_ERROR (Status)) { return Status; } return EFI_SUCCESS; }