aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mscc/ocelot_tc.c
diff options
context:
space:
mode:
authorHoratiu Vultur <horatiu.vultur@microchip.com>2019-05-31 09:16:57 +0200
committerDavid S. Miller <davem@davemloft.net>2019-06-02 13:49:49 -0700
commitfe3490e6107e10da90dee09cade35e6f4b558294 (patch)
tree4898d363f7e5133cfc14639129f98ef774c18fbc /drivers/net/ethernet/mscc/ocelot_tc.c
parentnet: mscc: ocelot: Add support for tcam (diff)
downloadlinux-dev-fe3490e6107e10da90dee09cade35e6f4b558294.tar.xz
linux-dev-fe3490e6107e10da90dee09cade35e6f4b558294.zip
net: mscc: ocelot: Hardware ofload for tc flower filter
Hardware offload of port filtering are now supported via tc command using flower filter. ACL rules are used to enable the hardware offload. The following keys are supported: vlan_id vlan_prio dst_mac/src_mac for non IP frames dst_ip/src_ip dst_port/src_port The following actions are supported: trap drop These filters are supported only on the ingress schedulare. Add: tc qdisc add dev eth3 ingress tc filter ad dev eth3 parent ffff: ip_proto ip flower \ ip_proto tcp dst_port 80 action drop Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mscc/ocelot_tc.c')
-rw-r--r--drivers/net/ethernet/mscc/ocelot_tc.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/net/ethernet/mscc/ocelot_tc.c b/drivers/net/ethernet/mscc/ocelot_tc.c
index a0eaadccfecc..72084306240d 100644
--- a/drivers/net/ethernet/mscc/ocelot_tc.c
+++ b/drivers/net/ethernet/mscc/ocelot_tc.c
@@ -6,6 +6,7 @@
#include "ocelot_tc.h"
#include "ocelot_police.h"
+#include "ocelot_ace.h"
#include <net/pkt_cls.h>
static int ocelot_setup_tc_cls_matchall(struct ocelot_port *port,
@@ -101,10 +102,7 @@ static int ocelot_setup_tc_block_cb(enum tc_setup_type type,
return ocelot_setup_tc_cls_matchall(port, type_data, ingress);
case TC_SETUP_CLSFLOWER:
- netdev_dbg(port->dev, "tc_block_cb: TC_SETUP_CLSFLOWER %s\n",
- ingress ? "ingress" : "egress");
-
- return -EOPNOTSUPP;
+ return 0;
default:
netdev_dbg(port->dev, "tc_block_cb: type %d %s\n",
type,
@@ -134,6 +132,7 @@ static int ocelot_setup_tc_block(struct ocelot_port *port,
struct tc_block_offload *f)
{
tc_setup_cb_t *cb;
+ int ret;
netdev_dbg(port->dev, "tc_block command %d, binder_type %d\n",
f->command, f->binder_type);
@@ -149,9 +148,14 @@ static int ocelot_setup_tc_block(struct ocelot_port *port,
switch (f->command) {
case TC_BLOCK_BIND:
- return tcf_block_cb_register(f->block, cb, port,
- port, f->extack);
+ ret = tcf_block_cb_register(f->block, cb, port,
+ port, f->extack);
+ if (ret)
+ return ret;
+
+ return ocelot_setup_tc_block_flower_bind(port, f);
case TC_BLOCK_UNBIND:
+ ocelot_setup_tc_block_flower_unbind(port, f);
tcf_block_cb_unregister(f->block, cb, port);
return 0;
default: