UINT32 DataLen;\r
TCP_RSV_DATA *TcpRsvData;\r
BOOLEAN Urg;\r
-\r
ASSERT ((SockBuffer != NULL) && (IsUrg != NULL) && (BufLen > 0));\r
\r
RcvBufEntry = SockBufFirst (SockBuffer);\r
SockSetTcpRxData (Sock, RxData, TokenRcvdBytes, IsUrg);\r
\r
NetbufQueTrim (Sock->RcvBuffer.DataQueue, TokenRcvdBytes);\r
-// SOCK_TRIM_RCV_BUFF (Sock, TokenRcvdBytes);\r
SIGNAL_TOKEN (&(RcvToken->Token), EFI_SUCCESS);\r
\r
return TokenRcvdBytes;\r
\r
@param SockInitData Pointer to the initial data of the socket.\r
\r
- @return Pointer to the newly created socket.\r
+ @return Pointer to the newly created socket, return NULL when exception occured.\r
\r
**/\r
SOCKET *\r
\r
/**\r
Called by the low layer protocol to indicate the socket a connection is \r
- established. This function just changes the socket's state to SO_CONNECTED \r
+ established. \r
+ \r
+ This function just changes the socket's state to SO_CONNECTED \r
and signals the token used for connection establishment.\r
\r
@param Sock Pointer to the socket associated with the\r
\r
\r
/**\r
- Called by the low layer protocol to indicate the connection is closed; This \r
- function flushes the socket, sets the state to SO_CLOSED and signals the close \r
- token.\r
+ Called by the low layer protocol to indicate the connection is closed.\r
+ \r
+ This function flushes the socket, sets the state to SO_CLOSED and signals \r
+ the close token.\r
\r
@param Sock Pointer to the socket associated with the closed\r
connection.\r
+ \r
**/\r
VOID\r
SockConnClosed (\r
\r
\r
/**\r
- Called by low layer protocol to indicate that some data is sent or processed; \r
+ Called by low layer protocol to indicate that some data is sent or processed.\r
+ \r
This function trims the sent data in the socket send buffer, signals the data \r
token if proper.\r
\r
\r
\r
/**\r
- Called by the low layer protocol to deliver received data to socket layer; \r
+ Called by the low layer protocol to deliver received data to socket layer.\r
+ \r
This function will append the data to the socket receive buffer, set ther \r
urgent data length and then check if any receive token can be signaled.\r
\r
\r
\r
/**\r
- Called by the low layer protocol to indicate that there\r
- will be no more data from the communication peer; This\r
- function set the socket's state to SO_NO_MORE_DATA and\r
- signal all queued IO tokens with the error status\r
- EFI_CONNECTION_FIN.\r
+ Called by the low layer protocol to indicate that there will be no more data \r
+ from the communication peer.\r
+ \r
+ This function set the socket's state to SO_NO_MORE_DATA and signal all queued \r
+ IO tokens with the error status EFI_CONNECTION_FIN.\r
\r
@param Sock Pointer to the socket.\r
\r
**/\r
EFI_STATUS\r
SockGetMode (\r
- IN SOCKET *Sock,\r
- IN VOID *Mode\r
+ IN SOCKET *Sock,\r
+ IN OUT VOID *Mode\r
)\r
{\r
return Sock->ProtoHandler (Sock, SOCK_MODE, Mode);\r
\r
#define SOCK_IS_NO_MORE_DATA(Sock) (0 != ((Sock)->Flag & SO_NO_MORE_DATA))\r
\r
-#define SOCK_SIGNATURE SIGNATURE_32 ('S', 'O', 'C', 'K')\r
+#define SOCK_SIGNATURE EFI_SIGNATURE_32 ('S', 'O', 'C', 'K')\r
\r
#define SOCK_FROM_THIS(a) CR ((a), SOCKET, NetProtocol, SOCK_SIGNATURE)\r
\r
SOCK_STREAM ///< This socket providing stream service\r
} SOCK_TYPE;\r
\r
-///\r
-/// The handler of protocol for request from socket.\r
-///\r
-typedef\r
-EFI_STATUS\r
-(*SOCK_PROTO_HANDLER) (\r
- IN SOCKET *Socket, ///< The socket issuing the request to protocol\r
- IN SOCK_REQUEST Request, ///< The request issued by socket\r
- IN VOID *RequestData ///< The request related data\r
- );\r
-\r
///\r
/// The buffer structure of rcvd data and send data used by socket.\r
///\r
NET_BUF_QUEUE *DataQueue; ///< The queue to buffer data\r
} SOCK_BUFFER;\r
\r
-\r
+/**\r
+ The handler of protocol for request from socket.\r
+ \r
+ @param Socket The socket issuing the request to protocol\r
+ @param Request The request issued by socket\r
+ @param RequestData The request related data\r
+ \r
+ @retval EFI_SUCCESS The socket request is completed successfully.\r
+ @retval other The error status returned by the corresponding TCP\r
+ layer function.\r
+ \r
+**/\r
+typedef\r
+EFI_STATUS\r
+(*SOCK_PROTO_HANDLER) (\r
+ IN SOCKET *Socket,\r
+ IN SOCK_REQUEST Request,\r
+ IN VOID *RequestData\r
+ );\r
+ \r
+ \r
//\r
// Socket provided oprerations for low layer protocol\r
//\r
\r
/**\r
Called by the low layer protocol to indicate the socket a connection is \r
- established. This function just changes the socket's state to SO_CONNECTED \r
+ established. \r
+ \r
+ This function just changes the socket's state to SO_CONNECTED \r
and signals the token used for connection establishment.\r
\r
@param Sock Pointer to the socket associated with the\r
);\r
\r
/**\r
- Called by the low layer protocol to indicate the connection is closed; This \r
- function flushes the socket, sets the state to SO_CLOSED and signals the close \r
- token.\r
+ Called by the low layer protocol to indicate the connection is closed.\r
+ \r
+ This function flushes the socket, sets the state to SO_CLOSED and signals \r
+ the close token.\r
\r
@param Sock Pointer to the socket associated with the closed\r
connection.\r
);\r
\r
/**\r
- Called by low layer protocol to indicate that some data is sent or processed; \r
+ Called by low layer protocol to indicate that some data is sent or processed.\r
+ \r
This function trims the sent data in the socket send buffer, signals the data \r
token if proper.\r
\r
\r
/**\r
Called by the low layer protocol to indicate that there\r
- will be no more data from the communication peer; This\r
- function set the socket's state to SO_NO_MORE_DATA and\r
- signal all queued IO tokens with the error status\r
- EFI_CONNECTION_FIN.\r
+ will be no more data from the communication peer.\r
+ \r
+ This function set the socket's state to SO_NO_MORE_DATA and\r
+ signal all queued IO tokens with the error status EFI_CONNECTION_FIN.\r
\r
@param Sock Pointer to the socket.\r
\r
);\r
\r
/**\r
- Called by the low layer protocol to deliver received data to socket layer; \r
+ Called by the low layer protocol to deliver received data to socket layer.\r
+ \r
This function will append the data to the socket receive buffer, set ther \r
urgent data length and then check if any receive token can be signaled.\r
\r
**/\r
EFI_STATUS\r
SockGetMode (\r
- IN SOCKET *Sock,\r
- IN VOID *Mode\r
+ IN SOCKET *Sock,\r
+ IN OUT VOID *Mode\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Tcp4GetMode (\r
- IN TCP_CB *Tcb,\r
- IN TCP4_MODE_DATA *Mode\r
+ IN TCP_CB *Tcb,\r
+ IN OUT TCP4_MODE_DATA *Mode\r
)\r
{\r
SOCKET *Sock;\r
EFI_STATUS\r
EFIAPI\r
Tcp4ServiceBindingCreateChild (\r
- IN EFI_SERVICE_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE *ChildHandle\r
+ IN EFI_SERVICE_BINDING_PROTOCOL *This,\r
+ IN OUT EFI_HANDLE *ChildHandle\r
)\r
{\r
SOCKET *Sock;\r
#include <Protocol/ServiceBinding.h>\r
#include <Library/IpIoLib.h>\r
\r
-#define TCP4_DRIVER_SIGNATURE SIGNATURE_32 ('T', 'C', 'P', '4')\r
+#define TCP4_DRIVER_SIGNATURE EFI_SIGNATURE_32 ('T', 'C', 'P', '4')\r
\r
#define TCP4_PORT_KNOWN 1024\r
#define TCP4_PORT_USER_RESERVED 65535\r
Tcp4ServiceBinding, \\r
TCP4_DRIVER_SIGNATURE \\r
)\r
-\r
+ \r
+///\r
+/// TCP heartbeat tick timer.\r
+///\r
typedef struct _TCP4_HEARTBEAT_TIMER {\r
- EFI_EVENT TimerEvent;\r
- INTN RefCnt;\r
+ EFI_EVENT TimerEvent; ///< The event assoiated with the timer\r
+ INTN RefCnt; ///< Number of reference\r
} TCP4_HEARTBEAT_TIMER;\r
\r
+///\r
+/// TCP service data\r
+///\r
typedef struct _TCP4_SERVICE_DATA {\r
UINT32 Signature;\r
EFI_HANDLE ControllerHandle;\r
LIST_ENTRY SocketList;\r
} TCP4_SERVICE_DATA;\r
\r
+///\r
+/// TCP protocol data\r
+///\r
+typedef struct _TCP4_PROTO_DATA {\r
+ TCP4_SERVICE_DATA *TcpService;\r
+ TCP_CB *TcpPcb;\r
+} TCP4_PROTO_DATA;\r
\r
\r
/**\r
IN VOID *Data OPTIONAL\r
);\r
\r
-typedef struct _TCP4_PROTO_DATA {\r
- TCP4_SERVICE_DATA *TcpService;\r
- TCP_CB *TcpPcb;\r
-} TCP4_PROTO_DATA;\r
\r
/**\r
The entry point for Tcp4 driver, used to install Tcp4 driver on the ImageHandle.\r
EFI_STATUS\r
EFIAPI\r
Tcp4ServiceBindingCreateChild (\r
- IN EFI_SERVICE_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE *ChildHandle\r
+ IN EFI_SERVICE_BINDING_PROTOCOL *This,\r
+ IN OUT EFI_HANDLE *ChildHandle\r
);\r
\r
/**\r
VOID\r
TcpSetState (\r
IN TCP_CB *Tcb,\r
- IN TCP_STATES State\r
+ IN UINT8 State\r
);\r
\r
//\r
@param Tcb Pointer to the TCP_CB of this TCP instance.\r
@param Nbuf Pointer to the NET_BUF containing the received tcp segment.\r
\r
- @return 0 The data is trimmed.\r
-\r
**/\r
-INTN\r
+VOID\r
TcpTrimInWnd (\r
IN TCP_CB *Tcb,\r
IN NET_BUF *Nbuf\r
@param Tcb Pointer to the TCP_CB of this TCP instance.\r
\r
**/\r
-INTN\r
+VOID\r
TcpOnAppConsume (\r
IN TCP_CB *Tcb\r
);\r
@param Left The sequence number of the window's left edge.\r
@param Right The sequence number of the window's right edge.\r
\r
- @return 0 The data is successfully trimmed.\r
-\r
**/\r
-INTN\r
+VOID\r
TcpTrimSegment (\r
IN NET_BUF *Nbuf,\r
IN TCP_SEQNO Left,\r
\r
Seg->Seq = Seg->End;\r
NetbufTrim (Nbuf, Nbuf->TotalSize, NET_BUF_HEAD);\r
- return 0;\r
}\r
\r
//\r
}\r
\r
ASSERT (TcpVerifySegment (Nbuf) != 0);\r
- return 0;\r
}\r
\r
\r
@param Tcb Pointer to the TCP_CB of this TCP instance.\r
@param Nbuf Pointer to the NET_BUF containing the received tcp segment.\r
\r
- @return 0 The data is trimmed.\r
-\r
**/\r
-INTN\r
+VOID\r
TcpTrimInWnd (\r
IN TCP_CB *Tcb,\r
IN NET_BUF *Nbuf\r
)\r
{\r
- return TcpTrimSegment (Nbuf, Tcb->RcvNxt, Tcb->RcvWl2 + Tcb->RcvWnd);\r
+ TcpTrimSegment (Nbuf, Tcb->RcvNxt, Tcb->RcvWl2 + Tcb->RcvWnd);\r
}\r
\r
\r
TcpClose (Tcb);\r
}\r
break;\r
- default:\r
- break;\r
}\r
\r
//\r
{\r
UINT16 RcvMss;\r
\r
- ASSERT (Tcb && Seg && Opt);\r
+ ASSERT ((Tcb != NULL) && (Seg != NULL) && (Opt != NULL));\r
ASSERT (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN));\r
\r
Tcb->SndWnd = Seg->Wnd;\r
VOID\r
TcpSetState (\r
IN TCP_CB *Tcb,\r
- IN TCP_STATES State\r
+ IN UINT8 State\r
)\r
{\r
DEBUG (\r
mTcpStateName[State])\r
);\r
\r
- Tcb->State = (TCP_STATES)State;\r
+ Tcb->State = State;\r
\r
switch (State) {\r
case TCP_ESTABLISHED:\r
@param Tcb Pointer to the TCP_CB of this TCP instance.\r
\r
**/\r
-INTN\r
+VOID\r
TcpOnAppConsume (\r
IN TCP_CB *Tcb\r
)\r
\r
switch (Tcb->State) {\r
case TCP_CLOSED:\r
- return -1;\r
- break;\r
+ return;\r
\r
case TCP_LISTEN:\r
- return -1;\r
- break;\r
+ return;\r
\r
case TCP_SYN_SENT:\r
case TCP_SYN_RCVD:\r
- return 0;\r
- break;\r
+ return;\r
\r
case TCP_ESTABLISHED:\r
TcpOld = TcpRcvWinOld (Tcb);\r
break;\r
\r
case TCP_CLOSE_WAIT:\r
- return 0;\r
- break;\r
+ return;\r
\r
case TCP_FIN_WAIT_1:\r
case TCP_FIN_WAIT_2:\r
case TCP_CLOSING:\r
case TCP_LAST_ACK:\r
case TCP_TIME_WAIT:\r
- return -1;\r
- break;\r
+ return;\r
}\r
-\r
- return -1;\r
}\r
\r
\r
case TCP_CLOSE_WAIT:\r
TcpResetConnection (Tcb);\r
break;\r
- default:\r
- break;\r
}\r
\r
TcpSetState (Tcb, TCP_CLOSED);\r
}\r
\r
if (TcpTransmitSegment (Tcb, Nbuf) != 0) {\r
- //\r
- // TODO: double check this\r
- //\r
NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD);\r
Nbuf->Tcp = NULL;\r
\r
//\r
// RFC793 and RFC1122 defined variables\r
//\r
- TCP_STATES State; ///< TCP state, such as SYN_SENT, LISTEN\r
+ UINT8 State; ///< TCP state, such as SYN_SENT, LISTEN\r
UINT8 DelayedAck; ///< Number of delayed ACKs\r
UINT16 HeadSum; ///< Checksum of the fixed parts of pesudo\r
///< header: Src IP, Dst IP, 0, Protocol,\r
typedef\r
VOID\r
(*TCP_TIMER_HANDLER) (\r
- IN TCP_CB * Tcb\r
+ IN TCP_CB *Tcb\r
);\r
\r
#include "Tcp4Func.h"\r
//\r
if ((TcpDataToSend (Tcb, 1) != 0) && (TcpToSendData (Tcb, 1) > 0)) {\r
\r
- ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT));\r
+ ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT) != 0);\r
return ;\r
}\r
\r