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 --- |