#include <vppinfra/hash.h>
#include <vppinfra/error.h>
-#include <vnet/flow/flow_report.h>
-#include <vnet/flow/flow_report_classify.h>
+#include <vnet/ipfix-export/flow_report.h>
+#include <vnet/ipfix-export/flow_report_classify.h>
#include <vppinfra/tw_timer_2t_1w_2048sl.h>
/* Default timers in seconds */
u16 *next_record_offset_per_worker;
} flowprobe_protocol_context_t;
-#define FLOWPROBE_KEY_IN_U32 22
/* *INDENT-OFF* */
-typedef CLIB_PACKED (union
-{
- struct {
- u32 rx_sw_if_index;
- u32 tx_sw_if_index;
- u8 src_mac[6];
- u8 dst_mac[6];
- u16 ethertype;
- ip46_address_t src_address;
- ip46_address_t dst_address;
- u8 protocol;
- u16 src_port;
- u16 dst_port;
- flowprobe_variant_t which;
- };
- u32 as_u32[FLOWPROBE_KEY_IN_U32];
-}) flowprobe_key_t;
+typedef struct __attribute__ ((aligned (8))) {
+ u32 rx_sw_if_index;
+ u32 tx_sw_if_index;
+ u8 src_mac[6];
+ u8 dst_mac[6];
+ u16 ethertype;
+ ip46_address_t src_address;
+ ip46_address_t dst_address;
+ u8 protocol;
+ u16 src_port;
+ u16 dst_port;
+ flowprobe_variant_t which;
+} flowprobe_key_t;
/* *INDENT-ON* */
-STATIC_ASSERT (sizeof (flowprobe_key_t) == FLOWPROBE_KEY_IN_U32 *
- sizeof (u32), "flowprobe_key_t padding is wrong");
+typedef struct
+{
+ u32 sec;
+ u32 nsec;
+} timestamp_nsec_t;
typedef struct
{
flowprobe_key_t key;
u64 packetcount;
u64 octetcount;
+ timestamp_nsec_t flow_start;
+ timestamp_nsec_t flow_end;
f64 last_updated;
f64 last_exported;
u32 passive_timer_handle;
+ union
+ {
+ struct
+ {
+ u16 flags;
+ } tcp;
+ } prot;
} flowprobe_entry_t;
/**
} flowprobe_main_t;
extern flowprobe_main_t flowprobe_main;
+extern vlib_node_registration_t flowprobe_walker_node;
void flowprobe_flush_callback_ip4 (void);
void flowprobe_flush_callback_ip6 (void);