mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-06 20:03:33 -04:00
Revert "net: rtnetlink: add NLM_F_BULK support to rtnl_fdb_del"
This reverts commit 4b7140925d which is
commit 9e83425993f38bb89e0ea07849ba0039a748e85b upstream.
It breaks the Android kernel abi and can be brought back in the future
in an abi-safe way if it is really needed.
Bug: 161946584
Change-Id: I065c84bd7cc13eb97aacf866af01a8b5c93d3d64
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
parent
13a2c8a68f
commit
af72578d25
1 changed files with 19 additions and 48 deletions
|
|
@ -3818,34 +3818,22 @@ int ndo_dflt_fdb_del(struct ndmsg *ndm,
|
|||
}
|
||||
EXPORT_SYMBOL(ndo_dflt_fdb_del);
|
||||
|
||||
static const struct nla_policy fdb_del_bulk_policy[NDA_MAX + 1] = {
|
||||
[NDA_VLAN] = { .type = NLA_U16 },
|
||||
[NDA_IFINDEX] = NLA_POLICY_MIN(NLA_S32, 1),
|
||||
};
|
||||
|
||||
static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
bool del_bulk = !!(nlh->nlmsg_flags & NLM_F_BULK);
|
||||
struct net *net = sock_net(skb->sk);
|
||||
const struct net_device_ops *ops;
|
||||
struct ndmsg *ndm;
|
||||
struct nlattr *tb[NDA_MAX+1];
|
||||
struct net_device *dev;
|
||||
__u8 *addr = NULL;
|
||||
__u8 *addr;
|
||||
int err;
|
||||
u16 vid;
|
||||
|
||||
if (!netlink_capable(skb, CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (!del_bulk) {
|
||||
err = nlmsg_parse_deprecated(nlh, sizeof(*ndm), tb, NDA_MAX,
|
||||
NULL, extack);
|
||||
} else {
|
||||
err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX,
|
||||
fdb_del_bulk_policy, extack);
|
||||
}
|
||||
err = nlmsg_parse_deprecated(nlh, sizeof(*ndm), tb, NDA_MAX, NULL,
|
||||
extack);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
|
|
@ -3861,12 +3849,9 @@ static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!del_bulk) {
|
||||
if (!tb[NDA_LLADDR] || nla_len(tb[NDA_LLADDR]) != ETH_ALEN) {
|
||||
NL_SET_ERR_MSG(extack, "invalid address");
|
||||
return -EINVAL;
|
||||
}
|
||||
addr = nla_data(tb[NDA_LLADDR]);
|
||||
if (!tb[NDA_LLADDR] || nla_len(tb[NDA_LLADDR]) != ETH_ALEN) {
|
||||
NL_SET_ERR_MSG(extack, "invalid address");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (dev->type != ARPHRD_ETHER) {
|
||||
|
|
@ -3874,6 +3859,8 @@ static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
addr = nla_data(tb[NDA_LLADDR]);
|
||||
|
||||
err = fdb_vid_parse(tb[NDA_VLAN], &vid, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
|
@ -3884,16 +3871,10 @@ static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
if ((!ndm->ndm_flags || ndm->ndm_flags & NTF_MASTER) &&
|
||||
netif_is_bridge_port(dev)) {
|
||||
struct net_device *br_dev = netdev_master_upper_dev_get(dev);
|
||||
const struct net_device_ops *ops = br_dev->netdev_ops;
|
||||
|
||||
ops = br_dev->netdev_ops;
|
||||
if (!del_bulk) {
|
||||
if (ops->ndo_fdb_del)
|
||||
err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid);
|
||||
} else {
|
||||
if (ops->ndo_fdb_del_bulk)
|
||||
err = ops->ndo_fdb_del_bulk(ndm, tb, dev, vid,
|
||||
extack);
|
||||
}
|
||||
if (ops->ndo_fdb_del)
|
||||
err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
|
|
@ -3903,24 +3884,15 @@ static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
|
||||
/* Embedded bridge, macvlan, and any other device support */
|
||||
if (ndm->ndm_flags & NTF_SELF) {
|
||||
ops = dev->netdev_ops;
|
||||
if (!del_bulk) {
|
||||
if (ops->ndo_fdb_del)
|
||||
err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid);
|
||||
else
|
||||
err = ndo_dflt_fdb_del(ndm, tb, dev, addr, vid);
|
||||
} else {
|
||||
/* in case err was cleared by NTF_MASTER call */
|
||||
err = -EOPNOTSUPP;
|
||||
if (ops->ndo_fdb_del_bulk)
|
||||
err = ops->ndo_fdb_del_bulk(ndm, tb, dev, vid,
|
||||
extack);
|
||||
}
|
||||
if (dev->netdev_ops->ndo_fdb_del)
|
||||
err = dev->netdev_ops->ndo_fdb_del(ndm, tb, dev, addr,
|
||||
vid);
|
||||
else
|
||||
err = ndo_dflt_fdb_del(ndm, tb, dev, addr, vid);
|
||||
|
||||
if (!err) {
|
||||
if (!del_bulk)
|
||||
rtnl_fdb_notify(dev, addr, vid, RTM_DELNEIGH,
|
||||
ndm->ndm_state);
|
||||
rtnl_fdb_notify(dev, addr, vid, RTM_DELNEIGH,
|
||||
ndm->ndm_state);
|
||||
ndm->ndm_flags &= ~NTF_SELF;
|
||||
}
|
||||
}
|
||||
|
|
@ -5436,8 +5408,7 @@ void __init rtnetlink_init(void)
|
|||
rtnl_register(PF_UNSPEC, RTM_GETNETCONF, NULL, rtnl_dump_all, 0);
|
||||
|
||||
rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, rtnl_fdb_add, NULL, 0);
|
||||
rtnl_register(PF_BRIDGE, RTM_DELNEIGH, rtnl_fdb_del, NULL,
|
||||
RTNL_FLAG_BULK_DEL_SUPPORTED);
|
||||
rtnl_register(PF_BRIDGE, RTM_DELNEIGH, rtnl_fdb_del, NULL, 0);
|
||||
rtnl_register(PF_BRIDGE, RTM_GETNEIGH, rtnl_fdb_get, rtnl_fdb_dump, 0);
|
||||
|
||||
rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, rtnl_bridge_getlink, 0);
|
||||
|
|
|
|||
Loading…
Reference in a new issue