diff options
author | Neale Ranns <nranns@cisco.com> | 2016-10-03 09:40:25 +0100 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2016-10-03 11:45:15 +0000 |
commit | 5e575b1d59a5a4c1590ca09d6383a876fb9fdd25 (patch) | |
tree | fcba6d058fe32d9b32fe246577565020d10455ff /vnet/vnet/fib | |
parent | 553d808fc44e61846e4cda108083dd88beb338e3 (diff) |
L2 over LISP and GRE (VPP-457)
Change-Id: I0d7f9c7f41a9f9e0acb0950adedb90d45df08c2a
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'vnet/vnet/fib')
-rw-r--r-- | vnet/vnet/fib/fib_entry.c | 6 | ||||
-rw-r--r-- | vnet/vnet/fib/fib_entry_src.c | 1 | ||||
-rw-r--r-- | vnet/vnet/fib/fib_node.h | 4 | ||||
-rw-r--r-- | vnet/vnet/fib/fib_path.c | 12 | ||||
-rw-r--r-- | vnet/vnet/fib/fib_path_list.c | 17 | ||||
-rw-r--r-- | vnet/vnet/fib/fib_types.c | 34 | ||||
-rw-r--r-- | vnet/vnet/fib/fib_types.h | 39 |
7 files changed, 91 insertions, 22 deletions
diff --git a/vnet/vnet/fib/fib_entry.c b/vnet/vnet/fib/fib_entry.c index 8b275c61912..a75d5c9cf8c 100644 --- a/vnet/vnet/fib/fib_entry.c +++ b/vnet/vnet/fib/fib_entry.c @@ -90,7 +90,8 @@ fib_entry_chain_type_fixup (const fib_entry_t *entry, * then use the payload-protocol field, that we stashed there * for just this purpose */ - return (fib_proto_to_forw_chain_type(entry->fe_prefix.fp_payload_proto)); + return (fib_forw_chain_type_from_dpo_proto( + entry->fe_prefix.fp_payload_proto)); } /* * else give them what this entry would be by default. i.e. if it's a v6 @@ -120,7 +121,8 @@ fib_entry_get_default_chain_type (const fib_entry_t *fib_entry) * then use the payload-protocol field, that we stashed there * for just this purpose */ - return (fib_proto_to_forw_chain_type(fib_entry->fe_prefix.fp_payload_proto)); + return (fib_forw_chain_type_from_dpo_proto( + fib_entry->fe_prefix.fp_payload_proto)); else return (FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS); } diff --git a/vnet/vnet/fib/fib_entry_src.c b/vnet/vnet/fib/fib_entry_src.c index 70550069356..0bca17dd884 100644 --- a/vnet/vnet/fib/fib_entry_src.c +++ b/vnet/vnet/fib/fib_entry_src.c @@ -298,6 +298,7 @@ fib_entry_src_collect_forwarding (fib_node_index_t pl_index, } break; case FIB_FORW_CHAIN_TYPE_MPLS_EOS: + case FIB_FORW_CHAIN_TYPE_ETHERNET: ASSERT(0); break; } diff --git a/vnet/vnet/fib/fib_node.h b/vnet/vnet/fib/fib_node.h index a05b6f1b61a..6a54c6f565b 100644 --- a/vnet/vnet/fib/fib_node.h +++ b/vnet/vnet/fib/fib_node.h @@ -35,7 +35,7 @@ typedef enum fib_node_type_t_ { FIB_NODE_TYPE_PATH, FIB_NODE_TYPE_ADJ, FIB_NODE_TYPE_MPLS_ENTRY, - FIB_NODE_TYPE_LISP_GPE_TUNNEL, + FIB_NODE_TYPE_LISP_GPE_FWD_ENTRY, FIB_NODE_TYPE_LISP_ADJ, FIB_NODE_TYPE_MPLS_GRE_TUNNEL, FIB_NODE_TYPE_GRE_TUNNEL, @@ -55,7 +55,7 @@ typedef enum fib_node_type_t_ { [FIB_NODE_TYPE_PATH] = "path", \ [FIB_NODE_TYPE_MPLS_ENTRY] = "mpls-entry", \ [FIB_NODE_TYPE_ADJ] = "adj", \ - [FIB_NODE_TYPE_LISP_GPE_TUNNEL] = "lisp-gpe-tunnel", \ + [FIB_NODE_TYPE_LISP_GPE_FWD_ENTRY] = "lisp-gpe-fwd-entry", \ [FIB_NODE_TYPE_LISP_ADJ] = "lisp-adj", \ [FIB_NODE_TYPE_MPLS_GRE_TUNNEL] = "mpls-gre-tunnel", \ [FIB_NODE_TYPE_GRE_TUNNEL] = "gre-tunnel", \ diff --git a/vnet/vnet/fib/fib_path.c b/vnet/vnet/fib/fib_path.c index d2e5e319afd..d5453fde256 100644 --- a/vnet/vnet/fib/fib_path.c +++ b/vnet/vnet/fib/fib_path.c @@ -1564,7 +1564,8 @@ fib_path_contribute_forwarding (fib_node_index_t path_index, { dpo_copy(dpo, &path->fp_dpo); } - else { + else + { switch (path->fp_type) { case FIB_PATH_TYPE_ATTACHED_NEXT_HOP: @@ -1574,6 +1575,7 @@ fib_path_contribute_forwarding (fib_node_index_t path_index, case FIB_FORW_CHAIN_TYPE_UNICAST_IP6: case FIB_FORW_CHAIN_TYPE_MPLS_EOS: case FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS: + case FIB_FORW_CHAIN_TYPE_ETHERNET: { adj_index_t ai; @@ -1606,6 +1608,9 @@ fib_path_contribute_forwarding (fib_node_index_t path_index, case FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS: fib_path_recursive_adj_update(path, fct, dpo); break; + case FIB_FORW_CHAIN_TYPE_ETHERNET: + ASSERT(0); + break; } break; case FIB_PATH_TYPE_DEAG: @@ -1623,6 +1628,9 @@ fib_path_contribute_forwarding (fib_node_index_t path_index, case FIB_FORW_CHAIN_TYPE_MPLS_EOS: dpo_copy(dpo, &path->fp_dpo); break; + case FIB_FORW_CHAIN_TYPE_ETHERNET: + ASSERT(0); + break; } break; case FIB_PATH_TYPE_EXCLUSIVE: @@ -1656,7 +1664,7 @@ fib_path_append_nh_for_multipath_hash (fib_node_index_t path_index, mnh->path_weight = path->fp_weight; mnh->path_index = path_index; - dpo_copy(&mnh->path_dpo, &path->fp_dpo); + fib_path_contribute_forwarding(path_index, fct, &mnh->path_dpo); } return (hash_key); diff --git a/vnet/vnet/fib/fib_path_list.c b/vnet/vnet/fib/fib_path_list.c index 1df73968614..3523d93a7bb 100644 --- a/vnet/vnet/fib/fib_path_list.c +++ b/vnet/vnet/fib/fib_path_list.c @@ -353,7 +353,7 @@ fib_path_list_last_lock_gone (fib_node_t *node) */ static void fib_path_list_mk_lb (fib_path_list_t *path_list, - fib_forward_chain_type_t type, + fib_forward_chain_type_t fct, dpo_id_t *dpo) { load_balance_path_t *hash_key; @@ -361,6 +361,19 @@ fib_path_list_mk_lb (fib_path_list_t *path_list, hash_key = NULL; + if (!dpo_id_is_valid(dpo)) + { + /* + * first time create + */ + dpo_set(dpo, + DPO_LOAD_BALANCE, + fib_forw_chain_type_to_dpo_proto(fct), + load_balance_create(0, + fib_forw_chain_type_to_dpo_proto(fct), + 0 /* FIXME FLOW HASH */)); + } + /* * We gather the DPOs from resolved paths. */ @@ -368,7 +381,7 @@ fib_path_list_mk_lb (fib_path_list_t *path_list, { hash_key = fib_path_append_nh_for_multipath_hash( *path_index, - type, + fct, hash_key); } diff --git a/vnet/vnet/fib/fib_types.c b/vnet/vnet/fib/fib_types.c index bf76c5536e6..f881a8f3ff2 100644 --- a/vnet/vnet/fib/fib_types.c +++ b/vnet/vnet/fib/fib_types.c @@ -214,6 +214,24 @@ fib_proto_to_dpo (fib_protocol_t fib_proto) return (0); } +dpo_proto_t +fib_link_to_dpo_proto (fib_link_t linkt) +{ + switch (linkt) + { + case FIB_LINK_IP6: + return (DPO_PROTO_IP6); + case FIB_LINK_IP4: + return (DPO_PROTO_IP4); + case FIB_LINK_MPLS: + return (DPO_PROTO_MPLS); + case FIB_LINK_ETHERNET: + return (DPO_PROTO_ETHERNET); + } + ASSERT(0); + return (0); +} + fib_protocol_t dpo_proto_to_fib (dpo_proto_t dpo_proto) { @@ -225,6 +243,8 @@ dpo_proto_to_fib (dpo_proto_t dpo_proto) return (FIB_PROTOCOL_IP4); case DPO_PROTO_MPLS: return (FIB_PROTOCOL_MPLS); + default: + break; } ASSERT(0); return (0); @@ -247,16 +267,18 @@ fib_proto_to_link (fib_protocol_t proto) } fib_forward_chain_type_t -fib_proto_to_forw_chain_type (fib_protocol_t proto) +fib_forw_chain_type_from_dpo_proto (dpo_proto_t proto) { switch (proto) { - case FIB_PROTOCOL_IP4: + case DPO_PROTO_IP4: return (FIB_FORW_CHAIN_TYPE_UNICAST_IP4); - case FIB_PROTOCOL_IP6: + case DPO_PROTO_IP6: return (FIB_FORW_CHAIN_TYPE_UNICAST_IP6); - case FIB_PROTOCOL_MPLS: + case DPO_PROTO_MPLS: return (FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS); + case DPO_PROTO_ETHERNET: + return (FIB_FORW_CHAIN_TYPE_ETHERNET); } ASSERT(0); return (FIB_FORW_CHAIN_TYPE_UNICAST_IP4); @@ -271,6 +293,8 @@ fib_forw_chain_type_to_link_type (fib_forward_chain_type_t fct) return (FIB_LINK_IP4); case FIB_FORW_CHAIN_TYPE_UNICAST_IP6: return (FIB_LINK_IP6); + case FIB_FORW_CHAIN_TYPE_ETHERNET: + return (FIB_LINK_ETHERNET); case FIB_FORW_CHAIN_TYPE_MPLS_EOS: /* * insufficient information to to convert @@ -292,6 +316,8 @@ fib_forw_chain_type_to_dpo_proto (fib_forward_chain_type_t fct) return (DPO_PROTO_IP4); case FIB_FORW_CHAIN_TYPE_UNICAST_IP6: return (DPO_PROTO_IP6); + case FIB_FORW_CHAIN_TYPE_ETHERNET: + return (DPO_PROTO_ETHERNET); case FIB_FORW_CHAIN_TYPE_MPLS_EOS: /* * insufficient information to to convert diff --git a/vnet/vnet/fib/fib_types.h b/vnet/vnet/fib/fib_types.h index 4ebd68d1450..232a2301606 100644 --- a/vnet/vnet/fib/fib_types.h +++ b/vnet/vnet/fib/fib_types.h @@ -1,4 +1,4 @@ -/* + /* * Copyright (c) 2016 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,6 +58,17 @@ typedef enum fib_protocol_t_ { */ #define FIB_PROTOCOL_NONE (FIB_PROTOCOL_MAX+1) +#define FOR_EACH_FIB_PROTOCOL(_item) \ + for (_item = FIB_PROTOCOL_IP4; \ + _item <= FIB_PROTOCOL_MPLS; \ + _item++) + +#define FOR_EACH_FIB_IP_PROTOCOL(_item) \ + for (_item = FIB_PROTOCOL_IP4; \ + _item <= FIB_PROTOCOL_IP6; \ + _item++) + + /** * Link Type. This maps directly into the ethertype. */ @@ -68,6 +79,7 @@ typedef enum fib_link_t_ { FIB_LINK_IP4 = 0, #endif FIB_LINK_IP6, + FIB_LINK_ETHERNET, FIB_LINK_MPLS, } __attribute__ ((packed)) fib_link_t; @@ -77,15 +89,16 @@ typedef enum fib_link_t_ { */ #define FIB_LINK_NUM (FIB_LINK_MPLS+1) -#define FIB_LINKS { \ - [FIB_LINK_IP4] = "ipv4", \ - [FIB_LINK_IP6] = "ipv6", \ - [FIB_LINK_MPLS] = "mpls", \ +#define FIB_LINKS { \ + [FIB_LINK_ETHERNET] = "ethernet", \ + [FIB_LINK_IP4] = "ipv4", \ + [FIB_LINK_IP6] = "ipv6", \ + [FIB_LINK_MPLS] = "mpls", \ } -#define FOR_EACH_FIB_LINK(_item) \ - for (_item = FIB_LINK_IP4; \ - _item <= FIB_LINK_MPLS; \ +#define FOR_EACH_FIB_LINK(_item) \ + for (_item = FIB_LINK_IP4; \ + _item <= FIB_LINK_MPLS; \ _item++) #define FOR_EACH_FIB_IP_LINK(_item) \ @@ -105,6 +118,10 @@ fib_link_t fib_proto_to_link (fib_protocol_t proto); */ typedef enum fib_forward_chain_type_t_ { /** + * Contribute an object that is to be used to forward Ethernet packets + */ + FIB_FORW_CHAIN_TYPE_ETHERNET, + /** * Contribute an object that is to be used to forward IP4 packets */ FIB_FORW_CHAIN_TYPE_UNICAST_IP4, @@ -127,6 +144,7 @@ typedef enum fib_forward_chain_type_t_ { } __attribute__ ((packed)) fib_forward_chain_type_t; #define FIB_FORW_CHAINS { \ + [FIB_FORW_CHAIN_TYPE_ETHERNET] = "ehternet", \ [FIB_FORW_CHAIN_TYPE_UNICAST_IP4] = "unicast-ip4", \ [FIB_FORW_CHAIN_TYPE_UNICAST_IP6] = "unicast-ip6", \ [FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS] = "mpls-neos", \ @@ -136,7 +154,7 @@ typedef enum fib_forward_chain_type_t_ { #define FIB_FORW_CHAIN_NUM (FIB_FORW_CHAIN_TYPE_MPLS_EOS+1) #define FOR_EACH_FIB_FORW_CHAIN(_item) \ - for (_item = FIB_FORW_CHAIN_TYPE_UNICAST_IP4; \ + for (_item = FIB_FORW_CHAIN_TYPE_ETHERNET; \ _item <= FIB_FORW_CHAIN_TYPE_MPLS_EOS; \ _item++) @@ -148,7 +166,7 @@ extern fib_link_t fib_forw_chain_type_to_link_type(fib_forward_chain_type_t fct) /** * @brief Convert from a payload-protocol to a chain type. */ -extern fib_forward_chain_type_t fib_proto_to_forw_chain_type(fib_protocol_t proto); +extern fib_forward_chain_type_t fib_forw_chain_type_from_dpo_proto(dpo_proto_t proto); /** * @brief Convert from a chain type to the DPO proto it will install @@ -222,6 +240,7 @@ extern u8 * format_fib_prefix(u8 * s, va_list * args); extern u8 * format_fib_forw_chain_type(u8 * s, va_list * args); extern dpo_proto_t fib_proto_to_dpo(fib_protocol_t fib_proto); +extern dpo_proto_t fib_link_to_dpo_proto(fib_link_t linkt); extern fib_protocol_t dpo_proto_to_fib(dpo_proto_t dpo_proto); /** |