From 2fba74798833331fe6312e8a764688a23918c14a Mon Sep 17 00:00:00 2001 From: Alberto Compagno Date: Tue, 7 Apr 2020 18:27:24 +0200 Subject: [HICN-591] Created new command "hicn enable " that enable hicn on a given prefix The changes include: - we use now a different vrf for the hicn routes. The default vrf (fib) contains every route, we sync the route we marked as hicn on the hicn vrf. In the vrf we use a custom dpo to implement the forwarding strategy. Change-Id: I399805eff8a62a5c41bf7b50831986a35bce4f76 Signed-off-by: Alberto Compagno --- hicn-plugin/src/hicn_api.c | 263 +++++---------------------------------------- 1 file changed, 24 insertions(+), 239 deletions(-) (limited to 'hicn-plugin/src/hicn_api.c') diff --git a/hicn-plugin/src/hicn_api.c b/hicn-plugin/src/hicn_api.c index 62fa55f47..841f0b604 100644 --- a/hicn-plugin/src/hicn_api.c +++ b/hicn-plugin/src/hicn_api.c @@ -137,114 +137,6 @@ vl_api_hicn_api_node_stats_get_t_handler (vl_api_hicn_api_node_stats_get_t * } -/****** FACE *******/ -/* static hicn_error_t */ -/* hicn_api_face_ip_add (vl_api_hicn_face_ip_t * mp, hicn_face_id_t * face_id) */ -/* { */ -/* hicn_error_t rv = HICN_ERROR_NONE; */ - -/* vnet_main_t *vnm = vnet_get_main (); */ - -/* ip46_address_t local_addr; */ -/* ip46_address_t remote_addr; */ -/* ip_address_decode (&mp->local_addr, &local_addr); */ -/* ip_address_decode (&mp->remote_addr, &remote_addr); */ - -/* u32 sw_if = clib_net_to_host_u32 (mp->swif); */ - -/* if (ip46_address_is_zero (&local_addr)) */ -/* { */ -/* if (!vnet_sw_interface_is_valid (vnm, sw_if)) */ -/* { */ -/* rv = HICN_ERROR_UNSPECIFIED; */ -/* } */ - -/* if ((rv == HICN_ERROR_NONE) && ip46_address_is_ip4 (&remote_addr)) */ -/* { */ -/* ip_interface_address_t *interface_address; */ -/* ip4_address_t *addr = */ -/* ip4_interface_address_matching_destination (&ip4_main, */ -/* &remote_addr.ip4, */ -/* sw_if, */ -/* &interface_address); */ -/* if (addr == NULL) */ -/* addr = ip4_interface_first_address (&ip4_main, */ -/* sw_if, &interface_address); */ - -/* if (addr == NULL) */ -/* rv = HICN_ERROR_UNSPECIFIED; */ -/* else */ -/* ip46_address_set_ip4 (&local_addr, addr); */ -/* } */ -/* else */ -/* { */ -/* ip_interface_address_t *interface_address; */ -/* ip6_interface_address_matching_destination (&ip6_main, */ -/* &remote_addr.ip6, sw_if, */ -/* &interface_address); */ -/* ip6_address_t *addr = NULL; */ -/* if (rv == HICN_ERROR_NONE && interface_address != NULL) */ -/* { */ -/* addr = */ -/* (ip6_address_t *) */ -/* ip_interface_address_get_address (&ip6_main.lookup_main, */ -/* interface_address); */ -/* } */ -/* else */ -/* { */ -/* addr = ip6_interface_first_address (&ip6_main, sw_if); */ -/* } */ - -/* if (addr == NULL) */ -/* rv = HICN_ERROR_UNSPECIFIED; */ -/* else */ -/* ip46_address_set_ip6 (&local_addr, addr); */ -/* } */ -/* } */ - -/* if (rv == HICN_ERROR_NONE) */ -/* rv = hicn_face_ip_add (&local_addr, &remote_addr, sw_if, face_id, 0); */ - -/* return rv; */ -/* } */ - -/* static void */ -/* vl_api_hicn_api_face_ip_add_t_handler (vl_api_hicn_api_face_ip_add_t * mp) */ -/* { */ -/* vl_api_hicn_api_face_ip_add_reply_t *rmp; */ -/* hicn_error_t rv = HICN_ERROR_NONE; */ - -/* hicn_main_t *sm = &hicn_main; */ -/* hicn_face_id_t face_id = HICN_FACE_NULL; */ -/* rv = hicn_api_face_ip_add (&(mp->face), &face_id); */ - -/* /\* *INDENT-OFF* *\/ */ -/* REPLY_MACRO2 (VL_API_HICN_API_FACE_IP_ADD_REPLY /\* , rmp, mp, rv *\/ ,( */ -/* { */ -/* rmp->faceid = clib_host_to_net_u32 ((u32) face_id); */ -/* rmp->retval = rv; */ -/* })); */ -/* /\* *INDENT-ON* *\/ */ -/* } */ - -/* static void */ -/* vl_api_hicn_api_face_ip_del_t_handler (vl_api_hicn_api_face_ip_del_t * mp) */ -/* { */ -/* vl_api_hicn_api_face_ip_del_reply_t *rmp; */ -/* int rv = HICN_ERROR_FACE_NOT_FOUND; */ - -/* hicn_main_t *sm = &hicn_main; */ - -/* hicn_face_id_t faceid = clib_net_to_host_u32 (mp->faceid); */ -/* if (hicn_dpoi_idx_is_valid (faceid)) */ -/* { */ -/* rv = hicn_face_ip_del (faceid); */ -/* } */ - -/* REPLY_MACRO (VL_API_HICN_API_FACE_IP_DEL_REPLY /\* , rmp, mp, rv *\/ ); */ - -/* } */ - static void vl_api_hicn_api_face_params_get_t_handler (vl_api_hicn_api_face_params_get_t * mp) @@ -265,93 +157,6 @@ static void /* *INDENT-ON* */ } -/* static hicn_error_t */ -/* hicn_api_face_udp_add (vl_api_hicn_face_udp_t * mp, hicn_face_id_t * face_id) */ -/* { */ -/* hicn_error_t rv = HICN_ERROR_NONE; */ - -/* ip46_address_t local_addr = ip46_address_initializer; */ -/* ip46_address_t remote_addr = ip46_address_initializer; */ -/* u16 lport; */ -/* u16 rport; */ -/* u32 sw_if; */ -/* ip_address_decode (&mp->local_addr, &local_addr); */ -/* ip_address_decode (&mp->remote_addr, &remote_addr); */ -/* //Do not byteswap. We store ports in network order */ -/* lport = mp->lport; */ -/* rport = mp->rport; */ -/* sw_if = clib_net_to_host_u32 (mp->swif); */ - -/* int input_is_ok = !ip46_address_is_zero (&local_addr) */ -/* && !ip46_address_is_zero (&remote_addr) */ -/* && */ -/* ((ip46_address_is_ip4 (&local_addr) && ip46_address_is_ip4 (&remote_addr)) */ -/* || (!ip46_address_is_ip4 (&local_addr) */ -/* && !ip46_address_is_ip4 (&remote_addr))) && lport != 0 && rport != 0; */ - -/* if (!input_is_ok) */ -/* { */ -/* rv = HICN_ERROR_UNSPECIFIED; */ -/* } */ -/* else */ -/* { */ -/* rv = hicn_face_udp_add (&local_addr, */ -/* &remote_addr, lport, rport, sw_if, face_id); */ -/* } */ -/* return rv; */ -/* } */ - -/* static void */ -/* vl_api_hicn_api_face_add_t_handler (vl_api_hicn_api_face_add_t * mp) */ -/* { */ -/* vl_api_hicn_api_face_add_reply_t *rmp; */ -/* hicn_error_t rv = HICN_ERROR_NONE; */ - -/* hicn_main_t *sm = &hicn_main; */ -/* hicn_face_id_t face_id; */ -/* vl_api_hicn_face_type_t face_type = clib_net_to_host_u32 (mp->type); */ - -/* switch (face_type) */ -/* { */ -/* case IP_FACE: */ -/* rv = hicn_api_face_ip_add (&(mp->face.ip), &face_id); */ -/* break; */ -/* case UDP_FACE: */ -/* rv = hicn_api_face_udp_add (&(mp->face.udp), &face_id); */ -/* break; */ -/* default: */ -/* rv = HICN_ERROR_UNSPECIFIED; */ -/* break; */ -/* } */ - -/* /\* *INDENT-OFF* *\/ */ -/* REPLY_MACRO2 (VL_API_HICN_API_FACE_ADD_REPLY /\* , rmp, mp, rv *\/ ,( */ -/* { */ -/* rmp->faceid = clib_host_to_net_u32 ((u32) face_id); */ -/* rmp->retval = clib_host_to_net_u32 (rv); */ -/* })); */ -/* /\* *INDENT-ON* *\/ */ -/* } */ - -/* static void */ -/* vl_api_hicn_api_face_del_t_handler (vl_api_hicn_api_face_del_t * mp) */ -/* { */ -/* vl_api_hicn_api_face_del_reply_t *rmp; */ -/* int rv = HICN_ERROR_FACE_NOT_FOUND; */ - -/* hicn_main_t *sm = &hicn_main; */ - -/* hicn_face_id_t faceid = clib_net_to_host_u32 (mp->faceid); */ -/* if (hicn_dpoi_idx_is_valid (faceid)) */ -/* { */ -/* hicn_face_t *face = hicn_dpoi_get_from_idx (faceid); */ -/* hicn_face_vft_t *vft = hicn_face_get_vft (face->shared.face_type); */ -/* rv = vft->hicn_face_del (faceid); */ -/* } */ - -/* REPLY_MACRO (VL_API_HICN_API_FACE_DEL_REPLY /\* , rmp, mp, rv *\/ ); */ -/* } */ - static void send_face_details (hicn_face_t * face, vl_api_hicn_face_t * mp) { @@ -371,50 +176,6 @@ send_face_details (hicn_face_t * face, vl_api_hicn_face_t * mp) } } -/* static void */ -/* send_face_udp_details (hicn_face_t * face, vl_api_hicn_face_udp_t * mp) */ -/* { */ -/* vnet_main_t *vnm = vnet_get_main (); */ -/* hicn_face_udp_t *face_udp = (hicn_face_udp_t *) face->data; */ -/* if (face_udp->hdrs.ip4.ip.ip_version_and_header_length == 0x45) */ -/* { */ -/* ip46_address_t src_addr = { 0 }; */ -/* ip46_address_t dst_addr = { 0 }; */ -/* ip46_address_set_ip4 (&src_addr, &(face_udp->hdrs.ip4.ip.src_address)); */ -/* ip46_address_set_ip4 (&dst_addr, &(face_udp->hdrs.ip4.ip.dst_address)); */ - -/* ip_address_encode (&src_addr, IP46_TYPE_ANY, &(mp->local_addr)); */ -/* ip_address_encode (&dst_addr, IP46_TYPE_ANY, &(mp->remote_addr)); */ -/* //Do not swap, they are already in network order */ -/* mp->lport = face_udp->hdrs.ip4.udp.src_port; */ -/* mp->rport = face_udp->hdrs.ip4.udp.dst_port; */ -/* } */ -/* else */ -/* { */ -/* ip46_address_t src_addr = { 0 }; */ -/* ip46_address_t dst_addr = { 0 }; */ -/* ip46_address_set_ip6 (&src_addr, &(face_udp->hdrs.ip6.ip.src_address)); */ -/* ip46_address_set_ip6 (&dst_addr, &(face_udp->hdrs.ip6.ip.dst_address)); */ - -/* ip_address_encode (&src_addr, IP46_TYPE_ANY, &(mp->local_addr)); */ -/* ip_address_encode (&dst_addr, IP46_TYPE_ANY, &(mp->remote_addr)); */ -/* //Do not swap, they are already in network order */ -/* mp->lport = face_udp->hdrs.ip6.udp.src_port; */ -/* mp->rport = face_udp->hdrs.ip6.udp.dst_port; */ -/* } */ -/* mp->flags = clib_host_to_net_u32 (face->shared.flags); */ -/* mp->swif = clib_net_to_host_u32 (face->shared.sw_if); */ -/* vnet_sw_interface_t *sw_interface = */ -/* vnet_get_sw_interface_or_null (vnm, face->shared.sw_if); */ -/* u8 *sbuf = 0; */ -/* if (sw_interface != NULL) */ -/* { */ -/* sbuf = */ -/* format (0, "%U", format_vnet_sw_interface_name, vnm, sw_interface); */ -/* strcpy ((char *) (mp->if_name), (char *) sbuf); */ -/* } */ -/* } */ - static void send_faces_details (vl_api_registration_t * reg, hicn_face_t * face, u32 context) @@ -899,6 +660,30 @@ vl_api_hicn_api_face_cons_del_t_handler (vl_api_hicn_api_face_cons_del_t * mp) REPLY_MACRO (VL_API_HICN_API_FACE_CONS_DEL_REPLY /* , rmp, mp, rv */ ); } +static void vl_api_hicn_api_enable_disable_t_handler +(vl_api_hicn_api_enable_disable_t * mp) +{ + vl_api_hicn_api_enable_disable_reply_t *rmp; + int rv = HICN_ERROR_NONE; + + hicn_main_t *sm = &hicn_main; + + fib_prefix_t prefix; + ip_prefix_decode (&mp->prefix, &prefix); + + switch (clib_net_to_host_u32(mp->enable_disable)) + { + case HICN_ENABLE: + rv = hicn_route_enable(&prefix); + break; + case HICN_DISABLE: + rv = hicn_route_disable(&prefix); + break; + } + + REPLY_MACRO (VL_API_HICN_API_ENABLE_DISABLE_REPLY/* , rmp, mp, rv */ ); +} + /************************************************************************************/ -- cgit 1.2.3-korg