diff options
author | Neale Ranns <nranns@cisco.com> | 2020-11-12 16:53:51 +0000 |
---|---|---|
committer | Ole Tr�an <otroan@employees.org> | 2020-11-17 12:26:40 +0000 |
commit | b18796092bd1ef23d41b70c83c69d8d9cd2d051a (patch) | |
tree | 46c1b3da4f6d7d6a3c5dd677ceb7340863d48706 | |
parent | 2e8760628d6f629ddaa0f24bb901e10dcdbd5435 (diff) |
geneve: Remove one bucket load-balance objects
Type: improvement
geneve uses the UDP source port for the flow hash to get load-balancing
over multiple paths to the tunnel destination. However, if there is only
one path, then we can elide the LB object, contributed by the resolving
FIB entry, from the dasta path.
Signed-off-by: Neale Ranns <nranns@cisco.com>
Change-Id: I13a1bedc307a474d258a757bc1bae28564798730
-rw-r--r-- | src/plugins/geneve/geneve.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/plugins/geneve/geneve.c b/src/plugins/geneve/geneve.c index f991af97571..2c6f1ffded5 100644 --- a/src/plugins/geneve/geneve.c +++ b/src/plugins/geneve/geneve.c @@ -150,6 +150,18 @@ geneve_tunnel_restack_dpo (geneve_tunnel_t * t) FIB_FORW_CHAIN_TYPE_UNICAST_IP4 : FIB_FORW_CHAIN_TYPE_UNICAST_IP6; fib_entry_contribute_forwarding (t->fib_entry_index, forw_type, &dpo); + + /* geneve uses the flow hash as the udp source port + * hence the packet's hash is unknown at this time. + * However, we can still skip single bucket load balance dpo's */ + while (DPO_LOAD_BALANCE == dpo.dpoi_type) + { + load_balance_t *lb = load_balance_get (dpo.dpoi_index); + if (lb->lb_n_buckets > 1) + break; + + dpo_copy (&dpo, load_balance_get_bucket_i (lb, 0)); + } dpo_stack_from_node (encap_index, &t->next_dpo, &dpo); dpo_reset (&dpo); } |