vrrp: fix vrrp_garp_or_na_send()'s memory leak
[vpp.git] / src / plugins / urpf / ip4_urpf.c
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 *ip4_urpf_error_strings[] = {
44 #define _(a, b) b,
45   foreach_urpf_error
46 #undef _
47 };
48
49 VLIB_NODE_FN (ip4_rx_urpf_loose) (vlib_main_t * vm,
50                                   vlib_node_runtime_t * node,
51                                   vlib_frame_t * frame)
52 {
53   return (urpf_inline (vm, node, frame, AF_IP4, VLIB_RX, URPF_MODE_LOOSE));
54 }
55
56 VLIB_NODE_FN (ip4_rx_urpf_strict) (vlib_main_t * vm,
57                                    vlib_node_runtime_t * node,
58                                    vlib_frame_t * frame)
59 {
60   return (urpf_inline (vm, node, frame, AF_IP4, VLIB_RX, URPF_MODE_STRICT));
61 }
62
63 VLIB_NODE_FN (ip4_tx_urpf_loose) (vlib_main_t * vm,
64                                   vlib_node_runtime_t * node,
65                                   vlib_frame_t * frame)
66 {
67   return (urpf_inline (vm, node, frame, AF_IP4, VLIB_TX, URPF_MODE_LOOSE));
68 }
69
70 VLIB_NODE_FN (ip4_tx_urpf_strict) (vlib_main_t * vm,
71                                    vlib_node_runtime_t * node,
72                                    vlib_frame_t * frame)
73 {
74   return (urpf_inline (vm, node, frame, AF_IP4, VLIB_TX, URPF_MODE_STRICT));
75 }
76
77 VLIB_REGISTER_NODE (ip4_rx_urpf_loose) = {
78   .name = "ip4-rx-urpf-loose",
79   .vector_size = sizeof (u32),
80
81   .n_next_nodes = URPF_N_NEXT,
82   .next_nodes = {
83     [URPF_NEXT_DROP] = "ip4-drop",
84   },
85   .n_errors = ARRAY_LEN (ip4_urpf_error_strings),
86   .error_strings = ip4_urpf_error_strings,
87
88   .format_buffer = format_ip4_header,
89   .format_trace = format_urpf_trace,
90 };
91
92 VLIB_REGISTER_NODE (ip4_rx_urpf_strict) = {
93   .name = "ip4-rx-urpf-strict",
94   .vector_size = sizeof (u32),
95
96   .n_next_nodes = URPF_N_NEXT,
97   .next_nodes = {
98     [URPF_NEXT_DROP] = "ip4-drop",
99   },
100   .n_errors = ARRAY_LEN (ip4_urpf_error_strings),
101   .error_strings = ip4_urpf_error_strings,
102
103   .format_buffer = format_ip4_header,
104   .format_trace = format_urpf_trace,
105 };
106
107 VLIB_REGISTER_NODE (ip4_tx_urpf_loose) = {
108   .name = "ip4-tx-urpf-loose",
109   .vector_size = sizeof (u32),
110
111   .n_next_nodes = URPF_N_NEXT,
112   .next_nodes = {
113     [URPF_NEXT_DROP] = "ip4-drop",
114   },
115   .n_errors = ARRAY_LEN (ip4_urpf_error_strings),
116   .error_strings = ip4_urpf_error_strings,
117
118   .format_buffer = format_ip4_header,
119   .format_trace = format_urpf_trace,
120 };
121
122 VLIB_REGISTER_NODE (ip4_tx_urpf_strict) = {
123   .name = "ip4-tx-urpf-strict",
124   .vector_size = sizeof (u32),
125
126   .n_next_nodes = URPF_N_NEXT,
127   .next_nodes = {
128     [URPF_NEXT_DROP] = "ip4-drop",
129   },
130   .n_errors = ARRAY_LEN (ip4_urpf_error_strings),
131   .error_strings = ip4_urpf_error_strings,
132
133   .format_buffer = format_ip4_header,
134   .format_trace = format_urpf_trace,
135 };
136
137 VNET_FEATURE_INIT (ip4_rx_urpf_loose_feat, static) =
138 {
139   .arc_name = "ip4-unicast",
140   .node_name = "ip4-rx-urpf-loose",
141   .runs_before = VNET_FEATURES ("ip4-rx-urpf-strict"),
142 };
143
144 VNET_FEATURE_INIT (ip4_rx_urpf_strict_feat, static) =
145 {
146   .arc_name = "ip4-unicast",
147   .node_name = "ip4-rx-urpf-strict",
148   .runs_before = VNET_FEATURES ("ip4-policer-classify"),
149 };
150
151 VNET_FEATURE_INIT (ip4_tx_urpf_loose_feat, static) =
152 {
153   .arc_name = "ip4-output",
154   .node_name = "ip4-tx-urpf-loose",
155 };
156
157 VNET_FEATURE_INIT (ip4_tx_urpf_strict_feat, static) =
158 {
159   .arc_name = "ip4-output",
160   .node_name = "ip4-tx-urpf-strict",
161 };
162
163 /*
164  * fd.io coding-style-patch-verification: ON
165  *
166  * Local Variables:
167  * eval: (c-set-style "gnu")
168  * End:
169  */