]> git.itanic.dy.fi Git - linux-stable/commitdiff
rtnetlink: Honour NLM_F_ECHO flag in rtnl_delete_link
authorHangbin Liu <liuhangbin@gmail.com>
Fri, 28 Oct 2022 08:42:24 +0000 (04:42 -0400)
committerJakub Kicinski <kuba@kernel.org>
Tue, 1 Nov 2022 01:10:21 +0000 (18:10 -0700)
This patch use the new helper unregister_netdevice_many_notify() for
rtnl_delete_link(), so that the kernel could reply unicast when userspace
 set NLM_F_ECHO flag to request the new created interface info.

At the same time, the parameters of rtnl_delete_link() need to be updated
since we need nlmsghdr and portid info.

Suggested-by: Guillaume Nault <gnault@redhat.com>
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Reviewed-by: Guillaume Nault <gnault@redhat.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/rtnetlink.h
net/core/rtnetlink.c
net/openvswitch/vport-geneve.c
net/openvswitch/vport-gre.c
net/openvswitch/vport-netdev.c
net/openvswitch/vport-vxlan.c

index cd94f65dc2a9284da70de86698a918d323b3c5da..d9076a7a430c23becbe69df1b536eba01b3c437f 100644 (file)
@@ -186,7 +186,7 @@ struct net_device *rtnl_create_link(struct net *net, const char *ifname,
                                    const struct rtnl_link_ops *ops,
                                    struct nlattr *tb[],
                                    struct netlink_ext_ack *extack);
-int rtnl_delete_link(struct net_device *dev);
+int rtnl_delete_link(struct net_device *dev, u32 portid, const struct nlmsghdr *nlh);
 int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm,
                        u32 portid, const struct nlmsghdr *nlh);
 
index 839ff8b7eadcb690985974e002d6bb08b791c9d4..d2f27548fc0bedaf621817c45e91133c43c0df01 100644 (file)
@@ -3110,7 +3110,7 @@ static int rtnl_group_dellink(const struct net *net, int group)
        return 0;
 }
 
-int rtnl_delete_link(struct net_device *dev)
+int rtnl_delete_link(struct net_device *dev, u32 portid, const struct nlmsghdr *nlh)
 {
        const struct rtnl_link_ops *ops;
        LIST_HEAD(list_kill);
@@ -3120,7 +3120,7 @@ int rtnl_delete_link(struct net_device *dev)
                return -EOPNOTSUPP;
 
        ops->dellink(dev, &list_kill);
-       unregister_netdevice_many(&list_kill);
+       unregister_netdevice_many_notify(&list_kill, portid, nlh);
 
        return 0;
 }
@@ -3130,6 +3130,7 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
                        struct netlink_ext_ack *extack)
 {
        struct net *net = sock_net(skb->sk);
+       u32 portid = NETLINK_CB(skb).portid;
        struct net *tgt_net = net;
        struct net_device *dev = NULL;
        struct ifinfomsg *ifm;
@@ -3171,7 +3172,7 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
                goto out;
        }
 
-       err = rtnl_delete_link(dev);
+       err = rtnl_delete_link(dev, portid, nlh);
 
 out:
        if (netnsid >= 0)
index 89a8e1501809f1167c451ee669bdf61c25079383..b10e1602c6b14710396388438bfee78468bd2034 100644 (file)
@@ -91,7 +91,7 @@ static struct vport *geneve_tnl_create(const struct vport_parms *parms)
 
        err = dev_change_flags(dev, dev->flags | IFF_UP, NULL);
        if (err < 0) {
-               rtnl_delete_link(dev);
+               rtnl_delete_link(dev, 0, NULL);
                rtnl_unlock();
                ovs_vport_free(vport);
                goto error;
index e6b5e76a962a683401388207a69689378a337cb4..4014c9b5eb7987202eacde6229975081e44d7d9c 100644 (file)
@@ -57,7 +57,7 @@ static struct vport *gre_tnl_create(const struct vport_parms *parms)
 
        err = dev_change_flags(dev, dev->flags | IFF_UP, NULL);
        if (err < 0) {
-               rtnl_delete_link(dev);
+               rtnl_delete_link(dev, 0, NULL);
                rtnl_unlock();
                ovs_vport_free(vport);
                return ERR_PTR(err);
index 2f61d5bdce1a73f657193dd343a99804a44f9256..903537a5da22ea434302c06d2f4931f13ff2ec27 100644 (file)
@@ -172,7 +172,7 @@ void ovs_netdev_tunnel_destroy(struct vport *vport)
         * if it's not already shutting down.
         */
        if (vport->dev->reg_state == NETREG_REGISTERED)
-               rtnl_delete_link(vport->dev);
+               rtnl_delete_link(vport->dev, 0, NULL);
        netdev_put(vport->dev, &vport->dev_tracker);
        vport->dev = NULL;
        rtnl_unlock();
index 188e9c1360a12245292a92069620ff76224abce0..0b881b043bcf4abe0610ed8008f4e0673d08b621 100644 (file)
@@ -120,7 +120,7 @@ static struct vport *vxlan_tnl_create(const struct vport_parms *parms)
 
        err = dev_change_flags(dev, dev->flags | IFF_UP, NULL);
        if (err < 0) {
-               rtnl_delete_link(dev);
+               rtnl_delete_link(dev, 0, NULL);
                rtnl_unlock();
                ovs_vport_free(vport);
                goto error;