Free (GPLv2) TCP/IP stack developed by TASS Belgium
Fork of PicoTCP by
Diff: modules/pico_tcp.c
- Revision:
- 40:c8ab0d2bba0b
- Parent:
- 37:bdf736327c71
- Child:
- 45:ca30069e49bb
--- a/modules/pico_tcp.c Thu Jul 11 10:17:25 2013 +0000 +++ b/modules/pico_tcp.c Tue Jul 16 06:40:35 2013 +0000 @@ -314,7 +314,7 @@ tcp_dbg("%s: snd_nxt is now %08x\n", __FUNCTION__, t->snd_nxt); } } else if (hdr->flags == PICO_TCP_ACK) { /* pure ack */ - hdr->seq = long_be(t->snd_nxt); + //hdr->seq = long_be(t->snd_nxt); /* XXX disabled this to not to mess with seq nrs of ACKs anymore */ } else { tcp_dbg("%s: non-pure ACK with len=0, fl:%04x\n", __FUNCTION__, hdr->flags); } @@ -620,6 +620,7 @@ hdr->flags |= PICO_TCP_PSH | PICO_TCP_ACK; hdr->ack = long_be(ts->rcv_nxt); ts->rcv_ackd = ts->rcv_nxt; + ts->keepalive_timer_running = 2; /* XXX TODO check fix: added 1 to counter to postpone sending keepalive, ACK is in data segments */ } f->start = f->transport_hdr + PICO_SIZE_TCPHDR; @@ -629,9 +630,11 @@ /* TCP: ENQUEUE to PROTO ( Transmit ) */ cpy = pico_frame_copy(f); - if (pico_enqueue(&tcp_out, cpy) > 0) { - if (f->payload_len > 0) + if ((pico_enqueue(&tcp_out, cpy) > 0)) { + if (f->payload_len > 0) { ts->in_flight++; + ts->snd_nxt += f->payload_len; /* update next pointer here to prevent sending same segment twice when called twice in same tick */ + } tcp_dbg("DBG> [tcp output] state: %02x --> local port:%d remote port: %d seq: %08x ack: %08x flags: %02x = t_len: %d, hdr: %u payload: %d\n", TCPSTATE(&ts->sock) >> 8, short_be(hdr->trans.sport), short_be(hdr->trans.dport), SEQN(f), ACKN(f), hdr->flags, f->transport_len, (hdr->len & 0xf0) >> 2 , f->payload_len ); } else { @@ -666,8 +669,8 @@ t->tcpq_out.max_size = PICO_DEFAULT_SOCKETQ; t->tcpq_hold.max_size = 2*PICO_TCP_DEFAULT_MSS; - /* enable Nagle by default */ - t->sock.opt_flags &= (~(1 << PICO_SOCKET_OPT_TCPNODELAY)); + /* disable Nagle by default */ + t->sock.opt_flags |= (1 << PICO_SOCKET_OPT_TCPNODELAY); #ifdef PICO_TCP_SUPPORT_SOCKET_STATS pico_timer_add(2000, sock_stats, t); @@ -1035,7 +1038,7 @@ tcp_add_options(t,f, PICO_TCP_FIN, opt_len); hdr->trans.sport = t->sock.local_port; hdr->trans.dport = t->sock.remote_port; - hdr->seq = long_be(t->snd_nxt); + hdr->seq = long_be(t->snd_nxt); /* XXX TODO check correct ?? --> snd_last? otherwise maybe data after FIN */ f->start = f->transport_hdr + PICO_SIZE_TCPHDR; hdr->rwnd = short_be(t->wnd); @@ -1329,7 +1332,7 @@ tcp_add_options(t, f, 0, f->transport_len - f->payload_len - PICO_SIZE_TCPHDR); hdr->rwnd = short_be(t->wnd); hdr->flags |= PICO_TCP_PSH; - hdr->ack = long_be(t->rcv_nxt); + //hdr->ack = long_be(t->rcv_nxt); /* XXX TODO check: setting ack field with no ACK flag ?? */ hdr->crc = 0; hdr->crc = short_be(pico_tcp_checksum_ipv4(f)); /* TCP: ENQUEUE to PROTO ( retransmit )*/ @@ -1895,15 +1898,15 @@ { PICO_SOCKET_STATE_TCP_UNDEF, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, { PICO_SOCKET_STATE_TCP_CLOSED, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, { PICO_SOCKET_STATE_TCP_LISTEN, &tcp_syn, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_nosync_rst, NULL }, - { PICO_SOCKET_STATE_TCP_SYN_SENT, &tcp_nosync_rst, &tcp_synack, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_rst }, + { PICO_SOCKET_STATE_TCP_SYN_SENT, &tcp_nosync_rst, &tcp_synack, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_rst }, { PICO_SOCKET_STATE_TCP_SYN_RECV, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_first_ack, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_nosync_rst, &tcp_rst }, - { PICO_SOCKET_STATE_TCP_ESTABLISHED, &tcp_send_rst, &tcp_send_rst, &tcp_ack, &tcp_data_in, &tcp_closewait, &tcp_closewait, &tcp_rst }, - { PICO_SOCKET_STATE_TCP_CLOSE_WAIT, &tcp_send_rst, &tcp_send_rst, &tcp_ack, &tcp_send_rst, &tcp_closewait, &tcp_closewait, &tcp_rst }, - { PICO_SOCKET_STATE_TCP_LAST_ACK, &tcp_send_rst, &tcp_send_rst, &tcp_lastackwait, &tcp_send_rst, &tcp_send_rst, &tcp_send_rst, &tcp_rst }, - { PICO_SOCKET_STATE_TCP_FIN_WAIT1, &tcp_send_rst, &tcp_send_rst, &tcp_finwaitack, &tcp_data_in, &tcp_rcvfin, &tcp_finack, &tcp_rst }, - { PICO_SOCKET_STATE_TCP_FIN_WAIT2, &tcp_send_rst, &tcp_send_rst, &tcp_ack, &tcp_data_in, &tcp_finwaitfin, &tcp_finack, &tcp_rst }, - { PICO_SOCKET_STATE_TCP_CLOSING, &tcp_send_rst, &tcp_send_rst, &tcp_closewaitack, &tcp_send_rst, &tcp_send_rst, &tcp_send_rst, &tcp_rst }, - { PICO_SOCKET_STATE_TCP_TIME_WAIT, &tcp_send_rst, &tcp_send_rst, &tcp_send_rst, &tcp_send_rst, &tcp_send_rst, &tcp_send_rst, &tcp_rst } + { PICO_SOCKET_STATE_TCP_ESTABLISHED, NULL, &tcp_ack, &tcp_ack, &tcp_data_in, &tcp_closewait, &tcp_closewait, &tcp_rst }, + { PICO_SOCKET_STATE_TCP_CLOSE_WAIT, NULL, &tcp_ack, &tcp_ack, &tcp_send_rst, &tcp_closewait, &tcp_closewait, &tcp_rst }, + { PICO_SOCKET_STATE_TCP_LAST_ACK, NULL, &tcp_ack, &tcp_lastackwait, &tcp_send_rst, &tcp_send_rst, &tcp_send_rst, &tcp_rst }, + { PICO_SOCKET_STATE_TCP_FIN_WAIT1, NULL, &tcp_ack, &tcp_finwaitack, &tcp_data_in, &tcp_rcvfin, &tcp_finack, &tcp_rst }, + { PICO_SOCKET_STATE_TCP_FIN_WAIT2, NULL, &tcp_ack, &tcp_ack, &tcp_data_in, &tcp_finwaitfin, &tcp_finack, &tcp_rst }, + { PICO_SOCKET_STATE_TCP_CLOSING, NULL, &tcp_ack, &tcp_closewaitack, &tcp_send_rst, &tcp_send_rst, &tcp_send_rst, &tcp_rst }, + { PICO_SOCKET_STATE_TCP_TIME_WAIT, NULL, &tcp_ack, &tcp_send_rst, &tcp_send_rst, &tcp_send_rst, &tcp_send_rst, &tcp_rst } }; /* @@ -2005,7 +2008,8 @@ if (t->x_mode != PICO_TCP_WINDOW_FULL) { tcp_dbg("TCP> RIGHT SIZING (rwnd: %d, frame len: %d\n",t->recv_wnd << t->recv_wnd_scale, f->payload_len); tcp_dbg("In window full...\n"); - t->snd_nxt = SEQN(una); + //t->snd_nxt = SEQN(una); /* XXX prevent out-of-order-packets ! */ + t->snd_retry = SEQN(una); /* XXX replace by retry pointer? */ /* Alternative to the line above: (better performance, but seems to lock anyway with larger buffers) if (seq_compare(t->snd_nxt, SEQN(una)) > 0)