#include <cnat/cnat_translation.h>
#include <cnat/cnat_session.h>
#include <cnat/cnat_client.h>
-#include <cnat/cnat_snat.h>
+#include <cnat/cnat_snat_policy.h>
#include <vnet/ip/ip_types_api.h>
#include <vlibapi/api_helper_macros.h>
-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
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
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);
/* 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++;
}
/* 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]);
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);
* 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
}
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 <cnat/cnat.api.c>
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