snort: snort3 plugin and DAQ
[vpp.git] / src / plugins / snort / snort.h
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright(c) 2021 Cisco Systems, Inc.
3  */
4
5 #ifndef __snort_snort_h__
6 #define __snort_snort_h__
7
8 #include <vppinfra/error.h>
9 #include <vppinfra/socket.h>
10 #include <vlib/vlib.h>
11 #include <snort/daq_vpp.h>
12
13 typedef struct
14 {
15   CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
16   u8 log2_queue_size;
17   daq_vpp_desc_t *descriptors;
18   volatile u32 *enq_head;
19   volatile u32 *deq_head;
20   volatile u32 *enq_ring;
21   volatile u32 *deq_ring;
22   u32 next_desc;
23   int enq_fd, deq_fd;
24   u32 deq_fd_file_index;
25   u32 *buffer_indices;
26   u16 *next_indices;
27   u32 *freelist;
28   u32 ready;
29
30   /* temporary storeage used by enqueue node */
31   u32 n_pending;
32   u16 pending_nexts[VLIB_FRAME_SIZE];
33   u32 pending_buffers[VLIB_FRAME_SIZE];
34   daq_vpp_desc_t pending_descs[VLIB_FRAME_SIZE];
35 } snort_qpair_t;
36
37 typedef struct
38 {
39   u32 index;
40   u32 client_index;
41   void *shm_base;
42   u32 shm_size;
43   int shm_fd;
44   snort_qpair_t *qpairs;
45   u8 *name;
46   u8 drop_on_disconnect;
47 } snort_instance_t;
48
49 typedef struct
50 {
51   daq_vpp_msg_t msg;
52   int fds[2];
53   int n_fds;
54 } snort_client_msg_queue_elt;
55
56 typedef struct
57 {
58   clib_socket_t socket;
59   u32 instance_index;
60   u32 file_index;
61   snort_client_msg_queue_elt *msg_queue;
62 } snort_client_t;
63
64 typedef struct
65 {
66   /* per-instance dequeue interrupts */
67   void *interrupts;
68 } snort_per_thread_data_t;
69
70 typedef struct
71 {
72   clib_socket_t *listener;
73   snort_client_t *clients;
74   snort_instance_t *instances;
75   uword *instance_by_name;
76   u32 *instance_by_sw_if_index;
77   u8 **buffer_pool_base_addrs;
78   snort_per_thread_data_t *per_thread_data;
79   u32 input_mode;
80   u8 *socket_name;
81 } snort_main_t;
82
83 extern snort_main_t snort_main;
84 extern vlib_node_registration_t snort_enq_node;
85 extern vlib_node_registration_t snort_deq_node;
86
87 typedef enum
88 {
89   SNORT_ENQ_NEXT_DROP,
90   SNORT_ENQ_N_NEXT_NODES,
91 } snort_enq_next_t;
92
93 #define SNORT_ENQ_NEXT_NODES                                                  \
94   {                                                                           \
95     [SNORT_ENQ_NEXT_DROP] = "error-drop",                                     \
96   }
97
98 /* functions */
99 clib_error_t *snort_instance_create (vlib_main_t *vm, char *name,
100                                      u8 log2_queue_sz, u8 drop_on_disconnect);
101 clib_error_t *snort_interface_enable_disable (vlib_main_t *vm,
102                                               char *instance_name,
103                                               u32 sw_if_index, int is_enable);
104 clib_error_t *snort_set_node_mode (vlib_main_t *vm, u32 mode);
105
106 always_inline void
107 snort_freelist_init (u32 *fl)
108 {
109   for (int j = 0; j < vec_len (fl); j++)
110     fl[j] = j;
111 }
112
113 #endif /* __snort_snort_h__ */