FD.io VPP  v21.10.1-2-g0a485f517
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 MFIBs. */
116 
118 
119  /** Table index indexed by software interface. */
121 
122  /** Table index indexed by software interface. */
124 
125  /* IP4 enabled count by software interface */
127 
128  /** Hash table mapping table id to fib index.
129  ID space is not necessarily dense; index space is dense. */
131 
132  /** Hash table mapping table id to multicast fib index.
133  ID space is not necessarily dense; index space is dense. */
135 
136  /** Functions to call when interface address changes. */
139 
140  /** Functions to call when interface becomes IPv4 enabled/disable. */
143 
144  /** Functions to call when interface to table biding changes. */
146 
147  /** Template used to generate IP4 ARP packets. */
149 
150  /** Seed for Jenkins hash used to compute ip4 flow hash. */
152 
153  /** @brief Template information for VPP generated packets */
154  struct
155  {
156  /** TTL to use for host generated packets. */
158 
159  /** TOS byte to use for host generated packets. */
161 
162  u8 pad[2];
163  } host_config;
164 
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 extern char *ip4_error_strings[];
173 
174 /** Global ip4 input node. Errors get attached to ip4 input node. */
185 
188  const ip4_address_t * key,
189  const ip4_address_t * dest, uword dest_length)
190 {
191  return 0 == ((key->data_u32 ^ dest->data_u32) & im->fib_masks[dest_length]);
192 }
193 
196  ip4_address_t * key,
198 {
199  ip4_address_t *a = ip_interface_address_get_address (&im->lookup_main, ia);
201 }
202 
203 /* Find interface address which matches destination. */
206  const ip4_address_t * dst,
209  result_ia)
210 {
211  ip_lookup_main_t *lm = &im->lookup_main;
213  ip4_address_t *result = 0;
214 
215  /* *INDENT-OFF* */
217  1 /* honor unnumbered */,
218  ({
221  {
222  result = a;
223  break;
224  }
225  }));
226  /* *INDENT-ON* */
227  if (result_ia)
228  *result_ia = result ? ia : 0;
229  return result;
230 }
231 
234  result_ia);
235 
239  u32 address_length, u32 is_del);
240 
242 
244 
246 
247 uword
249  u16 dst_port, u32 next_node_index);
250 
252  ip4_header_t * ip0);
253 
255 void ip4_unregister_protocol (u32 protocolx);
256 
258 
260  u32 table_index);
261 
262 void ip4_punt_policer_add_del (u8 is_add, u32 policer_index);
263 
264 void ip4_punt_redirect_add_paths (u32 rx_sw_if_index,
265  const fib_route_path_t *paths);
266 
267 void ip4_punt_redirect_del (u32 rx_sw_if_index);
268 
269 
270 void
274  vlib_rx_or_tx_t which_adj_index);
275 
276 u8 *format_ip4_forward_next_trace (u8 * s, va_list * args);
277 
279 
282 {
283  u32 fib_index, sw_if_index;
284  sw_if_index = vnet_buffer (b)->sw_if_index[VLIB_RX];
285  fib_index = vnet_buffer (b)->sw_if_index[VLIB_TX];
286  return (fib_index == (u32) ~ 0) ?
288 }
289 
290 #endif /* included_ip_ip4_h */
291 
292 /*
293  * fd.io coding-style-patch-verification: ON
294  *
295  * Local Variables:
296  * eval: (c-set-style "gnu")
297  * End:
298  */
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:157
ip4_unregister_protocol
void ip4_unregister_protocol(u32 protocolx)
Definition: ip4_forward.c:1884
ip4_lookup_node
vlib_node_registration_t ip4_lookup_node
(constructor) VLIB_REGISTER_NODE (ip4_lookup_node)
Definition: ip4_forward.c:105
ip4_midchain_node
vlib_node_registration_t ip4_midchain_node
(constructor) VLIB_REGISTER_NODE (ip4_midchain_node)
Definition: ip4_forward.c:2635
im
vnet_interface_main_t * im
Definition: interface_output.c:415
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
vlib_packet_template_t
Definition: buffer_funcs.h:1433
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:840
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:1239
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:145
ip4_main
ip4_main_t ip4_main
Global ip4 main structure.
Definition: ip4_forward.c:1104
ip4_sw_interface_enable_disable
void ip4_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
Definition: ip4_forward.c:602
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
ip4_main_t::host_config
struct ip4_main_t::@378 host_config
Template information for VPP generated packets.
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:205
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:148
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:130
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:440
ip4_local_node
vlib_node_registration_t ip4_local_node
(constructor) VLIB_REGISTER_NODE (ip4_local_node)
Definition: ip4_forward.c:1827
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:117
ip4_register_protocol
void ip4_register_protocol(u32 protocol, u32 node_index)
Definition: ip4_forward.c:1872
ip4_rewrite_node
vlib_node_registration_t ip4_rewrite_node
(constructor) VLIB_REGISTER_NODE (ip4_rewrite_node)
Definition: ip4_forward.c:2597
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:142
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:2619
mfib_table_t_
A protocol Independent IP multicast FIB table.
Definition: mfib_table.h:71
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:1189
key
typedef key
Definition: ipsec_types.api:91
serialize_vnet_ip4_main
serialize_function_t serialize_vnet_ip4_main
Definition: ip4.h:257
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:120
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:830
feature.h
ip_flow_hash.h
vnet_buffer
#define vnet_buffer(b)
Definition: buffer.h:441
ip4_main_t::pad
u8 pad[2]
Definition: ip4.h:162
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:195
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
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:134
address
manual_print typedef address
Definition: ip_types.api:96
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:126
ip4_main_t::msg_id_base
u16 msg_id_base
Definition: ip4.h:165
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:257
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:187
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:138
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
always_inline
#define always_inline
Definition: rdma_mlx5dv.h:23
paths
paths
Definition: map.api:460
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:123
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:281
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:378
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:115
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:327
u8
unsigned char u8
Definition: types.h:56
clib_error_t
Definition: clib_error.h:21
a
a
Definition: bitmap.h:525
lookup.h
icmp46_packet.h
ip4_input_node
vlib_node_registration_t ip4_input_node
Global ip4 input node.
Definition: ip4_input.c:386
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:160
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:151
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:282
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:2785
vlib_node_runtime_t
Definition: node.h:454
ip4_punt_redirect_add_paths
void ip4_punt_redirect_add_paths(u32 rx_sw_if_index, const fib_route_path_t *paths)
Definition: ip4_punt_drop.c:316
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