2022-08-23 16:47:36

by Maksym Glubokiy

[permalink] [raw]
Subject: [PATCH net-next 0/3] net: prestera: matchall features

This patch series extracts matchall rules management out of SPAN API
implementation and adds 2 features on top of that:
- support for egress traffic (mirred egress action)
- proper rule priorities management between matchall and flower

Maksym Glubokiy (1):
net: prestera: manage matchall and flower priorities

Serhiy Boiko (2):
net: prestera: acl: extract matchall logic into a separate file
net: prestera: add support for egress traffic mirroring

.../net/ethernet/marvell/prestera/Makefile | 2 +-
.../ethernet/marvell/prestera/prestera_acl.c | 43 ++++++
.../ethernet/marvell/prestera/prestera_acl.h | 2 +
.../ethernet/marvell/prestera/prestera_flow.c | 12 +-
.../ethernet/marvell/prestera/prestera_flow.h | 5 +
.../marvell/prestera/prestera_flower.c | 48 +++++++
.../marvell/prestera/prestera_flower.h | 2 +
.../ethernet/marvell/prestera/prestera_hw.c | 30 +++--
.../ethernet/marvell/prestera/prestera_hw.h | 5 +-
.../marvell/prestera/prestera_matchall.c | 125 ++++++++++++++++++
.../marvell/prestera/prestera_matchall.h | 17 +++
.../ethernet/marvell/prestera/prestera_span.c | 66 +--------
.../ethernet/marvell/prestera/prestera_span.h | 12 +-
13 files changed, 291 insertions(+), 78 deletions(-)
create mode 100644 drivers/net/ethernet/marvell/prestera/prestera_matchall.c
create mode 100644 drivers/net/ethernet/marvell/prestera/prestera_matchall.h

--
2.25.1


2022-08-23 16:48:26

by Maksym Glubokiy

[permalink] [raw]
Subject: [PATCH net-next 2/3] net: prestera: add support for egress traffic mirroring

From: Serhiy Boiko <[email protected]>

This enables adding matchall rules for egress:

tc filter add .. egress .. matchall skip_sw \
action mirred egress mirror dev ..

Signed-off-by: Serhiy Boiko <[email protected]>
Signed-off-by: Maksym Glubokiy <[email protected]>
---
.../ethernet/marvell/prestera/prestera_hw.c | 30 ++++++++++++++-----
.../ethernet/marvell/prestera/prestera_hw.h | 5 ++--
.../marvell/prestera/prestera_matchall.c | 7 +++--
.../ethernet/marvell/prestera/prestera_span.c | 10 ++++---
.../ethernet/marvell/prestera/prestera_span.h | 6 ++--
5 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/marvell/prestera/prestera_hw.c b/drivers/net/ethernet/marvell/prestera/prestera_hw.c
index e0e9ae34ceea..8430db3384f9 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_hw.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_hw.c
@@ -78,9 +78,11 @@ enum prestera_cmd_type_t {
PRESTERA_CMD_TYPE_STP_PORT_SET = 0x1000,

PRESTERA_CMD_TYPE_SPAN_GET = 0x1100,
- PRESTERA_CMD_TYPE_SPAN_BIND = 0x1101,
- PRESTERA_CMD_TYPE_SPAN_UNBIND = 0x1102,
+ PRESTERA_CMD_TYPE_SPAN_INGRESS_BIND = 0x1101,
+ PRESTERA_CMD_TYPE_SPAN_INGRESS_UNBIND = 0x1102,
PRESTERA_CMD_TYPE_SPAN_RELEASE = 0x1103,
+ PRESTERA_CMD_TYPE_SPAN_EGRESS_BIND = 0x1104,
+ PRESTERA_CMD_TYPE_SPAN_EGRESS_UNBIND = 0x1105,

PRESTERA_CMD_TYPE_POLICER_CREATE = 0x1500,
PRESTERA_CMD_TYPE_POLICER_RELEASE = 0x1501,
@@ -1432,27 +1434,39 @@ int prestera_hw_span_get(const struct prestera_port *port, u8 *span_id)
return 0;
}

