rtnetlink.c (6aeedba20e82150757f2dd5b896f0e09491a987c) rtnetlink.c (91f3e7b17412d42e933949a9c297072b13a04d41)
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>

--- 501 unchanged lines hidden (view full) ---

510err_cancel_data:
511 nla_nest_cancel(skb, data);
512err_cancel_link:
513 nla_nest_cancel(skb, linkinfo);
514out:
515 return err;
516}
517
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>

--- 501 unchanged lines hidden (view full) ---

510err_cancel_data:
511 nla_nest_cancel(skb, data);
512err_cancel_link:
513 nla_nest_cancel(skb, linkinfo);
514out:
515 return err;
516}
517
518static const int rtm_min[RTM_NR_FAMILIES] =
519{
520 [RTM_FAM(RTM_NEWLINK)] = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
521 [RTM_FAM(RTM_NEWADDR)] = NLMSG_LENGTH(sizeof(struct ifaddrmsg)),
522 [RTM_FAM(RTM_NEWROUTE)] = NLMSG_LENGTH(sizeof(struct rtmsg)),
523 [RTM_FAM(RTM_NEWRULE)] = NLMSG_LENGTH(sizeof(struct fib_rule_hdr)),
524 [RTM_FAM(RTM_NEWQDISC)] = NLMSG_LENGTH(sizeof(struct tcmsg)),
525 [RTM_FAM(RTM_NEWTCLASS)] = NLMSG_LENGTH(sizeof(struct tcmsg)),
526 [RTM_FAM(RTM_NEWTFILTER)] = NLMSG_LENGTH(sizeof(struct tcmsg)),
527 [RTM_FAM(RTM_NEWACTION)] = NLMSG_LENGTH(sizeof(struct tcamsg)),
528 [RTM_FAM(RTM_GETMULTICAST)] = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
529 [RTM_FAM(RTM_GETANYCAST)] = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
530};
531
532static const int rta_max[RTM_NR_FAMILIES] =
533{
534 [RTM_FAM(RTM_NEWLINK)] = IFLA_MAX,
535 [RTM_FAM(RTM_NEWADDR)] = IFA_MAX,
536 [RTM_FAM(RTM_NEWROUTE)] = RTA_MAX,
537 [RTM_FAM(RTM_NEWRULE)] = FRA_MAX,
538 [RTM_FAM(RTM_NEWQDISC)] = TCA_MAX,
539 [RTM_FAM(RTM_NEWTCLASS)] = TCA_MAX,
540 [RTM_FAM(RTM_NEWTFILTER)] = TCA_MAX,
541 [RTM_FAM(RTM_NEWACTION)] = TCAA_MAX,
542};
543
544int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned int group, int echo)
545{
546 struct sock *rtnl = net->rtnl;
547 int err = 0;
548
549 NETLINK_CB(skb).dst_group = group;
550 if (echo)
551 atomic_inc(&skb->users);

--- 422 unchanged lines hidden (view full) ---

974
975 /*
976 * Not all SR-IOV capable drivers support the
977 * spoofcheck query. Preset to -1 so the user
978 * space tool can detect that the driver didn't
979 * report anything.
980 */
981 ivi.spoofchk = -1;
518int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned int group, int echo)
519{
520 struct sock *rtnl = net->rtnl;
521 int err = 0;
522
523 NETLINK_CB(skb).dst_group = group;
524 if (echo)
525 atomic_inc(&skb->users);

--- 422 unchanged lines hidden (view full) ---

948
949 /*
950 * Not all SR-IOV capable drivers support the
951 * spoofcheck query. Preset to -1 so the user
952 * space tool can detect that the driver didn't
953 * report anything.
954 */
955 ivi.spoofchk = -1;
956 memset(ivi.mac, 0, sizeof(ivi.mac));
982 if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi))
983 break;
984 vf_mac.vf =
985 vf_vlan.vf =
986 vf_tx_rate.vf =
987 vf_spoofchk.vf = ivi.vf;
988
989 memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac));

