Home | History | Annotate | Download | only in Tcp4Dxe

Lines Matching refs:Tcb

22   @param  Tcb      Pointer to the TCP_CB of this TCP instance.

31 IN TCP_CB *Tcb,
35 return (TCP_SEQ_LEQ (Tcb->RcvWl2, Seg->End) &&
36 TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd));
43 @param Tcb Pointer to the TCP_CB of this TCP instance.
49 IN OUT TCP_CB *Tcb,
59 if (Tcb->CongestState != TCP_CONGEST_RECOVER) {
64 FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna);
66 Tcb->Ssthresh = MAX (FlightSize >> 1, (UINT32) (2 * Tcb->SndMss));
67 Tcb->Recover = Tcb->SndNxt;
69 Tcb->CongestState = TCP_CONGEST_RECOVER;
70 TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
75 TcpRetransmit (Tcb, Tcb->SndUna);
76 Tcb->CWnd = Tcb->Ssthresh + 3 * Tcb->SndMss;
79 " for TCB %p, recover point is %d\n", Tcb, Tcb->Recover));
86 if (Seg->Ack == Tcb->SndUna) {
96 Tcb->CWnd += Tcb->SndMss;
98 " duplicated ACK (%d) for TCB %p\n", Seg->Ack, Tcb));
106 if (TCP_SEQ_GEQ (Seg->Ack, Tcb->Recover)) {
112 FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna);
114 Tcb->CWnd = MIN (Tcb->Ssthresh, FlightSize + Tcb->SndMss);
116 Tcb->CongestState = TCP_CONGEST_OPEN;
118 " for TCB %p, exit fast recovery\n", Seg->Ack, Tcb));
127 TcpRetransmit (Tcb, Seg->Ack);
128 Acked = TCP_SUB_SEQ (Seg->Ack, Tcb->SndUna);
135 if (Acked >= Tcb->SndMss) {
136 Acked -= Tcb->SndMss;
140 Tcb->CWnd -= Acked;
143 " ACK(%d) for TCB %p\n", Seg->Ack, Tcb));
153 @param Tcb Pointer to the TCP_CB of this TCP instance.
159 IN OUT TCP_CB *Tcb,
163 if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
169 if (TCP_SEQ_GEQ (Seg->Ack, Tcb->LossRecover)) {
174 Tcb->LossTimes = 0;
175 Tcb->CongestState = TCP_CONGEST_OPEN;
178 "full ACK(%d) for TCB %p\n", Seg->Ack, Tcb));
186 TcpRetransmit (Tcb, Seg->Ack);
188 "partial ACK(%d) for TCB %p\n", Seg->Ack, Tcb));
197 @param Tcb Pointer to the TCP_CB of this TCP instance.
203 IN OUT TCP_CB *Tcb,
212 if (Tcb->SRtt != 0) {
214 Var = Tcb->SRtt - (Measure << TCP_RTT_SHIFT);
220 Tcb->RttVar = (3 * Tcb->RttVar + Var) >> 2;
221 Tcb->SRtt = 7 * (Tcb->SRtt >> 3) + Measure;
227 Tcb->SRtt = Measure << TCP_RTT_SHIFT;
228 Tcb->RttVar = Measure << (TCP_RTT_SHIFT - 1);
231 Tcb->Rto = (Tcb->SRtt + MAX (8, 4 * Tcb->RttVar)) >> TCP_RTT_SHIFT;
238 if (Tcb->Rto < TCP_RTO_MIN) {
239 Tcb->Rto = TCP_RTO_MIN;
241 } else if (Tcb->Rto > TCP_RTO_MAX) {
242 Tcb->Rto = TCP_RTO_MAX;
246 DEBUG ((EFI_D_INFO, "TcpComputeRtt: new RTT for TCB %p"
248 Tcb, Tcb->SRtt, Tcb->RttVar, Tcb->Rto));
343 Trim off the data outside the tcb's receive window.
345 @param Tcb Pointer to the TCP_CB of this TCP instance.
351 IN TCP_CB *Tcb,
355 TcpTrimSegment (Nbuf, Tcb->RcvNxt, Tcb->RcvWl2 + Tcb->RcvWnd);
363 @param Tcb Pointer to the TCP_CB of this TCP instance.
372 IN OUT TCP_CB *Tcb
381 ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
387 if (IsListEmpty (&Tcb->RcvQue) || !TCP_CONNECTED (Tcb->State)) {
395 Entry = Tcb->RcvQue.ForwardLink;
396 Seq = Tcb->RcvNxt;
398 while (Entry != &Tcb->RcvQue) {
411 Tcb->RcvNxt = Seq;
424 if (!IsListEmpty (&Tcb->RcvQue)) {
426 " FIN from peer of TCB %p, reset connection\n", Tcb));
433 "from peer of TCB %p\n", Tcb));
435 switch (Tcb->State) {
439 TcpSetState (Tcb, TCP_CLOSE_WAIT);
444 if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
446 TcpSetState (Tcb, TCP_CLOSING);
455 TcpSetState (Tcb, TCP_TIME_WAIT);
456 TcpClearAllTimer (Tcb);
458 if (Tcb->TimeWaitTimeout != 0) {
460 TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
464 "because app disables TIME_WAIT timer for %p\n", Tcb));
466 TcpSendAck (Tcb);
467 TcpClose (Tcb);
485 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
495 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
501 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) &&
502 TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvUp)) {
504 if (TCP_SEQ_LEQ (Seg->End, Tcb->RcvUp)) {
507 Urgent = TCP_SUB_SEQ (Tcb->RcvUp, Seg->Seq) + 1;
511 SockDataRcvd (Tcb->Sk, Nbuf, Urgent);
514 if (TCP_FIN_RCVD (Tcb->State)) {
516 SockNoMoreData (Tcb->Sk);
529 @param Tcb Pointer to the TCP_CB of this TCP instance.
535 IN OUT TCP_CB *Tcb,
545 ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL));
550 Head = &Tcb->RcvQue;
597 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
635 @param Tcb Pointer to the TCP_CB of this TCP instance.
641 IN TCP_CB *Tcb,
650 Head = &Tcb->SndQue;
698 TCP_CB *Tcb;
710 Tcb = NULL;
731 Tcb = TcpLocateTcb (
739 if ((Tcb == NULL) || (Tcb->State == TCP_CLOSED)) {
740 DEBUG ((EFI_D_INFO, "TcpInput: send reset because no TCB found\n"));
742 Tcb = NULL;
746 Seg = TcpFormatNetbuf (Tcb, Nbuf);
754 " of malformed option for TCB %p\n", Tcb));
768 if (Tcb->State == TCP_LISTEN) {
774 "for TCB %p in listening\n", Tcb));
785 " segment with ACK for TCB %p in listening\n", Tcb));
795 // create a child TCB to handle the data
797 Parent = Tcb;
799 Tcb = TcpCloneTcb (Parent);
800 if (Tcb == NULL) {
802 " failed to clone a child for TCB %p\n", Tcb));
807 DEBUG ((EFI_D_INFO, "TcpInput: create a child for TCB %p"
808 " in listening\n", Tcb));
811 // init the TCB structure
813 Tcb->LocalEnd.Ip = Dst;
814 Tcb->LocalEnd.Port = Head->DstPort;
815 Tcb->RemoteEnd.Ip = Src;
816 Tcb->RemoteEnd.Port = Head->SrcPort;
818 TcpInitTcbLocal (Tcb);
819 TcpInitTcbPeer (Tcb, Seg, &Option);
821 TcpSetState (Tcb, TCP_SYN_RCVD);
822 TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout);
823 TcpTrimInWnd (Tcb, Nbuf);
830 } else if (Tcb->State == TCP_SYN_SENT) {
834 if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK) && (Seg->Ack != Tcb->Iss + 1)) {
837 "wrong ACK received for TCB %p in SYN_SENT\n", Tcb));
850 " peer for TCB %p in SYN_SENT\n", Tcb));
852 SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
857 "because of no ACK for TCB %p in SYN_SENT\n", Tcb));
872 TcpInitTcbPeer (Tcb, Seg, &Option);
876 Tcb->SndUna = Seg->Ack;
879 TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
881 if (TCP_SEQ_GT (Tcb->SndUna, Tcb->Iss)) {
883 TcpSetState (Tcb, TCP_ESTABLISHED);
885 TcpClearTimer (Tcb, TCP_TIMER_CONNECT);
886 TcpDeliverData (Tcb);
888 if ((Tcb->CongestState == TCP_CONGEST_OPEN) &&
889 TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
891 TcpComputeRtt (Tcb, Tcb->RttMeasure);
892 TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
895 TcpTrimInWnd (Tcb, Nbuf);
897 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
900 " for TCB %p in SYN_SENT\n", Tcb));
907 TcpSetState (Tcb, TCP_SYN_RCVD);
909 ASSERT (Tcb->SndNxt == Tcb->Iss + 1);
910 TcpAdjustSndQue (Tcb, Tcb->SndNxt);
912 TcpTrimInWnd (Tcb, Nbuf);
915 "for TCB %p in SYN_SENT\n", Tcb));
931 if (Tcb->ProbeTimerOn && (Seg->Wnd != 0)) {
932 TcpClearTimer (Tcb, TCP_TIMER_PROBE);
933 Tcb->ProbeTimerOn = FALSE;
939 if (TcpSeqAcceptable (Tcb, Seg) == 0) {
941 " test failed for segment of TCB %p\n", Tcb));
944 TcpSendAck (Tcb);
950 if ((TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2)) &&
951 (Tcb->RcvWl2 == Seg->End) &&
954 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
962 DEBUG ((EFI_D_WARN, "TcpInput: connection reset for TCB %p\n", Tcb));
964 if (Tcb->State == TCP_SYN_RCVD) {
966 SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_REFUSED);
969 // This TCB comes from either a LISTEN TCB,
970 // or active open TCB with simultanous open.
972 // if it comes from a LISTEN TCB.
974 } else if ((Tcb->State == TCP_ESTABLISHED) ||
975 (Tcb->State == TCP_FIN_WAIT_1) ||
976 (Tcb->State == TCP_FIN_WAIT_2) ||
977 (Tcb->State == TCP_CLOSE_WAIT)) {
979 SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
991 TcpTrimInWnd (Tcb, Nbuf);
1003 "because received extra SYN for TCB %p\n", Tcb));
1005 SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
1014 " of no ACK for connected TCB %p\n", Tcb));
1020 if (Tcb->State == TCP_SYN_RCVD) {
1022 if (TCP_SEQ_LT (Tcb->SndUna, Seg->Ack) &&
1023 TCP_SEQ_LEQ (Seg->Ack, Tcb->SndNxt)) {
1025 Tcb->SndWnd = Seg->Wnd;
1026 Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax);
1027 Tcb->SndWl1 = Seg->Seq;
1028 Tcb->SndWl2 = Seg->Ack;
1029 TcpSetState (Tcb, TCP_ESTABLISHED);
1031 TcpClearTimer (Tcb, TCP_TIMER_CONNECT);
1032 TcpDeliverData (Tcb);
1035 " for TCB %p in SYN_RCVD\n", Tcb));
1042 " wrong ACK for TCB %p in SYN_RCVD\n", Tcb));
1048 if (TCP_SEQ_LT (Seg->Ack, Tcb->SndUna)) {
1051 " ACK for connected TCB %p\n", Tcb));
1055 } else if (TCP_SEQ_GT (Seg->Ack, Tcb->SndNxt)) {
1058 "future ACK for connected TCB %p\n", Tcb));
1060 TcpSendAck (Tcb);
1073 if (TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvWl2) &&
1074 TCP_SEQ_LT (Tcb->RcvWl2, Seg->End)) {
1076 Tcb->TsRecent = Option.TSVal;
1077 Tcb->TsRecentAge = mTcpTick;
1080 TcpComputeRtt (Tcb, TCP_SUB_TIME (mTcpTick, Option.TSEcr));
1082 } else if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
1084 ASSERT (Tcb->CongestState == TCP_CONGEST_OPEN);
1086 TcpComputeRtt (Tcb, Tcb->RttMeasure);
1087 TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
1090 if (Seg->Ack == Tcb->SndNxt) {
1092 TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
1095 TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto);
1101 if ((Seg->Ack == Tcb->SndUna) &&
1102 (Tcb->SndUna != Tcb->SndNxt) &&
1103 (Seg->Wnd == Tcb->SndWnd) &&
1106 Tcb->DupAck++;
1109 Tcb->DupAck = 0;
1115 if (((Tcb->CongestState == TCP_CONGEST_OPEN) && (Tcb->DupAck < 3)) ||
1116 (Tcb->CongestState == TCP_CONGEST_LOSS)) {
1118 if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
1120 if (Tcb->CWnd < Tcb->Ssthresh) {
1122 Tcb->CWnd += Tcb->SndMss;
1125 Tcb->CWnd += MAX (Tcb->SndMss * Tcb->SndMss / Tcb->CWnd, 1);
1128 Tcb->CWnd = MIN (Tcb->CWnd, TCP_MAX_WIN << Tcb->SndWndScale);
1131 if (Tcb->CongestState == TCP_CONGEST_LOSS) {
1132 TcpFastLossRecover (Tcb, Seg);
1136 TcpFastRecover (Tcb, Seg);
1139 if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
1141 TcpAdjustSndQue (Tcb, Seg->Ack);
1142 Tcb->SndUna = Seg->Ack;
1144 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) &&
1145 TCP_SEQ_LT (Tcb->SndUp, Seg->Ack)) {
1147 TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG);
1154 if (TCP_SEQ_LT (Tcb->SndWl1, Seg->Seq) ||
1155 ((Tcb->SndWl1 == Seg->Seq) && TCP_SEQ_LEQ (Tcb->SndWl2, Seg->Ack))) {
1159 if (TCP_SEQ_LT (Right, Tcb->SndWl2 + Tcb->SndWnd)) {
1161 if ((Tcb->SndWl1 == Seg->Seq) &&
1162 (Tcb->SndWl2 == Seg->Ack) &&
1169 " window for connected TCB %p\n", Tcb));
1171 if ((Tcb->CongestState == TCP_CONGEST_RECOVER) &&
1172 (TCP_SEQ_LT (Right, Tcb->Recover))) {
1174 Tcb->Recover = Right;
1177 if ((Tcb->CongestState == TCP_CONGEST_LOSS) &&
1178 (TCP_SEQ_LT (Right, Tcb->LossRecover))) {
1180 Tcb->LossRecover = Right;
1183 if (TCP_SEQ_LT (Right, Tcb->SndNxt)) {
1185 Tcb->SndNxt = Right;
1187 if (Right == Tcb->SndUna) {
1189 TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
1190 TcpSetProbeTimer (Tcb);
1195 Tcb->SndWnd = Seg->Wnd;
1196 Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax);
1197 Tcb->SndWl1 = Seg->Seq;
1198 Tcb->SndWl2 = Seg->Ack;
1203 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT) &&
1204 (Tcb->SndUna == Tcb->SndNxt)) {
1207 " peer for connected TCB %p\n", Tcb));
1209 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED);
1215 switch (Tcb->State) {
1218 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
1220 TcpSetState (Tcb, TCP_FIN_WAIT_2);
1222 TcpClearAllTimer (Tcb);
1223 TcpSetTimer (Tcb, TCP_TIMER_FINWAIT2, Tcb->FinWait2Timeout);
1235 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
1237 TcpSetState (Tcb, TCP_TIME_WAIT);
1239 TcpClearAllTimer (Tcb);
1241 if (Tcb->TimeWaitTimeout != 0) {
1243 TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
1247 "because app disables TIME_WAIT timer for %p\n", Tcb));
1249 TcpClose (Tcb);
1256 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
1258 TcpSetState (Tcb, TCP_CLOSED);
1265 TcpSendAck (Tcb);
1267 if (Tcb->TimeWaitTimeout != 0) {
1269 TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
1273 "because app disables TIME_WAIT timer for %p\n", Tcb));
1275 TcpClose (Tcb);
1289 Tcb->Idle = 0;
1290 TcpSetKeepaliveTimer (Tcb);
1293 !TCP_FIN_RCVD (Tcb->State))
1297 "from peer for connected TCB %p\n", Tcb));
1301 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) &&
1302 TCP_SEQ_GT (Urg, Tcb->RcvUp)) {
1304 Tcb->RcvUp = Urg;
1307 Tcb->RcvUp = Urg;
1308 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG);
1317 if (TCP_FIN_RCVD (Tcb->State)) {
1320 " data is lost for connected TCB %p\n", Tcb));
1325 if (TCP_LOCAL_CLOSED (Tcb->State) && (Nbuf->TotalSize != 0)) {
1327 " data is lost for connected TCB %p\n", Tcb));
1332 TcpQueueData (Tcb, Nbuf);
1333 if (TcpDeliverData (Tcb) == -1) {
1337 if (!IsListEmpty (&Tcb->RcvQue)) {
1338 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
1350 // Tcb is a new child of the listening Parent,
1354 Tcb->Parent = Parent;
1355 TcpInsertTcb (Tcb);
1358 if ((Tcb->State != TCP_CLOSED) &&
1359 (TcpToSendData (Tcb, 0) == 0) &&
1360 (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || (Nbuf->TotalSize != 0))) {
1362 TcpToSendAck (Tcb);
1369 TcpSendReset (Tcb, Head, Len, Dst, Src);
1372 ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
1375 TcpClose (Tcb);
1381 TcpSendReset (Tcb, Head, Len, Dst, Src);
1386 // Tcb is a child of Parent, and it doesn't survive
1391 if ((Parent != NULL) && (Tcb != NULL)) {
1393 ASSERT (Tcb->Sk != NULL);
1394 TcpClose (Tcb);
1420 TCP_CB *Tcb;
1428 Tcb = TcpLocateTcb (
1435 if (Tcb == NULL || Tcb->State == TCP_CLOSED) {
1444 if (!(TCP_SEQ_LEQ (Tcb->SndUna, Seq) && TCP_SEQ_LT (Seq, Tcb->SndNxt))) {
1458 SOCK_ERROR (Tcb->Sk, IcmpErrStatus);
1463 TcpClose (Tcb);