diff options
author | Neale Ranns <nranns@cisco.com> | 2017-04-21 01:07:59 -0700 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2017-04-26 15:31:41 +0000 |
commit | 227038a444b98f922b4a4f44b85ae60f9ee86e1c (patch) | |
tree | d4268410e3f860bb01386f4242e023324885801d /src/vnet/ip | |
parent | 9806eae1f5f3953f7ac2c5bd07061a94387d757e (diff) |
IP Flow Hash Config fixes
- the flow hash config is (and was) cached on the load-balance object so the fib_table_t struct is not used a switch time. Therefore changes to the table's flow hash config need to be propagated to all load-balances and hance all FIB entries in the table.
- enable API for setting the IPv6 table flow hash config
- use only the hash config in the fib_table_t object and not on the ipX_fib_t
- add tests.
Change-Id: Ib804c11162c6d4972c764957562c372f663e05d4
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet/ip')
-rw-r--r-- | src/vnet/ip/ip4_forward.c | 5 | ||||
-rw-r--r-- | src/vnet/ip/ip6.h | 3 | ||||
-rw-r--r-- | src/vnet/ip/ip6_forward.c | 12 | ||||
-rw-r--r-- | src/vnet/ip/ip_api.c | 12 |
4 files changed, 17 insertions, 15 deletions
diff --git a/src/vnet/ip/ip4_forward.c b/src/vnet/ip/ip4_forward.c index 697d2169b10..d85f76d46c0 100644 --- a/src/vnet/ip/ip4_forward.c +++ b/src/vnet/ip/ip4_forward.c @@ -3020,7 +3020,6 @@ VLIB_CLI_COMMAND (lookup_test_command, static) = int vnet_set_ip4_flow_hash (u32 table_id, u32 flow_hash_config) { - ip4_fib_t *fib; u32 fib_index; fib_index = fib_table_find (FIB_PROTOCOL_IP4, table_id); @@ -3028,9 +3027,9 @@ vnet_set_ip4_flow_hash (u32 table_id, u32 flow_hash_config) if (~0 == fib_index) return VNET_API_ERROR_NO_SUCH_FIB; - fib = ip4_fib_get (fib_index); + fib_table_set_flow_hash_config (fib_index, FIB_PROTOCOL_IP4, + flow_hash_config); - fib->flow_hash_config = flow_hash_config; return 0; } diff --git a/src/vnet/ip/ip6.h b/src/vnet/ip/ip6.h index bf7ec7d5efb..d623c95f52f 100644 --- a/src/vnet/ip/ip6.h +++ b/src/vnet/ip/ip6.h @@ -71,9 +71,6 @@ typedef struct /* Index into FIB vector. */ u32 index; - - /* flow hash configuration */ - flow_hash_config_t flow_hash_config; } ip6_fib_t; typedef struct ip6_mfib_t diff --git a/src/vnet/ip/ip6_forward.c b/src/vnet/ip/ip6_forward.c index 3bc07d0e679..0ad96d0b9e0 100644 --- a/src/vnet/ip/ip6_forward.c +++ b/src/vnet/ip/ip6_forward.c @@ -267,11 +267,10 @@ ip6_lookup_inline (vlib_main_t * vm, (vnet_buffer (p0)->sw_if_index[VLIB_TX] == (u32) ~ 0) ? fib_index0 : vnet_buffer (p0)->sw_if_index[VLIB_TX]; - flow_hash_config0 = ip6_fib_get (fib_index0)->flow_hash_config; - lbi0 = ip6_fib_table_fwding_lookup (im, fib_index0, dst_addr0); lb0 = load_balance_get (lbi0); + flow_hash_config0 = lb0->lb_hash_config; vnet_buffer (p0)->ip.flow_hash = 0; ASSERT (lb0->lb_n_buckets > 0); @@ -3156,7 +3155,6 @@ VLIB_CLI_COMMAND (test_link_command, static) = int vnet_set_ip6_flow_hash (u32 table_id, u32 flow_hash_config) { - ip6_fib_t *fib; u32 fib_index; fib_index = fib_table_find (FIB_PROTOCOL_IP6, table_id); @@ -3164,10 +3162,10 @@ vnet_set_ip6_flow_hash (u32 table_id, u32 flow_hash_config) if (~0 == fib_index) return VNET_API_ERROR_NO_SUCH_FIB; - fib = ip6_fib_get (fib_index); + fib_table_set_flow_hash_config (fib_index, FIB_PROTOCOL_IP6, + flow_hash_config); - fib->flow_hash_config = flow_hash_config; - return 1; + return 0; } static clib_error_t * @@ -3199,7 +3197,7 @@ set_ip6_flow_hash_command_fn (vlib_main_t * vm, rv = vnet_set_ip6_flow_hash (table_id, flow_hash_config); switch (rv) { - case 1: + case 0: break; case -1: diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c index 9c9cb4a445a..2680d6010dc 100644 --- a/src/vnet/ip/ip_api.c +++ b/src/vnet/ip/ip_api.c @@ -1336,9 +1336,17 @@ static void set_ip6_flow_hash (vl_api_set_ip_flow_hash_t * mp) { vl_api_set_ip_flow_hash_reply_t *rmp; - int rv = VNET_API_ERROR_UNIMPLEMENTED; + int rv; + u32 table_id; + flow_hash_config_t flow_hash_config = 0; + + table_id = ntohl (mp->vrf_id); + +#define _(a,b) if (mp->a) flow_hash_config |= b; + foreach_flow_hash_bit; +#undef _ - clib_warning ("unimplemented..."); + rv = vnet_set_ip6_flow_hash (table_id, flow_hash_config); REPLY_MACRO (VL_API_SET_IP_FLOW_HASH_REPLY); } |