Home | History | Annotate | Download | only in TcpDxe

Lines Matching defs:Tcb

21   @param[in]  Tcb Pointer to the TCP_CB of this TCP instance.

30 IN TCP_CB *Tcb,
34 return (TCP_SEQ_LEQ (Tcb->RcvWl2, Seg->End) &&
35 TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd));
41 @param[in, out] Tcb Pointer to the TCP_CB of this TCP instance.
47 IN OUT TCP_CB *Tcb,
57 if (Tcb->CongestState != TCP_CONGEST_RECOVER) {
62 FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna);
64 Tcb->Ssthresh = MAX (FlightSize >> 1, (UINT32) (2 * Tcb->SndMss));
65 Tcb->Recover = Tcb->SndNxt;
67 Tcb->CongestState = TCP_CONGEST_RECOVER;
68 TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
73 TcpRetransmit (Tcb, Tcb->SndUna);
74 Tcb->CWnd = Tcb->Ssthresh + 3 * Tcb->SndMss;
78 "TcpFastRecover: enter fast retransmission for TCB %p, recover point is %d\n",
79 Tcb,
80 Tcb->Recover)
88 if (Seg->Ack == Tcb->SndUna) {
98 Tcb->CWnd += Tcb->SndMss;
101 "TcpFastRecover: received another duplicated ACK (%d) for TCB %p\n",
103 Tcb)
112 if (TCP_SEQ_GEQ (Seg->Ack, Tcb->Recover)) {
118 FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna);
120 Tcb->CWnd = MIN (Tcb->Ssthresh, FlightSize + Tcb->SndMss);
122 Tcb->CongestState = TCP_CONGEST_OPEN;
125 "TcpFastRecover: received a full ACK(%d) for TCB %p, exit fast recovery\n",
127 Tcb)
137 TcpRetransmit (Tcb, Seg->Ack);
138 Acked = TCP_SUB_SEQ (Seg->Ack, Tcb->SndUna);
145 if (Acked >= Tcb->SndMss) {
146 Acked -= Tcb->SndMss;
150 Tcb->CWnd -= Acked;
154 "TcpFastRecover: received a partial ACK(%d) for TCB %p\n",
156 Tcb)
166 @param[in, out] Tcb Pointer to the TCP_CB of this TCP instance.
172 IN OUT TCP_CB *Tcb,
176 if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
182 if (TCP_SEQ_GEQ (Seg->Ack, Tcb->LossRecover)) {
187 Tcb->LossTimes = 0;
188 Tcb->CongestState = TCP_CONGEST_OPEN;
192 "TcpFastLossRecover: received a full ACK(%d) for TCB %p\n",
194 Tcb)
203 TcpRetransmit (Tcb, Seg->Ack);
206 "TcpFastLossRecover: received a partial ACK(%d) for TCB %p\n",
208 Tcb)
217 @param[in, out] Tcb Pointer to the TCP_CB of this TCP instance.
223 IN OUT TCP_CB *Tcb,
232 if (Tcb->SRtt != 0) {
234 Var = Tcb->SRtt - (Measure << TCP_RTT_SHIFT);
240 Tcb->RttVar = (3 * Tcb->RttVar + Var) >> 2;
241 Tcb->SRtt = 7 * (Tcb->SRtt >> 3) + Measure;
247 Tcb->SRtt = Measure << TCP_RTT_SHIFT;
248 Tcb->RttVar = Measure << (TCP_RTT_SHIFT - 1);
251 Tcb->Rto = (Tcb->SRtt + MAX (8, 4 * Tcb->RttVar)) >> TCP_RTT_SHIFT;
258 if (Tcb->Rto < TCP_RTO_MIN) {
259 Tcb->Rto = TCP_RTO_MIN;
261 } else if (Tcb->Rto > TCP_RTO_MAX) {
262 Tcb->Rto = TCP_RTO_MAX;
268 "TcpComputeRtt: new RTT for TCB %p computed SRTT: %d RTTVAR: %d RTO: %d\n",
269 Tcb,
270 Tcb->SRtt,
271 Tcb->RttVar,
272 Tcb->Rto)
366 Trim off the data outside the tcb's receive window.
368 @param[in] Tcb Pointer to the TCP_CB of this TCP instance.
374 IN TCP_CB *Tcb,
378 TcpTrimSegment (Nbuf, Tcb->RcvNxt, Tcb->RcvWl2 + Tcb->RcvWnd);
385 @param[in, out] Tcb Pointer to the TCP_CB of this TCP instance.
394 IN OUT TCP_CB *Tcb
403 ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
409 if (IsListEmpty (&Tcb->RcvQue) || !TCP_CONNECTED (Tcb->State)) {
417 Entry = Tcb->RcvQue.ForwardLink;
418 Seq = Tcb->RcvNxt;
420 while (Entry != &Tcb->RcvQue) {
433 Tcb->RcvNxt = Seq;
446 if (!IsListEmpty (&Tcb->RcvQue)) {
449 "TcpDeliverData: data received after FIN from peer of TCB %p, reset connection\n",
450 Tcb)
459 "TcpDeliverData: processing FIN from peer of TCB %p\n",
460 Tcb)
463 switch (Tcb->State) {
467 TcpSetState (Tcb, TCP_CLOSE_WAIT);
472 if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
474 TcpSetState (Tcb, TCP_CLOSING);
483 TcpSetState (Tcb, TCP_TIME_WAIT);
484 TcpClearAllTimer (Tcb);
486 if (Tcb->TimeWaitTimeout != 0) {
488 TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
494 Tcb)
497 TcpSendAck (Tcb);
498 TcpClose (Tcb);
517 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
527 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
533 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) &&
534 TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvUp))
537 if (TCP_SEQ_LEQ (Seg->End, Tcb->RcvUp)) {
540 Urgent = TCP_SUB_SEQ (Tcb->RcvUp, Seg->Seq) + 1;
544 SockDataRcvd (Tcb->Sk, Nbuf, Urgent);
547 if (TCP_FIN_RCVD (Tcb->State)) {
549 SockNoMoreData (Tcb->Sk);
561 @param[in, out] Tcb Pointer to the TCP_CB of this TCP instance.
567 IN OUT TCP_CB *Tcb,
577 ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL));
582 Head = &Tcb->RcvQue;
629 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
667 @param[in] Tcb Pointer to the TCP_CB of this TCP instance.
673 IN TCP_CB *Tcb,
682 Head = &Tcb->SndQue;
732 TCP_CB *Tcb;
747 Tcb = NULL;
780 Tcb = TcpLocateTcb (
789 if ((Tcb == NULL) || (Tcb->State == TCP_CLOSED)) {
790 DEBUG ((EFI_D_INFO, "TcpInput: send reset because no TCB found\n"));
792 Tcb = NULL;
796 Seg = TcpFormatNetbuf (Tcb, Nbuf);
805 "TcpInput: reset the peer because of malformed option for TCB %p\n",
806 Tcb)
821 if (Tcb->State == TCP_LISTEN) {
828 "TcpInput: discard a reset segment for TCB %p in listening\n",
829 Tcb)
842 "TcpInput: send reset because of segment with ACK for TCB %p in listening\n",
843 Tcb)
854 // create a child TCB to handle the data
856 Parent = Tcb;
858 Tcb = TcpCloneTcb (Parent);
859 if (Tcb == NULL) {
862 "TcpInput: discard a segment because failed to clone a child for TCB %p\n",
863 Tcb)
871 "TcpInput: create a child for TCB %p in listening\n",
872 Tcb)
876 // init the TCB structure
878 IP6_COPY_ADDRESS (&Tcb->LocalEnd.Ip, Dst);
879 IP6_COPY_ADDRESS (&Tcb->RemoteEnd.Ip, Src);
880 Tcb->LocalEnd.Port = Head->DstPort;
881 Tcb->RemoteEnd.Port = Head->SrcPort;
883 TcpInitTcbLocal (Tcb);
884 TcpInitTcbPeer (Tcb, Seg, &Option);
886 TcpSetState (Tcb, TCP_SYN_RCVD);
887 TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout);
888 TcpTrimInWnd (Tcb, Nbuf);
895 } else if (Tcb->State == TCP_SYN_SENT) {
899 if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK) && (Seg->Ack != Tcb->Iss + 1)) {
903 "TcpInput: send reset because of wrong ACK received for TCB %p in SYN_SENT\n",
904 Tcb)
919 "TcpInput: connection reset by peer for TCB %p in SYN_SENT\n",
920 Tcb)
923 SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
929 "TcpInput: discard a reset segment because of no ACK for TCB %p in SYN_SENT\n",
930 Tcb)
946 TcpInitTcbPeer (Tcb, Seg, &Option);
950 Tcb->SndUna = Seg->Ack;
953 TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
955 if (TCP_SEQ_GT (Tcb->SndUna, Tcb->Iss)) {
957 TcpSetState (Tcb, TCP_ESTABLISHED);
959 TcpClearTimer (Tcb, TCP_TIMER_CONNECT);
960 TcpDeliverData (Tcb);
962 if ((Tcb->CongestState == TCP_CONGEST_OPEN) &&
963 TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON))
966 TcpComputeRtt (Tcb, Tcb->RttMeasure);
967 TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
970 TcpTrimInWnd (Tcb, Nbuf);
972 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
976 "TcpInput: connection established for TCB %p in SYN_SENT\n",
977 Tcb)
985 TcpSetState (Tcb, TCP_SYN_RCVD);
987 ASSERT (Tcb->SndNxt == Tcb->Iss + 1);
988 TcpAdjustSndQue (Tcb, Tcb->SndNxt);
990 TcpTrimInWnd (Tcb, Nbuf);
994 "TcpInput: simultaneous open for TCB %p in SYN_SENT\n",
995 Tcb)
1012 if (Tcb->ProbeTimerOn && (Seg->Wnd != 0)) {
1013 TcpClearTimer (Tcb, TCP_TIMER_PROBE);
1014 Tcb->ProbeTimerOn = FALSE;
1020 if (TcpSeqAcceptable (Tcb, Seg) == 0) {
1023 "TcpInput: sequence acceptance test failed for segment of TCB %p\n",
1024 Tcb)
1028 TcpSendAck (Tcb);
1034 if ((TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2)) &&
1035 (Tcb->RcvWl2 == Seg->End) &&
1039 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
1047 DEBUG ((EFI_D_WARN, "TcpInput: connection reset for TCB %p\n", Tcb));
1049 if (Tcb->State == TCP_SYN_RCVD) {
1051 SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_REFUSED);
1054 // This TCB comes from either a LISTEN TCB,
1055 // or active open TCB with simultanous open.
1057 // if it comes from a LISTEN TCB.
1059 } else if ((Tcb->State == TCP_ESTABLISHED) ||
1060 (Tcb->State == TCP_FIN_WAIT_1) ||
1061 (Tcb->State == TCP_FIN_WAIT_2) ||
1062 (Tcb->State == TCP_CLOSE_WAIT))
1065 SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
1076 TcpTrimInWnd (Tcb, Nbuf);
1089 "TcpInput: connection reset because received extra SYN for TCB %p\n",
1090 Tcb)
1093 SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
1102 "TcpInput: segment discard because of no ACK for connected TCB %p\n",
1103 Tcb)
1108 if (Tcb->IpInfo->IpVersion == IP_VERSION_6 && Tcb->Tick == 0) {
1109 Tcp6RefreshNeighbor (Tcb, Src, TCP6_KEEP_NEIGHBOR_TIME * TICKS_PER_SECOND);
1110 Tcb->Tick = TCP6_REFRESH_NEIGHBOR_TICK;
1114 if (Tcb->State == TCP_SYN_RCVD) {
1116 if (TCP_SEQ_LT (Tcb->SndUna, Seg->Ack) &&
1117 TCP_SEQ_LEQ (Seg->Ack, Tcb->SndNxt))
1120 Tcb->SndWnd = Seg->Wnd;
1121 Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax);
1122 Tcb->SndWl1 = Seg->Seq;
1123 Tcb->SndWl2 = Seg->Ack;
1124 TcpSetState (Tcb, TCP_ESTABLISHED);
1126 TcpClearTimer (Tcb, TCP_TIMER_CONNECT);
1127 TcpDeliverData (Tcb);
1131 "TcpInput: connection established for TCB %p in SYN_RCVD\n",
1132 Tcb)
1141 "TcpInput: send reset because of wrong ACK for TCB %p in SYN_RCVD\n",
1142 Tcb)
1149 if (TCP_SEQ_LT (Seg->Ack, Tcb->SndUna)) {
1153 "TcpInput: ignore the out-of-data ACK for connected TCB %p\n",
1154 Tcb)
1159 } else if (TCP_SEQ_GT (Seg->Ack, Tcb->SndNxt)) {
1163 "TcpInput: discard segment for future ACK for connected TCB %p\n",
1164 Tcb)
1167 TcpSendAck (Tcb);
1180 if (TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvWl2) &&
1181 TCP_SEQ_LT (Tcb->RcvWl2, Seg->End))
1184 Tcb->TsRecent = Option.TSVal;
1185 Tcb->TsRecentAge = mTcpTick;
1188 TcpComputeRtt (Tcb, TCP_SUB_TIME (mTcpTick, Option.TSEcr));
1190 } else if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
1192 ASSERT (Tcb->CongestState == TCP_CONGEST_OPEN);
1194 TcpComputeRtt (Tcb, Tcb->RttMeasure);
1195 TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
1198 if (Seg->Ack == Tcb->SndNxt) {
1200 TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
1203 TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto);
1209 if ((Seg->Ack == Tcb->SndUna) &&
1210 (Tcb->SndUna != Tcb->SndNxt) &&
1211 (Seg->Wnd == Tcb->SndWnd) &&
1215 Tcb->DupAck++;
1218 Tcb->DupAck = 0;
1224 if (((Tcb->CongestState == TCP_CONGEST_OPEN) && (Tcb->DupAck < 3)) ||
1225 (Tcb->CongestState == TCP_CONGEST_LOSS))
1228 if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
1230 if (Tcb->CWnd < Tcb->Ssthresh) {
1232 Tcb->CWnd += Tcb->SndMss;
1235 Tcb->CWnd += MAX (Tcb->SndMss * Tcb->SndMss / Tcb->CWnd, 1);
1238 Tcb->CWnd = MIN (Tcb->CWnd, TCP_MAX_WIN << Tcb->SndWndScale);
1241 if (Tcb->CongestState == TCP_CONGEST_LOSS) {
1242 TcpFastLossRecover (Tcb, Seg);
1246 TcpFastRecover (Tcb, Seg);
1249 if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
1251 TcpAdjustSndQue (Tcb, Seg->Ack);
1252 Tcb->SndUna = Seg->Ack;
1254 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) &&
1255 TCP_SEQ_LT (Tcb->SndUp, Seg->Ack))
1258 TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG);
1265 if (TCP_SEQ_LT (Tcb->SndWl1, Seg->Seq) ||
1266 ((Tcb->SndWl1 == Seg->Seq) && TCP_SEQ_LEQ (Tcb->SndWl2, Seg->Ack)))
1271 if (TCP_SEQ_LT (Right, Tcb->SndWl2 + Tcb->SndWnd)) {
1273 if ((Tcb->SndWl1 == Seg->Seq) &&
1274 (Tcb->SndWl2 == Seg->Ack) &&
1283 "TcpInput: peer shrinks the window for connected TCB %p\n",
1284 Tcb)
1287 if ((Tcb->CongestState == TCP_CONGEST_RECOVER) &&
1288 (TCP_SEQ_LT (Right, Tcb->Recover)))
1291 Tcb->Recover = Right;
1294 if ((Tcb->CongestState == TCP_CONGEST_LOSS) &&
1295 (TCP_SEQ_LT (Right, Tcb->LossRecover)))
1298 Tcb->LossRecover = Right;
1301 if (TCP_SEQ_LT (Right, Tcb->SndNxt)) {
1303 Tcb->SndNxt = Right;
1305 if (Right == Tcb->SndUna) {
1307 TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
1308 TcpSetProbeTimer (Tcb);
1313 Tcb->SndWnd = Seg->Wnd;
1314 Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax);
1315 Tcb->SndWl1 = Seg->Seq;
1316 Tcb->SndWl2 = Seg->Ack;
1321 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT) &&
1322 (Tcb->SndUna == Tcb->SndNxt))
1327 "TcpInput: local FIN is ACKed by peer for connected TCB %p\n",
1328 Tcb)
1331 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED);
1337 switch (Tcb->State) {
1340 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
1342 TcpSetState (Tcb, TCP_FIN_WAIT_2);
1344 TcpClearAllTimer (Tcb);
1345 TcpSetTimer (Tcb, TCP_TIMER_FINWAIT2, Tcb->FinWait2Timeout);
1357 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
1359 TcpSetState (Tcb, TCP_TIME_WAIT);
1361 TcpClearAllTimer (Tcb);
1363 if (Tcb->TimeWaitTimeout != 0) {
1365 TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
1371 Tcb)
1374 TcpClose (Tcb);
1381 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
1383 TcpSetState (Tcb, TCP_CLOSED);
1390 TcpSendAck (Tcb);
1392 if (Tcb->TimeWaitTimeout != 0) {
1394 TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
1400 Tcb)
1403 TcpClose (Tcb);
1416 Tcb->Idle = 0;
1417 TcpSetKeepaliveTimer (Tcb);
1419 if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG) && !TCP_FIN_RCVD (Tcb->State)) {
1423 "TcpInput: received urgent data from peer for connected TCB %p\n",
1424 Tcb)
1429 if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) &&
1430 TCP_SEQ_GT (Urg, Tcb->RcvUp))
1433 Tcb->RcvUp = Urg;
1436 Tcb->RcvUp = Urg;
1437 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG);
1445 if (TCP_FIN_RCVD (Tcb->State)) {
1449 "TcpInput: connection reset because data is lost for connected TCB %p\n",
1450 Tcb)
1456 if (TCP_LOCAL_CLOSED (Tcb->State) && (Nbuf->TotalSize != 0)) {
1459 "TcpInput: connection reset because data is lost for connected TCB %p\n",
1460 Tcb)
1466 TcpQueueData (Tcb, Nbuf);
1467 if (TcpDeliverData (Tcb) == -1) {
1471 if (!IsListEmpty (&Tcb->RcvQue)) {
1472 TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
1484 // Tcb is a new child of the listening Parent,
1488 Tcb->Parent = Parent;
1489 TcpInsertTcb (Tcb);
1492 if ((Tcb->State != TCP_CLOSED) &&
1493 (TcpToSendData (Tcb, 0) == 0) &&
1494 (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || (Nbuf->TotalSize != 0)))
1497 TcpToSendAck (Tcb);
1504 TcpSendReset (Tcb, Head, Len, Dst, Src, Version);
1507 ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
1510 TcpClose (Tcb);
1516 TcpSendReset (Tcb, Head, Len, Dst, Src, Version);
1521 // Tcb is a child of Parent, and it doesn't survive
1526 if ((Parent != NULL) && (Tcb != NULL)) {
1528 ASSERT (Tcb->Sk != NULL);
1529 TcpClose (Tcb);
1557 TCP_CB *Tcb;
1566 Tcb = TcpLocateTcb (
1574 if (Tcb == NULL || Tcb->State == TCP_CLOSED) {
1583 if (!(TCP_SEQ_LEQ (Tcb->SndUna, Seq) && TCP_SEQ_LT (Seq, Tcb->SndNxt))) {
1590 Tcb->Sk->IpVersion,
1597 SOCK_ERROR (Tcb->Sk, IcmpErrStatus);
1602 TcpClose (Tcb);