Line data Source code
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 0 : ipfix_classify_table_index_valid (u32 index)
87 : {
88 0 : flow_report_classify_main_t *fcm = &flow_report_classify_main;
89 0 : return index < vec_len (fcm->tables) &&
90 0 : fcm->tables[index].classify_table_index != ~0;
91 : }
92 :
93 : static_always_inline ipfix_classify_table_t *
94 0 : ipfix_classify_add_table (void)
95 : {
96 0 : flow_report_classify_main_t *fcm = &flow_report_classify_main;
97 : u32 i;
98 0 : for (i = 0; i < vec_len (fcm->tables); i++)
99 0 : if (!ipfix_classify_table_index_valid (i))
100 0 : return &fcm->tables[i];
101 0 : u32 index = vec_len (fcm->tables);
102 0 : vec_validate (fcm->tables, index);
103 0 : return &fcm->tables[index];
104 : }
105 :
106 : static_always_inline void
107 0 : ipfix_classify_delete_table (u32 index)
108 : {
109 0 : flow_report_classify_main_t *fcm = &flow_report_classify_main;
110 0 : ASSERT (index < vec_len (fcm->tables));
111 0 : ASSERT (fcm->tables[index].classify_table_index != ~0);
112 0 : fcm->tables[index].classify_table_index = ~0;
113 0 : }
114 :
115 : u8 *ipfix_classify_template_rewrite (ipfix_exporter_t *exp, flow_report_t *fr,
116 : u16 collector_port,
117 : ipfix_report_element_t *elts, u32 n_elts,
118 : u32 *stream_index);
119 :
120 : vlib_frame_t *ipfix_classify_send_flows (flow_report_main_t *frm,
121 : ipfix_exporter_t *exp,
122 : flow_report_t *fr, vlib_frame_t *f,
123 : u32 *to_next, u32 node_index);
124 :
125 : #endif /* __included_flow_report_classify_h__ */
126 :
127 : /*
128 : * fd.io coding-style-patch-verification: ON
129 : *
130 : * Local Variables:
131 : * eval: (c-set-style "gnu")
132 : * End:
133 : */
|