Commit ec9d16ba authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso Committed by David S. Miller
Browse files

net: bridge: resolve forwarding path for bridge devices



Add .ndo_fill_forward_path for bridge devices.

Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e4417d69
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -851,6 +851,7 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev,
enum net_device_path_type {
	DEV_PATH_ETHERNET = 0,
	DEV_PATH_VLAN,
	DEV_PATH_BRIDGE,
};

struct net_device_path {
+27 −0
Original line number Diff line number Diff line
@@ -385,6 +385,32 @@ static int br_del_slave(struct net_device *dev, struct net_device *slave_dev)
	return br_del_if(br, slave_dev);
}

static int br_fill_forward_path(struct net_device_path_ctx *ctx,
				struct net_device_path *path)
{
	struct net_bridge_fdb_entry *f;
	struct net_bridge_port *dst;
	struct net_bridge *br;

	if (netif_is_bridge_port(ctx->dev))
		return -1;

	br = netdev_priv(ctx->dev);
	f = br_fdb_find_rcu(br, ctx->daddr, 0);
	if (!f || !f->dst)
		return -1;

	dst = READ_ONCE(f->dst);
	if (!dst)
		return -1;

	path->type = DEV_PATH_BRIDGE;
	path->dev = dst->br->dev;
	ctx->dev = dst->dev;

	return 0;
}

static const struct ethtool_ops br_ethtool_ops = {
	.get_drvinfo		 = br_getinfo,
	.get_link		 = ethtool_op_get_link,
@@ -419,6 +445,7 @@ static const struct net_device_ops br_netdev_ops = {
	.ndo_bridge_setlink	 = br_setlink,
	.ndo_bridge_dellink	 = br_dellink,
	.ndo_features_check	 = passthru_features_check,
	.ndo_fill_forward_path	 = br_fill_forward_path,
};

static struct device_type br_type = {