diff options
Diffstat (limited to 'src/vnet/flow/flow_api.c')
-rw-r--r-- | src/vnet/flow/flow_api.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/vnet/flow/flow_api.c b/src/vnet/flow/flow_api.c index 6f08f0314a4..0e25fb3017b 100644 --- a/src/vnet/flow/flow_api.c +++ b/src/vnet/flow/flow_api.c @@ -215,6 +215,16 @@ ipv4_gtpc_flow_convert (vl_api_flow_ip4_gtpc_t * vl_api_flow, f->teid = ntohl (vl_api_flow->teid); } +static inline void +generic_flow_convert (vl_api_flow_generic_t *vl_api_flow, + vnet_flow_generic_t *f) +{ + clib_memcpy (f->pattern.spec, vl_api_flow->pattern.spec, + sizeof (vl_api_flow->pattern.spec)); + clib_memcpy (f->pattern.mask, vl_api_flow->pattern.mask, + sizeof (vl_api_flow->pattern.mask)); +} + static void vl_api_flow_add_t_handler (vl_api_flow_add_t * mp) { @@ -298,6 +308,91 @@ out: } static void +vl_api_flow_add_v2_t_handler (vl_api_flow_add_v2_t *mp) +{ + vl_api_flow_add_v2_reply_t *rmp; + int rv = 0; + vnet_flow_t flow; + u32 flow_index = ~0; + vl_api_flow_rule_v2_t *f = &mp->flow; + + vnet_main_t *vnm = vnet_get_main (); + + flow.type = ntohl (f->type); + flow.actions = ntohl (f->actions); + flow.mark_flow_id = ntohl (f->mark_flow_id); + flow.redirect_node_index = ntohl (f->redirect_node_index); + flow.redirect_device_input_next_index = + ntohl (f->redirect_device_input_next_index); + flow.redirect_queue = ntohl (f->redirect_queue); + flow.buffer_advance = ntohl (f->buffer_advance); + flow.queue_index = ntohl (f->queue_index); + flow.queue_num = ntohl (f->queue_num); + flow.rss_types = ntohl (f->rss_types); + flow.rss_fun = ntohl (f->rss_fun); + + switch (flow.type) + { + case VNET_FLOW_TYPE_IP4: + ipv4_flow_convert (&f->flow.ip4, &flow.ip4); + break; + case VNET_FLOW_TYPE_IP6: + ipv6_flow_convert (&f->flow.ip6, &flow.ip6); + break; + case VNET_FLOW_TYPE_IP4_N_TUPLE: + ipv4_n_tuple_flow_convert (&f->flow.ip4_n_tuple, &flow.ip4_n_tuple); + break; + case VNET_FLOW_TYPE_IP6_N_TUPLE: + ipv6_n_tuple_flow_convert (&f->flow.ip6_n_tuple, &flow.ip6_n_tuple); + break; + case VNET_FLOW_TYPE_IP4_N_TUPLE_TAGGED: + ipv4_n_tuple_tagged_flow_convert (&f->flow.ip4_n_tuple_tagged, + &flow.ip4_n_tuple_tagged); + break; + case VNET_FLOW_TYPE_IP6_N_TUPLE_TAGGED: + ipv6_n_tuple_tagged_flow_convert (&f->flow.ip6_n_tuple_tagged, + &flow.ip6_n_tuple_tagged); + break; + case VNET_FLOW_TYPE_IP4_L2TPV3OIP: + ipv4_l2tpv3oip_flow_convert (&f->flow.ip4_l2tpv3oip, + &flow.ip4_l2tpv3oip); + break; + case VNET_FLOW_TYPE_IP4_IPSEC_ESP: + ipv4_ipsec_esp_flow_convert (&f->flow.ip4_ipsec_esp, + &flow.ip4_ipsec_esp); + break; + case VNET_FLOW_TYPE_IP4_IPSEC_AH: + ipv4_ipsec_ah_flow_convert (&f->flow.ip4_ipsec_ah, &flow.ip4_ipsec_ah); + break; + case VNET_FLOW_TYPE_IP4_VXLAN: + ipv4_vxlan_flow_convert (&f->flow.ip4_vxlan, &flow.ip4_vxlan); + break; + case VNET_FLOW_TYPE_IP6_VXLAN: + ipv6_vxlan_flow_convert (&f->flow.ip6_vxlan, &flow.ip6_vxlan); + break; + case VNET_FLOW_TYPE_IP4_GTPU: + ipv4_gtpu_flow_convert (&f->flow.ip4_gtpu, &flow.ip4_gtpu); + break; + case VNET_FLOW_TYPE_IP4_GTPC: + ipv4_gtpc_flow_convert (&f->flow.ip4_gtpc, &flow.ip4_gtpc); + break; + case VNET_FLOW_TYPE_GENERIC: + generic_flow_convert (&f->flow.generic, &flow.generic); + break; + default: + rv = VNET_FLOW_ERROR_NOT_SUPPORTED; + goto out; + break; + } + + rv = vnet_flow_add (vnm, &flow, &flow_index); + +out: + REPLY_MACRO2 (VL_API_FLOW_ADD_V2_REPLY, + ({ rmp->flow_index = ntohl (flow_index); })); +} + +static void vl_api_flow_del_t_handler (vl_api_flow_del_t * mp) { vl_api_flow_add_reply_t *rmp; |