--- 541 unchanged lines hidden (view full) ---

1531errout:
1532 if (err < 0 && modified)
1533 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",
1534 dev->name);
1535
1536 return err;
1537}
1538
957 if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi))
958 break;
959 vf_mac.vf =
960 vf_vlan.vf =
961 vf_tx_rate.vf =
962 vf_spoofchk.vf = ivi.vf;
963
964 memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac));

--- 541 unchanged lines hidden (view full) ---

1506errout:
1507 if (err < 0 && modified)
1508 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",
1509 dev->name);
1510
1511 return err;
1512}
1513
1539static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1514static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh)
1540{
1541 struct net *net = sock_net(skb->sk);
1542 struct ifinfomsg *ifm;
1543 struct net_device *dev;
1544 int err;
1545 struct nlattr *tb[IFLA_MAX+1];
1546 char ifname[IFNAMSIZ];
1547

--- 24 unchanged lines hidden (view full) ---

1572 if (err < 0)
1573 goto errout;
1574
1575 err = do_setlink(dev, ifm, tb, ifname, 0);
1576errout:
1577 return err;
1578}
1579
1515{
1516 struct net *net = sock_net(skb->sk);
1517 struct ifinfomsg *ifm;
1518 struct net_device *dev;
1519 int err;
1520 struct nlattr *tb[IFLA_MAX+1];
1521 char ifname[IFNAMSIZ];
1522

--- 24 unchanged lines hidden (view full) ---

1547 if (err < 0)
1548 goto errout;
1549
1550 err = do_setlink(dev, ifm, tb, ifname, 0);
1551errout:
1552 return err;
1553}
1554
1580static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1555static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh)
1581{
1582 struct net *net = sock_net(skb->sk);
1583 const struct rtnl_link_ops *ops;
1584 struct net_device *dev;
1585 struct ifinfomsg *ifm;
1586 char ifname[IFNAMSIZ];
1587 struct nlattr *tb[IFLA_MAX+1];
1588 int err;

--- 114 unchanged lines hidden (view full) ---

1703 if (err < 0)
1704 return err;
1705 }
1706 }
1707
1708 return 0;
1709}
1710
1556{
1557 struct net *net = sock_net(skb->sk);
1558 const struct rtnl_link_ops *ops;
1559 struct net_device *dev;
1560 struct ifinfomsg *ifm;
1561 char ifname[IFNAMSIZ];
1562 struct nlattr *tb[IFLA_MAX+1];
1563 int err;

--- 114 unchanged lines hidden (view full) ---

1678 if (err < 0)
1679 return err;
1680 }
1681 }
1682
1683 return 0;
1684}
1685
1711static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1686static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh)
1712{
1713 struct net *net = sock_net(skb->sk);
1714 const struct rtnl_link_ops *ops;
1715 struct net_device *dev;
1716 struct ifinfomsg *ifm;
1717 char kind[MODULE_NAME_LEN];
1718 char ifname[IFNAMSIZ];
1719 struct nlattr *tb[IFLA_MAX+1];

--- 138 unchanged lines hidden (view full) ---

1858 if (err < 0)
1859 unregister_netdevice(dev);
1860out:
1861 put_net(dest_net);
1862 return err;
1863 }
1864}
1865
1687{
1688 struct net *net = sock_net(skb->sk);
1689 const struct rtnl_link_ops *ops;
1690 struct net_device *dev;
1691 struct ifinfomsg *ifm;
1692 char kind[MODULE_NAME_LEN];
1693 char ifname[IFNAMSIZ];
1694 struct nlattr *tb[IFLA_MAX+1];

--- 138 unchanged lines hidden (view full) ---

1833 if (err < 0)
1834 unregister_netdevice(dev);
1835out:
1836 put_net(dest_net);
1837 return err;
1838 }
1839}
1840
1866static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
1841static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh)
1867{
1868 struct net *net = sock_net(skb->sk);
1869 struct ifinfomsg *ifm;
1870 char ifname[IFNAMSIZ];
1871 struct nlattr *tb[IFLA_MAX+1];
1872 struct net_device *dev = NULL;
1873 struct sk_buff *nskb;
1874 int err;

--- 74 unchanged lines hidden (view full) ---

1949 s_idx = 1;
1950 for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) {
1951 int type = cb->nlh->nlmsg_type-RTM_BASE;
1952 if (idx < s_idx || idx == PF_PACKET)
1953 continue;
1954 if (rtnl_msg_handlers[idx] == NULL ||
1955 rtnl_msg_handlers[idx][type].dumpit == NULL)
1956 continue;
1842{
1843 struct net *net = sock_net(skb->sk);
1844 struct ifinfomsg *ifm;
1845 char ifname[IFNAMSIZ];
1846 struct nlattr *tb[IFLA_MAX+1];
1847 struct net_device *dev = NULL;
1848 struct sk_buff *nskb;
1849 int err;

--- 74 unchanged lines hidden (view full) ---

1924 s_idx = 1;
1925 for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) {
1926 int type = cb->nlh->nlmsg_type-RTM_BASE;
1927 if (idx < s_idx || idx == PF_PACKET)
1928 continue;
1929 if (rtnl_msg_handlers[idx] == NULL ||
1930 rtnl_msg_handlers[idx][type].dumpit == NULL)
1931 continue;
1957 if (idx > s_idx)
1932 if (idx > s_idx) {
1958 memset(&cb->args[0], 0, sizeof(cb->args));
1933 memset(&cb->args[0], 0, sizeof(cb->args));
1934 cb->prev_seq = 0;
1935 cb->seq = 0;
1936 }
1959 if (rtnl_msg_handlers[idx][type].dumpit(skb, cb))
1960 break;
1961 }
1962 cb->family = idx;
1963
1964 return skb->len;
1965}
1966

