diff options
author | Alberto Compagno <acompagn+fdio@cisco.com> | 2020-04-07 11:43:39 +0200 |
---|---|---|
committer | Alberto Compagno <acompagn+fdio@cisco.com> | 2020-05-04 11:16:59 +0200 |
commit | c61e2e149421b849888bea0239c50607edce35ac (patch) | |
tree | f1191d338c9e27c77484c0d8bed6118c6d4612b6 /hicn-plugin/src/faces/app | |
parent | dee66271e7f84cb756dae31d154982d5b6bb9807 (diff) |
[HICN-590] Removed andjacency type specific face implementation
Changes in the new implementation are:
- the adjacency index is replaced with a dpo that allows the single face node
to dispatch the packet to the right vlib node.
- local and remote address in the face are replaced with a single nat address
which is used to perform the nat operation when rewriting an interest or a
data (in case of tunnels the nat address will be equal to 0)
- the list of next hop in the load balance is no longer a list of dpos but
a list of face id (this makes the code easier and increases the number of
next hop we supports)
Signed-off-by: Alberto Compagno <acompagn+fdio@cisco.com>
Change-Id: I4ac2b4eb09425bfe1b3ca9f82d7d0ff564297b0d
Diffstat (limited to 'hicn-plugin/src/faces/app')
-rw-r--r-- | hicn-plugin/src/faces/app/address_mgr.c | 20 | ||||
-rw-r--r-- | hicn-plugin/src/faces/app/face_app_cli.c | 7 | ||||
-rw-r--r-- | hicn-plugin/src/faces/app/face_cons.c | 14 | ||||
-rw-r--r-- | hicn-plugin/src/faces/app/face_prod.c | 176 | ||||
-rw-r--r-- | hicn-plugin/src/faces/app/face_prod.h | 13 | ||||
-rw-r--r-- | hicn-plugin/src/faces/app/face_prod_node.c | 6 |
6 files changed, 79 insertions, 157 deletions
diff --git a/hicn-plugin/src/faces/app/address_mgr.c b/hicn-plugin/src/faces/app/address_mgr.c index 1674379c4..2d5894ab8 100644 --- a/hicn-plugin/src/faces/app/address_mgr.c +++ b/hicn-plugin/src/faces/app/address_mgr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. + * Copyright (c) 2017-2020 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. * You may obtain a copy of the License at: @@ -36,7 +36,6 @@ #include "../../infra.h" #include "../../error.h" #include "../face.h" -#include "../ip/face_ip.h" #include "../../strategy_dpo_ctx.h" #include "../../route.h" @@ -134,26 +133,25 @@ get_two_ip6_addresses (ip6_address_t * appif_addr, ip6_address_t * nh_addr) fib_pfx.fp_proto = FIB_PROTOCOL_IP6; fib_pfx.fp_len = ADDR_MGR_IP6_LEN; + + fib_index = fib_table_find (fib_pfx.fp_proto, 0); + /* At this point the face exists in the face table */ do { /* Check if the route already exist in the fib */ fib_pfx.fp_addr = to_ip46 ( /* is_v6 */ 1, appif_addr->as_u8); - fib_index = fib_table_find_or_create_and_lock (fib_pfx.fp_proto, - HICN_FIB_TABLE, - FIB_SOURCE_PRIORITY_HI); + fib_entry_index = fib_table_lookup_exact_match (fib_index, &fib_pfx); - fib_table_unlock (fib_index, fib_pfx.fp_proto, FIB_SOURCE_PRIORITY_HI); + //fib_table_unlock (fib_index, fib_pfx.fp_proto, FIB_SOURCE_PRIORITY_HI); if (fib_entry_index != FIB_NODE_INDEX_INVALID) { fib_pfx.fp_addr = to_ip46 ( /* is_v6 */ 0, nh_addr->as_u8); - fib_index = fib_table_find_or_create_and_lock (fib_pfx.fp_proto, - HICN_FIB_TABLE, - FIB_SOURCE_PRIORITY_HI); + fib_entry_index = fib_table_lookup_exact_match (fib_index, &fib_pfx); - fib_table_unlock (fib_index, fib_pfx.fp_proto, - FIB_SOURCE_PRIORITY_HI); + // fib_table_unlock (fib_index, fib_pfx.fp_proto, + // FIB_SOURCE_PRIORITY_HI); } if (fib_entry_index != FIB_NODE_INDEX_INVALID) { diff --git a/hicn-plugin/src/faces/app/face_app_cli.c b/hicn-plugin/src/faces/app/face_app_cli.c index 1e8eb6a5b..1aa27adc7 100644 --- a/hicn-plugin/src/faces/app/face_app_cli.c +++ b/hicn-plugin/src/faces/app/face_app_cli.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. + * Copyright (c) 2017-2020 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. * You may obtain a copy of the License at: @@ -18,8 +18,7 @@ #include <vlib/vlib.h> #include <vnet/ip/ip6_packet.h> -#include "../ip/face_ip.h" -#include "../ip/dpo_ip.h" +//#include "../face_dpo.h" #include "../face.h" #include "face_prod.h" #include "face_cons.h" @@ -164,7 +163,7 @@ hicn_face_app_cli_set_command_fn (vlib_main_t * vm, { hicn_face_t *face = hicn_dpoi_get_from_idx (face_id1); - if (face->shared.flags & HICN_FACE_FLAGS_APPFACE_CONS) + if (face->flags & HICN_FACE_FLAGS_APPFACE_CONS) rv = hicn_face_cons_del (face_id1); else rv = hicn_face_prod_del (face_id1); diff --git a/hicn-plugin/src/faces/app/face_cons.c b/hicn-plugin/src/faces/app/face_cons.c index e51201c21..3cd3da78c 100644 --- a/hicn-plugin/src/faces/app/face_cons.c +++ b/hicn-plugin/src/faces/app/face_cons.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. + * Copyright (c) 2017-2020 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. * You may obtain a copy of the License at: @@ -57,10 +57,10 @@ hicn_face_cons_add (ip4_address_t * nh_addr4, ip6_address_t * nh_addr6, ip46_address_t nh_addr = to_ip46 (0, (u8 *) nh_addr4); - hicn_iface_ip_add (&if_ip, &nh_addr, swif, faceid1); + hicn_iface_add (&nh_addr, swif, faceid1, DPO_PROTO_IP4); hicn_face_t *face = hicn_dpoi_get_from_idx (*faceid1); - face->shared.flags |= HICN_FACE_FLAGS_APPFACE_CONS; + face->flags |= HICN_FACE_FLAGS_APPFACE_CONS; get_two_ip6_addresses (&(if_ip.ip6), nh_addr6); ip6_add_del_interface_address (vm, @@ -68,10 +68,10 @@ hicn_face_cons_add (ip4_address_t * nh_addr4, ip6_address_t * nh_addr6, &(if_ip.ip6), ADDR_MGR_IP6_CONS_LEN, 0 /* is_del */ ); - hicn_iface_ip_add (&if_ip, (ip46_address_t *) nh_addr6, swif, faceid2); + hicn_iface_add ((ip46_address_t *) nh_addr6, swif, faceid2, DPO_PROTO_IP6); face = hicn_dpoi_get_from_idx (*faceid2); - face->shared.flags |= HICN_FACE_FLAGS_APPFACE_CONS; + face->flags |= HICN_FACE_FLAGS_APPFACE_CONS; return HICN_ERROR_NONE; } @@ -84,9 +84,9 @@ hicn_face_cons_del (hicn_face_id_t face_id) hicn_face_t *face = hicn_dpoi_get_from_idx (face_id); - if (face->shared.flags & HICN_FACE_FLAGS_APPFACE_CONS) + if (face->flags & HICN_FACE_FLAGS_APPFACE_CONS) { - return hicn_face_ip_del (face_id); + return hicn_face_del (face_id); } else { diff --git a/hicn-plugin/src/faces/app/face_prod.c b/hicn-plugin/src/faces/app/face_prod.c index ae59719ce..5aed8c11e 100644 --- a/hicn-plugin/src/faces/app/face_prod.c +++ b/hicn-plugin/src/faces/app/face_prod.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. + * Copyright (c) 2017-2020 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. * You may obtain a copy of the License at: @@ -98,10 +98,11 @@ hicn_app_state_del (u32 swif) ); /* *INDENT-ON* */ - prefix = &(face_state_vec[swif].prefix); if (!found) return HICN_ERROR_APPFACE_NOT_FOUND; + prefix = &(face_state_vec[swif].prefix); + int ret = HICN_ERROR_NONE; if (ip46_address_is_ip4 (&prefix->fp_addr)) { @@ -132,7 +133,7 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, hicn_main_t *hm = &hicn_main; ip46_address_t local_app_ip; - ip46_address_t remote_app_ip; + CLIB_UNUSED(ip46_address_t remote_app_ip); u32 if_flags = 0; if (!hm->is_enabled) @@ -164,24 +165,12 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, * Check if a producer face is already existing for the same prefix * and sw_if */ - if (ip46_address_is_ip4 (&prefix->fp_addr)) - { - face = - hicn_face_ip4_get (&(prefix->fp_addr.ip4), sw_if, - &hicn_face_ip_remote_hashtb); - } - else - { - face = - hicn_face_ip6_get (&(prefix->fp_addr.ip6), sw_if, - &hicn_face_ip_remote_hashtb); - if (face != NULL) - return HICN_ERROR_FACE_ALREADY_CREATED; - } + face = hicn_face_get (&(prefix->fp_addr), sw_if, + &hicn_face_hashtb); if (face != NULL) { - if (!(face->shared.flags & HICN_FACE_FLAGS_DELETED)) + if (!(face->flags & HICN_FACE_FLAGS_DELETED)) return HICN_ERROR_FACE_ALREADY_CREATED; /* @@ -189,19 +178,17 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, * producer's prefix. */ /* It should never happens, this is a safety check. */ - if (face->shared.flags & HICN_FACE_FLAGS_APPFACE_CONS) + if (face->flags & HICN_FACE_FLAGS_APPFACE_CONS) return HICN_ERROR_FACE_ALREADY_CREATED; /* If the face exists but is marked as deleted, undelete it */ - if (face->shared.flags & HICN_FACE_FLAGS_DELETED) + if (face->flags & HICN_FACE_FLAGS_DELETED) { /* * remove the deleted flag and retrieve the face * local addr */ - face->shared.flags &= HICN_FACE_FLAGS_DELETED; - hicn_face_prod_t *prod_face = (hicn_face_prod_t *) face->data; - local_app_ip = prod_face->ip_face.local_addr; + face->flags &= HICN_FACE_FLAGS_DELETED; } } else @@ -221,10 +208,6 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, &local_app_ip4, 31, 0 /* is_del */ ); local_app_ip = to_ip46 ( /* isv6 */ 0, local_app_ip4.as_u8); remote_app_ip = to_ip46 ( /* isv6 */ 0, remote_app_ip4.as_u8); - - ret = - hicn_face_ip_add (&local_app_ip, &remote_app_ip, sw_if, faceid, - HICN_FACE_FLAGS_APPFACE_PROD); } else { @@ -242,41 +225,29 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, 0 /* is_del */ ); local_app_ip = to_ip46 ( /* isv6 */ 1, local_app_ip6.as_u8); remote_app_ip = to_ip46 ( /* isv6 */ 1, remote_app_ip6.as_u8); - - ret = - hicn_face_ip_add (&local_app_ip, &remote_app_ip, sw_if, faceid, - HICN_FACE_FLAGS_APPFACE_PROD); } - - face = hicn_dpoi_get_from_idx (*faceid); - - face->shared.flags |= HICN_FACE_FLAGS_APPFACE_PROD; - - hicn_face_prod_t *prod_face = (hicn_face_prod_t *) face->data; - - /* - * For the moment we keep them here although it would be good - * to create a different face for appface - */ - prod_face->policy_vft.hicn_cs_insert = hicn_cs_lru.hicn_cs_insert; - prod_face->policy_vft.hicn_cs_update = hicn_cs_lru.hicn_cs_update; - prod_face->policy_vft.hicn_cs_dequeue = hicn_cs_lru.hicn_cs_dequeue; - prod_face->policy_vft.hicn_cs_delete_get = - hicn_cs_lru.hicn_cs_delete_get; - prod_face->policy_vft.hicn_cs_trim = hicn_cs_lru.hicn_cs_trim; - prod_face->policy_vft.hicn_cs_flush = hicn_cs_lru.hicn_cs_flush; - } - if (ret == HICN_ERROR_NONE - && hicn_face_prod_set_lru_max (*faceid, cs_reserved) == HICN_ERROR_NONE) + if (ret == HICN_ERROR_NONE) + // && hicn_face_prod_set_lru_max (*faceid, cs_reserved) == HICN_ERROR_NONE) { + fib_route_path_t rpath = {0}; + fib_route_path_t * rpaths = NULL; + if (ip46_address_is_ip4(&(prefix->fp_addr))) { ip4_address_t mask; ip4_preflen_to_mask (prefix->fp_len, &mask); prefix->fp_addr.ip4.as_u32 = prefix->fp_addr.ip4.as_u32 & mask.as_u32; prefix->fp_proto = FIB_PROTOCOL_IP4; + + rpath.frp_weight = 1; + rpath.frp_sw_if_index = ~0; + rpath.frp_addr.ip4.as_u32 = remote_app_ip.ip4.as_u32; + rpath.frp_sw_if_index = sw_if; + rpath.frp_proto = DPO_PROTO_IP4; + + vec_add1 (rpaths, rpath); } else { @@ -287,21 +258,40 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, prefix->fp_addr.ip6.as_u64[1] = prefix->fp_addr.ip6.as_u64[1] & mask.as_u64[1]; prefix->fp_proto = FIB_PROTOCOL_IP6; + + rpath.frp_weight = 1; + rpath.frp_sw_if_index = ~0; + rpath.frp_addr.ip6.as_u64[0] = remote_app_ip.ip6.as_u64[0]; + rpath.frp_addr.ip6.as_u64[1] = remote_app_ip.ip6.as_u64[1]; + rpath.frp_sw_if_index = sw_if; + rpath.frp_proto = DPO_PROTO_IP6; + + vec_add1 (rpaths, rpath); } + u32 fib_index = fib_table_find (prefix->fp_proto, 0); + fib_table_entry_path_add2 (fib_index, + prefix, + FIB_SOURCE_CLI, + FIB_ENTRY_FLAG_NONE, rpaths); + hicn_app_state_create (sw_if, prefix); - ret = hicn_route_add (faceid, 1, prefix); } + face = hicn_face_get(&local_app_ip, sw_if, &hicn_face_hashtb);//HICN_FACE_FLAGS_APPFACE_PROD); + + *faceid = hicn_dpoi_get_index (face); + + face->flags |= HICN_FACE_FLAGS_APPFACE_PROD; + + hicn_face_unlock_with_id(*faceid); + *prod_addr = local_app_ip; /* Cleanup in case of something went wrong. */ if (ret) { hicn_app_state_del (sw_if); - - if (*faceid != HICN_FACE_NULL) - hicn_face_ip_del (*faceid); } return ret; } @@ -314,88 +304,32 @@ hicn_face_prod_del (hicn_face_id_t face_id) hicn_face_t *face = hicn_dpoi_get_from_idx (face_id); - if (face->shared.flags & HICN_FACE_FLAGS_APPFACE_PROD) + if (face->flags & HICN_FACE_FLAGS_APPFACE_PROD) { - hicn_face_prod_t *prod_face = (hicn_face_prod_t *) face->data; - /* Free the CS reserved for the face */ - hicn_main.pitcs.pcs_app_count -= prod_face->policy.max; - prod_face->policy.max = 0; - /* Remove the face from the fib */ - hicn_route_del_nhop (&(face_state_vec[face->shared.sw_if].prefix), - face_id); + //hicn_route_del_nhop (&(face_state_vec[face->sw_if].prefix), + // face_id); - /* - * Delete the content in the CS before deleting the face. - * Mandatory to prevent hitting the CS and not having the lru list - * due to a early deletion of the face. - */ - vlib_main_t *vm = vlib_get_main (); - prod_face->policy_vft.hicn_cs_flush (vm, &(hicn_main.pitcs), - &(prod_face->policy)); - - int ret = hicn_face_ip_del (face_id); - return ret == - HICN_ERROR_NONE ? hicn_app_state_del (face->shared.sw_if) : ret; + //int ret = hicn_face_del (face_id); + return hicn_app_state_del (face->sw_if); + //ret == HICN_ERROR_NONE ? hicn_app_state_del (face->sw_if) : ret; } else { return HICN_ERROR_APPFACE_NOT_FOUND; } -} -int -hicn_face_prod_set_lru_max (hicn_face_id_t face_id, u32 * requested_size) -{ - int ret = HICN_ERROR_NONE; - vlib_main_t *vm = vlib_get_main (); - hicn_face_t *face; - hicn_face_prod_t *face_prod; - - if (!hicn_infra_fwdr_initialized) - { - ret = HICN_ERROR_FWD_NOT_ENABLED; - vlib_cli_output (vm, "hicn: %s\n", get_error_string (ret)); - return ret; - } - face = hicn_dpoi_get_from_idx (face_id); - face_prod = (hicn_face_prod_t *) face->data; - - if (face == NULL) - return HICN_ERROR_FACE_NOT_FOUND; - - if (*requested_size > HICN_PARAM_FACE_MAX_CS_RESERVED) - *requested_size = HICN_PARAM_FACE_MAX_CS_RESERVED; - - uint32_t available = - hicn_main.pitcs.pcs_app_max - hicn_main.pitcs.pcs_app_count; - - if (*requested_size > available) - *requested_size = available; - - face_prod->policy.max = *requested_size; - face_prod->policy.count = 0; - face_prod->policy.head = face_prod->policy.tail = 0; - - hicn_main.pitcs.pcs_app_count += *requested_size; - - return ret; + return HICN_ERROR_NONE; } u8 * format_hicn_face_prod (u8 * s, va_list * args) { - index_t index = va_arg (*args, index_t); + CLIB_UNUSED (index_t index) = va_arg (*args, index_t); CLIB_UNUSED (u32 indent) = va_arg (*args, u32); - hicn_face_t *face; - hicn_face_prod_t *prod_face; - - face = hicn_dpoi_get_from_idx (index); - prod_face = (hicn_face_prod_t *) face->data; s = - format (s, " (producer face: CS size %d, data cached %d)", - prod_face->policy.max, prod_face->policy.count); + format (s, " (producer)"); return s; } diff --git a/hicn-plugin/src/faces/app/face_prod.h b/hicn-plugin/src/faces/app/face_prod.h index 33e2a4199..4cb2e3fbf 100644 --- a/hicn-plugin/src/faces/app/face_prod.h +++ b/hicn-plugin/src/faces/app/face_prod.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. + * Copyright (c) 2017-2020 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. * You may obtain a copy of the License at: @@ -17,7 +17,7 @@ #define _FACE_PRODUCER_H_ #include "../../cache_policies/cs_policy.h" -#include "../ip/face_ip.h" +#include "../face.h" /** * @file @@ -56,15 +56,6 @@ extern hicn_face_prod_state_t *face_state_vec; #define DEFAULT_PROBING_PORT 3784 -typedef struct __attribute__ ((packed)) hicn_face_prod_t_ -{ - hicn_face_ip_t ip_face; - - hicn_cs_policy_t policy; - hicn_cs_policy_vft_t policy_vft; - -} hicn_face_prod_t; - /** * @brief Add a new producer application face * diff --git a/hicn-plugin/src/faces/app/face_prod_node.c b/hicn-plugin/src/faces/app/face_prod_node.c index 0ef25fe94..80c3e124c 100644 --- a/hicn-plugin/src/faces/app/face_prod_node.c +++ b/hicn-plugin/src/faces/app/face_prod_node.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. + * Copyright (c) 2017-2020 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. * You may obtain a copy of the License at: @@ -300,8 +300,8 @@ VLIB_REGISTER_NODE(hicn_face_prod_input_node) = .n_next_nodes = HICN_FACE_PROD_N_NEXT, .next_nodes = { - [HICN_FACE_PROD_NEXT_DATA_IP4] = "hicn-face-ip4-input", - [HICN_FACE_PROD_NEXT_DATA_IP6] = "hicn-face-ip6-input", + [HICN_FACE_PROD_NEXT_DATA_IP4] = "hicn4-face-input", + [HICN_FACE_PROD_NEXT_DATA_IP6] = "hicn6-face-input", [HICN_FACE_PROD_NEXT_ERROR_DROP] = "error-drop", }, }; |