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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
15 #ifndef __included_flow_report_classify_h__
16 #define __included_flow_report_classify_h__
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)
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)
32 #define foreach_ipfix_tcpudp_field \
33 _(tcpudp->src_port, ((u16[]){0xFFFF}), sourceTransportPort, 2) \
34 _(tcpudp->dst_port, ((u16[]){0xFFFF}), destinationTransportPort, 2)
36 #define foreach_ipfix_tcp_field \
37 _(tcpudp->src_port, ((u16[]){0xFFFF}), tcpSourcePort, 2) \
38 _(tcpudp->dst_port, ((u16[]){0xFFFF}), tcpDestinationPort, 2)
40 #define foreach_ipfix_udp_field \
41 _(tcpudp->src_port, ((u16[]){0xFFFF}), udpSourcePort, 2) \
42 _(tcpudp->dst_port, ((u16[]){0xFFFF}), udpDestinationPort, 2)
44 #define foreach_ipfix_transport_protocol_field \
45 switch (transport_protocol) { \
47 foreach_ipfix_tcpudp_field; \
50 foreach_ipfix_tcp_field; \
53 foreach_ipfix_udp_field; \
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; \
63 ip6 = (ip6_header_t *)ip_start; \
64 tcpudp = (tcpudp_header_t *)(ip6+1); \
65 foreach_ipfix_ip6_field; \
67 foreach_ipfix_transport_protocol_field
70 u32 classify_table_index;
72 u8 transport_protocol;
73 } ipfix_classify_table_t;
78 ipfix_classify_table_t * tables;
79 } flow_report_classify_main_t;
81 extern flow_report_classify_main_t flow_report_classify_main;
83 static_always_inline u8 ipfix_classify_table_index_valid (u32 index)
85 flow_report_classify_main_t * fcm = &flow_report_classify_main;
86 return index < vec_len(fcm->tables) &&
87 fcm->tables[index].classify_table_index != ~0;
90 static_always_inline ipfix_classify_table_t * ipfix_classify_add_table (void)
92 flow_report_classify_main_t * fcm = &flow_report_classify_main;
94 for (i = 0; i < vec_len(fcm->tables); i++)
95 if (!ipfix_classify_table_index_valid(i))
96 return &fcm->tables[i];
97 u32 index = vec_len(fcm->tables);
98 vec_validate(fcm->tables, index);
99 return &fcm->tables[index];
102 static_always_inline void ipfix_classify_delete_table (u32 index)
104 flow_report_classify_main_t * fcm = &flow_report_classify_main;
105 ASSERT (index < vec_len(fcm->tables));
106 ASSERT (fcm->tables[index].classify_table_index != ~0);
107 fcm->tables[index].classify_table_index = ~0;
110 u8 * ipfix_classify_template_rewrite (flow_report_main_t * frm,
112 ip4_address_t * collector_address,
113 ip4_address_t * src_address,
116 vlib_frame_t * ipfix_classify_send_flows (flow_report_main_t * frm,
122 #endif /* __included_flow_report_classify_h__ */