Lines Matching refs:cur_stream
23 Handle_TCP_ST_ESTABLISHED (mtcp_manager_t mtcp, tcp_stream* cur_stream,
62 HandleActiveOpen(mtcp_manager_t mtcp, tcp_stream *cur_stream, in HandleActiveOpen() argument
67 cur_stream->rcvvar->irs = pctx->p.seq; in HandleActiveOpen()
68 cur_stream->snd_nxt = pctx->p.ack_seq; in HandleActiveOpen()
69 cur_stream->sndvar->peer_wnd = pctx->p.window; in HandleActiveOpen()
70 cur_stream->rcvvar->snd_wl1 = cur_stream->rcvvar->irs - 1; in HandleActiveOpen()
71 cur_stream->rcv_nxt = cur_stream->rcvvar->irs + 1; in HandleActiveOpen()
72 cur_stream->rcvvar->last_ack_seq = pctx->p.ack_seq; in HandleActiveOpen()
73 ParseTCPOptions(cur_stream, pctx->p.cur_ts, (uint8_t *)tcph + TCP_HEADER_LEN, in HandleActiveOpen()
75 cur_stream->sndvar->cwnd = ((cur_stream->sndvar->cwnd == 1)? in HandleActiveOpen()
76 (cur_stream->sndvar->mss * 2): cur_stream->sndvar->mss); in HandleActiveOpen()
77 cur_stream->sndvar->ssthresh = cur_stream->sndvar->mss * 10; in HandleActiveOpen()
78 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in HandleActiveOpen()
79 UpdateRetransmissionTimer(mtcp, cur_stream, pctx->p.cur_ts); in HandleActiveOpen()
88 ValidateSequence(mtcp_manager_t mtcp, tcp_stream *cur_stream, in ValidateSequence() argument
94 if (!tcph->rst && cur_stream->saw_timestamp) { in ValidateSequence()
97 if (!ParseTCPTimestamp(cur_stream, &ts, in ValidateSequence()
107 if (TCP_SEQ_LT(ts.ts_val, cur_stream->rcvvar->ts_recent)) { in ValidateSequence()
112 pctx->p.seq, ts.ts_val, cur_stream->rcvvar->ts_recent); in ValidateSequence()
113 cur_stream->actions |= MOS_ACT_SEND_ACK_NOW; in ValidateSequence()
117 if (TCP_SEQ_GT(ts.ts_val, cur_stream->rcvvar->ts_recent)) { in ValidateSequence()
120 ts.ts_val, cur_stream->rcvvar->ts_recent, in ValidateSequence()
121 TS_TO_USEC(pctx->p.cur_ts - cur_stream->rcvvar->ts_last_ts_upd)); in ValidateSequence()
122 cur_stream->rcvvar->ts_last_ts_upd = pctx->p.cur_ts; in ValidateSequence()
125 cur_stream->rcvvar->ts_recent = ts.ts_val; in ValidateSequence()
126 cur_stream->rcvvar->ts_lastack_rcvd = ts.ts_ref; in ValidateSequence()
131 if (!TCP_SEQ_BETWEEN(pctx->p.seq + pctx->p.payloadlen, cur_stream->rcv_nxt, in ValidateSequence()
132 cur_stream->rcv_nxt + cur_stream->rcvvar->rcv_wnd)) { in ValidateSequence()
138 if (cur_stream->state == TCP_ST_ESTABLISHED) { in ValidateSequence()
140 if (pctx->p.seq + 1 == cur_stream->rcv_nxt) { in ValidateSequence()
142 pctx->p.seq, cur_stream->rcvvar->rcv_wnd); in ValidateSequence()
143 cur_stream->actions |= MOS_ACT_SEND_ACK_AGG; in ValidateSequence()
148 if (TCP_SEQ_LEQ(pctx->p.seq, cur_stream->rcv_nxt)) { in ValidateSequence()
149 cur_stream->actions |= MOS_ACT_SEND_ACK_AGG; in ValidateSequence()
151 cur_stream->actions |= MOS_ACT_SEND_ACK_NOW; in ValidateSequence()
154 if (cur_stream->state == TCP_ST_TIME_WAIT) { in ValidateSequence()
156 cur_stream->id, cur_stream->rcvvar->ts_tw_expire); in ValidateSequence()
157 AddtoTimewaitList(mtcp, cur_stream, pctx->p.cur_ts); in ValidateSequence()
159 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in ValidateSequence()
168 NotifyConnectionReset(mtcp_manager_t mtcp, tcp_stream *cur_stream) in NotifyConnectionReset() argument
170 TRACE_DBG("Stream %d: Notifying connection reset.\n", cur_stream->id); in NotifyConnectionReset()
176 ProcessRST(mtcp_manager_t mtcp, tcp_stream *cur_stream, in ProcessRST() argument
184 cur_stream->id, TCPStateToString(cur_stream)); in ProcessRST()
186 DumpStream(mtcp, cur_stream); in ProcessRST()
189 if (cur_stream->state <= TCP_ST_SYN_SENT) { in ProcessRST()
194 if (cur_stream->state == TCP_ST_SYN_RCVD) { in ProcessRST()
198 pctx->p.seq == cur_stream->rcv_nxt + 1 || in ProcessRST()
200 pctx->p.ack_seq == cur_stream->snd_nxt) in ProcessRST()
202 cur_stream->state = TCP_ST_CLOSED_RSVD; in ProcessRST()
203 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE; in ProcessRST()
204 cur_stream->close_reason = TCP_RESET; in ProcessRST()
205 cur_stream->actions |= MOS_ACT_DESTROY; in ProcessRST()
207 RAISE_DEBUG_EVENT(mtcp, cur_stream, in ProcessRST()
210 cur_stream->rcv_nxt + 1, pctx->p.ack_seq); in ProcessRST()
217 if (cur_stream->state == TCP_ST_FIN_WAIT_1 || in ProcessRST()
218 cur_stream->state == TCP_ST_FIN_WAIT_2 || in ProcessRST()
219 cur_stream->state == TCP_ST_LAST_ACK || in ProcessRST()
220 cur_stream->state == TCP_ST_CLOSING || in ProcessRST()
221 cur_stream->state == TCP_ST_TIME_WAIT) { in ProcessRST()
222 cur_stream->state = TCP_ST_CLOSED_RSVD; in ProcessRST()
223 cur_stream->close_reason = TCP_ACTIVE_CLOSE; in ProcessRST()
224 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE; in ProcessRST()
225 cur_stream->actions |= MOS_ACT_DESTROY; in ProcessRST()
229 if (cur_stream->state >= TCP_ST_ESTABLISHED && in ProcessRST()
230 cur_stream->state <= TCP_ST_CLOSE_WAIT) { in ProcessRST()
236 if (!(cur_stream->sndvar->on_closeq || cur_stream->sndvar->on_closeq_int || in ProcessRST()
237 cur_stream->sndvar->on_resetq || cur_stream->sndvar->on_resetq_int)) { in ProcessRST()
240 cur_stream->state = TCP_ST_CLOSED_RSVD; in ProcessRST()
241 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE; in ProcessRST()
242 cur_stream->close_reason = TCP_RESET; in ProcessRST()
243 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in ProcessRST()
244 RaiseCloseEvent(mtcp, cur_stream); in ProcessRST()
251 EstimateRTT(mtcp_manager_t mtcp, tcp_stream *cur_stream, uint32_t mrtt) in EstimateRTT() argument
258 struct tcp_recv_vars *rcvvar = cur_stream->rcvvar; in EstimateRTT()
283 if (TCP_SEQ_GT(cur_stream->sndvar->snd_una, rcvvar->rtt_seq)) { in EstimateRTT()
287 rcvvar->rtt_seq = cur_stream->snd_nxt; in EstimateRTT()
295 rcvvar->rtt_seq = cur_stream->snd_nxt; in EstimateRTT()
305 ProcessACK(mtcp_manager_t mtcp, tcp_stream *cur_stream, in ProcessACK() argument
311 struct tcp_send_vars *sndvar = cur_stream->sndvar; in ProcessACK()
322 right_wnd_edge = sndvar->peer_wnd + cur_stream->rcvvar->snd_wl2; in ProcessACK()
324 if (cur_stream->state == TCP_ST_FIN_WAIT_1 || in ProcessACK()
325 cur_stream->state == TCP_ST_FIN_WAIT_2 || in ProcessACK()
326 cur_stream->state == TCP_ST_CLOSING || in ProcessACK()
327 cur_stream->state == TCP_ST_CLOSE_WAIT || in ProcessACK()
328 cur_stream->state == TCP_ST_LAST_ACK) { in ProcessACK()
337 "ack_seq: %u, possible max_ack_seq: %u\n", cur_stream->id, in ProcessACK()
338 TCPStateToString(cur_stream), ack_seq, in ProcessACK()
344 if (TCP_SEQ_GT(seq + pctx->p.payloadlen, cur_stream->rcv_nxt)) in ProcessACK()
345 cur_stream->rcv_nxt = seq + pctx->p.payloadlen; in ProcessACK()
349 if (TCP_SEQ_LT(cur_stream->rcvvar->snd_wl1, seq) || in ProcessACK()
350 (cur_stream->rcvvar->snd_wl1 == seq && in ProcessACK()
351 TCP_SEQ_LT(cur_stream->rcvvar->snd_wl2, ack_seq)) || in ProcessACK()
352 (cur_stream->rcvvar->snd_wl2 == ack_seq && in ProcessACK()
356 cur_stream->rcvvar->snd_wl1 = seq; in ProcessACK()
357 cur_stream->rcvvar->snd_wl2 = ack_seq; in ProcessACK()
360 ack_seq, cwindow, cur_stream->snd_nxt - sndvar->snd_una); in ProcessACK()
361 if (cwindow_prev < cur_stream->snd_nxt - sndvar->snd_una && in ProcessACK()
362 sndvar->peer_wnd >= cur_stream->snd_nxt - sndvar->snd_una) { in ProcessACK()
366 cur_stream->id, ack_seq, sndvar->peer_wnd, cwindow_prev, in ProcessACK()
367 cur_stream->snd_nxt - sndvar->snd_una); in ProcessACK()
368 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in ProcessACK()
369 RaiseWriteEvent(mtcp, cur_stream); in ProcessACK()
383 if (TCP_SEQ_LT(ack_seq, cur_stream->snd_nxt)) { in ProcessACK()
384 if (ack_seq == cur_stream->rcvvar->last_ack_seq && pctx->p.payloadlen == 0) { in ProcessACK()
385 if (cur_stream->rcvvar->snd_wl2 + sndvar->peer_wnd == right_wnd_edge) { in ProcessACK()
386 if (cur_stream->rcvvar->dup_acks + 1 > cur_stream->rcvvar->dup_acks) { in ProcessACK()
387 cur_stream->rcvvar->dup_acks++; in ProcessACK()
394 cur_stream->rcvvar->dup_acks = 0; in ProcessACK()
395 cur_stream->rcvvar->last_ack_seq = ack_seq; in ProcessACK()
399 if (dup && cur_stream->rcvvar->dup_acks == 3) { in ProcessACK()
401 if (TCP_SEQ_LT(ack_seq, cur_stream->snd_nxt)) { in ProcessACK()
403 cur_stream->snd_nxt, ack_seq); in ProcessACK()
406 sndvar->rstat.tdp_ack_bytes += (cur_stream->snd_nxt - ack_seq); in ProcessACK()
413 cur_stream->snd_nxt = ack_seq; in ProcessACK()
433 cur_stream->actions |= MOS_ACT_SEND_DATA; in ProcessACK()
435 } else if (cur_stream->rcvvar->dup_acks > 3) { in ProcessACK()
445 ParseSACKOption(cur_stream, ack_seq, (uint8_t *)tcph + TCP_HEADER_LEN, in ProcessACK()
451 if (TCP_SEQ_GT(ack_seq, cur_stream->snd_nxt)) { in ProcessACK()
454 sndvar->rstat.ack_upd_bytes += (ack_seq - cur_stream->snd_nxt); in ProcessACK()
457 cur_stream->snd_nxt, ack_seq); in ProcessACK()
458 cur_stream->snd_nxt = ack_seq; in ProcessACK()
460 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in ProcessACK()
461 RemoveFromSendList(mtcp, cur_stream); in ProcessACK()
484 if (cur_stream->saw_timestamp) { in ProcessACK()
485 EstimateRTT(mtcp, cur_stream, in ProcessACK()
486 pctx->p.cur_ts - cur_stream->rcvvar->ts_lastack_rcvd); in ProcessACK()
487 sndvar->rto = (cur_stream->rcvvar->srtt >> 3) + cur_stream->rcvvar->rttvar; in ProcessACK()
495 if (cur_stream->state >= TCP_ST_ESTABLISHED) { in ProcessACK()
519 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in ProcessACK()
530 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in ProcessACK()
531 RaiseWriteEvent(mtcp, cur_stream); in ProcessACK()
537 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in ProcessACK()
538 UpdateRetransmissionTimer(mtcp, cur_stream, pctx->p.cur_ts); in ProcessACK()
547 ProcessTCPPayload(mtcp_manager_t mtcp, tcp_stream *cur_stream, in ProcessTCPPayload() argument
550 struct tcp_recv_vars *rcvvar = cur_stream->rcvvar; in ProcessTCPPayload()
556 if (!cur_stream->buffer_mgmt) in ProcessTCPPayload()
560 if (TCP_SEQ_LT(pctx->p.seq + pctx->p.payloadlen, cur_stream->rcv_nxt)) in ProcessTCPPayload()
570 if (TCP_SEQ_GT(pctx->p.seq + pctx->p.payloadlen, cur_stream->rcv_nxt + rcvvar->rcv_wnd)) { in ProcessTCPPayload()
572 if (cur_stream->side == MOS_SIDE_CLI) { in ProcessTCPPayload()
573 SOCKQ_FOREACH_REVERSE(walk, &cur_stream->msocks) { in ProcessTCPPayload()
574 HandleCallback(mtcp, MOS_NULL, walk, cur_stream->side, in ProcessTCPPayload()
578 SOCKQ_FOREACH_START(walk, &cur_stream->msocks) { in ProcessTCPPayload()
579 HandleCallback(mtcp, MOS_NULL, walk, cur_stream->side, in ProcessTCPPayload()
588 rcvvar->rcvbuf = tcprb_new(mtcp->bufseg_pool, g_config.mos->rmem_size, cur_stream->buffer_mgmt); in ProcessTCPPayload()
591 cur_stream->id); in ProcessTCPPayload()
592 cur_stream->state = TCP_ST_CLOSED_RSVD; in ProcessTCPPayload()
593 cur_stream->close_reason = TCP_NO_MEM; in ProcessTCPPayload()
594 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE; in ProcessTCPPayload()
595 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in ProcessTCPPayload()
596 RaiseErrorEvent(mtcp, cur_stream); in ProcessTCPPayload()
602 read_lock = HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM); in ProcessTCPPayload()
610 prev_rcv_nxt = cur_stream->rcv_nxt; in ProcessTCPPayload()
615 if (!HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM) && in ProcessTCPPayload()
616 HAS_STREAM_TYPE(cur_stream, MOS_SOCK_MONITOR_STREAM_ACTIVE)) in ProcessTCPPayload()
624 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_MONITOR_STREAM_ACTIVE)) { in ProcessTCPPayload()
630 if (cur_stream->side == MOS_SIDE_CLI) { in ProcessTCPPayload()
631 SOCKQ_FOREACH_REVERSE(walk, &cur_stream->msocks) { in ProcessTCPPayload()
632 if (walk->monitor_stream->peek_offset[cur_stream->side] in ProcessTCPPayload()
634 HandleCallback(mtcp, MOS_NULL, walk, cur_stream->side, in ProcessTCPPayload()
638 SOCKQ_FOREACH_START(walk, &cur_stream->msocks) { in ProcessTCPPayload()
639 if (walk->monitor_stream->peek_offset[cur_stream->side] in ProcessTCPPayload()
641 HandleCallback(mtcp, MOS_NULL, walk, cur_stream->side, in ProcessTCPPayload()
657 if (ret < 0 && cur_stream->buffer_mgmt && mtcp->num_msp == 0) in ProcessTCPPayload()
663 if (cur_stream->state == TCP_ST_FIN_WAIT_1 || in ProcessTCPPayload()
664 cur_stream->state == TCP_ST_FIN_WAIT_2) { in ProcessTCPPayload()
668 if (cftail > 0 && (rcvvar->irs + 1) + cftail > cur_stream->rcv_nxt) { in ProcessTCPPayload()
669 RAISE_DEBUG_EVENT(mtcp, cur_stream, in ProcessTCPPayload()
671 cur_stream->rcv_nxt, (rcvvar->irs + 1) + cftail); in ProcessTCPPayload()
672 cur_stream->rcv_nxt = (rcvvar->irs + 1) + cftail; in ProcessTCPPayload()
681 if (TCP_SEQ_LEQ(cur_stream->rcv_nxt, prev_rcv_nxt)) { in ProcessTCPPayload()
688 cur_stream->id, pctx->p.payloadlen, in ProcessTCPPayload()
689 cur_stream->socket? (unsigned long long)cur_stream->socket->epoll & MOS_EPOLLET : 0, in ProcessTCPPayload()
690 cur_stream->socket? (unsigned long long)cur_stream->socket->epoll & MOS_EPOLLIN : 0, in ProcessTCPPayload()
691 cur_stream->socket? (unsigned long long)cur_stream->socket->epoll & MOS_EPOLLOUT : 0); in ProcessTCPPayload()
693 if (cur_stream->state == TCP_ST_ESTABLISHED) in ProcessTCPPayload()
694 RaiseReadEvent(mtcp, cur_stream); in ProcessTCPPayload()
700 Handle_TCP_ST_LISTEN (mtcp_manager_t mtcp, tcp_stream* cur_stream, in Handle_TCP_ST_LISTEN() argument
707 if (cur_stream->state == TCP_ST_LISTEN) in Handle_TCP_ST_LISTEN()
708 cur_stream->rcv_nxt++; in Handle_TCP_ST_LISTEN()
709 cur_stream->state = TCP_ST_SYN_RCVD; in Handle_TCP_ST_LISTEN()
710 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE | MOS_ON_CONN_START; in Handle_TCP_ST_LISTEN()
711 TRACE_STATE("Stream %d: TCP_ST_SYN_RCVD\n", cur_stream->id); in Handle_TCP_ST_LISTEN()
712 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in Handle_TCP_ST_LISTEN()
713 if (IS_STREAM_TYPE(cur_stream, MOS_SOCK_MONITOR_STREAM_ACTIVE)) { in Handle_TCP_ST_LISTEN()
719 cur_stream->rcvvar->irs = in Handle_TCP_ST_LISTEN()
720 cur_stream->rcv_nxt = pctx->p.seq; in Handle_TCP_ST_LISTEN()
724 "Packet without SYN.\n", cur_stream->id); in Handle_TCP_ST_LISTEN()
730 Handle_TCP_ST_SYN_SENT (mtcp_manager_t mtcp, tcp_stream* cur_stream, in Handle_TCP_ST_SYN_SENT() argument
738 if (TCP_SEQ_LEQ(pctx->p.ack_seq, cur_stream->sndvar->iss) in Handle_TCP_ST_SYN_SENT()
740 || TCP_SEQ_GT(pctx->p.ack_seq, cur_stream->snd_nxt) in Handle_TCP_ST_SYN_SENT()
744 cur_stream->actions |= MOS_ACT_SEND_RST; in Handle_TCP_ST_SYN_SENT()
749 cur_stream->sndvar->snd_una++; in Handle_TCP_ST_SYN_SENT()
754 cur_stream->state = TCP_ST_CLOSED_RSVD; in Handle_TCP_ST_SYN_SENT()
755 cur_stream->close_reason = TCP_RESET; in Handle_TCP_ST_SYN_SENT()
756 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE; in Handle_TCP_ST_SYN_SENT()
757 if (cur_stream->socket) { in Handle_TCP_ST_SYN_SENT()
758 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in Handle_TCP_ST_SYN_SENT()
759 RaiseErrorEvent(mtcp, cur_stream); in Handle_TCP_ST_SYN_SENT()
761 cur_stream->actions |= MOS_ACT_DESTROY; in Handle_TCP_ST_SYN_SENT()
773 int ret = HandleActiveOpen(mtcp, cur_stream, pctx); in Handle_TCP_ST_SYN_SENT()
780 RAISE_DEBUG_EVENT(mtcp, cur_stream, in Handle_TCP_ST_SYN_SENT()
783 cur_stream->rcv_nxt = pctx->p.seq; in Handle_TCP_ST_SYN_SENT()
787 cur_stream->sndvar->nrtx = 0; in Handle_TCP_ST_SYN_SENT()
788 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in Handle_TCP_ST_SYN_SENT()
789 RemoveFromRTOList(mtcp, cur_stream); in Handle_TCP_ST_SYN_SENT()
790 cur_stream->state = TCP_ST_ESTABLISHED; in Handle_TCP_ST_SYN_SENT()
791 cur_stream->cb_events |= /*MOS_ON_CONN_SETUP |*/ MOS_ON_TCP_STATE_CHANGE; in Handle_TCP_ST_SYN_SENT()
792 TRACE_STATE("Stream %d: TCP_ST_ESTABLISHED\n", cur_stream->id); in Handle_TCP_ST_SYN_SENT()
794 if (cur_stream->socket) { in Handle_TCP_ST_SYN_SENT()
795 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in Handle_TCP_ST_SYN_SENT()
796 RaiseWriteEvent(mtcp, cur_stream); in Handle_TCP_ST_SYN_SENT()
798 TRACE_STATE("Stream %d: ESTABLISHED, but no socket\n", cur_stream->id); in Handle_TCP_ST_SYN_SENT()
799 cur_stream->close_reason = TCP_ACTIVE_CLOSE; in Handle_TCP_ST_SYN_SENT()
800 cur_stream->actions |= MOS_ACT_SEND_RST; in Handle_TCP_ST_SYN_SENT()
801 cur_stream->actions |= MOS_ACT_DESTROY; in Handle_TCP_ST_SYN_SENT()
803 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in Handle_TCP_ST_SYN_SENT()
805 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in Handle_TCP_ST_SYN_SENT()
806 AddtoTimeoutList(mtcp, cur_stream); in Handle_TCP_ST_SYN_SENT()
811 Handle_TCP_ST_ESTABLISHED(mtcp, cur_stream, pctx); in Handle_TCP_ST_SYN_SENT()
815 cur_stream->state = TCP_ST_SYN_RCVD; in Handle_TCP_ST_SYN_SENT()
816 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE; in Handle_TCP_ST_SYN_SENT()
817 TRACE_STATE("Stream %d: TCP_ST_SYN_RCVD\n", cur_stream->id); in Handle_TCP_ST_SYN_SENT()
818 cur_stream->snd_nxt = cur_stream->sndvar->iss; in Handle_TCP_ST_SYN_SENT()
819 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in Handle_TCP_ST_SYN_SENT()
824 Handle_TCP_ST_SYN_RCVD (mtcp_manager_t mtcp, tcp_stream* cur_stream, in Handle_TCP_ST_SYN_RCVD() argument
828 struct tcp_send_vars *sndvar = cur_stream->sndvar; in Handle_TCP_ST_SYN_RCVD()
837 cur_stream->snd_nxt = pctx->p.ack_seq; in Handle_TCP_ST_SYN_RCVD()
844 cur_stream->rcv_nxt = cur_stream->rcvvar->irs + 1; in Handle_TCP_ST_SYN_RCVD()
845 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in Handle_TCP_ST_SYN_RCVD()
846 RemoveFromRTOList(mtcp, cur_stream); in Handle_TCP_ST_SYN_RCVD()
848 cur_stream->state = TCP_ST_ESTABLISHED; in Handle_TCP_ST_SYN_RCVD()
849 cur_stream->cb_events |= /*MOS_ON_CONN_SETUP |*/ MOS_ON_TCP_STATE_CHANGE; in Handle_TCP_ST_SYN_RCVD()
850 TRACE_STATE("Stream %d: TCP_ST_ESTABLISHED\n", cur_stream->id); in Handle_TCP_ST_SYN_RCVD()
854 Handle_TCP_ST_ESTABLISHED(mtcp, cur_stream, pctx); in Handle_TCP_ST_SYN_RCVD()
858 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) { in Handle_TCP_ST_SYN_RCVD()
862 ret = StreamEnqueue(listener->acceptq, cur_stream); in Handle_TCP_ST_SYN_RCVD()
865 "the listen backlog!\n", cur_stream->id); in Handle_TCP_ST_SYN_RCVD()
866 cur_stream->close_reason = TCP_NOT_ACCEPTED; in Handle_TCP_ST_SYN_RCVD()
867 cur_stream->state = TCP_ST_CLOSED_RSVD; in Handle_TCP_ST_SYN_RCVD()
868 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE; in Handle_TCP_ST_SYN_RCVD()
869 TRACE_STATE("Stream %d: TCP_ST_CLOSED_RSVD\n", cur_stream->id); in Handle_TCP_ST_SYN_RCVD()
870 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in Handle_TCP_ST_SYN_RCVD()
882 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in Handle_TCP_ST_SYN_RCVD()
883 AddtoTimeoutList(mtcp, cur_stream); in Handle_TCP_ST_SYN_RCVD()
887 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_MONITOR_STREAM_ACTIVE) && in Handle_TCP_ST_SYN_RCVD()
889 if (pctx->p.seq == cur_stream->pair_stream->sndvar->iss) { in Handle_TCP_ST_SYN_RCVD()
891 pctx->p.seq, cur_stream->pair_stream->sndvar->iss); in Handle_TCP_ST_SYN_RCVD()
892 cur_stream->cb_events |= MOS_ON_REXMIT; in Handle_TCP_ST_SYN_RCVD()
897 cur_stream->id); in Handle_TCP_ST_SYN_RCVD()
899 cur_stream->snd_nxt = sndvar->iss; in Handle_TCP_ST_SYN_RCVD()
900 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in Handle_TCP_ST_SYN_RCVD()
905 Handle_TCP_ST_ESTABLISHED (mtcp_manager_t mtcp, tcp_stream* cur_stream, in Handle_TCP_ST_ESTABLISHED() argument
912 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_MONITOR_STREAM_ACTIVE) && in Handle_TCP_ST_ESTABLISHED()
914 if (pctx->p.seq == cur_stream->pair_stream->sndvar->iss) { in Handle_TCP_ST_ESTABLISHED()
916 pctx->p.seq, cur_stream->pair_stream->sndvar->iss); in Handle_TCP_ST_ESTABLISHED()
917 cur_stream->cb_events |= MOS_ON_REXMIT; in Handle_TCP_ST_ESTABLISHED()
923 cur_stream->id, pctx->p.seq, cur_stream->rcv_nxt, in Handle_TCP_ST_ESTABLISHED()
924 pctx->p.ack_seq, cur_stream->snd_nxt); in Handle_TCP_ST_ESTABLISHED()
925 cur_stream->snd_nxt = pctx->p.ack_seq; in Handle_TCP_ST_ESTABLISHED()
926 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in Handle_TCP_ST_ESTABLISHED()
931 if (ProcessTCPPayload(mtcp, cur_stream, pctx)) { in Handle_TCP_ST_ESTABLISHED()
933 cur_stream->actions |= MOS_ACT_SEND_ACK_AGG; in Handle_TCP_ST_ESTABLISHED()
935 cur_stream->actions |= MOS_ACT_SEND_ACK_NOW; in Handle_TCP_ST_ESTABLISHED()
940 if (cur_stream->sndvar->sndbuf) { in Handle_TCP_ST_ESTABLISHED()
941 ProcessACK(mtcp, cur_stream, pctx); in Handle_TCP_ST_ESTABLISHED()
948 if (!cur_stream->buffer_mgmt || in Handle_TCP_ST_ESTABLISHED()
950 TCP_SEQ_GEQ(pctx->p.seq + pctx->p.payloadlen, cur_stream->rcv_nxt) in Handle_TCP_ST_ESTABLISHED()
952 pctx->p.seq + pctx->p.payloadlen == cur_stream->rcv_nxt in Handle_TCP_ST_ESTABLISHED()
956 cur_stream->rcv_nxt = pctx->p.seq + pctx->p.payloadlen; in Handle_TCP_ST_ESTABLISHED()
958 cur_stream->state = TCP_ST_CLOSE_WAIT; in Handle_TCP_ST_ESTABLISHED()
959 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE; in Handle_TCP_ST_ESTABLISHED()
960 TRACE_STATE("Stream %d: TCP_ST_CLOSE_WAIT\n", cur_stream->id); in Handle_TCP_ST_ESTABLISHED()
961 cur_stream->rcv_nxt++; in Handle_TCP_ST_ESTABLISHED()
962 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in Handle_TCP_ST_ESTABLISHED()
965 RaiseReadEvent(mtcp, cur_stream); in Handle_TCP_ST_ESTABLISHED()
967 RAISE_DEBUG_EVENT(mtcp, cur_stream, in Handle_TCP_ST_ESTABLISHED()
969 cur_stream->rcv_nxt, pctx->p.seq + pctx->p.payloadlen, in Handle_TCP_ST_ESTABLISHED()
972 cur_stream->actions |= MOS_ACT_SEND_ACK_NOW; in Handle_TCP_ST_ESTABLISHED()
979 Handle_TCP_ST_CLOSE_WAIT (mtcp_manager_t mtcp, tcp_stream* cur_stream, in Handle_TCP_ST_CLOSE_WAIT() argument
982 if (TCP_SEQ_LT(pctx->p.seq, cur_stream->rcv_nxt)) { in Handle_TCP_ST_CLOSE_WAIT()
985 cur_stream->id, pctx->p.seq, cur_stream->rcv_nxt); in Handle_TCP_ST_CLOSE_WAIT()
986 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in Handle_TCP_ST_CLOSE_WAIT()
990 if (cur_stream->sndvar->sndbuf) { in Handle_TCP_ST_CLOSE_WAIT()
991 ProcessACK(mtcp, cur_stream, pctx); in Handle_TCP_ST_CLOSE_WAIT()
996 Handle_TCP_ST_LAST_ACK (mtcp_manager_t mtcp, tcp_stream* cur_stream, in Handle_TCP_ST_LAST_ACK() argument
1001 if (TCP_SEQ_LT(pctx->p.seq, cur_stream->rcv_nxt)) { in Handle_TCP_ST_LAST_ACK()
1004 cur_stream->id, pctx->p.seq, cur_stream->rcv_nxt); in Handle_TCP_ST_LAST_ACK()
1009 if (cur_stream->sndvar->sndbuf) { in Handle_TCP_ST_LAST_ACK()
1010 ProcessACK(mtcp, cur_stream, pctx); in Handle_TCP_ST_LAST_ACK()
1013 if (!cur_stream->sndvar->is_fin_sent) { in Handle_TCP_ST_LAST_ACK()
1017 "No FIN sent yet.\n", cur_stream->id); in Handle_TCP_ST_LAST_ACK()
1022 DumpStream(mtcp, cur_stream); in Handle_TCP_ST_LAST_ACK()
1029 if (pctx->p.ack_seq == cur_stream->sndvar->fss + 1) { in Handle_TCP_ST_LAST_ACK()
1030 cur_stream->sndvar->snd_una++; in Handle_TCP_ST_LAST_ACK()
1031 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM)) in Handle_TCP_ST_LAST_ACK()
1032 UpdateRetransmissionTimer(mtcp, cur_stream, pctx->p.cur_ts); in Handle_TCP_ST_LAST_ACK()
1033 cur_stream->state = TCP_ST_CLOSED_RSVD; in Handle_TCP_ST_LAST_ACK()
1034 cur_stream->close_reason = TCP_PASSIVE_CLOSE; in Handle_TCP_ST_LAST_ACK()
1035 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE; in Handle_TCP_ST_LAST_ACK()
1037 cur_stream->id); in Handle_TCP_ST_LAST_ACK()
1038 cur_stream->actions |= MOS_ACT_DESTROY; in Handle_TCP_ST_LAST_ACK()
1042 cur_stream->id, pctx->p.ack_seq, cur_stream->sndvar->fss + 1); in Handle_TCP_ST_LAST_ACK()
1044 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in Handle_TCP_ST_LAST_ACK()
1048 cur_stream->id); in Handle_TCP_ST_LAST_ACK()
1050 cur_stream->actions |= MOS_ACT_SEND_CONTROL; in Handle_TCP_ST_LAST_ACK()
1055 Handle_TCP_ST_FIN_WAIT_1 (mtcp_manager_t mtcp, tcp_stream* cur_stream, argument
1060 if (TCP_SEQ_LT(pctx->p.seq, cur_stream->rcv_nxt)) {
1061 RAISE_DEBUG_EVENT(mtcp, cur_stream,
1064 cur_stream->id, pctx->p.seq, cur_stream->rcv_nxt);
1065 cur_stream->actions |= MOS_ACT_SEND_CONTROL;
1070 if (cur_stream->sndvar->sndbuf) {
1071 ProcessACK(mtcp, cur_stream, pctx);
1074 if (cur_stream->sndvar->is_fin_sent &&
1075 ((!HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM) &&
1076 pctx->p.ack_seq == cur_stream->sndvar->fss) ||
1077 pctx->p.ack_seq == cur_stream->sndvar->fss + 1)) {
1080 if (cur_stream->sndvar->is_fin_sent &&
1081 pctx->p.ack_seq == cur_stream->sndvar->fss + 1) {
1083 cur_stream->sndvar->snd_una = pctx->p.ack_seq;
1084 if (TCP_SEQ_GT(pctx->p.ack_seq, cur_stream->snd_nxt)) {
1086 cur_stream->id, pctx->p.ack_seq);
1087 cur_stream->snd_nxt = pctx->p.ack_seq;
1091 cur_stream->sndvar->nrtx = 0;
1092 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM))
1093 RemoveFromRTOList(mtcp, cur_stream);
1094 cur_stream->state = TCP_ST_FIN_WAIT_2;
1095 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE;
1097 cur_stream->id);
1099 RAISE_DEBUG_EVENT(mtcp, cur_stream,
1102 cur_stream->sndvar->is_fin_sent ? "true" : "false",
1103 pctx->p.ack_seq, cur_stream->sndvar->fss);
1107 RAISE_DEBUG_EVENT(mtcp, cur_stream,
1118 cur_stream->id);
1123 if (ProcessTCPPayload(mtcp, cur_stream, pctx)) {
1125 cur_stream->actions |= MOS_ACT_SEND_ACK_AGG;
1127 cur_stream->actions |= MOS_ACT_SEND_ACK_NOW;
1134 if (!cur_stream->buffer_mgmt ||
1136 TCP_SEQ_GEQ(pctx->p.seq + pctx->p.payloadlen, cur_stream->rcv_nxt)
1138 pctx->p.seq + pctx->p.payloadlen == cur_stream->rcv_nxt
1141 cur_stream->rcv_nxt++;
1143 if (cur_stream->state == TCP_ST_FIN_WAIT_1) {
1144 cur_stream->state = TCP_ST_CLOSING;
1145 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE;
1146 TRACE_STATE("Stream %d: TCP_ST_CLOSING\n", cur_stream->id);
1148 } else if (cur_stream->state == TCP_ST_FIN_WAIT_2) {
1149 cur_stream->state = TCP_ST_TIME_WAIT;
1150 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE;
1151 TRACE_STATE("Stream %d: TCP_ST_TIME_WAIT\n", cur_stream->id);
1152 AddtoTimewaitList(mtcp, cur_stream, pctx->p.cur_ts);
1154 cur_stream->actions |= MOS_ACT_SEND_CONTROL;
1156 RAISE_DEBUG_EVENT(mtcp, cur_stream,
1158 cur_stream->rcv_nxt, pctx->p.seq + pctx->p.payloadlen,
1161 cur_stream->actions |= MOS_ACT_SEND_ACK_NOW;
1168 Handle_TCP_ST_FIN_WAIT_2 (mtcp_manager_t mtcp, tcp_stream* cur_stream, argument
1174 if (cur_stream->sndvar->sndbuf) {
1175 ProcessACK(mtcp, cur_stream, pctx);
1179 cur_stream->id);
1184 if (ProcessTCPPayload(mtcp, cur_stream, pctx)) {
1186 cur_stream->actions |= MOS_ACT_SEND_ACK_AGG;
1188 cur_stream->actions |= MOS_ACT_SEND_ACK_NOW;
1195 if (!cur_stream->buffer_mgmt ||
1197 TCP_SEQ_GEQ(pctx->p.seq + pctx->p.payloadlen, cur_stream->rcv_nxt)
1199 pctx->p.seq + pctx->p.payloadlen == cur_stream->rcv_nxt
1202 cur_stream->state = TCP_ST_TIME_WAIT;
1203 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE;
1204 cur_stream->rcv_nxt++;
1205 TRACE_STATE("Stream %d: TCP_ST_TIME_WAIT\n", cur_stream->id);
1207 AddtoTimewaitList(mtcp, cur_stream, pctx->p.cur_ts);
1208 cur_stream->actions |= MOS_ACT_SEND_CONTROL;
1213 cur_stream->id, pctx->p.seq, pctx->p.ack_seq,
1214 cur_stream->snd_nxt, cur_stream->sndvar->snd_una);
1223 Handle_TCP_ST_CLOSING (mtcp_manager_t mtcp, tcp_stream* cur_stream, argument
1229 if (cur_stream->sndvar->sndbuf) {
1230 ProcessACK(mtcp, cur_stream, pctx);
1233 if (!cur_stream->sndvar->is_fin_sent) {
1235 "No FIN sent yet.\n", cur_stream->id);
1240 if (pctx->p.ack_seq != cur_stream->sndvar->fss + 1) {
1244 cur_stream->id, pctx->p.ack_seq, cur_stream->snd_nxt,
1245 cur_stream->sndvar->snd_una, cur_stream->sndvar->fss);
1247 DumpStream(mtcp, cur_stream);
1254 cur_stream->sndvar->snd_una = pctx->p.ack_seq;
1255 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM))
1256 UpdateRetransmissionTimer(mtcp, cur_stream, pctx->p.cur_ts);
1257 cur_stream->state = TCP_ST_TIME_WAIT;
1258 cur_stream->cb_events |= MOS_ON_TCP_STATE_CHANGE;
1259 TRACE_STATE("Stream %d: TCP_ST_TIME_WAIT\n", cur_stream->id);
1261 AddtoTimewaitList(mtcp, cur_stream, pctx->p.cur_ts);
1265 cur_stream->id);
1271 UpdateRecvTCPContext(mtcp_manager_t mtcp, struct tcp_stream *cur_stream, argument
1277 assert(cur_stream);
1280 if (cur_stream->state > TCP_ST_SYN_RCVD) {
1282 ret = ValidateSequence(mtcp, cur_stream, pctx);
1285 cur_stream->id, pctx->p.seq, cur_stream->rcv_nxt);
1290 DumpStream(mtcp, cur_stream);
1297 cur_stream->sndvar->peer_wnd = pctx->p.window;
1299 cur_stream->sndvar->peer_wnd =
1300 (uint32_t)pctx->p.window << cur_stream->sndvar->wscale_peer;
1303 cur_stream->last_active_ts = pctx->p.cur_ts;
1304 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_STREAM))
1305 UpdateTimeoutList(mtcp, cur_stream);
1309 cur_stream->have_reset = TRUE;
1310 if (cur_stream->state > TCP_ST_SYN_SENT) {
1311 if (ProcessRST(mtcp, cur_stream, pctx)) {
1317 if (HAS_STREAM_TYPE(cur_stream, MOS_SOCK_MONITOR_STREAM_ACTIVE) &&
1319 if (cur_stream->state == TCP_ST_CLOSE_WAIT ||
1320 cur_stream->state == TCP_ST_LAST_ACK ||
1321 cur_stream->state == TCP_ST_CLOSING ||
1322 cur_stream->state == TCP_ST_TIME_WAIT) {
1324 if (pctx->p.seq == cur_stream->pair_stream->sndvar->fss) {
1326 pctx->p.seq, cur_stream->pair_stream->sndvar->fss);
1327 cur_stream->cb_events |= MOS_ON_REXMIT;
1332 switch (cur_stream->state) {
1334 Handle_TCP_ST_LISTEN(mtcp, cur_stream, pctx);
1338 Handle_TCP_ST_SYN_SENT(mtcp, cur_stream, pctx);
1343 if (tcph->syn && pctx->p.seq == cur_stream->rcvvar->irs)
1344 Handle_TCP_ST_LISTEN(mtcp, cur_stream, pctx);
1346 Handle_TCP_ST_SYN_RCVD(mtcp, cur_stream, pctx);
1347 if (pctx->p.payloadlen > 0 && cur_stream->state == TCP_ST_ESTABLISHED)
1348 Handle_TCP_ST_ESTABLISHED(mtcp, cur_stream, pctx);
1353 Handle_TCP_ST_ESTABLISHED(mtcp, cur_stream, pctx);
1357 Handle_TCP_ST_CLOSE_WAIT(mtcp, cur_stream, pctx);
1361 Handle_TCP_ST_LAST_ACK(mtcp, cur_stream, pctx);
1365 Handle_TCP_ST_FIN_WAIT_1(mtcp, cur_stream, pctx);
1369 Handle_TCP_ST_FIN_WAIT_2(mtcp, cur_stream, pctx);
1373 Handle_TCP_ST_CLOSING(mtcp, cur_stream, pctx);
1379 if (cur_stream->on_timewait_list) {
1380 RemoveFromTimewaitList(mtcp, cur_stream);
1381 AddtoTimewaitList(mtcp, cur_stream, pctx->p.cur_ts);
1383 cur_stream->actions |= MOS_ACT_SEND_CONTROL;
1395 cur_stream->id, cur_stream->cb_events, cur_stream->actions);
1400 DoActionEndTCPPacket(mtcp_manager_t mtcp, struct tcp_stream *cur_stream, argument
1407 if (cur_stream->actions & i) {
1410 AddtoSendList(mtcp, cur_stream);
1413 EnqueueACK(mtcp, cur_stream, pctx->p.cur_ts, ACK_OPT_NOW);
1416 EnqueueACK(mtcp, cur_stream, pctx->p.cur_ts, ACK_OPT_AGGREGATE);
1419 AddtoControlList(mtcp, cur_stream, pctx->p.cur_ts);
1422 if (cur_stream->state <= TCP_ST_SYN_SENT)
1436 DestroyTCPStream(mtcp, cur_stream);
1445 cur_stream->actions = 0;
1453 UpdatePassiveRecvTCPContext(mtcp_manager_t mtcp, struct tcp_stream *cur_stream, argument
1456 UpdateRecvTCPContext(mtcp, cur_stream, pctx);