rtnetlink.c (650c919798c71fb34b77a6f2ba03a06907f06a76) | rtnetlink.c (c3a8d9474684d391b0afc3970d9b249add15ec07) |
---|---|
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> --- 664 unchanged lines hidden (view full) --- 673 if (i == RTAX_CC_ALGO - 1) { 674 char tmp[TCP_CA_NAME_MAX], *name; 675 676 name = tcp_ca_get_name_by_key(metrics[i], tmp); 677 if (!name) 678 continue; 679 if (nla_put_string(skb, i + 1, name)) 680 goto nla_put_failure; | 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> --- 664 unchanged lines hidden (view full) --- 673 if (i == RTAX_CC_ALGO - 1) { 674 char tmp[TCP_CA_NAME_MAX], *name; 675 676 name = tcp_ca_get_name_by_key(metrics[i], tmp); 677 if (!name) 678 continue; 679 if (nla_put_string(skb, i + 1, name)) 680 goto nla_put_failure; |
681 } else if (i == RTAX_FEATURES - 1) { 682 u32 user_features = metrics[i] & RTAX_FEATURE_MASK; 683 684 BUILD_BUG_ON(RTAX_FEATURE_MASK & DST_FEATURE_MASK); 685 if (nla_put_u32(skb, i + 1, user_features)) 686 goto nla_put_failure; |
|
681 } else { 682 if (nla_put_u32(skb, i + 1, metrics[i])) 683 goto nla_put_failure; 684 } 685 valid++; 686 } 687 } 688 --- 202 unchanged lines hidden (view full) --- 891 + nla_total_size(4) /* IFLA_LINK_NETNSID */ 892 + nla_total_size(ext_filter_mask 893 & RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */ 894 + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ 895 + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ 896 + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ 897 + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ 898 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ | 687 } else { 688 if (nla_put_u32(skb, i + 1, metrics[i])) 689 goto nla_put_failure; 690 } 691 valid++; 692 } 693 } 694 --- 202 unchanged lines hidden (view full) --- 897 + nla_total_size(4) /* IFLA_LINK_NETNSID */ 898 + nla_total_size(ext_filter_mask 899 & RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */ 900 + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ 901 + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ 902 + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ 903 + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ 904 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ |
899 + nla_total_size(MAX_PHYS_ITEM_ID_LEN); /* IFLA_PHYS_SWITCH_ID */ | 905 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */ 906 + nla_total_size(1); /* IFLA_PROTO_DOWN */ 907 |
900} 901 902static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev) 903{ 904 struct nlattr *vf_ports; 905 struct nlattr *vf_port; 906 int vf; 907 int err; --- 169 unchanged lines hidden (view full) --- 1077 (upper_dev && 1078 nla_put_u32(skb, IFLA_MASTER, upper_dev->ifindex)) || 1079 nla_put_u8(skb, IFLA_CARRIER, netif_carrier_ok(dev)) || 1080 (dev->qdisc && 1081 nla_put_string(skb, IFLA_QDISC, dev->qdisc->ops->id)) || 1082 (dev->ifalias && 1083 nla_put_string(skb, IFLA_IFALIAS, dev->ifalias)) || 1084 nla_put_u32(skb, IFLA_CARRIER_CHANGES, | 908} 909 910static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev) 911{ 912 struct nlattr *vf_ports; 913 struct nlattr *vf_port; 914 int vf; 915 int err; --- 169 unchanged lines hidden (view full) --- 1085 (upper_dev && 1086 nla_put_u32(skb, IFLA_MASTER, upper_dev->ifindex)) || 1087 nla_put_u8(skb, IFLA_CARRIER, netif_carrier_ok(dev)) || 1088 (dev->qdisc && 1089 nla_put_string(skb, IFLA_QDISC, dev->qdisc->ops->id)) || 1090 (dev->ifalias && 1091 nla_put_string(skb, IFLA_IFALIAS, dev->ifalias)) || 1092 nla_put_u32(skb, IFLA_CARRIER_CHANGES, |
1085 atomic_read(&dev->carrier_changes))) | 1093 atomic_read(&dev->carrier_changes)) || 1094 nla_put_u8(skb, IFLA_PROTO_DOWN, dev->proto_down)) |
1086 goto nla_put_failure; 1087 1088 if (1) { 1089 struct rtnl_link_ifmap map = { 1090 .mem_start = dev->mem_start, 1091 .mem_end = dev->mem_end, 1092 .base_addr = dev->base_addr, 1093 .irq = dev->irq, --- 220 unchanged lines hidden (view full) --- 1314 [IFLA_EXT_MASK] = { .type = NLA_U32 }, 1315 [IFLA_PROMISCUITY] = { .type = NLA_U32 }, 1316 [IFLA_NUM_TX_QUEUES] = { .type = NLA_U32 }, 1317 [IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 }, 1318 [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN }, 1319 [IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, /* ignored */ 1320 [IFLA_PHYS_SWITCH_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN }, 1321 [IFLA_LINK_NETNSID] = { .type = NLA_S32 }, | 1095 goto nla_put_failure; 1096 1097 if (1) { 1098 struct rtnl_link_ifmap map = { 1099 .mem_start = dev->mem_start, 1100 .mem_end = dev->mem_end, 1101 .base_addr = dev->base_addr, 1102 .irq = dev->irq, --- 220 unchanged lines hidden (view full) --- 1323 [IFLA_EXT_MASK] = { .type = NLA_U32 }, 1324 [IFLA_PROMISCUITY] = { .type = NLA_U32 }, 1325 [IFLA_NUM_TX_QUEUES] = { .type = NLA_U32 }, 1326 [IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 }, 1327 [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN }, 1328 [IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, /* ignored */ 1329 [IFLA_PHYS_SWITCH_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN }, 1330 [IFLA_LINK_NETNSID] = { .type = NLA_S32 }, |
1331 [IFLA_PROTO_DOWN] = { .type = NLA_U8 }, |
|
1322}; 1323 1324static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { 1325 [IFLA_INFO_KIND] = { .type = NLA_STRING }, 1326 [IFLA_INFO_DATA] = { .type = NLA_NESTED }, 1327 [IFLA_INFO_SLAVE_KIND] = { .type = NLA_STRING }, 1328 [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED }, 1329}; --- 526 unchanged lines hidden (view full) --- 1856 if (err < 0) 1857 goto errout; 1858 1859 status |= DO_SETLINK_NOTIFY; 1860 } 1861 } 1862 err = 0; 1863 | 1332}; 1333 1334static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { 1335 [IFLA_INFO_KIND] = { .type = NLA_STRING }, 1336 [IFLA_INFO_DATA] = { .type = NLA_NESTED }, 1337 [IFLA_INFO_SLAVE_KIND] = { .type = NLA_STRING }, 1338 [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED }, 1339}; --- 526 unchanged lines hidden (view full) --- 1866 if (err < 0) 1867 goto errout; 1868 1869 status |= DO_SETLINK_NOTIFY; 1870 } 1871 } 1872 err = 0; 1873 |
1874 if (tb[IFLA_PROTO_DOWN]) { 1875 err = dev_change_proto_down(dev, 1876 nla_get_u8(tb[IFLA_PROTO_DOWN])); 1877 if (err) 1878 goto errout; 1879 status |= DO_SETLINK_NOTIFY; 1880 } 1881 |
|
1864errout: 1865 if (status & DO_SETLINK_MODIFIED) { 1866 if (status & DO_SETLINK_NOTIFY) 1867 netdev_state_change(dev); 1868 1869 if (err < 0) 1870 net_warn_ratelimited("A link change request failed with some changes committed already. Interface %s may have been left with an inconsistent configuration, please check.\n", 1871 dev->name); --- 74 unchanged lines hidden (view full) --- 1946 ops->dellink(dev, &list_kill); 1947 } 1948 } 1949 unregister_netdevice_many(&list_kill); 1950 1951 return 0; 1952} 1953 | 1882errout: 1883 if (status & DO_SETLINK_MODIFIED) { 1884 if (status & DO_SETLINK_NOTIFY) 1885 netdev_state_change(dev); 1886 1887 if (err < 0) 1888 net_warn_ratelimited("A link change request failed with some changes committed already. Interface %s may have been left with an inconsistent configuration, please check.\n", 1889 dev->name); --- 74 unchanged lines hidden (view full) --- 1964 ops->dellink(dev, &list_kill); 1965 } 1966 } 1967 unregister_netdevice_many(&list_kill); 1968 1969 return 0; 1970} 1971 |
1972int rtnl_delete_link(struct net_device *dev) 1973{ 1974 const struct rtnl_link_ops *ops; 1975 LIST_HEAD(list_kill); 1976 1977 ops = dev->rtnl_link_ops; 1978 if (!ops || !ops->dellink) 1979 return -EOPNOTSUPP; 1980 1981 ops->dellink(dev, &list_kill); 1982 unregister_netdevice_many(&list_kill); 1983 1984 return 0; 1985} 1986EXPORT_SYMBOL_GPL(rtnl_delete_link); 1987 |
|
1954static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh) 1955{ 1956 struct net *net = sock_net(skb->sk); | 1988static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh) 1989{ 1990 struct net *net = sock_net(skb->sk); |
1957 const struct rtnl_link_ops *ops; | |
1958 struct net_device *dev; 1959 struct ifinfomsg *ifm; 1960 char ifname[IFNAMSIZ]; 1961 struct nlattr *tb[IFLA_MAX+1]; 1962 int err; | 1991 struct net_device *dev; 1992 struct ifinfomsg *ifm; 1993 char ifname[IFNAMSIZ]; 1994 struct nlattr *tb[IFLA_MAX+1]; 1995 int err; |
1963 LIST_HEAD(list_kill); | |
1964 1965 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy); 1966 if (err < 0) 1967 return err; 1968 1969 if (tb[IFLA_IFNAME]) 1970 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 1971 --- 5 unchanged lines hidden (view full) --- 1977 else if (tb[IFLA_GROUP]) 1978 return rtnl_group_dellink(net, nla_get_u32(tb[IFLA_GROUP])); 1979 else 1980 return -EINVAL; 1981 1982 if (!dev) 1983 return -ENODEV; 1984 | 1996 1997 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy); 1998 if (err < 0) 1999 return err; 2000 2001 if (tb[IFLA_IFNAME]) 2002 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 2003 --- 5 unchanged lines hidden (view full) --- 2009 else if (tb[IFLA_GROUP]) 2010 return rtnl_group_dellink(net, nla_get_u32(tb[IFLA_GROUP])); 2011 else 2012 return -EINVAL; 2013 2014 if (!dev) 2015 return -ENODEV; 2016 |
1985 ops = dev->rtnl_link_ops; 1986 if (!ops || !ops->dellink) 1987 return -EOPNOTSUPP; 1988 1989 ops->dellink(dev, &list_kill); 1990 unregister_netdevice_many(&list_kill); 1991 return 0; | 2017 return rtnl_delete_link(dev); |
1992} 1993 1994int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm) 1995{ 1996 unsigned int old_flags; 1997 int err; 1998 1999 old_flags = dev->flags; --- 1415 unchanged lines hidden --- | 2018} 2019 2020int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm) 2021{ 2022 unsigned int old_flags; 2023 int err; 2024 2025 old_flags = dev->flags; --- 1415 unchanged lines hidden --- |