rtnetlink.c (65921376425fc9c8b7ce647e1f7989f7cdf5dd70) rtnetlink.c (d4e4fdf9e4a27c87edb79b1478955075be141f67)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * INET An implementation of the TCP/IP protocol suite for the LINUX
4 * operating system. INET is implemented using the BSD Socket
5 * interface as the means of communication with the user level.
6 *
7 * Routing netlink socket interface: protocol independent part.
8 *

--- 1509 unchanged lines hidden (view full) ---

1518 int ret;
1519
1520 ret = dev_get_alias(dev, buf, sizeof(buf));
1521 return ret > 0 ? nla_put_string(skb, IFLA_IFALIAS, buf) : 0;
1522}
1523
1524static int rtnl_fill_link_netnsid(struct sk_buff *skb,
1525 const struct net_device *dev,
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * INET An implementation of the TCP/IP protocol suite for the LINUX
4 * operating system. INET is implemented using the BSD Socket
5 * interface as the means of communication with the user level.
6 *
7 * Routing netlink socket interface: protocol independent part.
8 *

--- 1509 unchanged lines hidden (view full) ---

1518 int ret;
1519
1520 ret = dev_get_alias(dev, buf, sizeof(buf));
1521 return ret > 0 ? nla_put_string(skb, IFLA_IFALIAS, buf) : 0;
1522}
1523
1524static int rtnl_fill_link_netnsid(struct sk_buff *skb,
1525 const struct net_device *dev,
1526 struct net *src_net)
1526 struct net *src_net, gfp_t gfp)
1527{
1528 bool put_iflink = false;
1529
1530 if (dev->rtnl_link_ops && dev->rtnl_link_ops->get_link_net) {
1531 struct net *link_net = dev->rtnl_link_ops->get_link_net(dev);
1532
1533 if (!net_eq(dev_net(dev), link_net)) {
1527{
1528 bool put_iflink = false;
1529
1530 if (dev->rtnl_link_ops && dev->rtnl_link_ops->get_link_net) {
1531 struct net *link_net = dev->rtnl_link_ops->get_link_net(dev);
1532
1533 if (!net_eq(dev_net(dev), link_net)) {
1534 int id = peernet2id_alloc(src_net, link_net);
1534 int id = peernet2id_alloc(src_net, link_net, gfp);
1535
1536 if (nla_put_s32(skb, IFLA_LINK_NETNSID, id))
1537 return -EMSGSIZE;
1538
1539 put_iflink = true;
1540 }
1541 }
1542

--- 41 unchanged lines hidden (view full) ---

1584 return 0;
1585}
1586
1587static int rtnl_fill_ifinfo(struct sk_buff *skb,
1588 struct net_device *dev, struct net *src_net,
1589 int type, u32 pid, u32 seq, u32 change,
1590 unsigned int flags, u32 ext_filter_mask,
1591 u32 event, int *new_nsid, int new_ifindex,
1535
1536 if (nla_put_s32(skb, IFLA_LINK_NETNSID, id))
1537 return -EMSGSIZE;
1538
1539 put_iflink = true;
1540 }
1541 }
1542

--- 41 unchanged lines hidden (view full) ---

1584 return 0;
1585}
1586
1587static int rtnl_fill_ifinfo(struct sk_buff *skb,
1588 struct net_device *dev, struct net *src_net,
1589 int type, u32 pid, u32 seq, u32 change,
1590 unsigned int flags, u32 ext_filter_mask,
1591 u32 event, int *new_nsid, int new_ifindex,
1592 int tgt_netnsid)
1592 int tgt_netnsid, gfp_t gfp)
1593{
1594 struct ifinfomsg *ifm;
1595 struct nlmsghdr *nlh;
1596
1597 ASSERT_RTNL();
1598 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifm), flags);
1599 if (nlh == NULL)
1600 return -EMSGSIZE;

--- 75 unchanged lines hidden (view full) ---

1676 if (rtnl_xdp_fill(skb, dev))
1677 goto nla_put_failure;
1678
1679 if (dev->rtnl_link_ops || rtnl_have_link_slave_info(dev)) {
1680 if (rtnl_link_fill(skb, dev) < 0)
1681 goto nla_put_failure;
1682 }
1683
1593{
1594 struct ifinfomsg *ifm;
1595 struct nlmsghdr *nlh;
1596
1597 ASSERT_RTNL();
1598 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifm), flags);
1599 if (nlh == NULL)
1600 return -EMSGSIZE;

--- 75 unchanged lines hidden (view full) ---

1676 if (rtnl_xdp_fill(skb, dev))
1677 goto nla_put_failure;
1678
1679 if (dev->rtnl_link_ops || rtnl_have_link_slave_info(dev)) {
1680 if (rtnl_link_fill(skb, dev) < 0)
1681 goto nla_put_failure;
1682 }
1683
1684 if (rtnl_fill_link_netnsid(skb, dev, src_net))
1684 if (rtnl_fill_link_netnsid(skb, dev, src_net, gfp))
1685 goto nla_put_failure;
1686
1687 if (new_nsid &&
1688 nla_put_s32(skb, IFLA_NEW_NETNSID, *new_nsid) < 0)
1689 goto nla_put_failure;
1690 if (new_ifindex &&
1691 nla_put_s32(skb, IFLA_NEW_IFINDEX, new_ifindex) < 0)
1692 goto nla_put_failure;

