Flow: Rename IPFIX exporter.
[vpp.git] / src / vnet / ipfix-export / flow_report_classify.h
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef __included_flow_report_classify_h__
16 #define __included_flow_report_classify_h__
17
18 #define foreach_ipfix_ip4_field                                             \
19 _(ip->src_address.as_u32, ((u32[]){0xFFFFFFFF}), sourceIPv4Address, 4)      \
20 _(ip->dst_address.as_u32, ((u32[]){0xFFFFFFFF}), destinationIPv4Address, 4) \
21 _(ip->protocol, ((u8[]){0xFF}), protocolIdentifier, 1)
22
23 #define foreach_ipfix_ip6_field                                             \
24 _(ip6->src_address.as_u8,                                                   \
25   ((u32[]){0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}),                   \
26   sourceIPv6Address, 16)                                                    \
27 _(ip6->dst_address.as_u8,                                                   \
28   ((u32[]){0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}),                   \
29   destinationIPv6Address, 16)                                               \
30 _(ip6->protocol, ((u8[]){0xFF}), protocolIdentifier, 1)
31
32 #define foreach_ipfix_tcpudp_field                                          \
33 _(tcpudp->src_port, ((u16[]){0xFFFF}), sourceTransportPort, 2)              \
34 _(tcpudp->dst_port, ((u16[]){0xFFFF}), destinationTransportPort, 2)
35
36 #define foreach_ipfix_tcp_field                                             \
37 _(tcpudp->src_port, ((u16[]){0xFFFF}), tcpSourcePort, 2)                    \
38 _(tcpudp->dst_port, ((u16[]){0xFFFF}), tcpDestinationPort, 2)
39
40 #define foreach_ipfix_udp_field                                             \
41 _(tcpudp->src_port, ((u16[]){0xFFFF}), udpSourcePort, 2)                    \
42 _(tcpudp->dst_port, ((u16[]){0xFFFF}), udpDestinationPort, 2)
43
44 #define foreach_ipfix_transport_protocol_field                              \
45   switch (transport_protocol) {                                             \
46     case 255:                                                               \
47       foreach_ipfix_tcpudp_field;                                           \
48       break;                                                                \
49     case 6:                                                                 \
50       foreach_ipfix_tcp_field;                                              \
51       break;                                                                \
52     case 17:                                                                \
53       foreach_ipfix_udp_field;                                              \
54       break;                                                                \
55   }
56
57 #define foreach_ipfix_field                                                 \
58   if (ip_version == 4) {                                                    \
59     ip = (ip4_header_t *)ip_start;                                          \
60     tcpudp = (tcpudp_header_t *)(ip+1);                                     \
61     foreach_ipfix_ip4_field;                                                \
62   } else {                                                                  \
63     ip6 = (ip6_header_t *)ip_start;                                         \
64     tcpudp = (tcpudp_header_t *)(ip6+1);                                    \
65     foreach_ipfix_ip6_field;                                                \
66   }                                                                         \
67   foreach_ipfix_transport_protocol_field
68
69 typedef struct
70 {
71   u32 classify_table_index;
72   u8 ip_version;
73   u8 transport_protocol;
74 } ipfix_classify_table_t;
75
76 typedef struct
77 {
78   u32 domain_id;
79   u16 src_port;
80   ipfix_classify_table_t *tables;
81 } flow_report_classify_main_t;
82
83 extern flow_report_classify_main_t flow_report_classify_main;
84
85 static_always_inline u8
86 ipfix_classify_table_index_valid (u32 index)
87 {
88   flow_report_classify_main_t *fcm = &flow_report_classify_main;
89   return index < vec_len (fcm->tables) &&
90     fcm->tables[index].classify_table_index != ~0;
91 }
92
93 static_always_inline ipfix_classify_table_t *
94 ipfix_classify_add_table (void)
95 {
96   flow_report_classify_main_t *fcm = &flow_report_classify_main;
97   u32 i;
98   for (i = 0; i < vec_len (fcm->tables); i++)
99     if (!ipfix_classify_table_index_valid (i))
100       return &fcm->tables[i];
101   u32 index = vec_len (fcm->tables);
102   vec_validate (fcm->tables, index);
103   return &fcm->tables[index];
104 }
105
106 static_always_inline void
107 ipfix_classify_delete_table (u32 index)
108 {
109   flow_report_classify_main_t *fcm = &flow_report_classify_main;
110   ASSERT (index < vec_len (fcm->tables));
111   ASSERT (fcm->tables[index].classify_table_index != ~0);
112   fcm->tables[index].classify_table_index = ~0;
113 }
114
115 u8 *ipfix_classify_template_rewrite (flow_report_main_t * frm,
116                                      flow_report_t * fr,
117                                      ip4_address_t * collector_address,
118                                      ip4_address_t * src_address,
119                                      u16 collector_port);
120
121 vlib_frame_t *ipfix_classify_send_flows (flow_report_main_t * frm,
122                                          flow_report_t * fr,
123                                          vlib_frame_t * f,
124                                          u32 * to_next, u32 node_index);
125
126 #endif /* __included_flow_report_classify_h__ */
127
128 /*
129  * fd.io coding-style-patch-verification: ON
130  *
131  * Local Variables:
132  * eval: (c-set-style "gnu")
133  * End:
134  */