diff options
Diffstat (limited to 'hicn-plugin/src/faces/app')
-rw-r--r-- | hicn-plugin/src/faces/app/face_app_cli.c | 40 | ||||
-rw-r--r-- | hicn-plugin/src/faces/app/face_cons.c | 14 | ||||
-rw-r--r-- | hicn-plugin/src/faces/app/face_cons.h | 3 | ||||
-rw-r--r-- | hicn-plugin/src/faces/app/face_prod.c | 33 |
4 files changed, 60 insertions, 30 deletions
diff --git a/hicn-plugin/src/faces/app/face_app_cli.c b/hicn-plugin/src/faces/app/face_app_cli.c index 200f813cb..1e8eb6a5b 100644 --- a/hicn-plugin/src/faces/app/face_app_cli.c +++ b/hicn-plugin/src/faces/app/face_app_cli.c @@ -35,7 +35,8 @@ hicn_face_app_cli_set_command_fn (vlib_main_t * vm, { vnet_main_t *vnm = vnet_get_main (); fib_prefix_t prefix; - hicn_face_id_t face_id = HICN_FACE_NULL; + hicn_face_id_t face_id1 = HICN_FACE_NULL; + hicn_face_id_t face_id2 = HICN_FACE_NULL; u32 cs_reserved = HICN_PARAM_FACE_DFT_CS_RESERVED; int ret = HICN_ERROR_NONE; int sw_if; @@ -57,7 +58,7 @@ hicn_face_app_cli_set_command_fn (vlib_main_t * vm, face_op = HICN_FACE_DELETE; } else if (face_op == HICN_FACE_DELETE - && unformat (line_input, "id %d", &face_id)) + && unformat (line_input, "id %d", &face_id1)) ; else if (unformat (line_input, "add")) { @@ -95,13 +96,13 @@ hicn_face_app_cli_set_command_fn (vlib_main_t * vm, } } - if (face_id != HICN_FACE_NULL) + if (face_id1 != HICN_FACE_NULL) { - if (!hicn_dpoi_idx_is_valid (face_id)) + if (!hicn_dpoi_idx_is_valid (face_id1)) { - return clib_error_return (0, "%s, face_id %d not valid", - get_error_string (ret), face_id); + return clib_error_return (0, "%s, face_id1 %d not valid", + get_error_string (ret), face_id1); } } @@ -116,15 +117,18 @@ hicn_face_app_cli_set_command_fn (vlib_main_t * vm, if (prod) { - prefix.fp_proto = ip46_address_is_ip4(&prefix.fp_addr) ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6; + prefix.fp_proto = + ip46_address_is_ip4 (&prefix. + fp_addr) ? FIB_PROTOCOL_IP4 : + FIB_PROTOCOL_IP6; rv = - hicn_face_prod_add (&prefix, sw_if, &cs_reserved, - &prod_addr, &face_id); + hicn_face_prod_add (&prefix, sw_if, &cs_reserved, &prod_addr, + &face_id1); if (rv == HICN_ERROR_NONE) { u8 *sbuf = NULL; sbuf = - format (sbuf, "Face id: %d, producer address %U", face_id, + format (sbuf, "Face id: %d, producer address %U", face_id1, format_ip46_address, &prod_addr, 0 /*IP46_ANY_TYPE */ ); vlib_cli_output (vm, "%s", sbuf); @@ -137,13 +141,15 @@ hicn_face_app_cli_set_command_fn (vlib_main_t * vm, else { rv = - hicn_face_cons_add (&cons_addr4, &cons_addr6, sw_if, &face_id); + hicn_face_cons_add (&cons_addr4, &cons_addr6, sw_if, &face_id1, + &face_id2); if (rv == HICN_ERROR_NONE) { u8 *sbuf = NULL; sbuf = - format (sbuf, "Face id: %d, consumer addresses v4 %U v6 %U", - face_id, format_ip4_address, &cons_addr4, + format (sbuf, + "Face id: %d, address v4 %U, face id: %d address v6 %U", + face_id1, format_ip4_address, &cons_addr4, face_id2, format_ip6_address, &cons_addr6); vlib_cli_output (vm, "%s", sbuf); } @@ -156,15 +162,15 @@ hicn_face_app_cli_set_command_fn (vlib_main_t * vm, } case HICN_FACE_DELETE: { - hicn_face_t *face = hicn_dpoi_get_from_idx (face_id); + hicn_face_t *face = hicn_dpoi_get_from_idx (face_id1); if (face->shared.flags & HICN_FACE_FLAGS_APPFACE_CONS) - rv = hicn_face_cons_del (face_id); + rv = hicn_face_cons_del (face_id1); else - rv = hicn_face_prod_del (face_id); + rv = hicn_face_prod_del (face_id1); if (rv == HICN_ERROR_NONE) { - vlib_cli_output (vm, "Face %d deleted", face_id); + vlib_cli_output (vm, "Face %d deleted", face_id1); } else { diff --git a/hicn-plugin/src/faces/app/face_cons.c b/hicn-plugin/src/faces/app/face_cons.c index 8278b6ab3..f258da787 100644 --- a/hicn-plugin/src/faces/app/face_cons.c +++ b/hicn-plugin/src/faces/app/face_cons.c @@ -23,7 +23,8 @@ int hicn_face_cons_add (ip4_address_t * nh_addr4, ip6_address_t * nh_addr6, - u32 swif, hicn_face_id_t * faceid) + u32 swif, hicn_face_id_t * faceid1, + hicn_face_id_t * faceid2) { /* Create the corresponding appif if */ /* Retrieve a valid local ip address to assign to the appif */ @@ -56,9 +57,9 @@ 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, faceid); + hicn_iface_ip_add (&if_ip, &nh_addr, swif, faceid1); - hicn_face_t *face = hicn_dpoi_get_from_idx (*faceid); + hicn_face_t *face = hicn_dpoi_get_from_idx (*faceid1); face->shared.flags |= HICN_FACE_FLAGS_APPFACE_CONS; get_two_ip6_addresses (&(if_ip.ip6), nh_addr6); @@ -67,9 +68,9 @@ 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, faceid); + hicn_iface_ip_add (&if_ip, (ip46_address_t *) nh_addr6, swif, faceid2); - face = hicn_dpoi_get_from_idx (*faceid); + face = hicn_dpoi_get_from_idx (*faceid2); face->shared.flags |= HICN_FACE_FLAGS_APPFACE_CONS; return vnet_feature_enable_disable ("ip6-unicast", @@ -81,6 +82,9 @@ hicn_face_cons_add (ip4_address_t * nh_addr4, ip6_address_t * nh_addr6, int hicn_face_cons_del (hicn_face_id_t face_id) { + if (!hicn_dpoi_idx_is_valid (face_id)) + return HICN_ERROR_APPFACE_NOT_FOUND; + hicn_face_t *face = hicn_dpoi_get_from_idx (face_id); if (face->shared.flags & HICN_FACE_FLAGS_APPFACE_CONS) diff --git a/hicn-plugin/src/faces/app/face_cons.h b/hicn-plugin/src/faces/app/face_cons.h index 067b45a1f..5f8f5dde8 100644 --- a/hicn-plugin/src/faces/app/face_cons.h +++ b/hicn-plugin/src/faces/app/face_cons.h @@ -47,7 +47,8 @@ */ int hicn_face_cons_add (ip4_address_t * nh_addr4, ip6_address_t * nh_addr6, - u32 swif, hicn_face_id_t * faceid); + u32 swif, hicn_face_id_t * faceid1, + hicn_face_id_t * faceid2); /** * @brief Delete an existing consumer application face diff --git a/hicn-plugin/src/faces/app/face_prod.c b/hicn-plugin/src/faces/app/face_prod.c index 6c12e6d33..14e100adc 100644 --- a/hicn-plugin/src/faces/app/face_prod.c +++ b/hicn-plugin/src/faces/app/face_prod.c @@ -16,6 +16,7 @@ #include <vnet/ip/ip6_packet.h> #include <vlib/vlib.h> #include <vnet/vnet.h> +#include <vnet/interface_funcs.h> #include "face_prod.h" #include "address_mgr.h" @@ -53,8 +54,7 @@ hicn_app_state_create (u32 swif, fib_prefix_t * prefix) /* Create the appif and store in the vector */ vec_validate (face_state_vec, swif); - clib_memcpy (&(face_state_vec[swif].prefix), prefix, - sizeof (fib_prefix_t)); + clib_memcpy (&(face_state_vec[swif].prefix), prefix, sizeof (fib_prefix_t)); /* Set as busy the element in the vector */ pool_get (face_state_pool, swif_app); @@ -139,6 +139,12 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, { return HICN_ERROR_FWD_NOT_ENABLED; } + + if (vnet_get_sw_interface_or_null (vnm, sw_if) == NULL) + { + return HICN_ERROR_FACE_HW_INT_NOT_FOUND; + } + int ret = HICN_ERROR_NONE; hicn_face_t *face = NULL; @@ -146,8 +152,7 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, vnet_sw_interface_set_flags (vnm, sw_if, if_flags); u8 *s0; - s0 = format (0, "Prefix %U", format_fib_prefix, - prefix); + s0 = format (0, "Prefix %U", format_fib_prefix, prefix); vlib_cli_output (vm, "Received request for %s, swif %d\n", s0, sw_if); @@ -218,7 +223,8 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, 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); + hicn_face_ip_add (&local_app_ip, &remote_app_ip, sw_if, faceid, + HICN_FACE_FLAGS_APPFACE_PROD); } else { @@ -238,7 +244,8 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, 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); + 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); @@ -257,6 +264,7 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, 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; } @@ -283,13 +291,15 @@ hicn_face_prod_add (fib_prefix_t * prefix, u32 sw_if, u32 * cs_reserved, int hicn_face_prod_del (hicn_face_id_t face_id) { + if (!hicn_dpoi_idx_is_valid (face_id)) + return HICN_ERROR_APPFACE_NOT_FOUND; + hicn_face_t *face = hicn_dpoi_get_from_idx (face_id); if (face->shared.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_max += prod_face->policy.max; hicn_main.pitcs.pcs_app_count -= prod_face->policy.max; prod_face->policy.max = 0; @@ -297,6 +307,15 @@ hicn_face_prod_del (hicn_face_id_t face_id) hicn_route_del_nhop (&(face_state_vec[face->shared.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; |