rtnetlink.c (df7dbcbbafc0b8f3fb31a40c6f3c4a7e15cb0b40) | rtnetlink.c (ba7d49b1f0f8e5f24294a880ed576964059af5ef) |
---|---|
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> --- 351 unchanged lines hidden (view full) --- 360void rtnl_link_unregister(struct rtnl_link_ops *ops) 361{ 362 rtnl_lock(); 363 __rtnl_link_unregister(ops); 364 rtnl_unlock(); 365} 366EXPORT_SYMBOL_GPL(rtnl_link_unregister); 367 | 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> --- 351 unchanged lines hidden (view full) --- 360void rtnl_link_unregister(struct rtnl_link_ops *ops) 361{ 362 rtnl_lock(); 363 __rtnl_link_unregister(ops); 364 rtnl_unlock(); 365} 366EXPORT_SYMBOL_GPL(rtnl_link_unregister); 367 |
368static size_t rtnl_link_get_slave_info_data_size(const struct net_device *dev) 369{ 370 struct net_device *master_dev; 371 const struct rtnl_link_ops *ops; 372 373 master_dev = netdev_master_upper_dev_get((struct net_device *) dev); 374 if (!master_dev) 375 return 0; 376 ops = master_dev->rtnl_link_ops; 377 if (!ops->get_slave_size) 378 return 0; 379 /* IFLA_INFO_SLAVE_DATA + nested data */ 380 return nla_total_size(sizeof(struct nlattr)) + 381 ops->get_slave_size(master_dev, dev); 382} 383 |
|
368static size_t rtnl_link_get_size(const struct net_device *dev) 369{ 370 const struct rtnl_link_ops *ops = dev->rtnl_link_ops; 371 size_t size; 372 373 if (!ops) 374 return 0; 375 --- 4 unchanged lines hidden (view full) --- 380 /* IFLA_INFO_DATA + nested data */ 381 size += nla_total_size(sizeof(struct nlattr)) + 382 ops->get_size(dev); 383 384 if (ops->get_xstats_size) 385 /* IFLA_INFO_XSTATS */ 386 size += nla_total_size(ops->get_xstats_size(dev)); 387 | 384static size_t rtnl_link_get_size(const struct net_device *dev) 385{ 386 const struct rtnl_link_ops *ops = dev->rtnl_link_ops; 387 size_t size; 388 389 if (!ops) 390 return 0; 391 --- 4 unchanged lines hidden (view full) --- 396 /* IFLA_INFO_DATA + nested data */ 397 size += nla_total_size(sizeof(struct nlattr)) + 398 ops->get_size(dev); 399 400 if (ops->get_xstats_size) 401 /* IFLA_INFO_XSTATS */ 402 size += nla_total_size(ops->get_xstats_size(dev)); 403 |
404 size += rtnl_link_get_slave_info_data_size(dev); 405 |
|
388 return size; 389} 390 391static LIST_HEAD(rtnl_af_ops); 392 393static const struct rtnl_af_ops *rtnl_af_lookup(const int family) 394{ 395 const struct rtnl_af_ops *ops; --- 58 unchanged lines hidden (view full) --- 454 size += nla_total_size(sizeof(struct nlattr)) + 455 af_ops->get_link_af_size(dev); 456 } 457 } 458 459 return size; 460} 461 | 406 return size; 407} 408 409static LIST_HEAD(rtnl_af_ops); 410 411static const struct rtnl_af_ops *rtnl_af_lookup(const int family) 412{ 413 const struct rtnl_af_ops *ops; --- 58 unchanged lines hidden (view full) --- 472 size += nla_total_size(sizeof(struct nlattr)) + 473 af_ops->get_link_af_size(dev); 474 } 475 } 476 477 return size; 478} 479 |
462static int rtnl_link_fill(struct sk_buff *skb, const struct net_device *dev) | 480static bool rtnl_have_link_slave_info(const struct net_device *dev) |
463{ | 481{ |
464 const struct rtnl_link_ops *ops = dev->rtnl_link_ops; 465 struct nlattr *linkinfo, *data; 466 int err = -EMSGSIZE; | 482 struct net_device *master_dev; |
467 | 483 |
468 linkinfo = nla_nest_start(skb, IFLA_LINKINFO); 469 if (linkinfo == NULL) 470 goto out; | 484 master_dev = netdev_master_upper_dev_get((struct net_device *) dev); 485 if (master_dev && master_dev->rtnl_link_ops && 486 master_dev->rtnl_link_ops->fill_slave_info) 487 return true; 488 return false; 489} |
471 | 490 |
491static int rtnl_link_slave_info_fill(struct sk_buff *skb, 492 const struct net_device *dev) 493{ 494 struct net_device *master_dev; 495 const struct rtnl_link_ops *ops; 496 struct nlattr *slave_data; 497 int err; 498 499 master_dev = netdev_master_upper_dev_get((struct net_device *) dev); 500 if (!master_dev) 501 return 0; 502 ops = master_dev->rtnl_link_ops; 503 if (!ops) 504 return 0; 505 if (nla_put_string(skb, IFLA_INFO_SLAVE_KIND, ops->kind) < 0) 506 return -EMSGSIZE; 507 if (ops->fill_slave_info) { 508 slave_data = nla_nest_start(skb, IFLA_INFO_SLAVE_DATA); 509 if (!slave_data) 510 return -EMSGSIZE; 511 err = ops->fill_slave_info(skb, master_dev, dev); 512 if (err < 0) 513 goto err_cancel_slave_data; 514 nla_nest_end(skb, slave_data); 515 } 516 return 0; 517 518err_cancel_slave_data: 519 nla_nest_cancel(skb, slave_data); 520 return err; 521} 522 523static int rtnl_link_info_fill(struct sk_buff *skb, 524 const struct net_device *dev) 525{ 526 const struct rtnl_link_ops *ops = dev->rtnl_link_ops; 527 struct nlattr *data; 528 int err; 529 530 if (!ops) 531 return 0; |
|
472 if (nla_put_string(skb, IFLA_INFO_KIND, ops->kind) < 0) | 532 if (nla_put_string(skb, IFLA_INFO_KIND, ops->kind) < 0) |
473 goto err_cancel_link; | 533 return -EMSGSIZE; |
474 if (ops->fill_xstats) { 475 err = ops->fill_xstats(skb, dev); 476 if (err < 0) | 534 if (ops->fill_xstats) { 535 err = ops->fill_xstats(skb, dev); 536 if (err < 0) |
477 goto err_cancel_link; | 537 return err; |
478 } 479 if (ops->fill_info) { 480 data = nla_nest_start(skb, IFLA_INFO_DATA); | 538 } 539 if (ops->fill_info) { 540 data = nla_nest_start(skb, IFLA_INFO_DATA); |
481 if (data == NULL) { 482 err = -EMSGSIZE; 483 goto err_cancel_link; 484 } | 541 if (data == NULL) 542 return -EMSGSIZE; |
485 err = ops->fill_info(skb, dev); 486 if (err < 0) 487 goto err_cancel_data; 488 nla_nest_end(skb, data); 489 } | 543 err = ops->fill_info(skb, dev); 544 if (err < 0) 545 goto err_cancel_data; 546 nla_nest_end(skb, data); 547 } |
490 491 nla_nest_end(skb, linkinfo); | |
492 return 0; 493 494err_cancel_data: 495 nla_nest_cancel(skb, data); | 548 return 0; 549 550err_cancel_data: 551 nla_nest_cancel(skb, data); |
552 return err; 553} 554 555static int rtnl_link_fill(struct sk_buff *skb, const struct net_device *dev) 556{ 557 struct nlattr *linkinfo; 558 int err = -EMSGSIZE; 559 560 linkinfo = nla_nest_start(skb, IFLA_LINKINFO); 561 if (linkinfo == NULL) 562 goto out; 563 564 err = rtnl_link_info_fill(skb, dev); 565 if (err < 0) 566 goto err_cancel_link; 567 568 err = rtnl_link_slave_info_fill(skb, dev); 569 if (err < 0) 570 goto err_cancel_link; 571 572 nla_nest_end(skb, linkinfo); 573 return 0; 574 |
|
496err_cancel_link: 497 nla_nest_cancel(skb, linkinfo); 498out: 499 return err; 500} 501 502int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned int group, int echo) 503{ --- 543 unchanged lines hidden (view full) --- 1047 nla_nest_end(skb, vf); 1048 } 1049 nla_nest_end(skb, vfinfo); 1050 } 1051 1052 if (rtnl_port_fill(skb, dev)) 1053 goto nla_put_failure; 1054 | 575err_cancel_link: 576 nla_nest_cancel(skb, linkinfo); 577out: 578 return err; 579} 580 581int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned int group, int echo) 582{ --- 543 unchanged lines hidden (view full) --- 1126 nla_nest_end(skb, vf); 1127 } 1128 nla_nest_end(skb, vfinfo); 1129 } 1130 1131 if (rtnl_port_fill(skb, dev)) 1132 goto nla_put_failure; 1133 |
1055 if (rtnl_bond_slave_fill(skb, dev)) 1056 goto nla_put_failure; 1057 1058 if (dev->rtnl_link_ops) { | 1134 if (dev->rtnl_link_ops || rtnl_have_link_slave_info(dev)) { |
1059 if (rtnl_link_fill(skb, dev) < 0) 1060 goto nla_put_failure; 1061 } 1062 1063 if (!(af_spec = nla_nest_start(skb, IFLA_AF_SPEC))) 1064 goto nla_put_failure; 1065 1066 list_for_each_entry(af_ops, &rtnl_af_ops, list) { --- 106 unchanged lines hidden (view full) --- 1173 [IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 }, 1174 [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_PORT_ID_LEN }, 1175}; 1176EXPORT_SYMBOL(ifla_policy); 1177 1178static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { 1179 [IFLA_INFO_KIND] = { .type = NLA_STRING }, 1180 [IFLA_INFO_DATA] = { .type = NLA_NESTED }, | 1135 if (rtnl_link_fill(skb, dev) < 0) 1136 goto nla_put_failure; 1137 } 1138 1139 if (!(af_spec = nla_nest_start(skb, IFLA_AF_SPEC))) 1140 goto nla_put_failure; 1141 1142 list_for_each_entry(af_ops, &rtnl_af_ops, list) { --- 106 unchanged lines hidden (view full) --- 1249 [IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 }, 1250 [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_PORT_ID_LEN }, 1251}; 1252EXPORT_SYMBOL(ifla_policy); 1253 1254static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { 1255 [IFLA_INFO_KIND] = { .type = NLA_STRING }, 1256 [IFLA_INFO_DATA] = { .type = NLA_NESTED }, |
1257 [IFLA_INFO_SLAVE_KIND] = { .type = NLA_STRING }, 1258 [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED }, |
|
1181}; 1182 1183static const struct nla_policy ifla_vfinfo_policy[IFLA_VF_INFO_MAX+1] = { 1184 [IFLA_VF_INFO] = { .type = NLA_NESTED }, 1185}; 1186 1187static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { 1188 [IFLA_VF_MAC] = { .type = NLA_BINARY, --- 571 unchanged lines hidden (view full) --- 1760 1761 return 0; 1762} 1763 1764static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh) 1765{ 1766 struct net *net = sock_net(skb->sk); 1767 const struct rtnl_link_ops *ops; | 1259}; 1260 1261static const struct nla_policy ifla_vfinfo_policy[IFLA_VF_INFO_MAX+1] = { 1262 [IFLA_VF_INFO] = { .type = NLA_NESTED }, 1263}; 1264 1265static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { 1266 [IFLA_VF_MAC] = { .type = NLA_BINARY, --- 571 unchanged lines hidden (view full) --- 1838 1839 return 0; 1840} 1841 1842static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh) 1843{ 1844 struct net *net = sock_net(skb->sk); 1845 const struct rtnl_link_ops *ops; |
1846 const struct rtnl_link_ops *m_ops = NULL; |
|
1768 struct net_device *dev; | 1847 struct net_device *dev; |
1848 struct net_device *master_dev = NULL; |
|
1769 struct ifinfomsg *ifm; 1770 char kind[MODULE_NAME_LEN]; 1771 char ifname[IFNAMSIZ]; 1772 struct nlattr *tb[IFLA_MAX+1]; 1773 struct nlattr *linkinfo[IFLA_INFO_MAX+1]; 1774 int err; 1775 1776#ifdef CONFIG_MODULES --- 13 unchanged lines hidden (view full) --- 1790 dev = __dev_get_by_index(net, ifm->ifi_index); 1791 else { 1792 if (ifname[0]) 1793 dev = __dev_get_by_name(net, ifname); 1794 else 1795 dev = NULL; 1796 } 1797 | 1849 struct ifinfomsg *ifm; 1850 char kind[MODULE_NAME_LEN]; 1851 char ifname[IFNAMSIZ]; 1852 struct nlattr *tb[IFLA_MAX+1]; 1853 struct nlattr *linkinfo[IFLA_INFO_MAX+1]; 1854 int err; 1855 1856#ifdef CONFIG_MODULES --- 13 unchanged lines hidden (view full) --- 1870 dev = __dev_get_by_index(net, ifm->ifi_index); 1871 else { 1872 if (ifname[0]) 1873 dev = __dev_get_by_name(net, ifname); 1874 else 1875 dev = NULL; 1876 } 1877 |
1878 if (dev) { 1879 master_dev = netdev_master_upper_dev_get(dev); 1880 if (master_dev) 1881 m_ops = master_dev->rtnl_link_ops; 1882 } 1883 |
|
1798 err = validate_linkmsg(dev, tb); 1799 if (err < 0) 1800 return err; 1801 1802 if (tb[IFLA_LINKINFO]) { 1803 err = nla_parse_nested(linkinfo, IFLA_INFO_MAX, 1804 tb[IFLA_LINKINFO], ifla_info_policy); 1805 if (err < 0) --- 5 unchanged lines hidden (view full) --- 1811 nla_strlcpy(kind, linkinfo[IFLA_INFO_KIND], sizeof(kind)); 1812 ops = rtnl_link_ops_get(kind); 1813 } else { 1814 kind[0] = '\0'; 1815 ops = NULL; 1816 } 1817 1818 if (1) { | 1884 err = validate_linkmsg(dev, tb); 1885 if (err < 0) 1886 return err; 1887 1888 if (tb[IFLA_LINKINFO]) { 1889 err = nla_parse_nested(linkinfo, IFLA_INFO_MAX, 1890 tb[IFLA_LINKINFO], ifla_info_policy); 1891 if (err < 0) --- 5 unchanged lines hidden (view full) --- 1897 nla_strlcpy(kind, linkinfo[IFLA_INFO_KIND], sizeof(kind)); 1898 ops = rtnl_link_ops_get(kind); 1899 } else { 1900 kind[0] = '\0'; 1901 ops = NULL; 1902 } 1903 1904 if (1) { |
1819 struct nlattr *attr[ops ? ops->maxtype + 1 : 0], **data = NULL; | 1905 struct nlattr *attr[ops ? ops->maxtype + 1 : 0]; 1906 struct nlattr *slave_attr[m_ops ? m_ops->slave_maxtype + 1 : 0]; 1907 struct nlattr **data = NULL; 1908 struct nlattr **slave_data = NULL; |
1820 struct net *dest_net; 1821 1822 if (ops) { 1823 if (ops->maxtype && linkinfo[IFLA_INFO_DATA]) { 1824 err = nla_parse_nested(attr, ops->maxtype, 1825 linkinfo[IFLA_INFO_DATA], 1826 ops->policy); 1827 if (err < 0) 1828 return err; 1829 data = attr; 1830 } 1831 if (ops->validate) { 1832 err = ops->validate(tb, data); 1833 if (err < 0) 1834 return err; 1835 } 1836 } 1837 | 1909 struct net *dest_net; 1910 1911 if (ops) { 1912 if (ops->maxtype && linkinfo[IFLA_INFO_DATA]) { 1913 err = nla_parse_nested(attr, ops->maxtype, 1914 linkinfo[IFLA_INFO_DATA], 1915 ops->policy); 1916 if (err < 0) 1917 return err; 1918 data = attr; 1919 } 1920 if (ops->validate) { 1921 err = ops->validate(tb, data); 1922 if (err < 0) 1923 return err; 1924 } 1925 } 1926 |
1927 if (m_ops) { 1928 if (m_ops->slave_maxtype && 1929 linkinfo[IFLA_INFO_SLAVE_DATA]) { 1930 err = nla_parse_nested(slave_attr, 1931 m_ops->slave_maxtype, 1932 linkinfo[IFLA_INFO_SLAVE_DATA], 1933 m_ops->slave_policy); 1934 if (err < 0) 1935 return err; 1936 slave_data = slave_attr; 1937 } 1938 if (m_ops->slave_validate) { 1939 err = m_ops->slave_validate(tb, slave_data); 1940 if (err < 0) 1941 return err; 1942 } 1943 } 1944 |
|
1838 if (dev) { 1839 int modified = 0; 1840 1841 if (nlh->nlmsg_flags & NLM_F_EXCL) 1842 return -EEXIST; 1843 if (nlh->nlmsg_flags & NLM_F_REPLACE) 1844 return -EOPNOTSUPP; 1845 1846 if (linkinfo[IFLA_INFO_DATA]) { 1847 if (!ops || ops != dev->rtnl_link_ops || 1848 !ops->changelink) 1849 return -EOPNOTSUPP; 1850 1851 err = ops->changelink(dev, tb, data); 1852 if (err < 0) 1853 return err; 1854 modified = 1; 1855 } 1856 | 1945 if (dev) { 1946 int modified = 0; 1947 1948 if (nlh->nlmsg_flags & NLM_F_EXCL) 1949 return -EEXIST; 1950 if (nlh->nlmsg_flags & NLM_F_REPLACE) 1951 return -EOPNOTSUPP; 1952 1953 if (linkinfo[IFLA_INFO_DATA]) { 1954 if (!ops || ops != dev->rtnl_link_ops || 1955 !ops->changelink) 1956 return -EOPNOTSUPP; 1957 1958 err = ops->changelink(dev, tb, data); 1959 if (err < 0) 1960 return err; 1961 modified = 1; 1962 } 1963 |
1964 if (linkinfo[IFLA_INFO_SLAVE_DATA]) { 1965 if (!m_ops || !m_ops->slave_changelink) 1966 return -EOPNOTSUPP; 1967 1968 err = m_ops->slave_changelink(master_dev, dev, 1969 tb, slave_data); 1970 if (err < 0) 1971 return err; 1972 modified = 1; 1973 } 1974 |
|
1857 return do_setlink(dev, ifm, tb, ifname, modified); 1858 } 1859 1860 if (!(nlh->nlmsg_flags & NLM_F_CREATE)) { 1861 if (ifm->ifi_index == 0 && tb[IFLA_GROUP]) 1862 return rtnl_group_changelink(net, 1863 nla_get_u32(tb[IFLA_GROUP]), 1864 ifm, tb); --- 955 unchanged lines hidden --- | 1975 return do_setlink(dev, ifm, tb, ifname, modified); 1976 } 1977 1978 if (!(nlh->nlmsg_flags & NLM_F_CREATE)) { 1979 if (ifm->ifi_index == 0 && tb[IFLA_GROUP]) 1980 return rtnl_group_changelink(net, 1981 nla_get_u32(tb[IFLA_GROUP]), 1982 ifm, tb); --- 955 unchanged lines hidden --- |