--- 76 unchanged lines hidden (view full) ---

2043 }
2044
2045 rtnl_notify(skb, net, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC);
2046 return;
2047errout:
2048 rtnl_set_sk_err(net, RTNLGRP_NEIGH, err);
2049}
2050
1937 if (rtnl_msg_handlers[idx][type].dumpit(skb, cb))
1938 break;
1939 }
1940 cb->family = idx;
1941
1942 return skb->len;
1943}
1944

--- 76 unchanged lines hidden (view full) ---

2021 }
2022
2023 rtnl_notify(skb, net, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC);
2024 return;
2025errout:
2026 rtnl_set_sk_err(net, RTNLGRP_NEIGH, err);
2027}
2028
2051static int rtnl_fdb_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
2029/**
2030 * ndo_dflt_fdb_add - default netdevice operation to add an FDB entry
2031 */
2032int ndo_dflt_fdb_add(struct ndmsg *ndm,
2033 struct nlattr *tb[],
2034 struct net_device *dev,
2035 const unsigned char *addr,
2036 u16 flags)
2052{
2037{
2038 int err = -EINVAL;
2039
2040 /* If aging addresses are supported device will need to
2041 * implement its own handler for this.
2042 */
2043 if (ndm->ndm_state && !(ndm->ndm_state & NUD_PERMANENT)) {
2044 pr_info("%s: FDB only supports static addresses\n", dev->name);
2045 return err;
2046 }
2047
2048 if (is_unicast_ether_addr(addr) || is_link_local_ether_addr(addr))
2049 err = dev_uc_add_excl(dev, addr);
2050 else if (is_multicast_ether_addr(addr))
2051 err = dev_mc_add_excl(dev, addr);
2052
2053 /* Only return duplicate errors if NLM_F_EXCL is set */
2054 if (err == -EEXIST && !(flags & NLM_F_EXCL))
2055 err = 0;
2056
2057 return err;
2058}
2059EXPORT_SYMBOL(ndo_dflt_fdb_add);
2060
2061static int rtnl_fdb_add(struct sk_buff *skb, struct nlmsghdr *nlh)
2062{
2053 struct net *net = sock_net(skb->sk);
2054 struct ndmsg *ndm;
2055 struct nlattr *tb[NDA_MAX+1];
2056 struct net_device *dev;
2057 u8 *addr;
2058 int err;
2059
2060 err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, NULL);

--- 13 unchanged lines hidden (view full) ---

2074 }
2075
2076 if (!tb[NDA_LLADDR] || nla_len(tb[NDA_LLADDR]) != ETH_ALEN) {
2077 pr_info("PF_BRIDGE: RTM_NEWNEIGH with invalid address\n");
2078 return -EINVAL;
2079 }
2080
2081 addr = nla_data(tb[NDA_LLADDR]);
2063 struct net *net = sock_net(skb->sk);
2064 struct ndmsg *ndm;
2065 struct nlattr *tb[NDA_MAX+1];
2066 struct net_device *dev;
2067 u8 *addr;
2068 int err;
2069
2070 err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, NULL);

