FD.io VPP  v21.06-3-gbb25fbf28
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 
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 {
200  ip4_address_t *a = ip_interface_address_get_address (&im->lookup_main, ia);
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* */
218  1 /* honor unnumbered */,
219  ({
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 
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) ?
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  */
ip4_add_del_interface_address_function_t
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
ip4_main_t::ttl
u8 ttl
TTL to use for host generated packets.
Definition: ip4.h:160
ip4_unregister_protocol
void ip4_unregister_protocol(u32 protocolx)
Definition: ip4_forward.c:1907
ip4_lookup_node
vlib_node_registration_t ip4_lookup_node
(constructor) VLIB_REGISTER_NODE (ip4_lookup_node)
Definition: ip4_forward.c:104
ip4_midchain_node
vlib_node_registration_t ip4_midchain_node
(constructor) VLIB_REGISTER_NODE (ip4_midchain_node)
Definition: ip4_forward.c:2657
im
vnet_interface_main_t * im
Definition: interface_output.c:395
ip_interface_address_get_address
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
Definition: ip_interface.h:43
ip4_main_t::v4_fibs
struct ip4_fib_t_ * v4_fibs
Vector of MTries.
Definition: ip4.h:115
vlib_packet_template_t
Definition: buffer_funcs.h:1436
foreach_ip_interface_address
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
Definition: ip_interface.h:57
ip4_directed_broadcast
void ip4_directed_broadcast(u32 sw_if_index, u8 enable)
Definition: ip4_forward.c:843
dst_port
vl_api_ip_port_and_mask_t dst_port
Definition: flow_types.api:92
frame
vlib_main_t vlib_node_runtime_t vlib_frame_t * frame
Definition: nat44_ei.c:3048
ip4_main_t::lookup_main
ip_lookup_main_t lookup_main
Definition: ip4.h:109
ip4_forward_next_trace
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
ip4_main_t::table_bind_callbacks
ip4_table_bind_callback_t * table_bind_callbacks
Functions to call when interface to table biding changes.
Definition: ip4.h:148
ip4_main
ip4_main_t ip4_main
Global ip4 main structure.
Definition: ip4_forward.c:1105
ip4_sw_interface_enable_disable
void ip4_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
Definition: ip4_forward.c:601
ip4_rewrite_local_node
vlib_node_registration_t ip4_rewrite_local_node
buffer.h
ip4_add_del_interface_address_callback_t
Definition: ip4.h:73
ip_interface_address_t::address_length
u16 address_length
Definition: lookup.h:98
node
vlib_main_t vlib_node_runtime_t * node
Definition: nat44_ei.c:3047
serialize_function_t
void() serialize_function_t(serialize_main_t *m, va_list *va)
Definition: serialize.h:168
ip4_interface_address_matching_destination
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
paths
paths
Definition: map.api:460
u16
unsigned short u16
Definition: types.h:57
ip4_main_t::ip4_arp_request_packet_template
vlib_packet_template_t ip4_arp_request_packet_template
Template used to generate IP4 ARP packets.
Definition: ip4.h:151
ip4_main_t::fib_index_by_table_id
uword * fib_index_by_table_id
Hash table mapping table id to fib index.
Definition: ip4.h:133
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
VLIB_RX
@ VLIB_RX
Definition: defs.h:46
node_index
node node_index
Definition: interface_output.c:420
ip4_local_node
vlib_node_registration_t ip4_local_node
(constructor) VLIB_REGISTER_NODE (ip4_local_node)
Definition: ip4_forward.c:1850
ip4_table_bind_callback_t::function_opaque
uword function_opaque
Definition: ip4.h:95
ip4_main_t::fib_masks
u32 fib_masks[33]
Definition: ip4.h:120
ip4_register_protocol
void ip4_register_protocol(u32 protocol, u32 node_index)
Definition: ip4_forward.c:1895
ip4_rewrite_node
vlib_node_registration_t ip4_rewrite_node
(constructor) VLIB_REGISTER_NODE (ip4_rewrite_node)
Definition: ip4_forward.c:2619
ip4_main_t::enable_disable_interface_callbacks
ip4_enable_disable_interface_callback_t * enable_disable_interface_callbacks
Functions to call when interface becomes IPv4 enabled/disable.
Definition: ip4.h:145
vlib_frame_t
Definition: node.h:372
ip4_rewrite_mcast_node
vlib_node_registration_t ip4_rewrite_mcast_node
(constructor) VLIB_REGISTER_NODE (ip4_rewrite_mcast_node)
Definition: ip4_forward.c:2641
mfib_table_t_
A protocol Independent IP multicast FIB table.
Definition: mfib_table.h:71
ip4_fib_t_
The IPv4 FIB.
Definition: ip4_fib.h:39
ip4_header_t
Definition: ip4_packet.h:87
format_ip4_forward_next_trace
u8 * format_ip4_forward_next_trace(u8 *s, va_list *args)
Definition: ip4_forward.c:1190
key
typedef key
Definition: ipsec_types.api:88
serialize_vnet_ip4_main
serialize_function_t serialize_vnet_ip4_main
Definition: ip4.h:258
vec_elt
#define vec_elt(v, i)
Get vector value at index i.
Definition: vec_bootstrap.h:210
ip4_main_t
struct ip4_main_t ip4_main_t
IPv4 main type.
ip4_main_t::fib_index_by_sw_if_index
u32 * fib_index_by_sw_if_index
Table index indexed by software interface.
Definition: ip4.h:123
fib_table_t_
A protocol Independent FIB table.
Definition: fib_table.h:71
ip4_mfib_t::table_id
u32 table_id
Definition: ip4.h:58
ip4_add_del_interface_address
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
feature.h
ip_flow_hash.h
vnet_buffer
#define vnet_buffer(b)
Definition: buffer.h:437
ip4_main_t::pad
u8 pad[2]
Definition: ip4.h:165
ip4_main_t::host_config
struct ip4_main_t::@372 host_config
Template information for VPP generated packets.
ip4_punt_redirect_add
void ip4_punt_redirect_add(u32 rx_sw_if_index, u32 tx_sw_if_index, ip46_address_t *nh)
Definition: ip4_punt_drop.c:316
ip4_destination_matches_interface
static uword ip4_destination_matches_interface(ip4_main_t *im, ip4_address_t *key, ip_interface_address_t *ia)
Definition: ip4.h:196
ip4_tcp_udp_validate_checksum
u32 ip4_tcp_udp_validate_checksum(vlib_main_t *vm, vlib_buffer_t *p0)
Definition: pnat_test_stubs.h:84
uword
u64 uword
Definition: types.h:112
tx_sw_if_index
vl_api_interface_index_t tx_sw_if_index
Definition: ip.api:548
vlib_rx_or_tx_t
vlib_rx_or_tx_t
Definition: defs.h:44
ip4_enable_disable_interface_callback_t
Definition: ip4.h:82
ip4_main_t::mfib_index_by_table_id
uword * mfib_index_by_table_id
Hash table mapping table id to multicast fib index.
Definition: ip4.h:137
address
manual_print typedef address
Definition: ip_types.api:96
nh
vl_api_fib_path_nh_t nh
Definition: fib_types.api:126
ip4_mfib_t::index
u32 index
Definition: ip4.h:61
ip4_mfib_t::fib_entry_by_dst_address
uword * fib_entry_by_dst_address[65]
Definition: ip4.h:55
ip4_address_t
Definition: ip4_packet.h:50
ip4_main_t::ip_enabled_by_sw_if_index
u8 * ip_enabled_by_sw_if_index
Definition: ip4.h:129
ip4_enable_disable_interface_function_t
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
vlib_node_registration_t
struct _vlib_node_registration vlib_node_registration_t
unserialize_vnet_ip4_main
serialize_function_t unserialize_vnet_ip4_main
Definition: ip4.h:258
ip4_table_bind_callback_t
Definition: ip4.h:92
ip4_address_compare
int ip4_address_compare(ip4_address_t *a1, ip4_address_t *a2)
Definition: ip46_cli.c:53
ip4_punt_policer_add_del
void ip4_punt_policer_add_del(u8 is_add, u32 policer_index)
Definition: ip4_punt_drop.c:244
ip4_add_del_interface_address_callback_t::function_opaque
uword function_opaque
Definition: ip4.h:76
ip4_destination_matches_route
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
ip4_packet.h
ip4_main_t::add_del_interface_address_callbacks
ip4_add_del_interface_address_callback_t * add_del_interface_address_callbacks
Functions to call when interface address changes.
Definition: ip4.h:141
ip4_tcp_udp_compute_checksum
u16 ip4_tcp_udp_compute_checksum(vlib_main_t *vm, vlib_buffer_t *p0, ip4_header_t *ip0)
Definition: pnat_test_stubs.h:59
ip4_punt_redirect_add_paths
void ip4_punt_redirect_add_paths(u32 rx_sw_if_index, fib_route_path_t *paths)
Definition: ip4_punt_drop.c:337
always_inline
#define always_inline
Definition: rdma_mlx5dv.h:23
ip4_main_t::mfib_index_by_sw_if_index
u32 * mfib_index_by_sw_if_index
Table index indexed by software interface.
Definition: ip4.h:126
ip4_mfib_t
Definition: ip4.h:52
u32
unsigned int u32
Definition: types.h:88
ip4_arp_node
vlib_node_registration_t ip4_arp_node
(constructor) VLIB_REGISTER_NODE (ip4_arp_node)
Definition: ip4_neighbor.c:272
ip4_glean_node
vlib_node_registration_t ip4_glean_node
(constructor) VLIB_REGISTER_NODE (ip4_glean_node)
Definition: ip4_neighbor.c:285
protocol
vl_api_ip_proto_t protocol
Definition: lb_types.api:72
ip4_address_t::data_u32
u32 data_u32
Definition: ip4_packet.h:53
ip4_main_t::fibs
struct fib_table_t_ * fibs
Vector of FIBs.
Definition: ip4.h:112
vlib_buffer_get_ip4_fib_index
static u32 vlib_buffer_get_ip4_fib_index(vlib_buffer_t *b)
Definition: ip4.h:284
dst
vl_api_ip4_address_t dst
Definition: pnat.api:41
fib_route_path_t_
A representation of a path as described by a route producer.
Definition: fib_types.h:500
ip4_punt_node
vlib_node_registration_t ip4_punt_node
(constructor) VLIB_REGISTER_NODE (ip4_punt_node)
Definition: ip4_punt_drop.c:217
ip4_error_strings
char * ip4_error_strings[]
Definition: ip4_input.c:377
ip_lookup_main_t
Definition: lookup.h:121
ip4_enable_disable_interface_callback_t::function_opaque
uword function_opaque
Definition: ip4.h:85
ip4_main_t::mfibs
struct mfib_table_t_ * mfibs
Vector of MFIBs.
Definition: ip4.h:118
ip_interface.h
IP prefix management on interfaces.
vlib_main_t
Definition: main.h:102
b
vlib_buffer_t ** b
Definition: nat44_ei_out2in.c:717
ip4_punt_redirect_del
void ip4_punt_redirect_del(u32 rx_sw_if_index)
Definition: ip4_punt_drop.c:347
u8
unsigned char u8
Definition: types.h:56
clib_error_t
Definition: clib_error.h:21
a
a
Definition: bitmap.h:544
lookup.h
icmp46_packet.h
ip4_input_node
vlib_node_registration_t ip4_input_node
Global ip4 input node.
Definition: ip4_input.c:385
ip4_table_bind_function_t
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
ip4_main_t::tos
u8 tos
TOS byte to use for host generated packets.
Definition: ip4.h:163
ip_interface_address_t
Definition: lookup.h:89
ip4_main_t::flow_hash_seed
u32 flow_hash_seed
Seed for Jenkins hash used to compute ip4 flow hash.
Definition: ip4.h:154
ip4_interface_first_address
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
vnet_set_ip4_classify_intfc
int vnet_set_ip4_classify_intfc(vlib_main_t *vm, u32 sw_if_index, u32 table_index)
Definition: ip4_forward.c:2904
vlib_node_runtime_t
Definition: node.h:454
ip4_main_t
IPv4 main type.
Definition: ip4.h:107
sw_if_index
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34
VLIB_TX
@ VLIB_TX
Definition: defs.h:47
ip4_mfib_t
struct ip4_mfib_t ip4_mfib_t
ip4_udp_register_listener
uword ip4_udp_register_listener(vlib_main_t *vm, u16 dst_port, u32 next_node_index)
vlib_buffer_t
VLIB buffer representation.
Definition: buffer.h:111