net: dsa: resolve forwarding path for dsa slave ports
authorFelix Fietkau <nbd@nbd.name>
Wed, 24 Mar 2021 01:30:37 +0000 (02:30 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Mar 2021 19:48:38 +0000 (12:48 -0700)
Add .ndo_fill_forward_path for dsa slave port devices

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h
net/dsa/slave.c

index dd54f7c..90db741 100644 (file)
@@ -853,6 +853,7 @@ enum net_device_path_type {
        DEV_PATH_VLAN,
        DEV_PATH_BRIDGE,
        DEV_PATH_PPPOE,
+       DEV_PATH_DSA,
 };
 
 struct net_device_path {
@@ -873,6 +874,10 @@ struct net_device_path {
                        u16             vlan_id;
                        __be16          vlan_proto;
                } bridge;
+               struct {
+                       int port;
+                       u16 proto;
+               } dsa;
        };
 };
 
index c51e524..7453cec 100644 (file)
@@ -1654,6 +1654,21 @@ static void dsa_slave_get_stats64(struct net_device *dev,
                dev_get_tstats64(dev, s);
 }
 
+static int dsa_slave_fill_forward_path(struct net_device_path_ctx *ctx,
+                                      struct net_device_path *path)
+{
+       struct dsa_port *dp = dsa_slave_to_port(ctx->dev);
+       struct dsa_port *cpu_dp = dp->cpu_dp;
+
+       path->dev = ctx->dev;
+       path->type = DEV_PATH_DSA;
+       path->dsa.proto = cpu_dp->tag_ops->proto;
+       path->dsa.port = dp->index;
+       ctx->dev = cpu_dp->master;
+
+       return 0;
+}
+
 static const struct net_device_ops dsa_slave_netdev_ops = {
        .ndo_open               = dsa_slave_open,
        .ndo_stop               = dsa_slave_close,
@@ -1679,6 +1694,7 @@ static const struct net_device_ops dsa_slave_netdev_ops = {
        .ndo_vlan_rx_kill_vid   = dsa_slave_vlan_rx_kill_vid,
        .ndo_get_devlink_port   = dsa_slave_get_devlink_port,
        .ndo_change_mtu         = dsa_slave_change_mtu,
+       .ndo_fill_forward_path  = dsa_slave_fill_forward_path,
 };
 
 static struct device_type dsa_type = {