--- 13 unchanged lines hidden (view full) ---

2084 }
2085
2086 if (!tb[NDA_LLADDR] || nla_len(tb[NDA_LLADDR]) != ETH_ALEN) {
2087 pr_info("PF_BRIDGE: RTM_NEWNEIGH with invalid address\n");
2088 return -EINVAL;
2089 }
2090
2091 addr = nla_data(tb[NDA_LLADDR]);
2082 if (!is_valid_ether_addr(addr)) {
2092 if (is_zero_ether_addr(addr)) {
2083 pr_info("PF_BRIDGE: RTM_NEWNEIGH with invalid ether address\n");
2084 return -EINVAL;
2085 }
2086
2087 err = -EOPNOTSUPP;
2088
2089 /* Support fdb on master device the net/bridge default case */
2090 if ((!ndm->ndm_flags || ndm->ndm_flags & NTF_MASTER) &&

--- 4 unchanged lines hidden (view full) ---

2095 err = ops->ndo_fdb_add(ndm, tb, dev, addr, nlh->nlmsg_flags);
2096 if (err)
2097 goto out;
2098 else
2099 ndm->ndm_flags &= ~NTF_MASTER;
2100 }
2101
2102 /* Embedded bridge, macvlan, and any other device support */
2093 pr_info("PF_BRIDGE: RTM_NEWNEIGH with invalid ether address\n");
2094 return -EINVAL;
2095 }
2096
2097 err = -EOPNOTSUPP;
2098
2099 /* Support fdb on master device the net/bridge default case */
2100 if ((!ndm->ndm_flags || ndm->ndm_flags & NTF_MASTER) &&

--- 4 unchanged lines hidden (view full) ---

2105 err = ops->ndo_fdb_add(ndm, tb, dev, addr, nlh->nlmsg_flags);
2106 if (err)
2107 goto out;
2108 else
2109 ndm->ndm_flags &= ~NTF_MASTER;
2110 }
2111
2112 /* Embedded bridge, macvlan, and any other device support */
2103 if ((ndm->ndm_flags & NTF_SELF) && dev->netdev_ops->ndo_fdb_add) {
2104 err = dev->netdev_ops->ndo_fdb_add(ndm, tb,
2105 dev, addr,
2106 nlh->nlmsg_flags);
2113 if ((ndm->ndm_flags & NTF_SELF)) {
2114 if (dev->netdev_ops->ndo_fdb_add)
2115 err = dev->netdev_ops->ndo_fdb_add(ndm, tb, dev, addr,
2116 nlh->nlmsg_flags);
2117 else
2118 err = ndo_dflt_fdb_add(ndm, tb, dev, addr,
2119 nlh->nlmsg_flags);
2107
2108 if (!err) {
2109 rtnl_fdb_notify(dev, addr, RTM_NEWNEIGH);
2110 ndm->ndm_flags &= ~NTF_SELF;
2111 }
2112 }
2113out:
2114 return err;
2115}
2116
2120
2121 if (!err) {
2122 rtnl_fdb_notify(dev, addr, RTM_NEWNEIGH);
2123 ndm->ndm_flags &= ~NTF_SELF;
2124 }
2125 }
2126out:
2127 return err;
2128}
2129
2117static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
2130/**
2131 * ndo_dflt_fdb_del - default netdevice operation to delete an FDB entry
2132 */
2133int ndo_dflt_fdb_del(struct ndmsg *ndm,
2134 struct nlattr *tb[],
2135 struct net_device *dev,
2136 const unsigned char *addr)
2118{
2137{
2138 int err = -EOPNOTSUPP;
2139
2140 /* If aging addresses are supported device will need to
2141 * implement its own handler for this.
2142 */
2143 if (ndm->ndm_state & NUD_PERMANENT) {
2144 pr_info("%s: FDB only supports static addresses\n", dev->name);
2145 return -EINVAL;
2146 }
2147
2148 if (is_unicast_ether_addr(addr) || is_link_local_ether_addr(addr))
2149 err = dev_uc_del(dev, addr);
2150 else if (is_multicast_ether_addr(addr))
2151 err = dev_mc_del(dev, addr);
2152 else
2153 err = -EINVAL;
2154
2155 return err;
2156}
2157EXPORT_SYMBOL(ndo_dflt_fdb_del);
2158
2159static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh)
2160{
2119 struct net *net = sock_net(skb->sk);
2120 struct ndmsg *ndm;
2121 struct nlattr *tb[NDA_MAX+1];
2122 struct net_device *dev;
2123 int err = -EINVAL;
2124 __u8 *addr;
2125
2126 if (!capable(CAP_NET_ADMIN))

--- 39 unchanged lines hidden (view full) ---

2166
2167 if (err)
2168 goto out;
2169 else
2170 ndm->ndm_flags &= ~NTF_MASTER;
2171 }
2172
2173 /* Embedded bridge, macvlan, and any other device support */
2161 struct net *net = sock_net(skb->sk);
2162 struct ndmsg *ndm;
2163 struct nlattr *tb[NDA_MAX+1];
2164 struct net_device *dev;
2165 int err = -EINVAL;
2166 __u8 *addr;
2167
2168 if (!capable(CAP_NET_ADMIN))

