diff options
Diffstat (limited to 'src/plugins/avf/avf_fdir_lib.c')
-rw-r--r-- | src/plugins/avf/avf_fdir_lib.c | 82 |
1 files changed, 56 insertions, 26 deletions
diff --git a/src/plugins/avf/avf_fdir_lib.c b/src/plugins/avf/avf_fdir_lib.c index f38614e87ec..24b796dc91d 100644 --- a/src/plugins/avf/avf_fdir_lib.c +++ b/src/plugins/avf/avf_fdir_lib.c @@ -28,7 +28,7 @@ static inline int fls_u32 (u32 x) { - return (x == 0) ? 0 : 32 - count_leading_zeros (x); + return (x == 0) ? 0 : 64 - count_leading_zeros (x); } static inline int @@ -100,7 +100,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, const struct avf_flow_eth_hdr *eth_spec, *eth_mask; struct virtchnl_proto_hdr *hdr; - enum virtchnl_proto_hdr_type type; + enum avf_flow_item_type type; u16 ether_type; int ret = 0; @@ -112,7 +112,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, switch (type) { - case VIRTCHNL_PROTO_HDR_ETH: + case AVF_FLOW_ITEM_TYPE_ETH: eth_spec = item->spec; eth_mask = item->mask; @@ -160,7 +160,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, } break; - case VIRTCHNL_PROTO_HDR_IPV4: + case AVF_FLOW_ITEM_TYPE_IPV4: ipv4_spec = item->spec; ipv4_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_IPV4; @@ -211,7 +211,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, } break; - case VIRTCHNL_PROTO_HDR_IPV6: + case AVF_FLOW_ITEM_TYPE_IPV6: ipv6_spec = item->spec; ipv6_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_IPV6; @@ -257,14 +257,14 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, { rcfg->input_set |= AVF_INSET_IPV6_DST; VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT (hdr, IPV6, DST); - - clib_memcpy (hdr->buffer, ipv6_spec, sizeof (*ipv6_spec)); } + + clib_memcpy (hdr->buffer, ipv6_spec, sizeof (*ipv6_spec)); } break; - case VIRTCHNL_PROTO_HDR_UDP: + case AVF_FLOW_ITEM_TYPE_UDP: udp_spec = item->spec; udp_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_UDP; @@ -295,7 +295,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, } break; - case VIRTCHNL_PROTO_HDR_TCP: + case AVF_FLOW_ITEM_TYPE_TCP: tcp_spec = item->spec; tcp_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_TCP; @@ -329,7 +329,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, break; - case VIRTCHNL_PROTO_HDR_SCTP: + case AVF_FLOW_ITEM_TYPE_SCTP: sctp_spec = item->spec; sctp_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_SCTP; @@ -360,7 +360,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, } break; - case VIRTCHNL_PROTO_HDR_GTPU_IP: + case AVF_FLOW_ITEM_TYPE_GTPU: gtp_spec = item->spec; gtp_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_GTPU_IP; @@ -387,7 +387,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, break; - case VIRTCHNL_PROTO_HDR_GTPU_EH: + case AVF_FLOW_ITEM_TYPE_GTP_PSC: gtp_psc_spec = item->spec; gtp_psc_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_GTPU_EH; @@ -405,7 +405,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, break; - case VIRTCHNL_PROTO_HDR_L2TPV3: + case AVF_FLOW_ITEM_TYPE_L2TPV3OIP: l2tpv3oip_spec = item->spec; l2tpv3oip_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_L2TPV3; @@ -422,7 +422,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, } break; - case VIRTCHNL_PROTO_HDR_ESP: + case AVF_FLOW_ITEM_TYPE_ESP: esp_spec = item->spec; esp_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_ESP; @@ -439,7 +439,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, } break; - case VIRTCHNL_PROTO_HDR_AH: + case AVF_FLOW_ITEM_TYPE_AH: ah_spec = item->spec; ah_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_AH; @@ -456,7 +456,7 @@ avf_fdir_rcfg_set_field (struct avf_fdir_conf *rcfg, int layer, } break; - case VIRTCHNL_PROTO_HDR_PFCP: + case AVF_FLOW_ITEM_TYPE_PFCP: pfcp_spec = item->spec; pfcp_mask = item->mask; hdr->type = VIRTCHNL_PROTO_HDR_PFCP; @@ -591,7 +591,7 @@ avf_fdir_rcfg_act_mark (struct avf_fdir_conf *rcfg, const u32 mark, } int -avf_fdir_rcfg_validate (struct avf_fdir_vc_ctx *ctx, +avf_fdir_rcfg_validate (struct avf_flow_vc_ctx *ctx, struct avf_fdir_conf *rcfg) { int ret; @@ -617,7 +617,7 @@ avf_fdir_rcfg_validate (struct avf_fdir_vc_ctx *ctx, } int -avf_fdir_rule_create (struct avf_fdir_vc_ctx *ctx, struct avf_fdir_conf *rcfg) +avf_fdir_rule_create (struct avf_flow_vc_ctx *ctx, struct avf_fdir_conf *rcfg) { int ret; rcfg->add_fltr.vsi_id = rcfg->vsi; @@ -644,7 +644,7 @@ avf_fdir_rule_create (struct avf_fdir_vc_ctx *ctx, struct avf_fdir_conf *rcfg) } int -avf_fdir_rule_destroy (struct avf_fdir_vc_ctx *ctx, struct avf_fdir_conf *rcfg) +avf_fdir_rule_destroy (struct avf_flow_vc_ctx *ctx, struct avf_fdir_conf *rcfg) { int ret; struct virtchnl_fdir_del fdir_ret; @@ -683,18 +683,18 @@ avf_fdir_parse_action (const struct avf_flow_action actions[], struct virtchnl_fdir_rule *rule_cfg = &rcfg->add_fltr.rule_cfg; - for (; actions->type != VIRTCHNL_ACTION_NONE; actions++, act_idx++) + for (; actions->type != AVF_FLOW_ACTION_TYPE_END; actions++, act_idx++) { switch (actions->type) { - case VIRTCHNL_ACTION_PASSTHRU: + case AVF_FLOW_ACTION_TYPE_PASSTHRU: dest_num++; filter_action = &rule_cfg->action_set.actions[act_idx]; filter_action->type = VIRTCHNL_ACTION_PASSTHRU; rule_cfg->action_set.count++; break; - case VIRTCHNL_ACTION_DROP: + case AVF_FLOW_ACTION_TYPE_DROP: dest_num++; ret = avf_fdir_rcfg_act_drop (rcfg, act_idx); if (ret) @@ -703,7 +703,7 @@ avf_fdir_parse_action (const struct avf_flow_action actions[], rule_cfg->action_set.count++; break; - case VIRTCHNL_ACTION_QUEUE: + case AVF_FLOW_ACTION_TYPE_QUEUE: dest_num++; act_q = actions->conf; @@ -722,7 +722,7 @@ avf_fdir_parse_action (const struct avf_flow_action actions[], rule_cfg->action_set.count++; break; - case VIRTCHNL_ACTION_Q_REGION: + case AVF_FLOW_ACTION_TYPE_RSS: dest_num++; filter_action = &rule_cfg->action_set.actions[act_idx]; ret = avf_fdir_parse_action_qregion (rcfg, actions, act_idx, error); @@ -732,7 +732,7 @@ avf_fdir_parse_action (const struct avf_flow_action actions[], rule_cfg->action_set.count++; break; - case VIRTCHNL_ACTION_MARK: + case AVF_FLOW_ACTION_TYPE_MARK: mark_num++; act_msk = actions->conf; rcfg->mark_flag = 1; @@ -786,6 +786,36 @@ avf_fdir_parse_action (const struct avf_flow_action actions[], } int +avf_fdir_parse_generic_pattern (struct avf_fdir_conf *rcfg, + struct avf_flow_item avf_items[], + struct avf_flow_error *error) +{ + struct avf_flow_item *item = avf_items; + u8 *pkt_buf, *msk_buf; + u16 spec_len, pkt_len; + + spec_len = clib_strnlen (item->spec, VIRTCHNL_MAX_SIZE_GEN_PACKET); + pkt_len = spec_len / 2; + + pkt_buf = clib_mem_alloc (pkt_len); + msk_buf = clib_mem_alloc (pkt_len); + + avf_parse_generic_pattern (item, pkt_buf, msk_buf, spec_len); + + clib_memcpy (rcfg->add_fltr.rule_cfg.proto_hdrs.raw.spec, pkt_buf, pkt_len); + clib_memcpy (rcfg->add_fltr.rule_cfg.proto_hdrs.raw.mask, msk_buf, pkt_len); + + rcfg->add_fltr.rule_cfg.proto_hdrs.count = 0; + rcfg->add_fltr.rule_cfg.proto_hdrs.tunnel_level = 0; + rcfg->add_fltr.rule_cfg.proto_hdrs.raw.pkt_len = pkt_len; + + clib_mem_free (pkt_buf); + clib_mem_free (msk_buf); + + return 0; +} + +int avf_fdir_parse_pattern (struct avf_fdir_conf *rcfg, struct avf_flow_item avf_items[], struct avf_flow_error *error) @@ -794,7 +824,7 @@ avf_fdir_parse_pattern (struct avf_fdir_conf *rcfg, int ret = 0; struct avf_flow_item *item; - for (item = avf_items; item->type != VIRTCHNL_PROTO_HDR_NONE; item++) + for (item = avf_items; item->type != AVF_FLOW_ITEM_TYPE_END; item++) { ret = avf_fdir_rcfg_set_field (rcfg, layer, item, error); if (ret) |