diff options
author | Klement Sekera <ksekera@cisco.com> | 2020-04-22 12:45:50 +0000 |
---|---|---|
committer | Ole Trøan <otroan@employees.org> | 2020-05-14 12:12:45 +0000 |
commit | 2a595da121b28784f73e710534522583cac7af40 (patch) | |
tree | c43c09673183f6ab4a0cee0b2329458581bfc8ce /src/plugins/nat/nat_inlines.h | |
parent | 88120824acc299a0aec17ce4c208dbc8be394779 (diff) |
nat: ED: store both thread&session idx in hash
By storing thread and session index in hash table we are able to skip
multiple hash lookups in multi-worker scenario, which were used for
handoff before. Also, by storing sesion index in vnet_buffer2, we can
avoid repeating the lookup after handoff.
Type: improvement
Signed-off-by: Klement Sekera <ksekera@cisco.com>
Change-Id: I406fb12f4e2dd8f4a5ca5d83d59dbc37e1af9abf
Diffstat (limited to 'src/plugins/nat/nat_inlines.h')
-rw-r--r-- | src/plugins/nat/nat_inlines.h | 48 |
1 files changed, 37 insertions, 11 deletions
diff --git a/src/plugins/nat/nat_inlines.h b/src/plugins/nat/nat_inlines.h index d37cb10b6fd..121d2c71aaa 100644 --- a/src/plugins/nat/nat_inlines.h +++ b/src/plugins/nat/nat_inlines.h @@ -445,13 +445,39 @@ nat44_session_update_lru (snat_main_t * sm, snat_session_t * s, always_inline void make_ed_kv (ip4_address_t * l_addr, ip4_address_t * r_addr, u8 proto, - u32 fib_index, u16 l_port, u16 r_port, u64 value, - clib_bihash_kv_16_8_t * kv) + u32 fib_index, u16 l_port, u16 r_port, u32 thread_index, + u32 session_index, clib_bihash_kv_16_8_t * kv) { kv->key[0] = (u64) r_addr->as_u32 << 32 | l_addr->as_u32; kv->key[1] = (u64) r_port << 48 | (u64) l_port << 32 | fib_index << 8 | proto; - kv->value = value; + kv->value = (u64) thread_index << 32 | session_index; +} + +always_inline u32 +ed_value_get_thread_index (clib_bihash_kv_16_8_t * value) +{ + return value->value >> 32; +} + +always_inline u32 +ed_value_get_session_index (clib_bihash_kv_16_8_t * value) +{ + return value->value & ~(u32) 0; +} + +always_inline void +split_ed_value (clib_bihash_kv_16_8_t * value, u32 * thread_index, + u32 * session_index) +{ + if (thread_index) + { + *thread_index = ed_value_get_thread_index (value); + } + if (session_index) + { + *session_index = ed_value_get_session_index (value); + } } always_inline void @@ -497,8 +523,8 @@ make_sm_kv (clib_bihash_kv_8_8_t * kv, ip4_address_t * addr, u8 proto, static_always_inline int get_icmp_i2o_ed_key (vlib_buffer_t * b, ip4_header_t * ip0, u32 rx_fib_index, - u64 value, u8 * nat_proto, u16 * l_port, u16 * r_port, - clib_bihash_kv_16_8_t * kv) + u32 thread_index, u32 session_index, u8 * nat_proto, + u16 * l_port, u16 * r_port, clib_bihash_kv_16_8_t * kv) { u8 proto; u16 _l_port, _r_port; @@ -546,8 +572,8 @@ get_icmp_i2o_ed_key (vlib_buffer_t * b, ip4_header_t * ip0, u32 rx_fib_index, return NAT_IN2OUT_ED_ERROR_UNSUPPORTED_PROTOCOL; } } - make_ed_kv (l_addr, r_addr, proto, rx_fib_index, _l_port, _r_port, value, - kv); + make_ed_kv (l_addr, r_addr, proto, rx_fib_index, _l_port, _r_port, + thread_index, session_index, kv); if (nat_proto) { *nat_proto = ip_proto_to_nat_proto (proto); @@ -566,8 +592,8 @@ get_icmp_i2o_ed_key (vlib_buffer_t * b, ip4_header_t * ip0, u32 rx_fib_index, static_always_inline int get_icmp_o2i_ed_key (vlib_buffer_t * b, ip4_header_t * ip0, u32 rx_fib_index, - u64 value, u8 * nat_proto, u16 * l_port, u16 * r_port, - clib_bihash_kv_16_8_t * kv) + u32 thread_index, u32 session_index, u8 * nat_proto, + u16 * l_port, u16 * r_port, clib_bihash_kv_16_8_t * kv) { icmp46_header_t *icmp0; u8 proto; @@ -614,8 +640,8 @@ get_icmp_o2i_ed_key (vlib_buffer_t * b, ip4_header_t * ip0, u32 rx_fib_index, return -1; } } - make_ed_kv (l_addr, r_addr, proto, rx_fib_index, _l_port, _r_port, value, - kv); + make_ed_kv (l_addr, r_addr, proto, rx_fib_index, _l_port, _r_port, + thread_index, session_index, kv); if (nat_proto) { *nat_proto = ip_proto_to_nat_proto (proto); |