FD.io VPP  v21.06
Vector Packet Processing
ip4.h
Go to the documentation of this file.
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. */
56 
57  /* Table ID (hash key) for this FIB. */
59 
60  /* Index into FIB vector. */
62 } ip4_mfib_t;
63 
64 struct ip4_main_t;
65 
67  (struct ip4_main_t * im,
68  uword opaque,
71  u32 address_length, u32 if_address_index, u32 is_del);
72 
73 typedef struct
74 {
78 
80  (struct ip4_main_t * im, uword opaque, u32 sw_if_index, u32 is_enable);
81 
82 typedef struct
83 {
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 {
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 {
110 
111  /** Vector of FIBs. */
113 
114  /** Vector of MTries. */
116 
117  /** Vector of MFIBs. */
119 
120  u32 fib_masks[33];
121 
122  /** Table index indexed by software interface. */
124 
125  /** Table index indexed by software interface. */
127 
128  /* IP4 enabled count by software interface */
130 
131  /** Hash table mapping table id to fib index.
132  ID space is not necessarily dense; index space is dense. */
134 
135  /** Hash table mapping table id to multicast fib index.
136  ID space is not necessarily dense; index space is dense. */
138 
139  /** Functions to call when interface address changes. */
142 
143  /** Functions to call when interface becomes IPv4 enabled/disable. */
146 
147  /** Functions to call when interface to table biding changes. */
149 
150  /** Template used to generate IP4 ARP packets. */
152 
153  /** Seed for Jenkins hash used to compute ip4 flow hash. */
155 
156  /** @brief Template information for VPP generated packets */
157  struct
158  {
159  /** TTL to use for host generated packets. */
161 
162  /** TOS byte to use for host generated packets. */
164 
165  u8 pad[2];
166  } host_config;
167 } ip4_main_t;
168 
169 #define ARP_THROTTLE_BITS (512)
170 
171 /** Global ip4 main structure. */
172 extern ip4_main_t ip4_main;
173 extern char *ip4_error_strings[];
174 
175 /** Global ip4 input node. Errors get attached to ip4 input node. */
186 
189  const ip4_address_t * key,
190  const ip4_address_t * dest, uword dest_length)
191 {
192  return 0 == ((key->data_u32 ^ dest->data_u32) & im->fib_masks[dest_length]);
193 }
194 
197  ip4_address_t * key,
199 {
201  return ip4_destination_matches_route (im, key, a, ia->address_length);
202 }
203 
204 /* Find interface address which matches destination. */
207  const ip4_address_t * dst,
210  result_ia)
211 {
212  ip_lookup_main_t *lm = &im->lookup_main;
214  ip4_address_t *result = 0;
215 
216  /* *INDENT-OFF* */
217  foreach_ip_interface_address (lm, ia, sw_if_index,
218  1 /* honor unnumbered */,
219  ({
221  if (ip4_destination_matches_route (im, dst, a, ia->address_length))
222  {
223  result = a;
224  break;
225  }
226  }));
227  /* *INDENT-ON* */
228  if (result_ia)
229  *result_ia = result ? ia : 0;
230  return result;
231 }
232 
235  result_ia);
236 
239  ip4_address_t * address,
240  u32 address_length, u32 is_del);
241 
243 
245 
247 
248 uword
250  u16 dst_port, u32 next_node_index);
251 
253  ip4_header_t * ip0);
254 
256 void ip4_unregister_protocol (u32 protocolx);
257 
259 
261  u32 table_index);
262 
263 void ip4_punt_policer_add_del (u8 is_add, u32 policer_index);
264 
265 void ip4_punt_redirect_add (u32 rx_sw_if_index,
266  u32 tx_sw_if_index, ip46_address_t * nh);
267 void ip4_punt_redirect_add_paths (u32 rx_sw_if_index,
269 
270 void ip4_punt_redirect_del (u32 rx_sw_if_index);
271 
272 
273 void
277  vlib_rx_or_tx_t which_adj_index);
278 
279 u8 *format_ip4_forward_next_trace (u8 * s, va_list * args);
280 
282 
285 {
286  u32 fib_index, sw_if_index;
287  sw_if_index = vnet_buffer (b)->sw_if_index[VLIB_RX];
288  fib_index = vnet_buffer (b)->sw_if_index[VLIB_TX];
289  return (fib_index == (u32) ~ 0) ?
290  vec_elt (ip4_main.fib_index_by_sw_if_index, sw_if_index) : fib_index;
291 }
292 
293 #endif /* included_ip_ip4_h */
294 
295 /*
296  * fd.io coding-style-patch-verification: ON
297  *
298  * Local Variables:
299  * eval: (c-set-style "gnu")
300  * End:
301  */
void ip4_punt_redirect_add(u32 rx_sw_if_index, u32 tx_sw_if_index, ip46_address_t *nh)
u8 pad[3]
log2 (size of the packing page block)
Definition: bihash_doc.h:61
ip4_add_del_interface_address_callback_t * add_del_interface_address_callbacks
Functions to call when interface address changes.
Definition: ip4.h:141
a
Definition: bitmap.h:544
A representation of a path as described by a route producer.
Definition: fib_types.h:500
u32 index
Definition: ip4.h:61
vl_api_fib_path_nh_t nh
Definition: fib_types.api:126
serialize_function_t serialize_vnet_ip4_main
Definition: ip4.h:258
void ip4_punt_redirect_del(u32 rx_sw_if_index)
vl_api_ip_port_and_mask_t dst_port
Definition: flow_types.api:92
vl_api_ip_proto_t protocol
Definition: lb_types.api:72
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
Definition: ip_interface.h:43
Definitions for all things IP (v4|v6) unicast and multicast lookup related.
ip4_address_t * ip4_interface_first_address(ip4_main_t *im, u32 sw_if_index, ip_interface_address_t **result_ia)
Definition: ip4_forward.c:281
vlib_node_registration_t ip4_punt_node
(constructor) VLIB_REGISTER_NODE (ip4_punt_node)
vlib_node_registration_t ip4_midchain_node
(constructor) VLIB_REGISTER_NODE (ip4_midchain_node)
Definition: ip4_forward.c:2657
vlib_main_t vlib_node_runtime_t vlib_frame_t * frame
Definition: nat44_ei.c:3048
char * ip4_error_strings[]
Definition: ip4_input.c:377
void() serialize_function_t(serialize_main_t *m, va_list *va)
Definition: serialize.h:168
ip_lookup_main_t lookup_main
Definition: ip4.h:109
static uword ip4_destination_matches_route(const ip4_main_t *im, const ip4_address_t *key, const ip4_address_t *dest, uword dest_length)
Definition: ip4.h:188
u32 * fib_index_by_sw_if_index
Table index indexed by software interface.
Definition: ip4.h:123
void ip4_punt_redirect_add_paths(u32 rx_sw_if_index, fib_route_path_t *paths)
void ip4_register_protocol(u32 protocol, u32 node_index)
Definition: ip4_forward.c:1895
uword ip4_udp_register_listener(vlib_main_t *vm, u16 dst_port, u32 next_node_index)
unsigned char u8
Definition: types.h:56
vlib_buffer_t ** b
vlib_node_registration_t ip4_lookup_node
(constructor) VLIB_REGISTER_NODE (ip4_lookup_node)
Definition: ip4_forward.c:104
unsigned int u32
Definition: types.h:88
vlib_node_registration_t ip4_rewrite_mcast_node
(constructor) VLIB_REGISTER_NODE (ip4_rewrite_mcast_node)
Definition: ip4_forward.c:2641
vlib_rx_or_tx_t
Definition: defs.h:44
u32 * mfib_index_by_sw_if_index
Table index indexed by software interface.
Definition: ip4.h:126
ip4_enable_disable_interface_callback_t * enable_disable_interface_callbacks
Functions to call when interface becomes IPv4 enabled/disable.
Definition: ip4.h:145
struct mfib_table_t_ * mfibs
Vector of MFIBs.
Definition: ip4.h:118
int vnet_set_ip4_classify_intfc(vlib_main_t *vm, u32 sw_if_index, u32 table_index)
Definition: ip4_forward.c:2904
void ip4_directed_broadcast(u32 sw_if_index, u8 enable)
Definition: ip4_forward.c:843
vlib_node_registration_t ip4_arp_node
(constructor) VLIB_REGISTER_NODE (ip4_arp_node)
Definition: ip4_neighbor.c:272
clib_error_t * ip4_add_del_interface_address(vlib_main_t *vm, u32 sw_if_index, ip4_address_t *address, u32 address_length, u32 is_del)
Definition: ip4_forward.c:833
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34
void ip4_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
Definition: ip4_forward.c:601
uword * fib_index_by_table_id
Hash table mapping table id to fib index.
Definition: ip4.h:133
vlib_node_registration_t ip4_input_node
Global ip4 input node.
Definition: ip4_input.c:385
unsigned short u16
Definition: types.h:57
u8 * ip_enabled_by_sw_if_index
Definition: ip4.h:129
Definition: ip4.h:52
u32 ip4_tcp_udp_validate_checksum(vlib_main_t *vm, vlib_buffer_t *p0)
void() ip4_table_bind_function_t(struct ip4_main_t *im, uword opaque, u32 sw_if_index, u32 new_fib_index, u32 old_fib_index)
Definition: ip4.h:89
The IPv4 FIB.
Definition: ip4_fib.h:39
vlib_node_registration_t ip4_rewrite_node
(constructor) VLIB_REGISTER_NODE (ip4_rewrite_node)
Definition: ip4_forward.c:2619
void() ip4_enable_disable_interface_function_t(struct ip4_main_t *im, uword opaque, u32 sw_if_index, u32 is_enable)
Definition: ip4.h:80
int ip4_address_compare(ip4_address_t *a1, ip4_address_t *a2)
Definition: ip46_cli.c:53
serialize_function_t unserialize_vnet_ip4_main
Definition: ip4.h:258
static ip4_address_t * ip4_interface_address_matching_destination(ip4_main_t *im, const ip4_address_t *dst, u32 sw_if_index, ip_interface_address_t **result_ia)
Definition: ip4.h:206
vnet_interface_main_t * im
void ip4_punt_policer_add_del(u8 is_add, u32 policer_index)
vlib_packet_template_t ip4_arp_request_packet_template
Template used to generate IP4 ARP packets.
Definition: ip4.h:151
uword * fib_entry_by_dst_address[65]
Definition: ip4.h:55
vl_api_interface_index_t tx_sw_if_index
Definition: ip.api:548
manual_print typedef address
Definition: ip_types.api:96
u16 ip4_tcp_udp_compute_checksum(vlib_main_t *vm, vlib_buffer_t *p0, ip4_header_t *ip0)
#define always_inline
Definition: rdma_mlx5dv.h:23
IPv4 main type.
Definition: ip4.h:107
static u32 vlib_buffer_get_ip4_fib_index(vlib_buffer_t *b)
Definition: ip4.h:284
#define vec_elt(v, i)
Get vector value at index i.
ip4_table_bind_callback_t * table_bind_callbacks
Functions to call when interface to table biding changes.
Definition: ip4.h:148
typedef key
Definition: ipsec_types.api:88
struct _vlib_node_registration vlib_node_registration_t
paths
Definition: map.api:460
Definition: defs.h:47
struct ip4_main_t ip4_main_t
IPv4 main type.
struct ip4_fib_t_ * v4_fibs
Vector of MTries.
Definition: ip4.h:115
vlib_main_t vlib_node_runtime_t * node
Definition: nat44_ei.c:3047
void ip4_forward_next_trace(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, vlib_rx_or_tx_t which_adj_index)
Definition: ip4_forward.c:1240
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
Definition: ip_interface.h:57
vlib_node_registration_t ip4_rewrite_local_node
VLIB buffer representation.
Definition: buffer.h:111
u64 uword
Definition: types.h:112
void() ip4_add_del_interface_address_function_t(struct ip4_main_t *im, uword opaque, u32 sw_if_index, ip4_address_t *address, u32 address_length, u32 if_address_index, u32 is_del)
Definition: ip4.h:67
u8 * format_ip4_forward_next_trace(u8 *s, va_list *args)
Definition: ip4_forward.c:1190
node node_index
vlib_node_registration_t ip4_glean_node
(constructor) VLIB_REGISTER_NODE (ip4_glean_node)
Definition: ip4_neighbor.c:285
static uword ip4_destination_matches_interface(ip4_main_t *im, ip4_address_t *key, ip_interface_address_t *ia)
Definition: ip4.h:196
#define vnet_buffer(b)
Definition: buffer.h:437
vl_api_ip4_address_t dst
Definition: pnat.api:41
A protocol Independent IP multicast FIB table.
Definition: mfib_table.h:71
ip4_main_t ip4_main
Global ip4 main structure.
Definition: ip4_forward.c:1105
struct fib_table_t_ * fibs
Vector of FIBs.
Definition: ip4.h:112
struct ip4_mfib_t ip4_mfib_t
u32 table_id
Definition: ip4.h:58
u32 flow_hash_seed
Seed for Jenkins hash used to compute ip4 flow hash.
Definition: ip4.h:154
uword * mfib_index_by_table_id
Hash table mapping table id to multicast fib index.
Definition: ip4.h:137
vlib_node_registration_t ip4_local_node
(constructor) VLIB_REGISTER_NODE (ip4_local_node)
Definition: ip4_forward.c:1850
u8 ttl
TTL to use for host generated packets.
Definition: ip4.h:160
void ip4_unregister_protocol(u32 protocolx)
Definition: ip4_forward.c:1907
u8 tos
TOS byte to use for host generated packets.
Definition: ip4.h:163
Definition: defs.h:46
IP prefix management on interfaces.
A protocol Independent FIB table.
Definition: fib_table.h:71
u32 fib_masks[33]
Definition: ip4.h:120