aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/ipfix-export/flow_api.c
diff options
context:
space:
mode:
authorPaul Atkins <patkins@graphiant.com>2021-10-04 15:43:56 +0100
committerNeale Ranns <neale@graphiant.com>2021-11-22 09:30:09 +0000
commit5140484529d420af47d6aa8ffbe6818621d8b55f (patch)
tree0946e14e9556e5b63b2285a1562d92994d3db717 /src/vnet/ipfix-export/flow_api.c
parent0ea1485361dfd23fe5f2522495efb9990df5a790 (diff)
ipfix-export: Change exp to use ip_address
Modify the ipfix_exporter to use ip_address instead of the ipv4 specific version. Modify the current code so that it writes into the v4 specific part of the address, i.e. we are not yet fully supporting IPv6. For the exporter configured via the original API (the one that is always in slot0) we will not support IPv6 addresses. Type: improvement Signed-off-by: Paul Atkins <patkins@graphiant.com> Change-Id: Ic9854ac62aaee76a7a55a958234c456fd9828c4c
Diffstat (limited to 'src/vnet/ipfix-export/flow_api.c')
-rw-r--r--src/vnet/ipfix-export/flow_api.c77
1 files changed, 37 insertions, 40 deletions
diff --git a/src/vnet/ipfix-export/flow_api.c b/src/vnet/ipfix-export/flow_api.c
index 62dc703d9a0..4a9b525ac67 100644
--- a/src/vnet/ipfix-export/flow_api.c
+++ b/src/vnet/ipfix-export/flow_api.c
@@ -37,14 +37,14 @@
#include <vlibapi/api_helper_macros.h>
ipfix_exporter_t *
-vnet_ipfix_exporter_lookup (ip4_address_t *ipfix_collector)
+vnet_ipfix_exporter_lookup (const ip_address_t *ipfix_collector)
{
flow_report_main_t *frm = &flow_report_main;
ipfix_exporter_t *exp;
pool_foreach (exp, frm->exporters)
{
- if (exp->ipfix_collector.as_u32 == ipfix_collector->as_u32)
+ if (ip_address_cmp (&exp->ipfix_collector, ipfix_collector) == 0)
return exp;
}
@@ -70,29 +70,34 @@ vl_api_set_ipfix_exporter_t_internal (
flow_report_main_t *frm = &flow_report_main;
ipfix_exporter_t *exp;
vl_api_registration_t *reg;
- ip4_address_t collector, src;
+ ip_address_t collector, src;
u16 collector_port = UDP_DST_PORT_ipfix;
u32 path_mtu;
u32 template_interval;
u8 udp_checksum;
u32 fib_id;
u32 fib_index = ~0;
+ u32 ip_header_size;
reg = vl_api_client_index_to_registration (client_index);
if (!reg)
return VNET_API_ERROR_UNIMPLEMENTED;
- /* Collector address is the key for the exporter lookup */
- ip4_address_decode (mp_collector_address->un.ip4, &collector);
-
if (use_index_0)
- /*
- * In this case we update the existing exporter. There is no delete
- * for exp[0]
- */
- exp = &frm->exporters[0];
+ {
+ /*
+ * In this case we update the existing exporter. There is no delete
+ * for exp[0]
+ */
+ exp = &frm->exporters[0];
+
+ /* Collector address must be IPv4 for exp[0] */
+ collector.version = AF_IP4;
+ ip4_address_decode (mp_collector_address->un.ip4, &collector.ip.ip4);
+ }
else
{
+ ip_address_decode2 (mp_collector_address, &collector);
if (is_create)
{
exp = vnet_ipfix_exporter_lookup (&collector);
@@ -118,16 +123,10 @@ vl_api_set_ipfix_exporter_t_internal (
}
}
- if (mp_src_address->af == ADDRESS_IP6 ||
- mp_collector_address->af == ADDRESS_IP6)
- {
- return VNET_API_ERROR_UNIMPLEMENTED;
- }
-
collector_port = ntohs (mp_collector_port);
if (collector_port == (u16) ~ 0)
collector_port = UDP_DST_PORT_ipfix;
- ip4_address_decode (mp_src_address->un.ip4, &src);
+ ip_address_decode2 (mp_src_address, &src);
fib_id = ntohl (mp_vrf_id);
ip4_main_t *im = &ip4_main;
@@ -151,7 +150,13 @@ vl_api_set_ipfix_exporter_t_internal (
template_interval = 20;
udp_checksum = mp_udp_checksum;
- if (collector.as_u32 != 0 && src.as_u32 == 0)
+ /*
+ * If the collector address is set then the src must be too.
+ * Collector address can be set to 0 to disable exporter
+ */
+ if (!ip_address_is_zero (&collector) && ip_address_is_zero (&src))
+ return VNET_API_ERROR_INVALID_VALUE;
+ if (collector.version != src.version)
return VNET_API_ERROR_INVALID_VALUE;
if (path_mtu > 1450 /* vpp does not support fragmentation */ )
@@ -161,19 +166,23 @@ vl_api_set_ipfix_exporter_t_internal (
return VNET_API_ERROR_INVALID_VALUE;
/* Calculate how much header data we need. */
- exp->all_headers_size = sizeof (ip4_header_t) + sizeof (udp_header_t) +
+ if (collector.version == AF_IP4)
+ ip_header_size = sizeof (ip4_header_t);
+ else
+ ip_header_size = sizeof (ip6_header_t);
+ exp->all_headers_size = ip_header_size + sizeof (udp_header_t) +
sizeof (ipfix_message_header_t) +
sizeof (ipfix_set_header_t);
/* Reset report streams if we are reconfiguring IP addresses */
- if (exp->ipfix_collector.as_u32 != collector.as_u32 ||
- exp->src_address.as_u32 != src.as_u32 ||
+ if (ip_address_cmp (&exp->ipfix_collector, &collector) ||
+ ip_address_cmp (&exp->src_address, &src) ||
exp->collector_port != collector_port)
vnet_flow_reports_reset (exp);
- exp->ipfix_collector.as_u32 = collector.as_u32;
+ exp->ipfix_collector = collector;
exp->collector_port = collector_port;
- exp->src_address.as_u32 = src.as_u32;
+ exp->src_address = src;
exp->fib_index = fib_index;
exp->path_mtu = path_mtu;
exp->template_interval = template_interval;
@@ -220,8 +229,6 @@ vl_api_ipfix_exporter_dump_t_handler (vl_api_ipfix_exporter_dump_t * mp)
vl_api_registration_t *reg;
vl_api_ipfix_exporter_details_t *rmp;
ip4_main_t *im = &ip4_main;
- ip46_address_t collector = {.as_u64[0] = 0,.as_u64[1] = 0 };
- ip46_address_t src = {.as_u64[0] = 0,.as_u64[1] = 0 };
u32 vrf_id;
reg = vl_api_client_index_to_registration (mp->client_index);
@@ -234,13 +241,9 @@ vl_api_ipfix_exporter_dump_t_handler (vl_api_ipfix_exporter_dump_t * mp)
ntohs ((REPLY_MSG_ID_BASE) + VL_API_IPFIX_EXPORTER_DETAILS);
rmp->context = mp->context;
- memcpy (&collector.ip4, &exp->ipfix_collector, sizeof (ip4_address_t));
- ip_address_encode (&collector, IP46_TYPE_IP4, &rmp->collector_address);
-
+ ip_address_encode2 (&exp->ipfix_collector, &rmp->collector_address);
rmp->collector_port = htons (exp->collector_port);
-
- memcpy (&src.ip4, &exp->src_address, sizeof (ip4_address_t));
- ip_address_encode (&src, IP46_TYPE_IP4, &rmp->src_address);
+ ip_address_encode2 (&exp->src_address, &rmp->src_address);
if (exp->fib_index == ~0)
vrf_id = ~0;
@@ -259,17 +262,11 @@ ipfix_all_fill_details (vl_api_ipfix_all_exporter_details_t *rmp,
ipfix_exporter_t *exp)
{
ip4_main_t *im = &ip4_main;
- ip46_address_t collector = { .as_u64[0] = 0, .as_u64[1] = 0 };
- ip46_address_t src = { .as_u64[0] = 0, .as_u64[1] = 0 };
u32 vrf_id;
- memcpy (&collector.ip4, &exp->ipfix_collector, sizeof (ip4_address_t));
- ip_address_encode (&collector, IP46_TYPE_IP4, &rmp->collector_address);
-
+ ip_address_encode2 (&exp->ipfix_collector, &rmp->collector_address);
rmp->collector_port = htons (exp->collector_port);
-
- memcpy (&src.ip4, &exp->src_address, sizeof (ip4_address_t));
- ip_address_encode (&src, IP46_TYPE_IP4, &rmp->src_address);
+ ip_address_encode2 (&exp->src_address, &rmp->src_address);
if (exp->fib_index == ~0)
vrf_id = ~0;
pan class="p">); typedef void (*generic_swap_fn_t) (void *payload); typedef int (*verify_msg_size_fn_t) (void *msg, uword buf_size); typedef struct { const char *name; size_t name_len; const char *name_with_crc; size_t name_with_crc_len; bool has_context; unsigned int context_offset; unsigned int payload_offset; verify_msg_size_fn_t verify_msg_size; generic_swap_fn_t swap_to_be; generic_swap_fn_t swap_to_host; vapi_msg_id_t id; /* assigned at run-time */ } vapi_message_desc_t; typedef struct { const char *name; int payload_offset; size_t size; void (*swap_to_be) (void *payload); void (*swap_to_host) (void *payload); } vapi_event_desc_t; vapi_msg_id_t vapi_register_msg (vapi_message_desc_t * msg); u16 vapi_lookup_vl_msg_id (vapi_ctx_t ctx, vapi_msg_id_t id); vapi_msg_id_t vapi_lookup_vapi_msg_id_t (vapi_ctx_t ctx, u16 vl_msg_id); int vapi_get_client_index (vapi_ctx_t ctx); bool vapi_is_nonblocking (vapi_ctx_t ctx); bool vapi_requests_empty (vapi_ctx_t ctx); bool vapi_requests_full (vapi_ctx_t ctx); size_t vapi_get_request_count (vapi_ctx_t ctx); size_t vapi_get_max_request_count (vapi_ctx_t ctx); u32 vapi_gen_req_context (vapi_ctx_t ctx); void vapi_store_request (vapi_ctx_t ctx, u32 context, bool is_dump, vapi_cb_t callback, void *callback_ctx); int vapi_get_payload_offset (vapi_msg_id_t id); void (*vapi_get_swap_to_host_func (vapi_msg_id_t id)) (void *payload); void (*vapi_get_swap_to_be_func (vapi_msg_id_t id)) (void *payload); size_t vapi_get_context_offset (vapi_msg_id_t id); bool vapi_msg_is_with_context (vapi_msg_id_t id); size_t vapi_get_message_count(); const char *vapi_get_msg_name(vapi_msg_id_t id); vapi_error_e vapi_producer_lock (vapi_ctx_t ctx); vapi_error_e vapi_producer_unlock (vapi_ctx_t ctx); #ifdef __cplusplus } #endif #endif