Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d6b7833 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "bridge: Add bridge API to access the bridge slave port"

parents e61a99a6 e092c033
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -52,6 +52,11 @@ struct br_ip_list {

extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *));

#ifdef CONFIG_ENABLE_SFE
extern struct net_device *br_port_dev_get(struct net_device *dev,
						unsigned char *addr);
#endif

#if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING)
int br_multicast_list_adjacent(struct net_device *dev,
			       struct list_head *br_ip_list);
+33 −0
Original line number Diff line number Diff line
@@ -757,3 +757,36 @@ bool br_port_flag_is_set(const struct net_device *dev, unsigned long flag)
	return p->flags & flag;
}
EXPORT_SYMBOL_GPL(br_port_flag_is_set);

#ifdef CONFIG_ENABLE_SFE
/* br_port_dev_get()
 * Using the given addr, identify the port to which it is reachable,
 * returing a reference to the net device associated with that port.
 *
 * NOTE: Return NULL if given dev is not a bridge or
 *       the mac has no associated port
 */
struct net_device *br_port_dev_get(struct net_device *dev, unsigned char *addr)
{
	struct net_bridge_fdb_entry *fdbe;
	struct net_bridge *br;
	struct net_device *netdev = NULL;

	/* Is this a bridge? */
	if (!(dev->priv_flags & IFF_EBRIDGE))
		return NULL;

	br = netdev_priv(dev);

	/* Lookup the fdb entry and get reference to the port dev */
	rcu_read_lock();
	fdbe = br_fdb_find_rcu(br, addr, 0);
	if (fdbe && fdbe->dst) {
		netdev = fdbe->dst->dev; /* port device */
		dev_hold(netdev);
	}
	rcu_read_unlock();
	return netdev;
}
EXPORT_SYMBOL(br_port_dev_get);
#endif