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