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

Commit 6545916e authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by David S. Miller
Browse files

net: bridge: mdb: factor out mdb filling



We have to factor out the mdb fill portion in order to re-use it later for
the bridge mdb entries. No functional changes intended.

Signed-off-by: default avatarNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f59783f5
Loading
Loading
Loading
Loading
+37 −31
Original line number Diff line number Diff line
@@ -77,6 +77,40 @@ static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip)
#endif
}

static int __mdb_fill_info(struct sk_buff *skb,
			   struct net_bridge_port_group *p)
{
	struct nlattr *nest_ent;
	struct br_mdb_entry e;

	memset(&e, 0, sizeof(e));
	__mdb_entry_fill_flags(&e, p->flags);
	e.ifindex = p->port->dev->ifindex;
	e.vid = p->addr.vid;
	if (p->addr.proto == htons(ETH_P_IP))
		e.addr.u.ip4 = p->addr.u.ip4;
#if IS_ENABLED(CONFIG_IPV6)
	if (p->addr.proto == htons(ETH_P_IPV6))
		e.addr.u.ip6 = p->addr.u.ip6;
#endif
	e.addr.proto = p->addr.proto;
	nest_ent = nla_nest_start_noflag(skb,
					 MDBA_MDB_ENTRY_INFO);
	if (!nest_ent)
		return -EMSGSIZE;

	if (nla_put_nohdr(skb, sizeof(e), &e) ||
	    nla_put_u32(skb,
			MDBA_MDB_EATTR_TIMER,
			br_timer_value(&p->timer))) {
		nla_nest_cancel(skb, nest_ent);
		return -EMSGSIZE;
	}
	nla_nest_end(skb, nest_ent);

	return 0;
}

static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
			    struct net_device *dev)
{
@@ -95,7 +129,6 @@ static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
	hlist_for_each_entry_rcu(mp, &br->mdb_list, mdb_node) {
		struct net_bridge_port_group *p;
		struct net_bridge_port_group __rcu **pp;
		struct net_bridge_port *port;

		if (idx < s_idx)
			goto skip;
@@ -108,41 +141,14 @@ static int br_mdb_fill_info(struct sk_buff *skb, struct netlink_callback *cb,

		for (pp = &mp->ports; (p = rcu_dereference(*pp)) != NULL;
		      pp = &p->next) {
			struct nlattr *nest_ent;
			struct br_mdb_entry e;

			port = p->port;
			if (!port)
			if (!p->port)
				continue;

			memset(&e, 0, sizeof(e));
			e.ifindex = port->dev->ifindex;
			e.vid = p->addr.vid;
			__mdb_entry_fill_flags(&e, p->flags);
			if (p->addr.proto == htons(ETH_P_IP))
				e.addr.u.ip4 = p->addr.u.ip4;
#if IS_ENABLED(CONFIG_IPV6)
			if (p->addr.proto == htons(ETH_P_IPV6))
				e.addr.u.ip6 = p->addr.u.ip6;
#endif
			e.addr.proto = p->addr.proto;
			nest_ent = nla_nest_start_noflag(skb,
							 MDBA_MDB_ENTRY_INFO);
			if (!nest_ent) {
				nla_nest_cancel(skb, nest2);
				err = -EMSGSIZE;
				goto out;
			}
			if (nla_put_nohdr(skb, sizeof(e), &e) ||
			    nla_put_u32(skb,
					MDBA_MDB_EATTR_TIMER,
					br_timer_value(&p->timer))) {
				nla_nest_cancel(skb, nest_ent);
			err = __mdb_fill_info(skb, p);
			if (err) {
				nla_nest_cancel(skb, nest2);
				err = -EMSGSIZE;
				goto out;
			}
			nla_nest_end(skb, nest_ent);
		}
		nla_nest_end(skb, nest2);
skip: