X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fcnat%2Fcnat_api.c;h=ea4b3aeaaefa75502b854ac5d7d0b1dfad2df904;hb=3fd77f7de;hp=f692451c14b6372c51c20593a9364e7fce62d301;hpb=af897c5e3fa76180fbe0634052bde98b4b3c34d7;p=vpp.git diff --git a/src/plugins/cnat/cnat_api.c b/src/plugins/cnat/cnat_api.c index f692451c14b..ea4b3aeaaef 100644 --- a/src/plugins/cnat/cnat_api.c +++ b/src/plugins/cnat/cnat_api.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include @@ -43,25 +43,32 @@ static u32 cnat_base_msg_id; #include -static void +static int cnat_endpoint_decode (const vl_api_cnat_endpoint_t * in, cnat_endpoint_t * out) { + int rv = 0; out->ce_port = clib_net_to_host_u16 (in->port); out->ce_sw_if_index = clib_net_to_host_u32 (in->sw_if_index); out->ce_flags = 0; if (out->ce_sw_if_index == INDEX_INVALID) ip_address_decode2 (&in->addr, &out->ce_ip); else - ip_address_family_decode (in->if_af, &out->ce_ip.version); + rv = ip_address_family_decode (in->if_af, &out->ce_ip.version); + return rv; } -static void +static int cnat_endpoint_tuple_decode (const vl_api_cnat_endpoint_tuple_t * in, cnat_endpoint_tuple_t * out) { - cnat_endpoint_decode (&in->src_ep, &out->src_ep); - cnat_endpoint_decode (&in->dst_ep, &out->dst_ep); + int rv = 0; + rv = cnat_endpoint_decode (&in->src_ep, &out->src_ep); + if (rv) + return rv; + rv = cnat_endpoint_decode (&in->dst_ep, &out->dst_ep); + out->ep_flags = in->flags; + return rv; } static void @@ -88,36 +95,43 @@ vl_api_cnat_translation_update_t_handler (vl_api_cnat_translation_update_t u32 id = ~0; u8 flags; int rv = 0; - u8 pi; + u32 pi, n_paths; + cnat_lb_type_t lb_type; rv = ip_proto_decode (mp->translation.ip_proto, &ip_proto); if (rv) goto done; - vec_validate (paths, mp->translation.n_paths - 1); + n_paths = clib_net_to_host_u32 (mp->translation.n_paths); + vec_validate (paths, n_paths - 1); - for (pi = 0; pi < mp->translation.n_paths; pi++) + for (pi = 0; pi < n_paths; pi++) { path = &paths[pi]; - cnat_endpoint_tuple_decode (&mp->translation.paths[pi], path); + rv = cnat_endpoint_tuple_decode (&mp->translation.paths[pi], path); + if (rv) + goto done; } - cnat_endpoint_decode (&mp->translation.vip, &vip); + + rv = cnat_endpoint_decode (&mp->translation.vip, &vip); + if (rv) + goto done; flags = mp->translation.flags; if (!mp->translation.is_real_ip) flags |= CNAT_FLAG_EXCLUSIVE; - id = cnat_translation_update (&vip, ip_proto, paths, flags); + + lb_type = (cnat_lb_type_t) mp->translation.lb_type; + id = cnat_translation_update (&vip, ip_proto, paths, flags, lb_type); vec_free (paths); done: - /* *INDENT-OFF* */ REPLY_MACRO2 (VL_API_CNAT_TRANSLATION_UPDATE_REPLY, ({ rmp->id = htonl (id); })); - /* *INDENT-ON* */ } static void @@ -146,7 +160,7 @@ cnat_translation_send_details (u32 cti, void *args) vl_api_cnat_endpoint_tuple_t *path; size_t msg_size; cnat_translation_t *ct; - u8 n_paths; + u32 n_paths; ctx = args; ct = cnat_translation_get (cti); @@ -158,16 +172,18 @@ cnat_translation_send_details (u32 cti, void *args) /* fill in the message */ mp->context = ctx->context; - mp->translation.n_paths = n_paths; - mp->translation.id = htonl (cti); + mp->translation.n_paths = clib_host_to_net_u32 (n_paths); + mp->translation.id = clib_host_to_net_u32 (cti); cnat_endpoint_encode (&ct->ct_vip, &mp->translation.vip); mp->translation.ip_proto = ip_proto_encode (ct->ct_proto); + mp->translation.lb_type = (vl_api_cnat_lb_type_t) ct->lb_type; path = mp->translation.paths; vec_foreach (trk, ct->ct_paths) { cnat_endpoint_encode (&trk->ct_ep[VLIB_TX], &path->dst_ep); cnat_endpoint_encode (&trk->ct_ep[VLIB_RX], &path->src_ep); + path->flags = trk->ct_flags; path++; } @@ -216,6 +232,8 @@ cnat_session_send_details (const cnat_session_t * session, void *args) /* fill in the message */ mp->context = ctx->context; + ep.ce_sw_if_index = INDEX_INVALID; + ep.ce_flags = CNAT_EP_FLAG_RESOLVED; ip_address2_from_46 (&session->value.cs_ip[VLIB_TX], session->key.cs_af, &ep.ce_ip); ep.ce_port = clib_host_to_net_u16 (session->value.cs_port[VLIB_TX]); @@ -232,6 +250,7 @@ cnat_session_send_details (const cnat_session_t * session, void *args) cnat_endpoint_encode (&ep, &mp->session.dst); mp->session.ip_proto = ip_proto_encode (session->key.cs_proto); + mp->session.location = session->key.cs_loc; vl_api_send_msg (ctx->rp, (u8 *) mp); @@ -273,16 +292,15 @@ vl_api_cnat_get_snat_addresses_t_handler (vl_api_cnat_get_snat_addresses_t * mp) { vl_api_cnat_get_snat_addresses_reply_t *rmp; + cnat_snat_policy_main_t *cpm = &cnat_snat_policy_main; int rv = 0; - /* *INDENT-OFF* */ - REPLY_MACRO2 (VL_API_CNAT_GET_SNAT_ADDRESSES_REPLY, - ({ - ip6_address_encode (&ip_addr_v6(&cnat_main.snat_ip6.ce_ip), rmp->snat_ip6); - ip4_address_encode (&ip_addr_v4(&cnat_main.snat_ip4.ce_ip), rmp->snat_ip4); - rmp->sw_if_index = clib_host_to_net_u32 (cnat_main.snat_ip6.ce_sw_if_index); - })); - /* *INDENT-ON* */ + REPLY_MACRO2 ( + VL_API_CNAT_GET_SNAT_ADDRESSES_REPLY, ({ + ip6_address_encode (&ip_addr_v6 (&cpm->snat_ip6.ce_ip), rmp->snat_ip6); + ip4_address_encode (&ip_addr_v4 (&cpm->snat_ip4.ce_ip), rmp->snat_ip4); + rmp->sw_if_index = clib_host_to_net_u32 (cpm->snat_ip6.ce_sw_if_index); + })); } static void @@ -304,20 +322,52 @@ vl_api_cnat_set_snat_addresses_t_handler (vl_api_cnat_set_snat_addresses_t } static void - vl_api_cnat_add_del_snat_prefix_t_handler - (vl_api_cnat_add_del_snat_prefix_t * mp) +vl_api_cnat_set_snat_policy_t_handler (vl_api_cnat_set_snat_policy_t *mp) +{ + vl_api_cnat_set_snat_policy_reply_t *rmp; + int rv = 0; + cnat_snat_policy_type_t policy = (cnat_snat_policy_type_t) mp->policy; + + rv = cnat_set_snat_policy (policy); + + REPLY_MACRO (VL_API_CNAT_SET_SNAT_POLICY_REPLY); +} + +static void +vl_api_cnat_snat_policy_add_del_exclude_pfx_t_handler ( + vl_api_cnat_snat_policy_add_del_exclude_pfx_t *mp) { - vl_api_cnat_add_del_snat_prefix_reply_t *rmp; + vl_api_cnat_snat_policy_add_del_exclude_pfx_reply_t *rmp; ip_prefix_t pfx; int rv; ip_prefix_decode2 (&mp->prefix, &pfx); if (mp->is_add) - rv = cnat_add_snat_prefix (&pfx); + rv = cnat_snat_policy_add_pfx (&pfx); else - rv = cnat_del_snat_prefix (&pfx); + rv = cnat_snat_policy_del_pfx (&pfx); + + REPLY_MACRO (VL_API_CNAT_SNAT_POLICY_ADD_DEL_EXCLUDE_PFX_REPLY); +} + +static void +vl_api_cnat_snat_policy_add_del_if_t_handler ( + vl_api_cnat_snat_policy_add_del_if_t *mp) +{ + vl_api_cnat_snat_policy_add_del_if_reply_t *rmp; + u32 sw_if_index = ntohl (mp->sw_if_index); + int rv = 0; + + VALIDATE_SW_IF_INDEX (mp); + + cnat_snat_interface_map_type_t table = + (cnat_snat_interface_map_type_t) mp->table; + + rv = cnat_snat_policy_add_del_if (sw_if_index, mp->is_add, table); + + BAD_SW_IF_INDEX_LABEL; - REPLY_MACRO (VL_API_CNAT_ADD_DEL_SNAT_PREFIX_REPLY); + REPLY_MACRO (VL_API_CNAT_SNAT_POLICY_ADD_DEL_IF_REPLY); } #include @@ -333,12 +383,10 @@ cnat_api_init (vlib_main_t * vm) VLIB_INIT_FUNCTION (cnat_api_init); -/* *INDENT-OFF* */ VLIB_PLUGIN_REGISTER () = { .version = VPP_BUILD_VER, .description = "CNat Translate", }; -/* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON