FD.io VPP  v21.06-3-gbb25fbf28
Vector Packet Processing
ip6_urpf.c
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_source_check.c: IP v4 check source address (unicast RPF check)
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 #include <urpf/urpf.h>
41 #include <urpf/urpf_dp.h>
42 
43 static char *ip6_urpf_error_strings[] = {
44 #define _(a, b) b,
46 #undef _
47 };
48 
52 {
53  return (urpf_inline (vm, node, frame, AF_IP6, VLIB_RX, URPF_MODE_LOOSE));
54 }
55 
59 {
60  return (urpf_inline (vm, node, frame, AF_IP6, VLIB_RX, URPF_MODE_STRICT));
61 }
62 
66 {
67  return (urpf_inline (vm, node, frame, AF_IP6, VLIB_TX, URPF_MODE_LOOSE));
68 }
69 
73 {
74  return (urpf_inline (vm, node, frame, AF_IP6, VLIB_TX, URPF_MODE_STRICT));
75 }
76 
77 /* *INDENT-OFF* */
79  .name = "ip6-rx-urpf-loose",
80  .vector_size = sizeof (u32),
81 
82  .n_next_nodes = URPF_N_NEXT,
83  .next_nodes = {
84  [URPF_NEXT_DROP] = "ip6-drop",
85  },
86  .n_errors = ARRAY_LEN (ip6_urpf_error_strings),
87  .error_strings = ip6_urpf_error_strings,
88 
89  .format_buffer = format_ip6_header,
90  .format_trace = format_urpf_trace,
91 };
92 
94  .name = "ip6-rx-urpf-strict",
95  .vector_size = sizeof (u32),
96 
97  .n_next_nodes = URPF_N_NEXT,
98  .next_nodes = {
99  [URPF_NEXT_DROP] = "ip6-drop",
100  },
101  .n_errors = ARRAY_LEN (ip6_urpf_error_strings),
102  .error_strings = ip6_urpf_error_strings,
103 
104  .format_buffer = format_ip6_header,
105  .format_trace = format_urpf_trace,
106 };
107 
109  .name = "ip6-tx-urpf-loose",
110  .vector_size = sizeof (u32),
111 
112  .n_next_nodes = URPF_N_NEXT,
113  .next_nodes = {
114  [URPF_NEXT_DROP] = "ip6-drop",
115  },
116  .n_errors = ARRAY_LEN (ip6_urpf_error_strings),
117  .error_strings = ip6_urpf_error_strings,
118 
119  .format_buffer = format_ip6_header,
120  .format_trace = format_urpf_trace,
121 };
122 
124  .name = "ip6-tx-urpf-strict",
125  .vector_size = sizeof (u32),
126 
127  .n_next_nodes = URPF_N_NEXT,
128  .next_nodes = {
129  [URPF_NEXT_DROP] = "ip6-drop",
130  },
131  .n_errors = ARRAY_LEN (ip6_urpf_error_strings),
132  .error_strings = ip6_urpf_error_strings,
133 
134  .format_buffer = format_ip6_header,
135  .format_trace = format_urpf_trace,
136 };
137 
138 VNET_FEATURE_INIT (ip6_rx_urpf_loose_feat, static) =
139 {
140  .arc_name = "ip6-unicast",
141  .node_name = "ip6-rx-urpf-loose",
142  .runs_before = VNET_FEATURES ("ip6-rx-urpf-strict"),
143 };
144 
145 VNET_FEATURE_INIT (ip6_rx_urpf_strict_feat, static) =
146 {
147  .arc_name = "ip6-unicast",
148  .node_name = "ip6-rx-urpf-strict",
149  .runs_before = VNET_FEATURES ("ip6-policer-classify"),
150 };
151 
152 VNET_FEATURE_INIT (ip6_tx_urpf_loose_feat, static) =
153 {
154  .arc_name = "ip6-output",
155  .node_name = "ip6-tx-urpf-loose",
156 };
157 
158 VNET_FEATURE_INIT (ip6_tx_urpf_strict_feat, static) =
159 {
160  .arc_name = "ip6-output",
161  .node_name = "ip6-tx-urpf-strict",
162 };
163 /* *INDENT-ON* */
164 
165 /*
166  * fd.io coding-style-patch-verification: ON
167  *
168  * Local Variables:
169  * eval: (c-set-style "gnu")
170  * End:
171  */
format_urpf_trace
static u8 * format_urpf_trace(u8 *s, va_list *va)
Definition: urpf_dp.h:62
frame
vlib_main_t vlib_node_runtime_t vlib_frame_t * frame
Definition: nat44_ei.c:3048
format_ip6_header
format_function_t format_ip6_header
Definition: format.h:95
node
vlib_main_t vlib_node_runtime_t * node
Definition: nat44_ei.c:3047
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
vlib_frame_t
Definition: node.h:372
urpf.h
ip6_tx_urpf_strict
vlib_node_registration_t ip6_tx_urpf_strict
(constructor) VLIB_REGISTER_NODE (ip6_tx_urpf_strict)
Definition: ip6_urpf.c:123
URPF_N_NEXT
@ URPF_N_NEXT
Definition: urpf_dp.h:87
VLIB_NODE_FN
#define VLIB_NODE_FN(node)
Definition: node.h:202
ARRAY_LEN
#define ARRAY_LEN(x)
Definition: clib.h:70
ip6_urpf_error_strings
static char * ip6_urpf_error_strings[]
Definition: ip6_urpf.c:43
vlib_node_registration_t
struct _vlib_node_registration vlib_node_registration_t
foreach_urpf_error
#define foreach_urpf_error
Definition: urpf_dp.h:73
ip6_rx_urpf_loose
vlib_node_registration_t ip6_rx_urpf_loose
(constructor) VLIB_REGISTER_NODE (ip6_rx_urpf_loose)
Definition: ip6_urpf.c:78
u32
unsigned int u32
Definition: types.h:88
ip6_rx_urpf_strict
vlib_node_registration_t ip6_rx_urpf_strict
(constructor) VLIB_REGISTER_NODE (ip6_rx_urpf_strict)
Definition: ip6_urpf.c:93
urpf_inline
static_always_inline uword urpf_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, ip_address_family_t af, vlib_dir_t dir, urpf_mode_t mode)
Definition: urpf_dp.h:91
urpf_dp.h
Unicast Reverse Path forwarding.
AF_IP6
@ AF_IP6
Definition: ip_types.h:24
vlib_main_t
Definition: main.h:102
VNET_FEATURES
#define VNET_FEATURES(...)
Definition: feature.h:470
ip6_tx_urpf_loose
vlib_node_registration_t ip6_tx_urpf_loose
(constructor) VLIB_REGISTER_NODE (ip6_tx_urpf_loose)
Definition: ip6_urpf.c:108
vlib_node_runtime_t
Definition: node.h:454
VLIB_TX
@ VLIB_TX
Definition: defs.h:47
URPF_NEXT_DROP
@ URPF_NEXT_DROP
Definition: urpf_dp.h:86
VNET_FEATURE_INIT
VNET_FEATURE_INIT(ip6_rx_urpf_loose_feat, static)
VLIB_REGISTER_NODE
#define VLIB_REGISTER_NODE(x,...)
Definition: node.h:169