From 00dd39044e64b4a7a33d204ef7d19aac819d71f5 Mon Sep 17 00:00:00 2001 From: Filip Varga Date: Tue, 4 Aug 2020 18:06:06 +0200 Subject: nat: sessions get expired when fib table removed fib table removal would leave lingering sessions in vpp this patch is aimed at solving this issue by grouping sessions by source and destionation fib. if one of the fibs gets removed this grouping is tagged as expired and session won't be passed to non existing fib table Ticket: VPPSUPP-93 Type: improvement Change-Id: I45b1205a8b58d91f174e6feb862554ec2f6cffad Signed-off-by: Filip Varga --- src/plugins/nat/nat.h | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'src/plugins/nat/nat.h') diff --git a/src/plugins/nat/nat.h b/src/plugins/nat/nat.h index ddcf4c970b0..8bec46a3704 100644 --- a/src/plugins/nat/nat.h +++ b/src/plugins/nat/nat.h @@ -198,6 +198,20 @@ typedef enum #define NAT_STATIC_MAPPING_FLAG_IDENTITY_NAT 4 #define NAT_STATIC_MAPPING_FLAG_LB 8 +/* *INDENT-OFF* */ +typedef CLIB_PACKED(struct +{ + // number of sessions in this vrf + u32 ses_count; + + u32 rx_fib_index; + u32 tx_fib_index; + + // is this vrf expired + u8 expired; +}) per_vrf_sessions_t; +/* *INDENT-ON* */ + /* *INDENT-OFF* */ typedef CLIB_PACKED(struct { @@ -258,10 +272,13 @@ typedef CLIB_PACKED(struct /* user index */ u32 user_index; + + /* per vrf sessions index */ + u32 per_vrf_sessions_index; + }) snat_session_t; /* *INDENT-ON* */ - typedef struct { ip4_address_t addr; @@ -285,6 +302,12 @@ typedef struct /* *INDENT-ON* */ } snat_address_t; +typedef struct +{ + u32 fib_index; + u32 ref_count; +} nat_fib_t; + typedef struct { u32 fib_index; @@ -414,6 +437,8 @@ typedef struct /* real thread index */ u32 thread_index; + per_vrf_sessions_t *per_vrf_sessions_vec; + } snat_main_per_thread_data_t; struct snat_main_s; @@ -501,6 +526,9 @@ typedef struct snat_main_s u16 start_port; u16 end_port; + /* vector of fibs */ + nat_fib_t *fibs; + /* vector of outside fibs */ nat_outside_fib_t *outside_fibs; @@ -1350,6 +1378,8 @@ int snat_alloc_outside_address_and_port (snat_address_t * addresses, u16 port_per_thread, u32 snat_thread_index); +void expire_per_vrf_sessions (u32 fib_index); + /** * @brief Match NAT44 static mapping. * -- cgit 1.2.3-korg