[08/12] net/ice: add FDIR dst mac support

Message ID 20190906120058.108073-9-yahui.cao@intel.com (mailing list archive)
State Superseded, archived
Delegated to: xiaolong ye
Headers
Series net/ice: add ice Flow Director driver |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail apply issues

Commit Message

Cao, Yahui Sept. 6, 2019, noon UTC
  Enable FDIR ethernet destination address field matching support

Signed-off-by: Yahui Cao <yahui.cao@intel.com>
---
 drivers/net/ice/ice_fdir_filter.c | 27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)
  

Comments

Xiaolong Ye Sept. 7, 2019, 6:25 p.m. UTC | #1
On 09/06, Yahui Cao wrote:
>Enable FDIR ethernet destination address field matching support
>
>Signed-off-by: Yahui Cao <yahui.cao@intel.com>
>---
> drivers/net/ice/ice_fdir_filter.c | 27 +++++++++++++++++++++++----
> 1 file changed, 23 insertions(+), 4 deletions(-)
>
>diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c
>index ebbe1bd6c..1893aa0ee 100644
>--- a/drivers/net/ice/ice_fdir_filter.c
>+++ b/drivers/net/ice/ice_fdir_filter.c
>@@ -10,6 +10,7 @@
> #include "ice_generic_flow.h"
> 
> #define ICE_FDIR_INSET_ETH_IPV4 (\
>+	ICE_INSET_DMAC | \
> 	ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_TOS | \
> 	ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO)
> 
>@@ -387,6 +388,7 @@ ice_parse_input_set(uint64_t inset, enum ice_flow_field *field)
> 		enum ice_flow_field fld;
> 	};
> 	static const struct ice_inset_map ice_inset_map[] = {
>+		{ICE_INSET_DMAC, ICE_FLOW_FIELD_IDX_ETH_DA},
> 		{ICE_INSET_IPV4_SRC, ICE_FLOW_FIELD_IDX_IPV4_SA},
> 		{ICE_INSET_IPV4_DST, ICE_FLOW_FIELD_IDX_IPV4_DA},
> 		{ICE_INSET_IPV6_SRC, ICE_FLOW_FIELD_IDX_IPV6_SA},
>@@ -918,13 +920,30 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
> 		case RTE_FLOW_ITEM_TYPE_ETH:
> 			eth_spec = item->spec;
> 			eth_mask = item->mask;
>-			if (eth_spec || eth_mask) {
>-				rte_flow_error_set(error, EINVAL,
>+			if (eth_spec && eth_mask) {
>+				if (!rte_is_zero_ether_addr(&eth_spec->src) ||
>+				    !rte_is_zero_ether_addr(&eth_mask->src)) {
>+					rte_flow_error_set(error, EINVAL,
> 						RTE_FLOW_ERROR_TYPE_ITEM,
> 						item,
>-						"eth mac not support");
>-				return -rte_errno;
>+						"Src mac not support");
>+					return -rte_errno;
>+				}
>+
>+				if (!rte_is_broadcast_ether_addr(&eth_mask->dst)) {
>+					rte_flow_error_set(error, EINVAL,
>+						RTE_FLOW_ERROR_TYPE_ITEM,
>+						item,
>+						"Invalid mac addr mask");
>+					return -rte_errno;
>+				}
>+
>+				input_set |= ICE_INSET_DMAC;
>+				rte_memcpy(&filter->input.ext_data.dst_mac,
>+					   &eth_spec->dst,
>+					   RTE_ETHER_ADDR_LEN);
> 			}
>+

Unnecessary empty line.

> 			break;
> 		case RTE_FLOW_ITEM_TYPE_IPV4:
> 			l3 = RTE_FLOW_ITEM_TYPE_IPV4;
>-- 
>2.17.1
>
  

Patch

diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c
index ebbe1bd6c..1893aa0ee 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -10,6 +10,7 @@ 
 #include "ice_generic_flow.h"
 
 #define ICE_FDIR_INSET_ETH_IPV4 (\
+	ICE_INSET_DMAC | \
 	ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_TOS | \
 	ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO)
 
@@ -387,6 +388,7 @@  ice_parse_input_set(uint64_t inset, enum ice_flow_field *field)
 		enum ice_flow_field fld;
 	};
 	static const struct ice_inset_map ice_inset_map[] = {
+		{ICE_INSET_DMAC, ICE_FLOW_FIELD_IDX_ETH_DA},
 		{ICE_INSET_IPV4_SRC, ICE_FLOW_FIELD_IDX_IPV4_SA},
 		{ICE_INSET_IPV4_DST, ICE_FLOW_FIELD_IDX_IPV4_DA},
 		{ICE_INSET_IPV6_SRC, ICE_FLOW_FIELD_IDX_IPV6_SA},
@@ -918,13 +920,30 @@  ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
 		case RTE_FLOW_ITEM_TYPE_ETH:
 			eth_spec = item->spec;
 			eth_mask = item->mask;
-			if (eth_spec || eth_mask) {
-				rte_flow_error_set(error, EINVAL,
+			if (eth_spec && eth_mask) {
+				if (!rte_is_zero_ether_addr(&eth_spec->src) ||
+				    !rte_is_zero_ether_addr(&eth_mask->src)) {
+					rte_flow_error_set(error, EINVAL,
 						RTE_FLOW_ERROR_TYPE_ITEM,
 						item,
-						"eth mac not support");
-				return -rte_errno;
+						"Src mac not support");
+					return -rte_errno;
+				}
+
+				if (!rte_is_broadcast_ether_addr(&eth_mask->dst)) {
+					rte_flow_error_set(error, EINVAL,
+						RTE_FLOW_ERROR_TYPE_ITEM,
+						item,
+						"Invalid mac addr mask");
+					return -rte_errno;
+				}
+
+				input_set |= ICE_INSET_DMAC;
+				rte_memcpy(&filter->input.ext_data.dst_mac,
+					   &eth_spec->dst,
+					   RTE_ETHER_ADDR_LEN);
 			}
+
 			break;
 		case RTE_FLOW_ITEM_TYPE_IPV4:
 			l3 = RTE_FLOW_ITEM_TYPE_IPV4;