diff options
author | Neale Ranns <nranns@cisco.com> | 2017-05-26 03:48:53 -0700 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2017-05-26 18:15:31 +0000 |
commit | 6af1c04f925f0d74fc02789cf8227706ed6a8c2a (patch) | |
tree | 4661458544f73e55df5141f361a8244b8066f69e /src/vnet/mpls/mpls_lookup.c | |
parent | dcd6d6254a2b204a4283c889d1feac8f59a62639 (diff) |
MPLS lookup DPO does not pop the label (nor does it handle replicate)
Change-Id: I7de6b96631d1645d0eadd38525860d84d78e316d
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet/mpls/mpls_lookup.c')
-rw-r--r-- | src/vnet/mpls/mpls_lookup.c | 79 |
1 files changed, 2 insertions, 77 deletions
diff --git a/src/vnet/mpls/mpls_lookup.c b/src/vnet/mpls/mpls_lookup.c index 42e5399c2da..7cedc3846bf 100644 --- a/src/vnet/mpls/mpls_lookup.c +++ b/src/vnet/mpls/mpls_lookup.c @@ -17,7 +17,7 @@ #include <vlib/vlib.h> #include <vnet/pg/pg.h> -#include <vnet/mpls/mpls.h> +#include <vnet/mpls/mpls_lookup.h> #include <vnet/fib/mpls_fib.h> #include <vnet/dpo/load_balance_map.h> #include <vnet/dpo/replicate_dpo.h> @@ -30,7 +30,7 @@ static vlib_node_registration_t mpls_lookup_node; /** * The arc/edge from the MPLS lookup node to the MPLS replicate node */ -static u32 mpls_lookup_to_replicate_edge; +u32 mpls_lookup_to_replicate_edge; typedef struct { u32 next_index; @@ -56,81 +56,6 @@ format_mpls_lookup_trace (u8 * s, va_list * args) return s; } -/* - * Compute flow hash. - * We'll use it to select which adjacency to use for this flow. And other things. - */ -always_inline u32 -mpls_compute_flow_hash (const mpls_unicast_header_t * hdr, - flow_hash_config_t flow_hash_config) -{ - /* - * We need to byte swap so we use the numerical value. i.e. an odd label - * leads to an odd bucket. as opposed to a label above and below value X. - */ - u8 next_label_is_entropy; - mpls_label_t ho_label; - u32 hash, value; - - ho_label = clib_net_to_host_u32(hdr->label_exp_s_ttl); - hash = vnet_mpls_uc_get_label(ho_label); - next_label_is_entropy = 0; - - while (MPLS_EOS != vnet_mpls_uc_get_s(ho_label)) - { - hdr++; - ho_label = clib_net_to_host_u32(hdr->label_exp_s_ttl); - value = vnet_mpls_uc_get_label(ho_label); - - if (1 == next_label_is_entropy) - { - /* - * The label is an entropy value, use it alone as the hash - */ - return (ho_label); - } - if (MPLS_IETF_ENTROPY_LABEL == value) - { - /* - * we've met a label in the stack indicating that tha next - * label is an entropy value - */ - next_label_is_entropy = 1; - } - else - { - /* - * XOR the label values in the stack together to - * build up the hash value - */ - hash ^= value; - } - } - - /* - * check the top nibble for v4 and v6 - */ - hdr++; - - switch (((u8*)hdr)[0] >> 4) - { - case 4: - /* incorporate the v4 flow-hash */ - hash ^= ip4_compute_flow_hash ((const ip4_header_t *)hdr, - IP_FLOW_HASH_DEFAULT); - break; - case 6: - /* incorporate the v6 flow-hash */ - hash ^= ip6_compute_flow_hash ((const ip6_header_t *)hdr, - IP_FLOW_HASH_DEFAULT); - break; - default: - break; - } - - return (hash); -} - static inline uword mpls_lookup (vlib_main_t * vm, vlib_node_runtime_t * node, |