X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip.c;h=5d0c7707dd3255919ea9d642244c752a7c92c50a;hp=bceb529ee6f7c674a242d30e2e1a32afe397e0fe;hb=3d5f08a82;hpb=9268b5823fa7a16195f638e5b1f9c54b430f2f3c diff --git a/src/vnet/ip/ip.c b/src/vnet/ip/ip.c index bceb529ee6f..5d0c7707dd3 100644 --- a/src/vnet/ip/ip.c +++ b/src/vnet/ip/ip.c @@ -16,6 +16,8 @@ #include #include +u32 ip_flow_hash_router_id; + u8 ip_is_zero (ip46_address_t * ip46_address, u8 is_ip4) { @@ -102,6 +104,113 @@ ip_set (ip46_address_t * dst, void *src, u8 is_ip4) 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); +} + +int +ip_flow_hash_set (ip_address_family_t af, u32 table_id, u32 flow_hash_config) +{ + fib_protocol_t fproto; + u32 fib_index; + + fproto = ip_address_family_to_fib_proto (af); + fib_index = fib_table_find (fproto, table_id); + + if (~0 == fib_index) + return VNET_API_ERROR_NO_SUCH_FIB; + + fib_table_set_flow_hash_config (fib_index, fproto, flow_hash_config); + + return 0; +} + +void +ip_flow_hash_router_id_set (u32 router_id) +{ + ip_flow_hash_router_id = router_id; +} + u8 * format_ip_address_family (u8 * s, va_list * args) { @@ -138,6 +247,40 @@ unformat_ip_address_family (unformat_input_t * input, 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) { @@ -155,6 +298,24 @@ 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) {