diff options
Diffstat (limited to 'src/plugins/linux-cp/lcp_api.c')
-rw-r--r-- | src/plugins/linux-cp/lcp_api.c | 142 |
1 files changed, 97 insertions, 45 deletions
diff --git a/src/plugins/linux-cp/lcp_api.c b/src/plugins/linux-cp/lcp_api.c index 7f77bf71f1d..74421230e9d 100644 --- a/src/plugins/linux-cp/lcp_api.c +++ b/src/plugins/linux-cp/lcp_api.c @@ -45,7 +45,7 @@ static int vl_api_lcp_itf_pair_add (u32 phy_sw_if_index, lip_host_type_t lip_host_type, u8 *mp_host_if_name, size_t sizeof_host_if_name, u8 *mp_namespace, size_t sizeof_mp_namespace, - u32 *host_sw_if_index_p) + u32 *host_sw_if_index_p, u32 *vif_index_p) { u8 *host_if_name, *netns; int host_len, netns_len, rv; @@ -64,6 +64,13 @@ vl_api_lcp_itf_pair_add (u32 phy_sw_if_index, lip_host_type_t lip_host_type, rv = lcp_itf_pair_create (phy_sw_if_index, host_if_name, lip_host_type, netns, host_sw_if_index_p); + if (!rv && (vif_index_p != NULL)) + { + lcp_itf_pair_t *pair = + lcp_itf_pair_get (lcp_itf_pair_find_by_phy (phy_sw_if_index)); + *vif_index_p = pair->lip_vif_index; + } + vec_free (host_if_name); vec_free (netns); @@ -78,20 +85,15 @@ vl_api_lcp_itf_pair_add_del_t_handler (vl_api_lcp_itf_pair_add_del_t *mp) lip_host_type_t lip_host_type; int rv; - if (!vnet_sw_if_index_is_api_valid (mp->sw_if_index)) - { - rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; - goto bad_sw_if_index; - } + VALIDATE_SW_IF_INDEX_END (mp); phy_sw_if_index = mp->sw_if_index; lip_host_type = api_decode_host_type (mp->host_if_type); if (mp->is_add) { - rv = - vl_api_lcp_itf_pair_add (phy_sw_if_index, lip_host_type, - mp->host_if_name, sizeof (mp->host_if_name), - mp->namespace, sizeof (mp->namespace), NULL); + rv = vl_api_lcp_itf_pair_add ( + phy_sw_if_index, lip_host_type, mp->host_if_name, + sizeof (mp->host_if_name), mp->netns, sizeof (mp->netns), NULL, NULL); } else { @@ -99,7 +101,7 @@ vl_api_lcp_itf_pair_add_del_t_handler (vl_api_lcp_itf_pair_add_del_t *mp) } BAD_SW_IF_INDEX_LABEL; - REPLY_MACRO (VL_API_LCP_ITF_PAIR_ADD_DEL_REPLY); + REPLY_MACRO_END (VL_API_LCP_ITF_PAIR_ADD_DEL_REPLY); } static void @@ -110,20 +112,45 @@ vl_api_lcp_itf_pair_add_del_v2_t_handler (vl_api_lcp_itf_pair_add_del_v2_t *mp) lip_host_type_t lip_host_type; int rv; - if (!vnet_sw_if_index_is_api_valid (mp->sw_if_index)) + VALIDATE_SW_IF_INDEX_END (mp); + + phy_sw_if_index = mp->sw_if_index; + lip_host_type = api_decode_host_type (mp->host_if_type); + if (mp->is_add) { - rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; - goto bad_sw_if_index; + rv = vl_api_lcp_itf_pair_add ( + phy_sw_if_index, lip_host_type, mp->host_if_name, + sizeof (mp->host_if_name), mp->netns, sizeof (mp->netns), + &host_sw_if_index, NULL); } + else + { + rv = lcp_itf_pair_delete (phy_sw_if_index); + } + + BAD_SW_IF_INDEX_LABEL; + REPLY_MACRO2_END (VL_API_LCP_ITF_PAIR_ADD_DEL_V2_REPLY, + { rmp->host_sw_if_index = host_sw_if_index; }); +} + +static void +vl_api_lcp_itf_pair_add_del_v3_t_handler (vl_api_lcp_itf_pair_add_del_v3_t *mp) +{ + u32 phy_sw_if_index, host_sw_if_index = ~0, vif_index = ~0; + vl_api_lcp_itf_pair_add_del_v3_reply_t *rmp; + lip_host_type_t lip_host_type; + int rv; + + VALIDATE_SW_IF_INDEX_END (mp); phy_sw_if_index = mp->sw_if_index; lip_host_type = api_decode_host_type (mp->host_if_type); if (mp->is_add) { - rv = vl_api_lcp_itf_pair_add (phy_sw_if_index, lip_host_type, - mp->host_if_name, - sizeof (mp->host_if_name), mp->namespace, - sizeof (mp->namespace), &host_sw_if_index); + rv = vl_api_lcp_itf_pair_add ( + phy_sw_if_index, lip_host_type, mp->host_if_name, + sizeof (mp->host_if_name), mp->netns, sizeof (mp->netns), + &host_sw_if_index, &vif_index); } else { @@ -131,8 +158,10 @@ vl_api_lcp_itf_pair_add_del_v2_t_handler (vl_api_lcp_itf_pair_add_del_v2_t *mp) } BAD_SW_IF_INDEX_LABEL; - REPLY_MACRO2 (VL_API_LCP_ITF_PAIR_ADD_DEL_V2_REPLY, - { rmp->host_sw_if_index = ntohl (host_sw_if_index); }); + REPLY_MACRO2_END (VL_API_LCP_ITF_PAIR_ADD_DEL_V3_REPLY, ({ + rmp->host_sw_if_index = host_sw_if_index; + rmp->vif_index = vif_index; + })); } static void @@ -142,7 +171,7 @@ send_lcp_itf_pair_details (index_t lipi, vl_api_registration_t *rp, vl_api_lcp_itf_pair_details_t *rmp; lcp_itf_pair_t *lcp_pair = lcp_itf_pair_get (lipi); - REPLY_MACRO_DETAILS4 ( + REPLY_MACRO_DETAILS4_END ( VL_API_LCP_ITF_PAIR_DETAILS, rp, context, ({ rmp->phy_sw_if_index = lcp_pair->lip_phy_sw_if_index; rmp->host_sw_if_index = lcp_pair->lip_host_sw_if_index; @@ -151,9 +180,11 @@ send_lcp_itf_pair_details (index_t lipi, vl_api_registration_t *rp, memcpy_s (rmp->host_if_name, sizeof (rmp->host_if_name), lcp_pair->lip_host_name, vec_len (lcp_pair->lip_host_name)); + rmp->host_if_name[vec_len (lcp_pair->lip_host_name)] = 0; - clib_strncpy ((char *) rmp->namespace, (char *) lcp_pair->lip_namespace, - vec_len (lcp_pair->lip_namespace)); + memcpy_s (rmp->netns, sizeof (rmp->netns), lcp_pair->lip_namespace, + vec_len (lcp_pair->lip_namespace)); + rmp->netns[vec_len (lcp_pair->lip_namespace)] = 0; })); } @@ -163,19 +194,51 @@ vl_api_lcp_itf_pair_get_t_handler (vl_api_lcp_itf_pair_get_t *mp) vl_api_lcp_itf_pair_get_reply_t *rmp; i32 rv = 0; - REPLY_AND_DETAILS_MACRO ( + REPLY_AND_DETAILS_MACRO_END ( VL_API_LCP_ITF_PAIR_GET_REPLY, lcp_itf_pair_pool, ({ send_lcp_itf_pair_details (cursor, rp, mp->context); })); } static void +vl_api_lcp_itf_pair_get_v2_t_handler (vl_api_lcp_itf_pair_get_v2_t *mp) +{ + vl_api_lcp_itf_pair_get_v2_reply_t *rmp; + i32 rv = 0; + + if (mp->sw_if_index == ~0) + { + REPLY_AND_DETAILS_MACRO_END ( + VL_API_LCP_ITF_PAIR_GET_REPLY, lcp_itf_pair_pool, + ({ send_lcp_itf_pair_details (cursor, rp, mp->context); })); + } + else + { + VALIDATE_SW_IF_INDEX_END (mp); + + u32 pair_index = lcp_itf_pair_find_by_phy (mp->sw_if_index); + if (pair_index == INDEX_INVALID) + { + rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; + goto bad_sw_if_index; + } + send_lcp_itf_pair_details ( + pair_index, vl_api_client_index_to_registration (mp->client_index), + mp->context); + + BAD_SW_IF_INDEX_LABEL; + REPLY_MACRO2_END (VL_API_LCP_ITF_PAIR_GET_V2_REPLY, + ({ rmp->cursor = ~0; })); + } +} + +static void vl_api_lcp_default_ns_set_t_handler (vl_api_lcp_default_ns_set_t *mp) { vl_api_lcp_default_ns_set_reply_t *rmp; int rv; - mp->namespace[LCP_NS_LEN - 1] = 0; - rv = lcp_set_default_ns (mp->namespace); + mp->netns[LCP_NS_LEN - 1] = 0; + rv = lcp_set_default_ns (mp->netns); REPLY_MACRO (VL_API_LCP_DEFAULT_NS_SET_REPLY); } @@ -183,25 +246,14 @@ vl_api_lcp_default_ns_set_t_handler (vl_api_lcp_default_ns_set_t *mp) static void vl_api_lcp_default_ns_get_t_handler (vl_api_lcp_default_ns_get_t *mp) { - lcp_main_t *lcpm = &lcp_main; vl_api_lcp_default_ns_get_reply_t *rmp; - vl_api_registration_t *reg; - char *ns; - - reg = vl_api_client_index_to_registration (mp->client_index); - if (!reg) - return; - - rmp = vl_msg_api_alloc (sizeof (*rmp)); - clib_memset (rmp, 0, sizeof (*rmp)); - rmp->_vl_msg_id = (VL_API_LCP_DEFAULT_NS_GET_REPLY + lcpm->msg_id_base); - rmp->context = mp->context; - - ns = (char *) lcp_get_default_ns (); - if (ns) - clib_strncpy ((char *) rmp->namespace, ns, LCP_NS_LEN - 1); - vl_api_send_msg (reg, (u8 *) rmp); + REPLY_MACRO_DETAILS2 (VL_API_LCP_DEFAULT_NS_GET_REPLY, ({ + char *ns = (char *) lcp_get_default_ns (); + if (ns) + clib_strncpy ((char *) rmp->netns, ns, + LCP_NS_LEN - 1); + })); } static void @@ -234,7 +286,7 @@ vl_api_lcp_itf_pair_replace_end_t_handler ( #include <linux-cp/lcp.api.c> static clib_error_t * -lcp_plugin_api_hookup (vlib_main_t *vm) +lcp_api_init (vlib_main_t *vm) { /* Ask for a correctly-sized block of API message decode slots */ lcp_msg_id_base = setup_message_id_table (); @@ -242,7 +294,7 @@ lcp_plugin_api_hookup (vlib_main_t *vm) return (NULL); } -VLIB_INIT_FUNCTION (lcp_plugin_api_hookup); +VLIB_INIT_FUNCTION (lcp_api_init); #include <vpp/app/version.h> VLIB_PLUGIN_REGISTER () = { |