2 * Copyright (c) 2017 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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 #include <vnet/ip/ip.h>
17 #include <vnet/fib/fib_table.h>
19 u32 ip_flow_hash_router_id;
22 ip_is_zero (ip46_address_t * ip46_address, u8 is_ip4)
25 return (ip46_address->ip4.as_u32 == 0);
27 return (ip46_address->as_u64[0] == 0 && ip46_address->as_u64[1] == 0);
31 ip_is_local_host (ip46_address_t * ip46_address, u8 is_ip4)
34 return (ip46_address->ip4.as_u8[0] == 127);
36 return (ip46_address->as_u64[0] == 0 &&
37 clib_net_to_host_u64 (ip46_address->as_u64[1]) == 1);
41 ip4_is_local_host (ip4_address_t * ip4_address)
43 return (ip4_address->as_u8[0] == 127);
47 ip6_is_local_host (ip6_address_t * ip6_address)
49 return (ip6_address->as_u64[0] == 0 &&
50 clib_net_to_host_u64 (ip6_address->as_u64[1]) == 1);
54 * Checks that an ip is local to the requested fib
57 ip_is_local (u32 fib_index, ip46_address_t * ip46_address, u8 is_ip4)
60 fib_entry_flag_t flags;
63 /* Check if requester is local */
67 prefix.fp_proto = FIB_PROTOCOL_IP4;
72 prefix.fp_proto = FIB_PROTOCOL_IP6;
75 clib_memcpy_fast (&prefix.fp_addr, ip46_address, sizeof (ip46_address_t));
76 fei = fib_table_lookup (fib_index, &prefix);
77 flags = fib_entry_get_flags (fei);
79 return (flags & FIB_ENTRY_FLAG_LOCAL);
83 ip_copy (ip46_address_t * dst, ip46_address_t * src, u8 is_ip4)
87 ip46_address_mask_ip4 (dst);
88 dst->ip4.as_u32 = src->ip4.as_u32;
91 clib_memcpy_fast (&dst->ip6, &src->ip6, sizeof (ip6_address_t));
95 ip_set (ip46_address_t * dst, void *src, u8 is_ip4)
99 ip46_address_mask_ip4 (dst);
100 dst->ip4.as_u32 = ((ip4_address_t *) src)->as_u32;
103 clib_memcpy_fast (&dst->ip6, (ip6_address_t *) src,
104 sizeof (ip6_address_t));
108 static const char *ip_arc_names[N_IP_FEATURE_LOCATIONS][N_AF][N_SAFI] = {
109 [IP_FEATURE_INPUT] = {
111 [SAFI_UNICAST] = "ip4-unicast",
112 [SAFI_MULTICAST] = "ip4-multicast",
115 [SAFI_UNICAST] = "ip6-unicast",
116 [SAFI_MULTICAST] = "ip6-multicast",
119 [IP_FEATURE_OUTPUT] = {
121 [SAFI_UNICAST] = "ip4-output",
122 [SAFI_MULTICAST] = "ip4-output",
125 [SAFI_UNICAST] = "ip6-output",
126 [SAFI_MULTICAST] = "ip6-output",
129 [IP_FEATURE_LOCAL] = {
131 [SAFI_UNICAST] = "ip4-local",
132 [SAFI_MULTICAST] = "ip4-local",
135 [SAFI_UNICAST] = "ip6-local",
136 [SAFI_MULTICAST] = "ip6-local",
139 [IP_FEATURE_PUNT] = {
141 [SAFI_UNICAST] = "ip4-punt",
142 [SAFI_MULTICAST] = "ip4-punt",
145 [SAFI_UNICAST] = "ip6-punt",
146 [SAFI_MULTICAST] = "ip6-punt",
149 [IP_FEATURE_DROP] = {
151 [SAFI_UNICAST] = "ip4-drop",
152 [SAFI_MULTICAST] = "ip4-drop",
155 [SAFI_UNICAST] = "ip6-drop",
156 [SAFI_MULTICAST] = "ip6-drop",
163 ip_feature_enable_disable (ip_address_family_t af,
164 ip_sub_address_family_t safi,
165 ip_feature_location_t loc,
166 const char *feature_name,
167 u32 sw_if_index, int enable,
168 void *feature_config, u32 n_feature_config_bytes)
170 if (IP_FEATURE_INPUT == loc)
173 FOR_EACH_IP_ADDRESS_SUB_FAMILY (safi)
174 vnet_feature_enable_disable (ip_arc_names[loc][af][safi],
175 feature_name, sw_if_index,
176 enable, feature_config,
177 n_feature_config_bytes);
179 vnet_feature_enable_disable (ip_arc_names[loc][af][safi],
180 feature_name, sw_if_index,
181 enable, feature_config,
182 n_feature_config_bytes);
185 vnet_feature_enable_disable (ip_arc_names[loc][af][SAFI_UNICAST],
186 feature_name, sw_if_index,
187 enable, feature_config,
188 n_feature_config_bytes);
192 ip_flow_hash_set (ip_address_family_t af, u32 table_id, u32 flow_hash_config)
194 fib_protocol_t fproto;
197 fproto = ip_address_family_to_fib_proto (af);
198 fib_index = fib_table_find (fproto, table_id);
201 return VNET_API_ERROR_NO_SUCH_FIB;
203 fib_table_set_flow_hash_config (fib_index, fproto, flow_hash_config);
209 ip_flow_hash_router_id_set (u32 router_id)
211 ip_flow_hash_router_id = router_id;
215 format_ip_address_family (u8 * s, va_list * args)
217 ip_address_family_t af = va_arg (*args, int); // int promo ip_address_family_t);
222 return (format (s, "ip4"));
224 return (format (s, "ip6"));
227 return (format (s, "unknown"));
231 unformat_ip_address_family (unformat_input_t * input, va_list * args)
233 ip_address_family_t *af = va_arg (*args, ip_address_family_t *);
235 if (unformat (input, "ip4") || unformat (input, "ipv4") ||
236 unformat (input, "IP4") || unformat (input, "IPv4"))
241 else if (unformat (input, "ip6") || unformat (input, "ipv6") ||
242 unformat (input, "IP6") || unformat (input, "IPv6"))
251 format_ip_sub_address_family (u8 * s, va_list * args)
253 ip_sub_address_family_t safi = va_arg (*args, int); // int promo ip_sub_address_family_t);
258 return (format (s, "unicast"));
260 return (format (s, "multicast"));
263 return (format (s, "unknown"));
267 unformat_ip_sub_address_family (unformat_input_t * input, va_list * args)
269 ip_sub_address_family_t *safi = va_arg (*args, ip_sub_address_family_t *);
271 if (unformat (input, "unicast") || unformat (input, "uni"))
273 *safi = SAFI_UNICAST;
276 else if (unformat (input, "multicast") || unformat (input, "multi"))
278 *safi = SAFI_MULTICAST;
285 format_ip_dscp (u8 * s, va_list * va)
287 ip_dscp_t dscp = va_arg (*va, u32); // int promotion of u8
293 return (format (s, "%s", #v));
298 return (format (s, "unknown"));
302 unformat_ip_dscp (unformat_input_t * input, va_list * args)
304 ip_dscp_t *dscp = va_arg (*args, ip_dscp_t *);
309 else if (unformat (input, #v)) \
320 format_ip_ecn (u8 * s, va_list * va)
322 ip_ecn_t ecn = va_arg (*va, u32); // int promotion of u8
328 return (format (s, "%s", #v));
333 return (format (s, "unknown"));
337 * fd.io coding-style-patch-verification: ON
340 * eval: (c-set-style "gnu")