diff options
author | Alberto Compagno <acompagn+fdio@cisco.com> | 2019-04-01 17:53:05 +0200 |
---|---|---|
committer | Alberto Compagno <acompagn+fdio@cisco.com> | 2019-04-01 17:53:05 +0200 |
commit | 4dc317e8c18fadbc8d7ccce272f38e0cdfe80382 (patch) | |
tree | 05110f6e2f0cc4c40f70ee2ae19dc7f53261f7b8 | |
parent | fe16eee83b82383974996cffc0f423aa9deb50d9 (diff) |
[HICN-156] Ip face now support the remote address to be reachable through a "via" route.
Change-Id: Ic5e217ea997e8e86db1c21371839dfde03c641cf
Signed-off-by: Alberto Compagno <acompagn+fdio@cisco.com>
-rw-r--r-- | hicn-plugin/src/faces/ip/face_ip.c | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/hicn-plugin/src/faces/ip/face_ip.c b/hicn-plugin/src/faces/ip/face_ip.c index e4eb8b665..d03ff8739 100644 --- a/hicn-plugin/src/faces/ip/face_ip.c +++ b/hicn-plugin/src/faces/ip/face_ip.c @@ -40,17 +40,21 @@ hicn_face_ip_init (vlib_main_t * vm) /* Default Strategy has index 0 and it always exists */ strategy_face_ip4_vlib_edge = vlib_node_add_next (vm, hicn_dpo_get_strategy_vft - (default_dpo.hicn_dpo_get_type - ())->get_strategy_node_index + (default_dpo. + hicn_dpo_get_type ())-> + get_strategy_node_index (), - hicn_face_ip4_output_node.index); + hicn_face_ip4_output_node. + index); strategy_face_ip6_vlib_edge = vlib_node_add_next (vm, hicn_dpo_get_strategy_vft - (default_dpo.hicn_dpo_get_type - ())->get_strategy_node_index + (default_dpo. + hicn_dpo_get_type ())-> + get_strategy_node_index (), - hicn_face_ip6_output_node.index); + hicn_face_ip6_output_node. + index); /* * Create and edge between al the other strategy nodes and the * ip_encap nodes. @@ -124,8 +128,8 @@ hicn_face_ip_add (const ip46_address_t * local_addr, const ip46_address_t * remote_addr, int sw_if, hicn_face_id_t * pfaceid) { - fib_protocol_t fib_type; - vnet_link_t link_type; + /* fib_protocol_t fib_type; */ + /* vnet_link_t link_type; */ adj_index_t adj; dpo_proto_t dpo_proto; @@ -133,18 +137,21 @@ hicn_face_ip_add (const ip46_address_t * local_addr, if (ip46_address_is_zero (local_addr) || ip46_address_is_zero (remote_addr)) return HICN_ERROR_FACE_NO_GLOBAL_IP; - if (ip46_address_is_ip4 (local_addr) && ip46_address_is_ip4 (remote_addr)) - { - link_type = VNET_LINK_IP4; - fib_type = FIB_PROTOCOL_IP4; - } - else - { - link_type = VNET_LINK_IP6; - fib_type = FIB_PROTOCOL_IP6; - } + fib_prefix_t fib_pfx; + fib_node_index_t fib_entry_index; + fib_prefix_from_ip46_addr (remote_addr, &fib_pfx); + fib_pfx.fp_len = 128; + + u32 fib_index = fib_table_find_or_create_and_lock (fib_pfx.fp_proto, + HICN_FIB_TABLE, + FIB_SOURCE_PLUGIN_HI); + + fib_entry_index = fib_table_lookup (fib_index, &fib_pfx); + + adj = fib_entry_get_adj (fib_entry_index); - adj = adj_nbr_add_or_lock (fib_type, link_type, remote_addr, sw_if); + if (adj == ~0) + return HICN_ERROR_FACE_IP_ADJ_NOT_FOUND; hicn_face_flags_t flags = (hicn_face_flags_t) 0; flags |= HICN_FACE_FLAGS_FACE; @@ -230,7 +237,8 @@ hicn_face_ip_add (const ip46_address_t * local_addr, } retx_t *retx = vlib_process_signal_event_data (vlib_get_main (), - hicn_mapme_eventmgr_process_node.index, + hicn_mapme_eventmgr_process_node. + index, HICN_MAPME_EVENT_FACE_ADD, 1, sizeof (retx_t)); |