openwrt/target/linux/generic/pending-5.4/647-net-dsa-support-hardware-flow-table-offload.patch
Hauke Mehrtens 98b1a6435f kernel: Backport patch to automatically bring up DSA master when opening user port
Without this patch we have to manually bring up the CPU interface in
failsafe mode.

This was backported from kernel 5.12.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Tested-by: Rafał Miłecki <rafal@milecki.pl>
(cherry picked from commit 2e17c71095)
2021-06-22 23:52:09 +02:00

79 lines
2.2 KiB
Diff

From: Felix Fietkau <nbd@nbd.name>
Date: Thu, 17 Sep 2020 18:41:23 +0200
Subject: [PATCH] net: dsa: support hardware flow table offload
Look up the master device and the port id
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
--- a/include/net/netfilter/nf_flow_table.h
+++ b/include/net/netfilter/nf_flow_table.h
@@ -90,6 +90,7 @@ struct flow_offload {
#define FLOW_OFFLOAD_PATH_ETHERNET BIT(0)
#define FLOW_OFFLOAD_PATH_VLAN BIT(1)
#define FLOW_OFFLOAD_PATH_PPPOE BIT(2)
+#define FLOW_OFFLOAD_PATH_DSA BIT(3)
struct flow_offload_hw_path {
struct net_device *dev;
@@ -100,6 +101,7 @@ struct flow_offload_hw_path {
u16 vlan_proto;
u16 vlan_id;
u16 pppoe_sid;
+ u16 dsa_port;
};
#define NF_FLOW_TIMEOUT (30 * HZ)
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -19,6 +19,10 @@
#include <linux/if_bridge.h>
#include <linux/netpoll.h>
#include <linux/ptp_classify.h>
+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
+#include <linux/netfilter.h>
+#include <net/netfilter/nf_flow_table.h>
+#endif
#include "dsa_priv.h"
@@ -1226,6 +1230,27 @@ static struct devlink_port *dsa_slave_ge
return dp->ds->devlink ? &dp->devlink_port : NULL;
}
+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
+static int dsa_flow_offload_check(struct flow_offload_hw_path *path)
+{
+ struct net_device *dev = path->dev;
+ struct dsa_port *dp;
+
+ if (!(path->flags & FLOW_OFFLOAD_PATH_ETHERNET))
+ return -EINVAL;
+
+ dp = dsa_slave_to_port(dev);
+ path->dsa_port = dp->index;
+ path->dev = dsa_slave_to_master(dev);
+ path->flags |= FLOW_OFFLOAD_PATH_DSA;
+
+ if (path->dev->netdev_ops->ndo_flow_offload_check)
+ return path->dev->netdev_ops->ndo_flow_offload_check(path);
+
+ return 0;
+}
+#endif /* CONFIG_NF_FLOW_TABLE */
+
static const struct net_device_ops dsa_slave_netdev_ops = {
.ndo_open = dsa_slave_open,
.ndo_stop = dsa_slave_close,
@@ -1250,6 +1275,9 @@ static const struct net_device_ops dsa_s
.ndo_vlan_rx_add_vid = dsa_slave_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = dsa_slave_vlan_rx_kill_vid,
.ndo_get_devlink_port = dsa_slave_get_devlink_port,
+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
+ .ndo_flow_offload_check = dsa_flow_offload_check,
+#endif
};
static struct device_type dsa_type = {