--- 39 unchanged lines hidden (view full) ---

2208
2209 if (err)
2210 goto out;
2211 else
2212 ndm->ndm_flags &= ~NTF_MASTER;
2213 }
2214
2215 /* Embedded bridge, macvlan, and any other device support */
2174 if ((ndm->ndm_flags & NTF_SELF) && dev->netdev_ops->ndo_fdb_del) {
2175 err = dev->netdev_ops->ndo_fdb_del(ndm, tb, dev, addr);
2216 if (ndm->ndm_flags & NTF_SELF) {
2217 if (dev->netdev_ops->ndo_fdb_del)
2218 err = dev->netdev_ops->ndo_fdb_del(ndm, tb, dev, addr);
2219 else
2220 err = ndo_dflt_fdb_del(ndm, tb, dev, addr);
2176
2177 if (!err) {
2178 rtnl_fdb_notify(dev, addr, RTM_DELNEIGH);
2179 ndm->ndm_flags &= ~NTF_SELF;
2180 }
2181 }
2182out:
2183 return err;

--- 28 unchanged lines hidden (view full) ---

2212}
2213
2214/**
2215 * ndo_dflt_fdb_dump - default netdevice operation to dump an FDB table.
2216 * @nlh: netlink message header
2217 * @dev: netdevice
2218 *
2219 * Default netdevice operation to dump the existing unicast address list.
2221
2222 if (!err) {
2223 rtnl_fdb_notify(dev, addr, RTM_DELNEIGH);
2224 ndm->ndm_flags &= ~NTF_SELF;
2225 }
2226 }
2227out:
2228 return err;

--- 28 unchanged lines hidden (view full) ---

2257}
2258
2259/**
2260 * ndo_dflt_fdb_dump - default netdevice operation to dump an FDB table.
2261 * @nlh: netlink message header
2262 * @dev: netdevice
2263 *
2264 * Default netdevice operation to dump the existing unicast address list.
2220 * Returns zero on success.
2265 * Returns number of addresses from list put in skb.
2221 */
2222int ndo_dflt_fdb_dump(struct sk_buff *skb,
2223 struct netlink_callback *cb,
2224 struct net_device *dev,
2225 int idx)
2226{
2227 int err;
2228

--- 23 unchanged lines hidden (view full) ---

2252 br_dev = netdev_master_upper_dev_get(dev);
2253 ops = br_dev->netdev_ops;
2254 if (ops->ndo_fdb_dump)
2255 idx = ops->ndo_fdb_dump(skb, cb, dev, idx);
2256 }
2257
2258 if (dev->netdev_ops->ndo_fdb_dump)
2259 idx = dev->netdev_ops->ndo_fdb_dump(skb, cb, dev, idx);
2266 */
2267int ndo_dflt_fdb_dump(struct sk_buff *skb,
2268 struct netlink_callback *cb,
2269 struct net_device *dev,
2270 int idx)
2271{
2272 int err;
2273

--- 23 unchanged lines hidden (view full) ---

2297 br_dev = netdev_master_upper_dev_get(dev);
2298 ops = br_dev->netdev_ops;
2299 if (ops->ndo_fdb_dump)
2300 idx = ops->ndo_fdb_dump(skb, cb, dev, idx);
2301 }
2302
2303 if (dev->netdev_ops->ndo_fdb_dump)
2304 idx = dev->netdev_ops->ndo_fdb_dump(skb, cb, dev, idx);
2305 else
2306 idx = ndo_dflt_fdb_dump(skb, cb, dev, idx);
2260 }
2261 rcu_read_unlock();
2262
2263 cb->args[0] = idx;
2264 return skb->len;
2265}
2266
2267int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,

