ip_copy (ip46_address_t * dst, ip46_address_t * src, u8 is_ip4)
{
if (is_ip4)
- dst->ip4.as_u32 = src->ip4.as_u32;
+ {
+ ip46_address_mask_ip4 (dst);
+ dst->ip4.as_u32 = src->ip4.as_u32;
+ }
else
clib_memcpy_fast (&dst->ip6, &src->ip6, sizeof (ip6_address_t));
}
ip_set (ip46_address_t * dst, void *src, u8 is_ip4)
{
if (is_ip4)
- dst->ip4.as_u32 = ((ip4_address_t *) src)->as_u32;
+ {
+ ip46_address_mask_ip4 (dst);
+ dst->ip4.as_u32 = ((ip4_address_t *) src)->as_u32;
+ }
else
clib_memcpy_fast (&dst->ip6, (ip6_address_t *) src,
sizeof (ip6_address_t));
}
+/* *INDENT-OFF* */
+static const char *ip_arc_names[N_IP_FEATURE_LOCATIONS][N_AF][N_SAFI] = {
+ [IP_FEATURE_INPUT] = {
+ [AF_IP4] = {
+ [SAFI_UNICAST] = "ip4-unicast",
+ [SAFI_MULTICAST] = "ip4-multicast",
+ },
+ [AF_IP6] = {
+ [SAFI_UNICAST] = "ip6-unicast",
+ [SAFI_MULTICAST] = "ip6-multicast",
+ },
+ },
+ [IP_FEATURE_OUTPUT] = {
+ [AF_IP4] = {
+ [SAFI_UNICAST] = "ip4-output",
+ [SAFI_MULTICAST] = "ip4-output",
+ },
+ [AF_IP6] = {
+ [SAFI_UNICAST] = "ip6-output",
+ [SAFI_MULTICAST] = "ip6-output",
+ },
+ },
+ [IP_FEATURE_LOCAL] = {
+ [AF_IP4] = {
+ [SAFI_UNICAST] = "ip4-local",
+ [SAFI_MULTICAST] = "ip4-local",
+ },
+ [AF_IP6] = {
+ [SAFI_UNICAST] = "ip6-local",
+ [SAFI_MULTICAST] = "ip6-local",
+ },
+ },
+ [IP_FEATURE_PUNT] = {
+ [AF_IP4] = {
+ [SAFI_UNICAST] = "ip4-punt",
+ [SAFI_MULTICAST] = "ip4-punt",
+ },
+ [AF_IP6] = {
+ [SAFI_UNICAST] = "ip6-punt",
+ [SAFI_MULTICAST] = "ip6-punt",
+ },
+ },
+ [IP_FEATURE_DROP] = {
+ [AF_IP4] = {
+ [SAFI_UNICAST] = "ip4-drop",
+ [SAFI_MULTICAST] = "ip4-drop",
+ },
+ [AF_IP6] = {
+ [SAFI_UNICAST] = "ip6-drop",
+ [SAFI_MULTICAST] = "ip6-drop",
+ },
+ },
+};
+/* *INDENT-ON* */
+
+void
+ip_feature_enable_disable (ip_address_family_t af,
+ ip_sub_address_family_t safi,
+ ip_feature_location_t loc,
+ const char *feature_name,
+ u32 sw_if_index, int enable,
+ void *feature_config, u32 n_feature_config_bytes)
+{
+ if (IP_FEATURE_INPUT == loc)
+ {
+ if (N_SAFI == safi)
+ FOR_EACH_IP_ADDRESS_SUB_FAMILY (safi)
+ vnet_feature_enable_disable (ip_arc_names[loc][af][safi],
+ feature_name, sw_if_index,
+ enable, feature_config,
+ n_feature_config_bytes);
+ else
+ vnet_feature_enable_disable (ip_arc_names[loc][af][safi],
+ feature_name, sw_if_index,
+ enable, feature_config,
+ n_feature_config_bytes);
+ }
+ else
+ vnet_feature_enable_disable (ip_arc_names[loc][af][SAFI_UNICAST],
+ feature_name, sw_if_index,
+ enable, feature_config,
+ n_feature_config_bytes);
+}
+
+
+
u8 *
format_ip_address_family (u8 * s, va_list * args)
{
return (0);
}
+u8 *
+format_ip_sub_address_family (u8 * s, va_list * args)
+{
+ ip_sub_address_family_t safi = va_arg (*args, int); // int promo ip_sub_address_family_t);
+
+ switch (safi)
+ {
+ case SAFI_UNICAST:
+ return (format (s, "unicast"));
+ case SAFI_MULTICAST:
+ return (format (s, "multicast"));
+ }
+
+ return (format (s, "unknown"));
+}
+
+uword
+unformat_ip_sub_address_family (unformat_input_t * input, va_list * args)
+{
+ ip_sub_address_family_t *safi = va_arg (*args, ip_sub_address_family_t *);
+
+ if (unformat (input, "unicast") || unformat (input, "uni"))
+ {
+ *safi = SAFI_UNICAST;
+ return (1);
+ }
+ else if (unformat (input, "multicast") || unformat (input, "multi"))
+ {
+ *safi = SAFI_MULTICAST;
+ return (1);
+ }
+ return (0);
+}
+
u8 *
format_ip_dscp (u8 * s, va_list * va)
{
return (format (s, "unknown"));
}
+uword
+unformat_ip_dscp (unformat_input_t * input, va_list * args)
+{
+ ip_dscp_t *dscp = va_arg (*args, ip_dscp_t *);
+
+ if (0)
+ ;
+#define _(n,v) \
+ else if (unformat (input, #v)) \
+ *dscp = IP_DSCP_##v;
+ foreach_ip_dscp
+#undef _
+ else
+ return 0;
+
+ return 1;
+}
+
u8 *
format_ip_ecn (u8 * s, va_list * va)
{