diff options
-rw-r--r-- | src/vnet/tcp/tcp.c | 3 | ||||
-rw-r--r-- | src/vnet/tcp/tcp.h | 1 | ||||
-rw-r--r-- | src/vnet/tcp/tcp_input.c | 5 |
3 files changed, 7 insertions, 2 deletions
diff --git a/src/vnet/tcp/tcp.c b/src/vnet/tcp/tcp.c index 9f35b82a16f..8969f7bc980 100644 --- a/src/vnet/tcp/tcp.c +++ b/src/vnet/tcp/tcp.c @@ -223,6 +223,9 @@ tcp_connection_cleanup (tcp_connection_t * tc) if (!tc->c_is_ip4 && ip6_address_is_link_local_unicast (&tc->c_rmt_ip6)) tcp_add_del_adjacency (tc, 0); + vec_free (tc->snd_sacks); + vec_free (tc->snd_sacks_fl); + /* Poison the entry */ if (CLIB_DEBUG > 0) clib_memset (tc, 0xFA, sizeof (*tc)); diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h index a4e7935dfe4..65182c493b6 100644 --- a/src/vnet/tcp/tcp.h +++ b/src/vnet/tcp/tcp.h @@ -304,6 +304,7 @@ typedef struct _tcp_connection sack_block_t *snd_sacks; /**< Vector of SACKs to send. XXX Fixed size? */ u8 snd_sack_pos; /**< Position in vec of first block to send */ + sack_block_t *snd_sacks_fl; /**< Vector for building new list */ sack_scoreboard_t sack_sb; /**< SACK "scoreboard" that tracks holes */ u16 rcv_dupacks; /**< Number of DUPACKs received */ diff --git a/src/vnet/tcp/tcp_input.c b/src/vnet/tcp/tcp_input.c index dbe1fc4de87..df8f53d8b7e 100644 --- a/src/vnet/tcp/tcp_input.c +++ b/src/vnet/tcp/tcp_input.c @@ -1714,7 +1714,7 @@ tcp_sack_vector_is_sane (sack_block_t * sacks) void tcp_update_sack_list (tcp_connection_t * tc, u32 start, u32 end) { - sack_block_t *new_list = 0, *block = 0; + sack_block_t *new_list = tc->snd_sacks_fl, *block = 0; int i; /* If the first segment is ooo add it to the list. Last write might've moved @@ -1758,7 +1758,8 @@ tcp_update_sack_list (tcp_connection_t * tc, u32 start, u32 end) ASSERT (vec_len (new_list) <= TCP_MAX_SACK_BLOCKS); /* Replace old vector with new one */ - vec_free (tc->snd_sacks); + vec_reset_length (tc->snd_sacks); + tc->snd_sacks_fl = tc->snd_sacks; tc->snd_sacks = new_list; /* Segments should not 'touch' */ |