-int prestera_hw_span_bind(const struct prestera_port *port, u8 span_id)
+int prestera_hw_span_bind(const struct prestera_port *port, u8 span_id,
+ bool ingress)
{
struct prestera_msg_span_req req = {
.port = __cpu_to_le32(port->hw_id),
.dev = __cpu_to_le32(port->dev_id),
.id = span_id,
};
+ enum prestera_cmd_type_t cmd_type;
+
+ if (ingress)
+ cmd_type = PRESTERA_CMD_TYPE_SPAN_INGRESS_BIND;
+ else
+ cmd_type = PRESTERA_CMD_TYPE_SPAN_EGRESS_BIND;
+
+ return prestera_cmd(port->sw, cmd_type, &req.cmd, sizeof(req));

- return prestera_cmd(port->sw, PRESTERA_CMD_TYPE_SPAN_BIND,
- &req.cmd, sizeof(req));
}

-int prestera_hw_span_unbind(const struct prestera_port *port)
+int prestera_hw_span_unbind(const struct prestera_port *port, bool ingress)
{
struct prestera_msg_span_req req = {
.port = __cpu_to_le32(port->hw_id),
.dev = __cpu_to_le32(port->dev_id),
};
+ enum prestera_cmd_type_t cmd_type;

- return prestera_cmd(port->sw, PRESTERA_CMD_TYPE_SPAN_UNBIND,
- &req.cmd, sizeof(req));
+ if (ingress)
+ cmd_type = PRESTERA_CMD_TYPE_SPAN_INGRESS_UNBIND;
+ else
+ cmd_type = PRESTERA_CMD_TYPE_SPAN_EGRESS_UNBIND;
+
+ return prestera_cmd(port->sw, cmd_type, &req.cmd, sizeof(req));
}

int prestera_hw_span_release(struct prestera_switch *sw, u8 span_id)
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_hw.h b/drivers/net/ethernet/marvell/prestera/prestera_hw.h
index 56e043146dd2..a589450e9f27 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_hw.h
+++ b/drivers/net/ethernet/marvell/prestera/prestera_hw.h
@@ -243,8 +243,9 @@ int prestera_hw_counter_clear(struct prestera_switch *sw, u32 block_id,

/* SPAN API */
int prestera_hw_span_get(const struct prestera_port *port, u8 *span_id);
-int prestera_hw_span_bind(const struct prestera_port *port, u8 span_id);
-int prestera_hw_span_unbind(const struct prestera_port *port);
+int prestera_hw_span_bind(const struct prestera_port *port, u8 span_id,
+ bool ingress);
+int prestera_hw_span_unbind(const struct prestera_port *port, bool ingress);
int prestera_hw_span_release(struct prestera_switch *sw, u8 span_id);

/* Router API */
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_matchall.c b/drivers/net/ethernet/marvell/prestera/prestera_matchall.c
index 54573c6a6fe2..3fc13176e046 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_matchall.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_matchall.c
@@ -43,7 +43,7 @@ int prestera_mall_replace(struct prestera_flow_block *block,
port = netdev_priv(act->dev);

list_for_each_entry(binding, &block->binding_list, list) {
- err = prestera_span_rule_add(binding, port);
+ err = prestera_span_rule_add(binding, port, block->ingress);
if (err)
goto rollback;
}
@@ -53,7 +53,7 @@ int prestera_mall_replace(struct prestera_flow_block *block,
rollback:
list_for_each_entry_continue_reverse(binding,
&block->binding_list, list)
- prestera_span_rule_del(binding);
+ prestera_span_rule_del(binding, block->ingress);
return err;
}

@@ -62,5 +62,6 @@ void prestera_mall_destroy(struct prestera_flow_block *block)
struct prestera_flow_block_binding *binding;

list_for_each_entry(binding, &block->binding_list, list)
- prestera_span_rule_del(binding);
+ prestera_span_rule_del(binding, block->ingress);
+
}
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_span.c b/drivers/net/ethernet/marvell/prestera/prestera_span.c
index 766413b9ba1b..f0e9d6ea88c5 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_span.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_span.c
@@ -121,7 +121,8 @@ static int prestera_span_put(struct prestera_switch *sw, u8 span_id)
}

