From acb0d2d1356b69c4be1c8f571d5b17567ba0f0cf Mon Sep 17 00:00:00 2001 From: Paul Atkins Date: Thu, 23 Sep 2021 09:28:50 +0100 Subject: [PATCH] ipfix-export: add a new API to dump all exporters Add a new API to dump all the exporters. As the destination struct type is not the same as for the existing dump/details API no attempt is made to use the existing code to populate the structure. Type: improvement Signed-off-by: Paul Atkins Change-Id: I409f80285b107a530e0e4f3c6a047a803815a0ec --- src/vnet/ipfix-export/flow_api.c | 51 ++++++++++++++++++++++++++++++++++ src/vnet/ipfix-export/ipfix_export.api | 36 +++++++++++++++++++++++- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/src/vnet/ipfix-export/flow_api.c b/src/vnet/ipfix-export/flow_api.c index 47e1d1103a2..c64f5508487 100644 --- a/src/vnet/ipfix-export/flow_api.c +++ b/src/vnet/ipfix-export/flow_api.c @@ -249,6 +249,57 @@ vl_api_ipfix_exporter_dump_t_handler (vl_api_ipfix_exporter_dump_t * mp) vl_api_send_msg (reg, (u8 *) rmp); } +static void +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); + + 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); + + if (exp->fib_index == ~0) + vrf_id = ~0; + else + vrf_id = im->fibs[exp->fib_index].ft_table_id; + rmp->vrf_id = htonl (vrf_id); + rmp->path_mtu = htonl (exp->path_mtu); + rmp->template_interval = htonl (exp->template_interval); + rmp->udp_checksum = (exp->udp_checksum != 0); +} + +static void +ipfix_all_exporter_details (flow_report_main_t *frm, u32 index, + vl_api_registration_t *rp, u32 context) +{ + ipfix_exporter_t *exp = pool_elt_at_index (frm->exporters, index); + + vl_api_ipfix_all_exporter_details_t *rmp; + + REPLY_MACRO_DETAILS4 (VL_API_IPFIX_ALL_EXPORTER_DETAILS, rp, context, + ({ ipfix_all_fill_details (rmp, exp); })); +} + +static void +vl_api_ipfix_all_exporter_get_t_handler (vl_api_ipfix_all_exporter_get_t *mp) +{ + flow_report_main_t *frm = &flow_report_main; + vl_api_ipfix_all_exporter_get_reply_t *rmp; + int rv = 0; + + REPLY_AND_DETAILS_MACRO ( + VL_API_IPFIX_ALL_EXPORTER_GET_REPLY, frm->exporters, + ({ ipfix_all_exporter_details (frm, cursor, rp, mp->context); })); +} + static void vl_api_set_ipfix_classify_stream_t_handler (vl_api_set_ipfix_classify_stream_t * mp) diff --git a/src/vnet/ipfix-export/ipfix_export.api b/src/vnet/ipfix-export/ipfix_export.api index 2b1da36b581..8a9d5b13124 100644 --- a/src/vnet/ipfix-export/ipfix_export.api +++ b/src/vnet/ipfix-export/ipfix_export.api @@ -73,7 +73,6 @@ define ipfix_exporter_details bool udp_checksum; }; - /** Configure IPFIX exporter within the exporting process. The exporting process can contain multiple independent exporters, each of which have their own state. The collector_address is the key @@ -113,6 +112,41 @@ define ipfix_exporter_create_delete_reply { u32 stat_index; }; +service { + rpc ipfix_all_exporter_get returns ipfix_all_exporter_get_reply + stream ipfix_all_exporter_details; +}; + +define ipfix_all_exporter_get +{ + u32 client_index; + u32 context; + u32 cursor; +}; + +define ipfix_all_exporter_get_reply +{ + u32 context; + i32 retval; + u32 cursor; +}; + +/** \brief Ipfix meter details in response to the get_meters command + @param context - sender context, to match reply w/ request + @param name The name of the ipfix meter +*/ +define ipfix_all_exporter_details +{ + u32 context; + vl_api_address_t collector_address; + u16 collector_port; + vl_api_address_t src_address; + u32 vrf_id; + u32 path_mtu; + u32 template_interval; + bool udp_checksum; +}; + /** \brief IPFIX classify stream configure request @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request -- 2.16.6