On 12/1/2020 8:32 AM, Yuying Zhang wrote:
This patch adds an input set refinement function to support outer
and inner TCP/UDP patterns without input set for flow director filter.
Can you please describe more what is supported now, it can be even better to
give same samples which patter is supported now, which was not supported before?
Signed-off-by: Yuying Zhang <yuying.zh...@intel.com>
---
drivers/net/iavf/iavf_fdir.c | 67 ++++++++++++++++++++++++++++++------
1 file changed, 56 insertions(+), 11 deletions(-)
diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index 7054bde0b..2c57313e4 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -448,9 +448,56 @@ iavf_fdir_parse_action(struct iavf_adapter *ad,
return 0;
}
+static int
+iavf_fdir_refine_input_set(const uint64_t input_set,
+ const uint64_t input_set_mask,
+ struct iavf_fdir_conf *filter)
+{
+ struct virtchnl_proto_hdr *hdr, *hdr_last;
+ struct rte_flow_item_ipv4 ipv4_spec;
+ struct rte_flow_item_ipv6 ipv6_spec;
+ int last_layer;
+ uint8_t proto_id;
+
+ if (input_set & ~input_set_mask)
+ return -rte_errno;
What is the value of the 'rte_errno' at this stage, why returning it instead of
setting it?
+ else if (input_set)
+ return 0;
+
+ last_layer = filter->add_fltr.rule_cfg.proto_hdrs.count - 1;
+ hdr_last = &filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[last_layer];
+ if (hdr_last->type == VIRTCHNL_PROTO_HDR_TCP)
+ proto_id = 6;
+ else if (hdr_last->type == VIRTCHNL_PROTO_HDR_UDP)
+ proto_id = 17;
+ else
+ return -rte_errno;
+
+ hdr = &filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[last_layer - 1];
Do we know here that 'last_layer' > 0 ?
+ switch (hdr->type) {
+ case VIRTCHNL_PROTO_HDR_IPV4:
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV4, PROT);
+ memset(&ipv4_spec, 0, sizeof(ipv4_spec));
+ ipv4_spec.hdr.next_proto_id = proto_id;
+ rte_memcpy(hdr->buffer, &ipv4_spec.hdr,
+ sizeof(ipv4_spec.hdr));
+ return 0;
+ case VIRTCHNL_PROTO_HDR_IPV6:
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV6, PROT);
+ memset(&ipv6_spec, 0, sizeof(ipv6_spec));
+ ipv6_spec.hdr.proto = proto_id;
+ rte_memcpy(hdr->buffer, &ipv6_spec.hdr,
+ sizeof(ipv6_spec.hdr));
+ return 0;
+ default:
+ return -rte_errno;
+ }
+}
+
<...>