int prestera_span_rule_add(struct prestera_flow_block_binding *binding,
- struct prestera_port *to_port)
+ struct prestera_port *to_port,
+ bool ingress)
{
struct prestera_switch *sw = binding->port->sw;
u8 span_id;
@@ -135,7 +136,7 @@ int prestera_span_rule_add(struct prestera_flow_block_binding *binding,
if (err)
return err;

- err = prestera_hw_span_bind(binding->port, span_id);
+ err = prestera_hw_span_bind(binding->port, span_id, ingress);
if (err) {
prestera_span_put(sw, span_id);
return err;
@@ -145,11 +146,12 @@ int prestera_span_rule_add(struct prestera_flow_block_binding *binding,
return 0;
}

-int prestera_span_rule_del(struct prestera_flow_block_binding *binding)
+int prestera_span_rule_del(struct prestera_flow_block_binding *binding,
+ bool ingress)
{
int err;

- err = prestera_hw_span_unbind(binding->port);
+ err = prestera_hw_span_unbind(binding->port, ingress);
if (err)
return err;

diff --git a/drivers/net/ethernet/marvell/prestera/prestera_span.h b/drivers/net/ethernet/marvell/prestera/prestera_span.h
index 4958ce820b52..493b68524bcb 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_span.h
+++ b/drivers/net/ethernet/marvell/prestera/prestera_span.h
@@ -16,7 +16,9 @@ int prestera_span_init(struct prestera_switch *sw);
void prestera_span_fini(struct prestera_switch *sw);

int prestera_span_rule_add(struct prestera_flow_block_binding *binding,
- struct prestera_port *to_port);
-int prestera_span_rule_del(struct prestera_flow_block_binding *binding);
+ struct prestera_port *to_port,
+ bool ingress);
+int prestera_span_rule_del(struct prestera_flow_block_binding *binding,
+ bool ingress);

#endif /* _PRESTERA_SPAN_H_ */
--
2.25.1

2022-08-23 16:51:38

by Maksym Glubokiy

[permalink] [raw]
Subject: [PATCH net-next 1/3] net: prestera: acl: extract matchall logic into a separate file

From: Serhiy Boiko <[email protected]>

This commit adds more clarity to handling of TC_CLSMATCHALL_REPLACE and
TC_CLSMATCHALL_DESTROY events by calling newly added *_mall_*() handlers
instead of directly calling SPAN API.

This also extracts matchall rules management out of SPAN API since SPAN
is a hardware module which is used to implement 'matchall egress mirred'
action only.

Signed-off-by: Taras Chornyi <[email protected]>
Signed-off-by: Serhiy Boiko <[email protected]>
Signed-off-by: Maksym Glubokiy <[email protected]>
---
.../net/ethernet/marvell/prestera/Makefile | 2 +-
.../ethernet/marvell/prestera/prestera_flow.c | 9 +--
.../marvell/prestera/prestera_matchall.c | 66 +++++++++++++++++++
.../marvell/prestera/prestera_matchall.h | 15 +++++
.../ethernet/marvell/prestera/prestera_span.c | 60 +----------------
.../ethernet/marvell/prestera/prestera_span.h | 10 +--
6 files changed, 96 insertions(+), 66 deletions(-)
create mode 100644 drivers/net/ethernet/marvell/prestera/prestera_matchall.c
create mode 100644 drivers/net/ethernet/marvell/prestera/prestera_matchall.h

diff --git a/drivers/net/ethernet/marvell/prestera/Makefile b/drivers/net/ethernet/marvell/prestera/Makefile
index d395f4131648..df14cee80153 100644
--- a/drivers/net/ethernet/marvell/prestera/Makefile
+++ b/drivers/net/ethernet/marvell/prestera/Makefile
@@ -4,6 +4,6 @@ prestera-objs := prestera_main.o prestera_hw.o prestera_dsa.o \
prestera_rxtx.o prestera_devlink.o prestera_ethtool.o \
prestera_switchdev.o prestera_acl.o prestera_flow.o \
prestera_flower.o prestera_span.o prestera_counter.o \
- prestera_router.o prestera_router_hw.o
+ prestera_router.o prestera_router_hw.o prestera_matchall.o

obj-$(CONFIG_PRESTERA_PCI) += prestera_pci.o
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_flow.c b/drivers/net/ethernet/marvell/prestera/prestera_flow.c
index 2262693bd5cf..3f81eef167fa 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_flow.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_flow.c
@@ -7,8 +7,9 @@
#include "prestera.h"
#include "prestera_acl.h"
#include "prestera_flow.h"
-#include "prestera_span.h"
#include "prestera_flower.h"
+#include "prestera_matchall.h"
+#include "prestera_span.h"

static LIST_HEAD(prestera_block_cb_list);

@@ -17,9 +18,9 @@ static int prestera_flow_block_mall_cb(struct prestera_flow_block *block,
{
switch (f->command) {
case TC_CLSMATCHALL_REPLACE:
- return prestera_span_replace(block, f);
+ return prestera_mall_replace(block, f);
case TC_CLSMATCHALL_DESTROY:
- prestera_span_destroy(block);
+ prestera_mall_destroy(block);
return 0;
default:
return -EOPNOTSUPP;
@@ -263,7 +264,7 @@ static void prestera_setup_flow_block_unbind(struct prestera_port *port,

block = flow_block_cb_priv(block_cb);

- prestera_span_destroy(block);
+ prestera_mall_destroy(block);

err = prestera_flow_block_unbind(block, port);
if (err)
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_matchall.c b/drivers/net/ethernet/marvell/prestera/prestera_matchall.c
new file mode 100644
index 000000000000..54573c6a6fe2
--- /dev/null
+++ b/drivers/net/ethernet/marvell/prestera/prestera_matchall.c
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
+/* Copyright (c) 2019-2022 Marvell International Ltd. All rights reserved */
+
+#include <linux/kernel.h>
+#include <linux/list.h>
+
+#include "prestera.h"
+#include "prestera_hw.h"
+#include "prestera_flow.h"
+#include "prestera_flower.h"
+#include "prestera_matchall.h"
+#include "prestera_span.h"
+
+int prestera_mall_replace(struct prestera_flow_block *block,
+ struct tc_cls_matchall_offload *f)
+{
+ struct prestera_flow_block_binding *binding;
+ __be16 protocol = f->common.protocol;
+ struct flow_action_entry *act;
+ struct prestera_port *port;
+ int err;
+
+ if (!flow_offload_has_one_action(&f->rule->action)) {
+ NL_SET_ERR_MSG(f->common.extack,
+ "Only singular actions are supported");
+ return -EOPNOTSUPP;
+ }
+
+ act = &f->rule->action.entries[0];
+
+ if (!prestera_netdev_check(act->dev)) {
+ NL_SET_ERR_MSG(f->common.extack,
+ "Only Marvell Prestera port is supported");
+ return -EINVAL;
+ }
+ if (!tc_cls_can_offload_and_chain0(act->dev, &f->common))
+ return -EOPNOTSUPP;
+ if (act->id != FLOW_ACTION_MIRRED)
+ return -EOPNOTSUPP;
+ if (protocol != htons(ETH_P_ALL))
+ return -EOPNOTSUPP;
+
+ port = netdev_priv(act->dev);
+
+ list_for_each_entry(binding, &block->binding_list, list) {
+ err = prestera_span_rule_add(binding, port);
+ if (err)
+ goto rollback;
+ }
+
+ return 0;
+
+rollback:
+ list_for_each_entry_continue_reverse(binding,
+ &block->binding_list, list)
+ prestera_span_rule_del(binding);
+ return err;
+}
+
+void prestera_mall_destroy(struct prestera_flow_block *block)
+{
+ struct prestera_flow_block_binding *binding;
+
+ list_for_each_entry(binding, &block->binding_list, list)
+ prestera_span_rule_del(binding);
+}
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_matchall.h b/drivers/net/ethernet/marvell/prestera/prestera_matchall.h
new file mode 100644
index 000000000000..31ad4d02ecbb
--- /dev/null
+++ b/drivers/net/ethernet/marvell/prestera/prestera_matchall.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
+/* Copyright (c) 2022 Marvell International Ltd. All rights reserved. */
+
+#ifndef _PRESTERA_MATCHALL_H_
+#define _PRESTERA_MATCHALL_H_
+
+#include <net/pkt_cls.h>
+
+struct prestera_flow_block;
+
+int prestera_mall_replace(struct prestera_flow_block *block,
+ struct tc_cls_matchall_offload *f);
+void prestera_mall_destroy(struct prestera_flow_block *block);
+
+#endif /* _PRESTERA_MATCHALL_H_ */
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_span.c b/drivers/net/ethernet/marvell/prestera/prestera_span.c
index 845e9d8c8cc7..766413b9ba1b 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_span.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_span.c
@@ -120,8 +120,8 @@ static int prestera_span_put(struct prestera_switch *sw, u8 span_id)
return 0;
}

-static int prestera_span_rule_add(struct prestera_flow_block_binding *binding,
- struct prestera_port *to_port)
+int prestera_span_rule_add(struct prestera_flow_block_binding *binding,
+ struct prestera_port *to_port)
{
struct prestera_switch *sw = binding->port->sw;
u8 span_id;
@@ -145,7 +145,7 @@ static int prestera_span_rule_add(struct prestera_flow_block_binding *binding,
return 0;
}

-static int prestera_span_rule_del(struct prestera_flow_block_binding *binding)
+int prestera_span_rule_del(struct prestera_flow_block_binding *binding)
{
int err;

@@ -161,60 +161,6 @@ static int prestera_span_rule_del(struct prestera_flow_block_binding *binding)
return 0;
}

-int prestera_span_replace(struct prestera_flow_block *block,
- struct tc_cls_matchall_offload *f)
-{
- struct prestera_flow_block_binding *binding;
- __be16 protocol = f->common.protocol;
- struct flow_action_entry *act;
- struct prestera_port *port;
- int err;
-
- if (!flow_offload_has_one_action(&f->rule->action)) {
- NL_SET_ERR_MSG(f->common.extack,
- "Only singular actions are supported");
- return -EOPNOTSUPP;
- }
-
- act = &f->rule->action.entries[0];
-
- if (!prestera_netdev_check(act->dev)) {
- NL_SET_ERR_MSG(f->common.extack,
- "Only Marvell Prestera port is supported");
- return -EINVAL;
- }
- if (!tc_cls_can_offload_and_chain0(act->dev, &f->common))
- return -EOPNOTSUPP;
- if (act->id != FLOW_ACTION_MIRRED)
- return -EOPNOTSUPP;
- if (protocol != htons(ETH_P_ALL))
- return -EOPNOTSUPP;
-
- port = netdev_priv(act->dev);
-
- list_for_each_entry(binding, &block->binding_list, list) {
- err = prestera_span_rule_add(binding, port);
- if (err)
- goto rollback;
- }
-
- return 0;
-
-rollback:
- list_for_each_entry_continue_reverse(binding,
- &block->binding_list, list)
- prestera_span_rule_del(binding);
- return err;
-}
-
-void prestera_span_destroy(struct prestera_flow_block *block)
-{
- struct prestera_flow_block_binding *binding;
-
- list_for_each_entry(binding, &block->binding_list, list)
- prestera_span_rule_del(binding);
-}
-
int prestera_span_init(struct prestera_switch *sw)
{
struct prestera_span *span;
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_span.h b/drivers/net/ethernet/marvell/prestera/prestera_span.h
index f0644521f78a..4958ce820b52 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_span.h
+++ b/drivers/net/ethernet/marvell/prestera/prestera_span.h
@@ -8,13 +8,15 @@

#define PRESTERA_SPAN_INVALID_ID -1

+struct prestera_port;
struct prestera_switch;
-struct prestera_flow_block;
+struct prestera_flow_block_binding;

int prestera_span_init(struct prestera_switch *sw);
void prestera_span_fini(struct prestera_switch *sw);
-int prestera_span_replace(struct prestera_flow_block *block,
- struct tc_cls_matchall_offload *f);
-void prestera_span_destroy(struct prestera_flow_block *block);
+
+int prestera_span_rule_add(struct prestera_flow_block_binding *binding,
+ struct prestera_port *to_port);
+int prestera_span_rule_del(struct prestera_flow_block_binding *binding);

#endif /* _PRESTERA_SPAN_H_ */
--
2.25.1

2022-08-25 11:40:19

by Paolo Abeni

[permalink] [raw]
Subject: Re: [PATCH net-next 1/3] net: prestera: acl: extract matchall logic into a separate file

Hello,

On Tue, 2022-08-23 at 14:39 +0300, Maksym Glubokiy wrote:
> From: Serhiy Boiko <[email protected]>
>
> This commit adds more clarity to handling of TC_CLSMATCHALL_REPLACE and
> TC_CLSMATCHALL_DESTROY events by calling newly added *_mall_*() handlers
> instead of directly calling SPAN API.
>
> This also extracts matchall rules management out of SPAN API since SPAN
> is a hardware module which is used to implement 'matchall egress mirred'
> action only.
>
> Signed-off-by: Taras Chornyi <[email protected]>
> Signed-off-by: Serhiy Boiko <[email protected]>
> Signed-off-by: Maksym Glubokiy <[email protected]>

This SoB chain is not clear to me. Did Taras co-developed the patch? In
that case a Co-developed-by: tag is missing, as the first tag in the
list. Otherwise why is Taras' SoB there?

Thanks!

Paolo

2022-08-25 12:00:03

by Maksym Glubokiy

[permalink] [raw]
Subject: Re: [PATCH net-next 1/3] net: prestera: acl: extract matchall logic into a separate file

On Thu, Aug 25, 2022 at 01:11:35PM +0200, Paolo Abeni wrote:
> Hello,
>
> On Tue, 2022-08-23 at 14:39 +0300, Maksym Glubokiy wrote:
> > From: Serhiy Boiko <[email protected]>
> >
> > This commit adds more clarity to handling of TC_CLSMATCHALL_REPLACE and
> > TC_CLSMATCHALL_DESTROY events by calling newly added *_mall_*() handlers
> > instead of directly calling SPAN API.
> >
> > This also extracts matchall rules management out of SPAN API since SPAN
> > is a hardware module which is used to implement 'matchall egress mirred'
> > action only.
> >
> > Signed-off-by: Taras Chornyi <[email protected]>
> > Signed-off-by: Serhiy Boiko <[email protected]>
> > Signed-off-by: Maksym Glubokiy <[email protected]>
>
> This SoB chain is not clear to me. Did Taras co-developed the patch? In
> that case a Co-developed-by: tag is missing, as the first tag in the
> list. Otherwise why is Taras' SoB there?
There are new files being added with Marvel's copyright and my understanding is
that there must be someone from Marvel on SoB list in such a case.

2022-08-26 09:26:40

by patchwork-bot+netdevbpf

[permalink] [raw]
Subject: Re: [PATCH net-next 0/3] net: prestera: matchall features

Hello:

This series was applied to netdev/net-next.git (master)
by David S. Miller <[email protected]>:

On Tue, 23 Aug 2022 14:39:55 +0300 you wrote:
> This patch series extracts matchall rules management out of SPAN API
> implementation and adds 2 features on top of that:
> - support for egress traffic (mirred egress action)
> - proper rule priorities management between matchall and flower
>
> Maksym Glubokiy (1):
> net: prestera: manage matchall and flower priorities
>
> [...]

Here is the summary with links:
- [net-next,1/3] net: prestera: acl: extract matchall logic into a separate file
https://git.kernel.org/netdev/net-next/c/8afd552db463
- [net-next,2/3] net: prestera: add support for egress traffic mirroring
https://git.kernel.org/netdev/net-next/c/8c448c2b5fd2
- [net-next,3/3] net: prestera: manage matchall and flower priorities
https://git.kernel.org/netdev/net-next/c/44af95718fed

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html