rtnetlink.c (4e1a606d552de03aec2b1fd157011bf012fcc870) | rtnetlink.c (dac9c9790e542777079999900594fd069ba10489) |
---|---|
1/* 2 * INET An implementation of the TCP/IP protocol suite for the LINUX 3 * operating system. INET is implemented using the BSD Socket 4 * interface as the means of communication with the user level. 5 * 6 * Routing netlink socket interface: protocol independent part. 7 * 8 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> --- 116 unchanged lines hidden (view full) --- 125EXPORT_SYMBOL(rtnl_trylock); 126 127int rtnl_is_locked(void) 128{ 129 return mutex_is_locked(&rtnl_mutex); 130} 131EXPORT_SYMBOL(rtnl_is_locked); 132 | 1/* 2 * INET An implementation of the TCP/IP protocol suite for the LINUX 3 * operating system. INET is implemented using the BSD Socket 4 * interface as the means of communication with the user level. 5 * 6 * Routing netlink socket interface: protocol independent part. 7 * 8 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> --- 116 unchanged lines hidden (view full) --- 125EXPORT_SYMBOL(rtnl_trylock); 126 127int rtnl_is_locked(void) 128{ 129 return mutex_is_locked(&rtnl_mutex); 130} 131EXPORT_SYMBOL(rtnl_is_locked); 132 |
133bool refcount_dec_and_rtnl_lock(refcount_t *r) 134{ 135 return refcount_dec_and_mutex_lock(r, &rtnl_mutex); 136} 137EXPORT_SYMBOL(refcount_dec_and_rtnl_lock); 138 |
|
133#ifdef CONFIG_PROVE_LOCKING 134bool lockdep_rtnl_is_held(void) 135{ 136 return lockdep_is_held(&rtnl_mutex); 137} 138EXPORT_SYMBOL(lockdep_rtnl_is_held); 139#endif /* #ifdef CONFIG_PROVE_LOCKING */ 140 --- 870 unchanged lines hidden (view full) --- 1011 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ 1012 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */ 1013 + nla_total_size(IFNAMSIZ) /* IFLA_PHYS_PORT_NAME */ 1014 + rtnl_xdp_size() /* IFLA_XDP */ 1015 + nla_total_size(4) /* IFLA_EVENT */ 1016 + nla_total_size(4) /* IFLA_NEW_NETNSID */ 1017 + nla_total_size(4) /* IFLA_NEW_IFINDEX */ 1018 + nla_total_size(1) /* IFLA_PROTO_DOWN */ | 139#ifdef CONFIG_PROVE_LOCKING 140bool lockdep_rtnl_is_held(void) 141{ 142 return lockdep_is_held(&rtnl_mutex); 143} 144EXPORT_SYMBOL(lockdep_rtnl_is_held); 145#endif /* #ifdef CONFIG_PROVE_LOCKING */ 146 --- 870 unchanged lines hidden (view full) --- 1017 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ 1018 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */ 1019 + nla_total_size(IFNAMSIZ) /* IFLA_PHYS_PORT_NAME */ 1020 + rtnl_xdp_size() /* IFLA_XDP */ 1021 + nla_total_size(4) /* IFLA_EVENT */ 1022 + nla_total_size(4) /* IFLA_NEW_NETNSID */ 1023 + nla_total_size(4) /* IFLA_NEW_IFINDEX */ 1024 + nla_total_size(1) /* IFLA_PROTO_DOWN */ |
1019 + nla_total_size(4) /* IFLA_IF_NETNSID */ | 1025 + nla_total_size(4) /* IFLA_TARGET_NETNSID */ |
1020 + nla_total_size(4) /* IFLA_CARRIER_UP_COUNT */ 1021 + nla_total_size(4) /* IFLA_CARRIER_DOWN_COUNT */ 1022 + nla_total_size(4) /* IFLA_MIN_MTU */ 1023 + nla_total_size(4) /* IFLA_MAX_MTU */ 1024 + 0; 1025} 1026 1027static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev) --- 565 unchanged lines hidden (view full) --- 1593 ifm = nlmsg_data(nlh); 1594 ifm->ifi_family = AF_UNSPEC; 1595 ifm->__ifi_pad = 0; 1596 ifm->ifi_type = dev->type; 1597 ifm->ifi_index = dev->ifindex; 1598 ifm->ifi_flags = dev_get_flags(dev); 1599 ifm->ifi_change = change; 1600 | 1026 + nla_total_size(4) /* IFLA_CARRIER_UP_COUNT */ 1027 + nla_total_size(4) /* IFLA_CARRIER_DOWN_COUNT */ 1028 + nla_total_size(4) /* IFLA_MIN_MTU */ 1029 + nla_total_size(4) /* IFLA_MAX_MTU */ 1030 + 0; 1031} 1032 1033static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev) --- 565 unchanged lines hidden (view full) --- 1599 ifm = nlmsg_data(nlh); 1600 ifm->ifi_family = AF_UNSPEC; 1601 ifm->__ifi_pad = 0; 1602 ifm->ifi_type = dev->type; 1603 ifm->ifi_index = dev->ifindex; 1604 ifm->ifi_flags = dev_get_flags(dev); 1605 ifm->ifi_change = change; 1606 |
1601 if (tgt_netnsid >= 0 && nla_put_s32(skb, IFLA_IF_NETNSID, tgt_netnsid)) | 1607 if (tgt_netnsid >= 0 && nla_put_s32(skb, IFLA_TARGET_NETNSID, tgt_netnsid)) |
1602 goto nla_put_failure; 1603 1604 if (nla_put_string(skb, IFLA_IFNAME, dev->name) || 1605 nla_put_u32(skb, IFLA_TXQLEN, dev->tx_queue_len) || 1606 nla_put_u8(skb, IFLA_OPERSTATE, 1607 netif_running(dev) ? dev->operstate : IF_OPER_DOWN) || 1608 nla_put_u8(skb, IFLA_LINKMODE, dev->link_mode) || 1609 nla_put_u32(skb, IFLA_MTU, dev->mtu) || --- 122 unchanged lines hidden (view full) --- 1732 [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN }, 1733 [IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, /* ignored */ 1734 [IFLA_PHYS_SWITCH_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN }, 1735 [IFLA_LINK_NETNSID] = { .type = NLA_S32 }, 1736 [IFLA_PROTO_DOWN] = { .type = NLA_U8 }, 1737 [IFLA_XDP] = { .type = NLA_NESTED }, 1738 [IFLA_EVENT] = { .type = NLA_U32 }, 1739 [IFLA_GROUP] = { .type = NLA_U32 }, | 1608 goto nla_put_failure; 1609 1610 if (nla_put_string(skb, IFLA_IFNAME, dev->name) || 1611 nla_put_u32(skb, IFLA_TXQLEN, dev->tx_queue_len) || 1612 nla_put_u8(skb, IFLA_OPERSTATE, 1613 netif_running(dev) ? dev->operstate : IF_OPER_DOWN) || 1614 nla_put_u8(skb, IFLA_LINKMODE, dev->link_mode) || 1615 nla_put_u32(skb, IFLA_MTU, dev->mtu) || --- 122 unchanged lines hidden (view full) --- 1738 [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN }, 1739 [IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, /* ignored */ 1740 [IFLA_PHYS_SWITCH_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN }, 1741 [IFLA_LINK_NETNSID] = { .type = NLA_S32 }, 1742 [IFLA_PROTO_DOWN] = { .type = NLA_U8 }, 1743 [IFLA_XDP] = { .type = NLA_NESTED }, 1744 [IFLA_EVENT] = { .type = NLA_U32 }, 1745 [IFLA_GROUP] = { .type = NLA_U32 }, |
1740 [IFLA_IF_NETNSID] = { .type = NLA_S32 }, | 1746 [IFLA_TARGET_NETNSID] = { .type = NLA_S32 }, |
1741 [IFLA_CARRIER_UP_COUNT] = { .type = NLA_U32 }, 1742 [IFLA_CARRIER_DOWN_COUNT] = { .type = NLA_U32 }, 1743 [IFLA_MIN_MTU] = { .type = NLA_U32 }, 1744 [IFLA_MAX_MTU] = { .type = NLA_U32 }, 1745}; 1746 1747static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { 1748 [IFLA_INFO_KIND] = { .type = NLA_STRING }, --- 91 unchanged lines hidden (view full) --- 1840{ 1841 if (link_master_filtered(dev, master_idx) || 1842 link_kind_filtered(dev, kind_ops)) 1843 return true; 1844 1845 return false; 1846} 1847 | 1747 [IFLA_CARRIER_UP_COUNT] = { .type = NLA_U32 }, 1748 [IFLA_CARRIER_DOWN_COUNT] = { .type = NLA_U32 }, 1749 [IFLA_MIN_MTU] = { .type = NLA_U32 }, 1750 [IFLA_MAX_MTU] = { .type = NLA_U32 }, 1751}; 1752 1753static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { 1754 [IFLA_INFO_KIND] = { .type = NLA_STRING }, --- 91 unchanged lines hidden (view full) --- 1846{ 1847 if (link_master_filtered(dev, master_idx) || 1848 link_kind_filtered(dev, kind_ops)) 1849 return true; 1850 1851 return false; 1852} 1853 |
1848static struct net *get_target_net(struct sock *sk, int netnsid) | 1854/** 1855 * rtnl_get_net_ns_capable - Get netns if sufficiently privileged. 1856 * @sk: netlink socket 1857 * @netnsid: network namespace identifier 1858 * 1859 * Returns the network namespace identified by netnsid on success or an error 1860 * pointer on failure. 1861 */ 1862struct net *rtnl_get_net_ns_capable(struct sock *sk, int netnsid) |
1849{ 1850 struct net *net; 1851 1852 net = get_net_ns_by_id(sock_net(sk), netnsid); 1853 if (!net) 1854 return ERR_PTR(-EINVAL); 1855 1856 /* For now, the caller is required to have CAP_NET_ADMIN in 1857 * the user namespace owning the target net ns. 1858 */ 1859 if (!sk_ns_capable(sk, net->user_ns, CAP_NET_ADMIN)) { 1860 put_net(net); 1861 return ERR_PTR(-EACCES); 1862 } 1863 return net; 1864} | 1863{ 1864 struct net *net; 1865 1866 net = get_net_ns_by_id(sock_net(sk), netnsid); 1867 if (!net) 1868 return ERR_PTR(-EINVAL); 1869 1870 /* For now, the caller is required to have CAP_NET_ADMIN in 1871 * the user namespace owning the target net ns. 1872 */ 1873 if (!sk_ns_capable(sk, net->user_ns, CAP_NET_ADMIN)) { 1874 put_net(net); 1875 return ERR_PTR(-EACCES); 1876 } 1877 return net; 1878} |
1879EXPORT_SYMBOL_GPL(rtnl_get_net_ns_capable); |
|
1865 1866static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) 1867{ 1868 struct net *net = sock_net(skb->sk); 1869 struct net *tgt_net = net; 1870 int h, s_h; 1871 int idx = 0, s_idx; 1872 struct net_device *dev; --- 16 unchanged lines hidden (view full) --- 1889 * what iproute2 < v3.9.0 used. 1890 * We can detect the old iproute2. Even including the IFLA_EXT_MASK 1891 * attribute, its netlink message is shorter than struct ifinfomsg. 1892 */ 1893 hdrlen = nlmsg_len(cb->nlh) < sizeof(struct ifinfomsg) ? 1894 sizeof(struct rtgenmsg) : sizeof(struct ifinfomsg); 1895 1896 if (nlmsg_parse(cb->nlh, hdrlen, tb, IFLA_MAX, | 1880 1881static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) 1882{ 1883 struct net *net = sock_net(skb->sk); 1884 struct net *tgt_net = net; 1885 int h, s_h; 1886 int idx = 0, s_idx; 1887 struct net_device *dev; --- 16 unchanged lines hidden (view full) --- 1904 * what iproute2 < v3.9.0 used. 1905 * We can detect the old iproute2. Even including the IFLA_EXT_MASK 1906 * attribute, its netlink message is shorter than struct ifinfomsg. 1907 */ 1908 hdrlen = nlmsg_len(cb->nlh) < sizeof(struct ifinfomsg) ? 1909 sizeof(struct rtgenmsg) : sizeof(struct ifinfomsg); 1910 1911 if (nlmsg_parse(cb->nlh, hdrlen, tb, IFLA_MAX, |
1897 ifla_policy, NULL) >= 0) { 1898 if (tb[IFLA_IF_NETNSID]) { 1899 netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]); 1900 tgt_net = get_target_net(skb->sk, netnsid); | 1912 ifla_policy, cb->extack) >= 0) { 1913 if (tb[IFLA_TARGET_NETNSID]) { 1914 netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]); 1915 tgt_net = rtnl_get_net_ns_capable(skb->sk, netnsid); |
1901 if (IS_ERR(tgt_net)) 1902 return PTR_ERR(tgt_net); 1903 } 1904 1905 if (tb[IFLA_EXT_MASK]) 1906 ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); 1907 1908 if (tb[IFLA_MASTER]) --- 68 unchanged lines hidden (view full) --- 1977} 1978EXPORT_SYMBOL(rtnl_link_get_net); 1979 1980/* Figure out which network namespace we are talking about by 1981 * examining the link attributes in the following order: 1982 * 1983 * 1. IFLA_NET_NS_PID 1984 * 2. IFLA_NET_NS_FD | 1916 if (IS_ERR(tgt_net)) 1917 return PTR_ERR(tgt_net); 1918 } 1919 1920 if (tb[IFLA_EXT_MASK]) 1921 ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); 1922 1923 if (tb[IFLA_MASTER]) --- 68 unchanged lines hidden (view full) --- 1992} 1993EXPORT_SYMBOL(rtnl_link_get_net); 1994 1995/* Figure out which network namespace we are talking about by 1996 * examining the link attributes in the following order: 1997 * 1998 * 1. IFLA_NET_NS_PID 1999 * 2. IFLA_NET_NS_FD |
1985 * 3. IFLA_IF_NETNSID | 2000 * 3. IFLA_TARGET_NETNSID |
1986 */ 1987static struct net *rtnl_link_get_net_by_nlattr(struct net *src_net, 1988 struct nlattr *tb[]) 1989{ 1990 struct net *net; 1991 1992 if (tb[IFLA_NET_NS_PID] || tb[IFLA_NET_NS_FD]) 1993 return rtnl_link_get_net(src_net, tb); 1994 | 2001 */ 2002static struct net *rtnl_link_get_net_by_nlattr(struct net *src_net, 2003 struct nlattr *tb[]) 2004{ 2005 struct net *net; 2006 2007 if (tb[IFLA_NET_NS_PID] || tb[IFLA_NET_NS_FD]) 2008 return rtnl_link_get_net(src_net, tb); 2009 |
1995 if (!tb[IFLA_IF_NETNSID]) | 2010 if (!tb[IFLA_TARGET_NETNSID]) |
1996 return get_net(src_net); 1997 | 2011 return get_net(src_net); 2012 |
1998 net = get_net_ns_by_id(src_net, nla_get_u32(tb[IFLA_IF_NETNSID])); | 2013 net = get_net_ns_by_id(src_net, nla_get_u32(tb[IFLA_TARGET_NETNSID])); |
1999 if (!net) 2000 return ERR_PTR(-EINVAL); 2001 2002 return net; 2003} 2004 2005static struct net *rtnl_link_get_net_capable(const struct sk_buff *skb, 2006 struct net *src_net, --- 24 unchanged lines hidden (view full) --- 2031 if (netns_id_only) { 2032 if (!tb[IFLA_NET_NS_PID] && !tb[IFLA_NET_NS_FD]) 2033 return 0; 2034 2035 NL_SET_ERR_MSG(extack, "specified netns attribute not supported"); 2036 return -EOPNOTSUPP; 2037 } 2038 | 2014 if (!net) 2015 return ERR_PTR(-EINVAL); 2016 2017 return net; 2018} 2019 2020static struct net *rtnl_link_get_net_capable(const struct sk_buff *skb, 2021 struct net *src_net, --- 24 unchanged lines hidden (view full) --- 2046 if (netns_id_only) { 2047 if (!tb[IFLA_NET_NS_PID] && !tb[IFLA_NET_NS_FD]) 2048 return 0; 2049 2050 NL_SET_ERR_MSG(extack, "specified netns attribute not supported"); 2051 return -EOPNOTSUPP; 2052 } 2053 |
2039 if (tb[IFLA_IF_NETNSID] && (tb[IFLA_NET_NS_PID] || tb[IFLA_NET_NS_FD])) | 2054 if (tb[IFLA_TARGET_NETNSID] && (tb[IFLA_NET_NS_PID] || tb[IFLA_NET_NS_FD])) |
2040 goto invalid_attr; 2041 | 2055 goto invalid_attr; 2056 |
2042 if (tb[IFLA_NET_NS_PID] && (tb[IFLA_IF_NETNSID] || tb[IFLA_NET_NS_FD])) | 2057 if (tb[IFLA_NET_NS_PID] && (tb[IFLA_TARGET_NETNSID] || tb[IFLA_NET_NS_FD])) |
2043 goto invalid_attr; 2044 | 2058 goto invalid_attr; 2059 |
2045 if (tb[IFLA_NET_NS_FD] && (tb[IFLA_IF_NETNSID] || tb[IFLA_NET_NS_PID])) | 2060 if (tb[IFLA_NET_NS_FD] && (tb[IFLA_TARGET_NETNSID] || tb[IFLA_NET_NS_PID])) |
2046 goto invalid_attr; 2047 2048 return 0; 2049 2050invalid_attr: 2051 NL_SET_ERR_MSG(extack, "multiple netns identifying attributes specified"); 2052 return -EINVAL; 2053} --- 259 unchanged lines hidden (view full) --- 2313{ 2314 const struct net_device_ops *ops = dev->netdev_ops; 2315 int err; 2316 2317 err = validate_linkmsg(dev, tb); 2318 if (err < 0) 2319 return err; 2320 | 2061 goto invalid_attr; 2062 2063 return 0; 2064 2065invalid_attr: 2066 NL_SET_ERR_MSG(extack, "multiple netns identifying attributes specified"); 2067 return -EINVAL; 2068} --- 259 unchanged lines hidden (view full) --- 2328{ 2329 const struct net_device_ops *ops = dev->netdev_ops; 2330 int err; 2331 2332 err = validate_linkmsg(dev, tb); 2333 if (err < 0) 2334 return err; 2335 |
2321 if (tb[IFLA_NET_NS_PID] || tb[IFLA_NET_NS_FD] || tb[IFLA_IF_NETNSID]) { | 2336 if (tb[IFLA_NET_NS_PID] || tb[IFLA_NET_NS_FD] || tb[IFLA_TARGET_NETNSID]) { |
2322 struct net *net = rtnl_link_get_net_capable(skb, dev_net(dev), 2323 tb, CAP_NET_ADMIN); 2324 if (IS_ERR(net)) { 2325 err = PTR_ERR(net); 2326 goto errout; 2327 } 2328 2329 err = dev_change_net_namespace(dev, net, ifname); --- 426 unchanged lines hidden (view full) --- 2756 2757 err = rtnl_ensure_unique_netns(tb, extack, true); 2758 if (err < 0) 2759 return err; 2760 2761 if (tb[IFLA_IFNAME]) 2762 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 2763 | 2337 struct net *net = rtnl_link_get_net_capable(skb, dev_net(dev), 2338 tb, CAP_NET_ADMIN); 2339 if (IS_ERR(net)) { 2340 err = PTR_ERR(net); 2341 goto errout; 2342 } 2343 2344 err = dev_change_net_namespace(dev, net, ifname); --- 426 unchanged lines hidden (view full) --- 2771 2772 err = rtnl_ensure_unique_netns(tb, extack, true); 2773 if (err < 0) 2774 return err; 2775 2776 if (tb[IFLA_IFNAME]) 2777 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 2778 |
2764 if (tb[IFLA_IF_NETNSID]) { 2765 netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]); 2766 tgt_net = get_target_net(NETLINK_CB(skb).sk, netnsid); | 2779 if (tb[IFLA_TARGET_NETNSID]) { 2780 netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]); 2781 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid); |
2767 if (IS_ERR(tgt_net)) 2768 return PTR_ERR(tgt_net); 2769 } 2770 2771 err = -EINVAL; 2772 ifm = nlmsg_data(nlh); 2773 if (ifm->ifi_index > 0) 2774 dev = __dev_get_by_index(tgt_net, ifm->ifi_index); --- 397 unchanged lines hidden (view full) --- 3172 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy, extack); 3173 if (err < 0) 3174 return err; 3175 3176 err = rtnl_ensure_unique_netns(tb, extack, true); 3177 if (err < 0) 3178 return err; 3179 | 2782 if (IS_ERR(tgt_net)) 2783 return PTR_ERR(tgt_net); 2784 } 2785 2786 err = -EINVAL; 2787 ifm = nlmsg_data(nlh); 2788 if (ifm->ifi_index > 0) 2789 dev = __dev_get_by_index(tgt_net, ifm->ifi_index); --- 397 unchanged lines hidden (view full) --- 3187 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy, extack); 3188 if (err < 0) 3189 return err; 3190 3191 err = rtnl_ensure_unique_netns(tb, extack, true); 3192 if (err < 0) 3193 return err; 3194 |
3180 if (tb[IFLA_IF_NETNSID]) { 3181 netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]); 3182 tgt_net = get_target_net(NETLINK_CB(skb).sk, netnsid); | 3195 if (tb[IFLA_TARGET_NETNSID]) { 3196 netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]); 3197 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid); |
3183 if (IS_ERR(tgt_net)) 3184 return PTR_ERR(tgt_net); 3185 } 3186 3187 if (tb[IFLA_IFNAME]) 3188 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 3189 3190 if (tb[IFLA_EXT_MASK]) --- 68 unchanged lines hidden (view full) --- 3259 3260 return nlmsg_total_size(min_ifinfo_dump_size); 3261} 3262 3263static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb) 3264{ 3265 int idx; 3266 int s_idx = cb->family; | 3198 if (IS_ERR(tgt_net)) 3199 return PTR_ERR(tgt_net); 3200 } 3201 3202 if (tb[IFLA_IFNAME]) 3203 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 3204 3205 if (tb[IFLA_EXT_MASK]) --- 68 unchanged lines hidden (view full) --- 3274 3275 return nlmsg_total_size(min_ifinfo_dump_size); 3276} 3277 3278static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb) 3279{ 3280 int idx; 3281 int s_idx = cb->family; |
3282 int type = cb->nlh->nlmsg_type - RTM_BASE; |
|
3267 3268 if (s_idx == 0) 3269 s_idx = 1; 3270 3271 for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) { 3272 struct rtnl_link **tab; | 3283 3284 if (s_idx == 0) 3285 s_idx = 1; 3286 3287 for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) { 3288 struct rtnl_link **tab; |
3273 int type = cb->nlh->nlmsg_type-RTM_BASE; | |
3274 struct rtnl_link *link; 3275 rtnl_dumpit_func dumpit; 3276 3277 if (idx < s_idx || idx == PF_PACKET) 3278 continue; 3279 3280 if (type < 0 || type >= RTM_NR_MSGTYPES) 3281 continue; --- 472 unchanged lines hidden (view full) --- 3754 * So, check for ndmsg with an optional u32 attribute (not used here). 3755 * Fortunately these sizes don't conflict with the size of ifinfomsg 3756 * with an optional attribute. 3757 */ 3758 if (nlmsg_len(cb->nlh) != sizeof(struct ndmsg) && 3759 (nlmsg_len(cb->nlh) != sizeof(struct ndmsg) + 3760 nla_attr_size(sizeof(u32)))) { 3761 err = nlmsg_parse(cb->nlh, sizeof(struct ifinfomsg), tb, | 3289 struct rtnl_link *link; 3290 rtnl_dumpit_func dumpit; 3291 3292 if (idx < s_idx || idx == PF_PACKET) 3293 continue; 3294 3295 if (type < 0 || type >= RTM_NR_MSGTYPES) 3296 continue; --- 472 unchanged lines hidden (view full) --- 3769 * So, check for ndmsg with an optional u32 attribute (not used here). 3770 * Fortunately these sizes don't conflict with the size of ifinfomsg 3771 * with an optional attribute. 3772 */ 3773 if (nlmsg_len(cb->nlh) != sizeof(struct ndmsg) && 3774 (nlmsg_len(cb->nlh) != sizeof(struct ndmsg) + 3775 nla_attr_size(sizeof(u32)))) { 3776 err = nlmsg_parse(cb->nlh, sizeof(struct ifinfomsg), tb, |
3762 IFLA_MAX, ifla_policy, NULL); | 3777 IFLA_MAX, ifla_policy, cb->extack); |
3763 if (err < 0) { 3764 return -EINVAL; 3765 } else if (err == 0) { 3766 if (tb[IFLA_MASTER]) 3767 br_idx = nla_get_u32(tb[IFLA_MASTER]); 3768 } 3769 3770 brport_idx = ifm->ifi_index; --- 1081 unchanged lines hidden --- | 3778 if (err < 0) { 3779 return -EINVAL; 3780 } else if (err == 0) { 3781 if (tb[IFLA_MASTER]) 3782 br_idx = nla_get_u32(tb[IFLA_MASTER]); 3783 } 3784 3785 brport_idx = ifm->ifi_index; --- 1081 unchanged lines hidden --- |