diff options
author | Dave Barach <dbarach@cisco.com> | 2017-05-15 16:27:05 -0400 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2017-05-16 16:50:10 +0000 |
commit | 259cdaeccb70ea1a45b422218d3f5e1920459db8 (patch) | |
tree | 1a3d8b5196186882cfe15a65a3a3fe9eef53cebd /src | |
parent | f73dae3c45b8fd8c0d9e26d386c56a90cfaf67fd (diff) |
Fixes to tcp active opens and reception
- Properly initialize connection index
- Add new session to main hash table
- Drop packets that are completely in the past with respect to the rcv
wnd (e.g., retransmits due to premature timer pops)
Change-Id: Ic0873018ff0a4c59e0913863dc7f0c0f822d5c34
Signed-off-by: Dave Barach <dbarach@cisco.com>
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/vnet/session/session.c | 6 | ||||
-rw-r--r-- | src/vnet/tcp/tcp_input.c | 5 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index ed205d7627f..d0792faec09 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -732,6 +732,10 @@ stream_session_connect_notify (transport_connection_t * tc, u8 sst, /* Cleanup session lookup */ stream_session_half_open_table_del (smm, sst, tc); + + /* Add to established lookup table */ + handle = (((u64) tc->thread_index) << 32) | (u64) new_s->session_index; + stream_session_table_add_for_tc (tc, handle); } void @@ -1104,7 +1108,7 @@ session_manager_main_enable (vlib_main_t * vm) for (i = 0; i < 200000; i++) { stream_session_t *ss; - pool_get (smm->sessions[0], ss); + pool_get_aligned (smm->sessions[0], ss, CLIB_CACHE_LINE_BYTES); memset (ss, 0, sizeof (*ss)); } diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c index 318d8ec5c89..ddee41e0b9e 100644 --- a/src/vnet/tcp/tcp_input.c +++ b/src/vnet/tcp/tcp_input.c @@ -1135,6 +1135,10 @@ tcp_segment_rcv (tcp_main_t * tm, tcp_connection_t * tc, vlib_buffer_t * b, error = TCP_ERROR_SEGMENT_OLD; *next0 = TCP_NEXT_DROP; + /* Completely in the past (possible retransmit) */ + if (seq_lt (vnet_buffer (b)->tcp.seq_end, tc->rcv_nxt)) + goto done; + /* Chop off the bytes in the past */ n_bytes_to_drop = tc->rcv_nxt - vnet_buffer (b)->tcp.seq_number; n_data_bytes -= n_bytes_to_drop; @@ -1553,6 +1557,7 @@ tcp46_syn_sent_inline (vlib_main_t * vm, vlib_node_runtime_t * node, clib_memcpy (new_tc0, tc0, sizeof (*new_tc0)); new_tc0->c_thread_index = my_thread_index; + new_tc0->c_c_index = new_tc0 - tm->connections[my_thread_index]; /* Cleanup half-open connection XXX lock */ pool_put (tm->half_open_connections, tc0); |