--- 135 unchanged lines hidden (view full) ---

2403 return 0;
2404errout:
2405 WARN_ON(err == -EMSGSIZE);
2406 kfree_skb(skb);
2407 rtnl_set_sk_err(net, RTNLGRP_LINK, err);
2408 return err;
2409}
2410
2307 }
2308 rcu_read_unlock();
2309
2310 cb->args[0] = idx;
2311 return skb->len;
2312}
2313
2314int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,

--- 135 unchanged lines hidden (view full) ---

2450 return 0;
2451errout:
2452 WARN_ON(err == -EMSGSIZE);
2453 kfree_skb(skb);
2454 rtnl_set_sk_err(net, RTNLGRP_LINK, err);
2455 return err;
2456}
2457
2411static int rtnl_bridge_setlink(struct sk_buff *skb, struct nlmsghdr *nlh,
2412 void *arg)
2458static int rtnl_bridge_setlink(struct sk_buff *skb, struct nlmsghdr *nlh)
2413{
2414 struct net *net = sock_net(skb->sk);
2415 struct ifinfomsg *ifm;
2416 struct net_device *dev;
2417 struct nlattr *br_spec, *attr = NULL;
2418 int rem, err = -EOPNOTSUPP;
2419 u16 oflags, flags = 0;
2420 bool have_flags = false;

--- 53 unchanged lines hidden (view full) ---

2474 memcpy(nla_data(attr), &flags, sizeof(flags));
2475 /* Generate event to notify upper layer of bridge change */
2476 if (!err)
2477 err = rtnl_bridge_notify(dev, oflags);
2478out:
2479 return err;
2480}
2481
2459{
2460 struct net *net = sock_net(skb->sk);
2461 struct ifinfomsg *ifm;
2462 struct net_device *dev;
2463 struct nlattr *br_spec, *attr = NULL;
2464 int rem, err = -EOPNOTSUPP;
2465 u16 oflags, flags = 0;
2466 bool have_flags = false;

--- 53 unchanged lines hidden (view full) ---

2520 memcpy(nla_data(attr), &flags, sizeof(flags));
2521 /* Generate event to notify upper layer of bridge change */
2522 if (!err)
2523 err = rtnl_bridge_notify(dev, oflags);
2524out:
2525 return err;
2526}
2527
2482static int rtnl_bridge_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
2483 void *arg)
2528static int rtnl_bridge_dellink(struct sk_buff *skb, struct nlmsghdr *nlh)
2484{
2485 struct net *net = sock_net(skb->sk);
2486 struct ifinfomsg *ifm;
2487 struct net_device *dev;
2488 struct nlattr *br_spec, *attr = NULL;
2489 int rem, err = -EOPNOTSUPP;
2490 u16 oflags, flags = 0;
2491 bool have_flags = false;

--- 53 unchanged lines hidden (view full) ---

2545 memcpy(nla_data(attr), &flags, sizeof(flags));
2546 /* Generate event to notify upper layer of bridge change */
2547 if (!err)
2548 err = rtnl_bridge_notify(dev, oflags);
2549out:
2550 return err;
2551}
2552
2529{
2530 struct net *net = sock_net(skb->sk);
2531 struct ifinfomsg *ifm;
2532 struct net_device *dev;
2533 struct nlattr *br_spec, *attr = NULL;
2534 int rem, err = -EOPNOTSUPP;
2535 u16 oflags, flags = 0;
2536 bool have_flags = false;

--- 53 unchanged lines hidden (view full) ---

2590 memcpy(nla_data(attr), &flags, sizeof(flags));
2591 /* Generate event to notify upper layer of bridge change */
2592 if (!err)
2593 err = rtnl_bridge_notify(dev, oflags);
2594out:
2595 return err;
2596}
2597
2553/* Protected by RTNL sempahore. */
2554static struct rtattr **rta_buf;
2555static int rtattr_max;
2556
2557/* Process one rtnetlink message. */
2558
2559static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
2560{
2561 struct net *net = sock_net(skb->sk);
2562 rtnl_doit_func doit;
2563 int sz_idx, kind;
2598/* Process one rtnetlink message. */
2599
2600static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
2601{
2602 struct net *net = sock_net(skb->sk);
2603 rtnl_doit_func doit;
2604 int sz_idx, kind;
2564 int min_len;
2565 int family;
2566 int type;
2567 int err;
2568
2569 type = nlh->nlmsg_type;
2570 if (type > RTM_MAX)
2571 return -EOPNOTSUPP;
2572
2573 type -= RTM_BASE;
2574
2575 /* All the messages must have at least 1 byte length */
2605 int family;
2606 int type;
2607 int err;
2608
2609 type = nlh->nlmsg_type;
2610 if (type > RTM_MAX)
2611 return -EOPNOTSUPP;
2612
2613 type -= RTM_BASE;
2614
2615 /* All the messages must have at least 1 byte length */
2576 if (nlh->nlmsg_len < NLMSG_LENGTH(sizeof(struct rtgenmsg)))
2616 if (nlmsg_len(nlh) < sizeof(struct rtgenmsg))
2577 return 0;
2578
2617 return 0;
2618
2579 family = ((struct rtgenmsg *)NLMSG_DATA(nlh))->rtgen_family;
2619 family = ((struct rtgenmsg *)nlmsg_data(nlh))->rtgen_family;
2580 sz_idx = type>>2;
2581 kind = type&3;
2582
2583 if (kind != 2 && !ns_capable(net->user_ns, CAP_NET_ADMIN))
2584 return -EPERM;
2585
2586 if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) {
2587 struct sock *rtnl;

--- 16 unchanged lines hidden (view full) ---

2604 .min_dump_alloc = min_dump_alloc,
2605 };
2606 err = netlink_dump_start(rtnl, skb, nlh, &c);
2607 }
2608 rtnl_lock();
2609 return err;
2610 }
2611
2620 sz_idx = type>>2;
2621 kind = type&3;
2622
2623 if (kind != 2 && !ns_capable(net->user_ns, CAP_NET_ADMIN))
2624 return -EPERM;
2625
2626 if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) {
2627 struct sock *rtnl;

--- 16 unchanged lines hidden (view full) ---

2644 .min_dump_alloc = min_dump_alloc,
2645 };
2646 err = netlink_dump_start(rtnl, skb, nlh, &c);
2647 }
2648 rtnl_lock();
2649 return err;
2650 }
2651
2612 memset(rta_buf, 0, (rtattr_max * sizeof(struct rtattr *)));
2613
2614 min_len = rtm_min[sz_idx];
2615 if (nlh->nlmsg_len < min_len)
2616 return -EINVAL;
2617
2618 if (nlh->nlmsg_len > min_len) {
2619 int attrlen = nlh->nlmsg_len - NLMSG_ALIGN(min_len);
2620 struct rtattr *attr = (void *)nlh + NLMSG_ALIGN(min_len);
2621
2622 while (RTA_OK(attr, attrlen)) {
2623 unsigned int flavor = attr->rta_type;
2624 if (flavor) {
2625 if (flavor > rta_max[sz_idx])
2626 return -EINVAL;
2627 rta_buf[flavor-1] = attr;
2628 }
2629 attr = RTA_NEXT(attr, attrlen);
2630 }
2631 }
2632
2633 doit = rtnl_get_doit(family, type);
2634 if (doit == NULL)
2635 return -EOPNOTSUPP;
2636
2652 doit = rtnl_get_doit(family, type);
2653 if (doit == NULL)
2654 return -EOPNOTSUPP;
2655
2637 return doit(skb, nlh, (void *)&rta_buf[0]);
2656 return doit(skb, nlh);
2638}
2639
2640static void rtnetlink_rcv(struct sk_buff *skb)
2641{
2642 rtnl_lock();
2643 netlink_rcv_skb(skb, &rtnetlink_rcv_msg);
2644 rtnl_unlock();
2645}

