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