aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vnet/ipfix-export/flow_api.c51
-rw-r--r--src/vnet/ipfix-export/ipfix_export.api36
2 files changed, 86 insertions, 1 deletions
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
@@ -250,6 +250,57 @@ vl_api_ipfix_exporter_dump_t_handler (vl_api_ipfix_exporter_dump_t * mp)
}
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