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 : /*
16 : * ip/ip4.h: ip4 main include file
17 : *
18 : * Copyright (c) 2008 Eliot Dresselhaus
19 : *
20 : * Permission is hereby granted, free of charge, to any person obtaining
21 : * a copy of this software and associated documentation files (the
22 : * "Software"), to deal in the Software without restriction, including
23 : * without limitation the rights to use, copy, modify, merge, publish,
24 : * distribute, sublicense, and/or sell copies of the Software, and to
25 : * permit persons to whom the Software is furnished to do so, subject to
26 : * the following conditions:
27 : *
28 : * The above copyright notice and this permission notice shall be
29 : * included in all copies or substantial portions of the Software.
30 : *
31 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32 : * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33 : * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34 : * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35 : * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36 : * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37 : * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38 : */
39 :
40 : #ifndef included_ip_ip4_h
41 : #define included_ip_ip4_h
42 :
43 : #include <vnet/ip/ip4_packet.h>
44 : #include <vnet/ip/ip_flow_hash.h>
45 :
46 : #include <vnet/ip/lookup.h>
47 : #include <vnet/ip/ip_interface.h>
48 : #include <vnet/buffer.h>
49 : #include <vnet/feature/feature.h>
50 : #include <vnet/ip/icmp46_packet.h>
51 :
52 : typedef struct ip4_mfib_t
53 : {
54 : /* Hash table for each prefix length mapping. */
55 : uword *fib_entry_by_dst_address[65];
56 :
57 : /* Table ID (hash key) for this FIB. */
58 : u32 table_id;
59 :
60 : /* Index into FIB vector. */
61 : u32 index;
62 : } ip4_mfib_t;
63 :
64 : struct ip4_main_t;
65 :
66 : typedef void (ip4_add_del_interface_address_function_t)
67 : (struct ip4_main_t * im,
68 : uword opaque,
69 : u32 sw_if_index,
70 : ip4_address_t * address,
71 : u32 address_length, u32 if_address_index, u32 is_del);
72 :
73 : typedef struct
74 : {
75 : ip4_add_del_interface_address_function_t *function;
76 : uword function_opaque;
77 : } ip4_add_del_interface_address_callback_t;
78 :
79 : typedef void (ip4_enable_disable_interface_function_t)
80 : (struct ip4_main_t * im, uword opaque, u32 sw_if_index, u32 is_enable);
81 :
82 : typedef struct
83 : {
84 : ip4_enable_disable_interface_function_t *function;
85 : uword function_opaque;
86 : } ip4_enable_disable_interface_callback_t;
87 :
88 : typedef void (ip4_table_bind_function_t)
89 : (struct ip4_main_t * im,
90 : uword opaque, u32 sw_if_index, u32 new_fib_index, u32 old_fib_index);
91 :
92 : typedef struct
93 : {
94 : ip4_table_bind_function_t *function;
95 : uword function_opaque;
96 : } ip4_table_bind_callback_t;
97 :
98 : /**
99 : * @brief IPv4 main type.
100 : *
101 : * State of IPv4 VPP processing including:
102 : * - FIBs
103 : * - Feature indices used in feature topological sort
104 : * - Feature node run time references
105 : */
106 :
107 : typedef struct ip4_main_t
108 : {
109 : ip_lookup_main_t lookup_main;
110 :
111 : /** Vector of FIBs. */
112 : struct fib_table_t_ *fibs;
113 :
114 : /** Vector of MFIBs. */
115 : struct mfib_table_t_ *mfibs;
116 :
117 : u32 fib_masks[33];
118 :
119 : /** Table index indexed by software interface. */
120 : u32 *fib_index_by_sw_if_index;
121 :
122 : /** Table index indexed by software interface. */
123 : u32 *mfib_index_by_sw_if_index;
124 :
125 : /* IP4 enabled count by software interface */
126 : u8 *ip_enabled_by_sw_if_index;
127 :
128 : /** Hash table mapping table id to fib index.
129 : ID space is not necessarily dense; index space is dense. */
130 : uword *fib_index_by_table_id;
131 :
132 : /** Hash table mapping table id to multicast fib index.
133 : ID space is not necessarily dense; index space is dense. */
134 : uword *mfib_index_by_table_id;
135 :
136 : /** Functions to call when interface address changes. */
137 : ip4_add_del_interface_address_callback_t
138 : * add_del_interface_address_callbacks;
139 :
140 : /** Functions to call when interface becomes IPv4 enabled/disable. */
141 : ip4_enable_disable_interface_callback_t
142 : * enable_disable_interface_callbacks;
143 :
144 : /** Functions to call when interface to table biding changes. */
145 : ip4_table_bind_callback_t *table_bind_callbacks;
146 :
147 : /** Template used to generate IP4 ARP packets. */
148 : vlib_packet_template_t ip4_arp_request_packet_template;
149 :
150 : /** Seed for Jenkins hash used to compute ip4 flow hash. */
151 : u32 flow_hash_seed;
152 :
153 : /** @brief Template information for VPP generated packets */
154 : struct
155 : {
156 : /** TTL to use for host generated packets. */
157 : u8 ttl;
158 :
159 : /** TOS byte to use for host generated packets. */
160 : u8 tos;
161 :
162 : u8 pad[2];
163 : } host_config;
164 :
165 : u16 msg_id_base;
166 : } ip4_main_t;
167 :
168 : #define ARP_THROTTLE_BITS (512)
169 :
170 : /** Global ip4 main structure. */
171 : extern ip4_main_t ip4_main;
172 :
173 : /** Global ip4 input node. Errors get attached to ip4 input node. */
174 : extern vlib_node_registration_t ip4_input_node;
175 : extern vlib_node_registration_t ip4_lookup_node;
176 : extern vlib_node_registration_t ip4_local_node;
177 : extern vlib_node_registration_t ip4_rewrite_node;
178 : extern vlib_node_registration_t ip4_rewrite_mcast_node;
179 : extern vlib_node_registration_t ip4_rewrite_local_node;
180 : extern vlib_node_registration_t ip4_arp_node;
181 : extern vlib_node_registration_t ip4_glean_node;
182 : extern vlib_node_registration_t ip4_midchain_node;
183 : extern vlib_node_registration_t ip4_punt_node;
184 :
185 : always_inline uword
186 160858 : ip4_destination_matches_route (const ip4_main_t * im,
187 : const ip4_address_t * key,
188 : const ip4_address_t * dest, uword dest_length)
189 : {
190 160858 : return 0 == ((key->data_u32 ^ dest->data_u32) & im->fib_masks[dest_length]);
191 : }
192 :
193 : always_inline uword
194 : ip4_destination_matches_interface (ip4_main_t * im,
195 : ip4_address_t * key,
196 : ip_interface_address_t * ia)
197 : {
198 : ip4_address_t *a = ip_interface_address_get_address (&im->lookup_main, ia);
199 : return ip4_destination_matches_route (im, key, a, ia->address_length);
200 : }
201 :
202 : /* Find interface address which matches destination. */
203 : always_inline ip4_address_t *
204 0 : ip4_interface_address_matching_destination (ip4_main_t * im,
205 : const ip4_address_t * dst,
206 : u32 sw_if_index,
207 : ip_interface_address_t **
208 : result_ia)
209 : {
210 0 : ip_lookup_main_t *lm = &im->lookup_main;
211 : ip_interface_address_t *ia;
212 0 : ip4_address_t *result = 0;
213 :
214 : /* *INDENT-OFF* */
215 0 : foreach_ip_interface_address (lm, ia, sw_if_index,
216 : 1 /* honor unnumbered */,
217 : ({
218 : ip4_address_t * a = ip_interface_address_get_address (lm, ia);
219 : if (ip4_destination_matches_route (im, dst, a, ia->address_length))
220 : {
221 : result = a;
222 : break;
223 : }
224 : }));
225 : /* *INDENT-ON* */
226 0 : if (result_ia)
227 0 : *result_ia = result ? ia : 0;
228 0 : return result;
229 : }
230 :
231 : ip4_address_t *ip4_interface_first_address (ip4_main_t * im, u32 sw_if_index,
232 : ip_interface_address_t **
233 : result_ia);
234 :
235 : clib_error_t *ip4_add_del_interface_address (vlib_main_t * vm,
236 : u32 sw_if_index,
237 : ip4_address_t * address,
238 : u32 address_length, u32 is_del);
239 :
240 : void ip4_directed_broadcast (u32 sw_if_index, u8 enable);
241 :
242 : void ip4_sw_interface_enable_disable (u32 sw_if_index, u32 is_enable);
243 :
244 : int ip4_address_compare (ip4_address_t * a1, ip4_address_t * a2);
245 :
246 : uword
247 : ip4_udp_register_listener (vlib_main_t * vm,
248 : u16 dst_port, u32 next_node_index);
249 :
250 : u16 ip4_tcp_udp_compute_checksum (vlib_main_t * vm, vlib_buffer_t * p0,
251 : ip4_header_t * ip0);
252 :
253 : void ip4_register_protocol (u32 protocol, u32 node_index);
254 : void ip4_unregister_protocol (u32 protocolx);
255 :
256 : serialize_function_t serialize_vnet_ip4_main, unserialize_vnet_ip4_main;
257 :
258 : int vnet_set_ip4_classify_intfc (vlib_main_t * vm, u32 sw_if_index,
259 : u32 table_index);
260 :
261 : void ip4_punt_policer_add_del (u8 is_add, u32 policer_index);
262 :
263 : void ip4_punt_redirect_add_paths (u32 rx_sw_if_index,
264 : const fib_route_path_t *paths);
265 :
266 : void ip4_punt_redirect_del (u32 rx_sw_if_index);
267 :
268 :
269 : void
270 : ip4_forward_next_trace (vlib_main_t * vm,
271 : vlib_node_runtime_t * node,
272 : vlib_frame_t * frame,
273 : vlib_rx_or_tx_t which_adj_index);
274 :
275 : u8 *format_ip4_forward_next_trace (u8 * s, va_list * args);
276 :
277 : u32 ip4_tcp_udp_validate_checksum (vlib_main_t * vm, vlib_buffer_t * p0);
278 :
279 : always_inline u32
280 53 : vlib_buffer_get_ip4_fib_index (vlib_buffer_t * b)
281 : {
282 : u32 fib_index, sw_if_index;
283 53 : sw_if_index = vnet_buffer (b)->sw_if_index[VLIB_RX];
284 53 : fib_index = vnet_buffer (b)->sw_if_index[VLIB_TX];
285 : return (fib_index == (u32) ~ 0) ?
286 53 : vec_elt (ip4_main.fib_index_by_sw_if_index, sw_if_index) : fib_index;
287 : }
288 :
289 : #endif /* included_ip_ip4_h */
290 :
291 : /*
292 : * fd.io coding-style-patch-verification: ON
293 : *
294 : * Local Variables:
295 : * eval: (c-set-style "gnu")
296 : * End:
297 : */
|