mirror of https://gitee.com/openkylin/linux.git
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: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f59783f5bb
commit
6545916ed9
|
@ -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) {
|
||||
err = __mdb_fill_info(skb, p);
|
||||
if (err) {
|
||||
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);
|
||||
nla_nest_cancel(skb, nest2);
|
||||
err = -EMSGSIZE;
|
||||
goto out;
|
||||
}
|
||||
nla_nest_end(skb, nest_ent);
|
||||
}
|
||||
nla_nest_end(skb, nest2);
|
||||
skip:
|
||||
|
|
Loading…
Reference in New Issue