--- 53 unchanged lines hidden (view full) ---

2699
2700static struct pernet_operations rtnetlink_net_ops = {
2701 .init = rtnetlink_net_init,
2702 .exit = rtnetlink_net_exit,
2703};
2704
2705void __init rtnetlink_init(void)
2706{
2657}
2658
2659static void rtnetlink_rcv(struct sk_buff *skb)
2660{
2661 rtnl_lock();
2662 netlink_rcv_skb(skb, &rtnetlink_rcv_msg);
2663 rtnl_unlock();
2664}

--- 53 unchanged lines hidden (view full) ---

2718
2719static struct pernet_operations rtnetlink_net_ops = {
2720 .init = rtnetlink_net_init,
2721 .exit = rtnetlink_net_exit,
2722};
2723
2724void __init rtnetlink_init(void)
2725{
2707 int i;
2708
2709 rtattr_max = 0;
2710 for (i = 0; i < ARRAY_SIZE(rta_max); i++)
2711 if (rta_max[i] > rtattr_max)
2712 rtattr_max = rta_max[i];
2713 rta_buf = kmalloc(rtattr_max * sizeof(struct rtattr *), GFP_KERNEL);
2714 if (!rta_buf)
2715 panic("rtnetlink_init: cannot allocate rta_buf\n");
2716
2717 if (register_pernet_subsys(&rtnetlink_net_ops))
2718 panic("rtnetlink_init: cannot initialize rtnetlink\n");
2719
2720 register_netdevice_notifier(&rtnetlink_dev_notifier);
2721
2722 rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink,
2723 rtnl_dump_ifinfo, rtnl_calcit);
2724 rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, NULL);

--- 15 unchanged lines hidden ---
2726 if (register_pernet_subsys(&rtnetlink_net_ops))
2727 panic("rtnetlink_init: cannot initialize rtnetlink\n");
2728
2729 register_netdevice_notifier(&rtnetlink_dev_notifier);
2730
2731 rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink,
2732 rtnl_dump_ifinfo, rtnl_calcit);
2733 rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, NULL);

--- 15 unchanged lines hidden ---