--- 303 unchanged lines hidden (view full) ---

1996 goto cont;
1997 if (idx < s_idx)
1998 goto cont;
1999 err = rtnl_fill_ifinfo(skb, dev, net,
2000 RTM_NEWLINK,
2001 NETLINK_CB(cb->skb).portid,
2002 nlh->nlmsg_seq, 0, flags,
2003 ext_filter_mask, 0, NULL, 0,
1685 goto nla_put_failure;
1686
1687 if (new_nsid &&
1688 nla_put_s32(skb, IFLA_NEW_NETNSID, *new_nsid) < 0)
1689 goto nla_put_failure;
1690 if (new_ifindex &&
1691 nla_put_s32(skb, IFLA_NEW_IFINDEX, new_ifindex) < 0)
1692 goto nla_put_failure;

--- 303 unchanged lines hidden (view full) ---

1996 goto cont;
1997 if (idx < s_idx)
1998 goto cont;
1999 err = rtnl_fill_ifinfo(skb, dev, net,
2000 RTM_NEWLINK,
2001 NETLINK_CB(cb->skb).portid,
2002 nlh->nlmsg_seq, 0, flags,
2003 ext_filter_mask, 0, NULL, 0,
2004 netnsid);
2004 netnsid, GFP_KERNEL);
2005
2006 if (err < 0) {
2007 if (likely(skb->len))
2008 goto out;
2009
2010 goto out_err;
2011 }
2012cont:

--- 1342 unchanged lines hidden (view full) ---

3355 err = -ENOBUFS;
3356 nskb = nlmsg_new(if_nlmsg_size(dev, ext_filter_mask), GFP_KERNEL);
3357 if (nskb == NULL)
3358 goto out;
3359
3360 err = rtnl_fill_ifinfo(nskb, dev, net,
3361 RTM_NEWLINK, NETLINK_CB(skb).portid,
3362 nlh->nlmsg_seq, 0, 0, ext_filter_mask,
2005
2006 if (err < 0) {
2007 if (likely(skb->len))
2008 goto out;
2009
2010 goto out_err;
2011 }
2012cont:

--- 1342 unchanged lines hidden (view full) ---

3355 err = -ENOBUFS;
3356 nskb = nlmsg_new(if_nlmsg_size(dev, ext_filter_mask), GFP_KERNEL);
3357 if (nskb == NULL)
3358 goto out;
3359
3360 err = rtnl_fill_ifinfo(nskb, dev, net,
3361 RTM_NEWLINK, NETLINK_CB(skb).portid,
3362 nlh->nlmsg_seq, 0, 0, ext_filter_mask,
3363 0, NULL, 0, netnsid);
3363 0, NULL, 0, netnsid, GFP_KERNEL);
3364 if (err < 0) {
3365 /* -EMSGSIZE implies BUG in if_nlmsg_size */
3366 WARN_ON(err == -EMSGSIZE);
3367 kfree_skb(nskb);
3368 } else
3369 err = rtnl_unicast(nskb, net, NETLINK_CB(skb).portid);
3370out:
3371 if (netnsid >= 0)

--- 95 unchanged lines hidden (view full) ---

3467 size_t if_info_size;
3468
3469 skb = nlmsg_new((if_info_size = if_nlmsg_size(dev, 0)), flags);
3470 if (skb == NULL)
3471 goto errout;
3472
3473 err = rtnl_fill_ifinfo(skb, dev, dev_net(dev),
3474 type, 0, 0, change, 0, 0, event,
3364 if (err < 0) {
3365 /* -EMSGSIZE implies BUG in if_nlmsg_size */
3366 WARN_ON(err == -EMSGSIZE);
3367 kfree_skb(nskb);
3368 } else
3369 err = rtnl_unicast(nskb, net, NETLINK_CB(skb).portid);
3370out:
3371 if (netnsid >= 0)

--- 95 unchanged lines hidden (view full) ---

3467 size_t if_info_size;
3468
3469 skb = nlmsg_new((if_info_size = if_nlmsg_size(dev, 0)), flags);
3470 if (skb == NULL)
3471 goto errout;
3472
3473 err = rtnl_fill_ifinfo(skb, dev, dev_net(dev),
3474 type, 0, 0, change, 0, 0, event,
3475 new_nsid, new_ifindex, -1);
3475 new_nsid, new_ifindex, -1, flags);
3476 if (err < 0) {
3477 /* -EMSGSIZE implies BUG in if_nlmsg_size() */
3478 WARN_ON(err == -EMSGSIZE);
3479 kfree_skb(skb);
3480 goto errout;
3481 }
3482 return skb;
3483errout:

--- 1862 unchanged lines hidden ---
3476 if (err < 0) {
3477 /* -EMSGSIZE implies BUG in if_nlmsg_size() */
3478 WARN_ON(err == -EMSGSIZE);
3479 kfree_skb(skb);
3480 goto errout;
3481 }
3482 return skb;
3483errout:

--- 1862 unchanged lines hidden ---