pm_netlink.c (1e07938e29c587eaae069f6c624daa4c2a56331c) | pm_netlink.c (aab4d8564947f391674391e5c346d7f6f1c49f89) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* Multipath TCP 3 * 4 * Copyright (c) 2020, Red Hat, Inc. 5 */ 6 7#define pr_fmt(fmt) "MPTCP: " fmt 8 --- 34 unchanged lines hidden (view full) --- 43 unsigned int subflows_max; 44 unsigned int next_id; 45 DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); 46}; 47 48#define MPTCP_PM_ADDR_MAX 8 49#define ADD_ADDR_RETRANS_MAX 3 50 | 1// SPDX-License-Identifier: GPL-2.0 2/* Multipath TCP 3 * 4 * Copyright (c) 2020, Red Hat, Inc. 5 */ 6 7#define pr_fmt(fmt) "MPTCP: " fmt 8 --- 34 unchanged lines hidden (view full) --- 43 unsigned int subflows_max; 44 unsigned int next_id; 45 DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); 46}; 47 48#define MPTCP_PM_ADDR_MAX 8 49#define ADD_ADDR_RETRANS_MAX 3 50 |
51static 52const struct nla_policy mptcp_pm_address_nl_policy[MPTCP_PM_ADDR_ATTR_IF_IDX + 1] = { 53 [MPTCP_PM_ADDR_ATTR_FAMILY] = { .type = NLA_U16, }, 54 [MPTCP_PM_ADDR_ATTR_ID] = { .type = NLA_U8, }, 55 [MPTCP_PM_ADDR_ATTR_ADDR4] = { .type = NLA_U32, }, 56 [MPTCP_PM_ADDR_ATTR_ADDR6] = NLA_POLICY_EXACT_LEN(16), 57 [MPTCP_PM_ADDR_ATTR_PORT] = { .type = NLA_U16, }, 58 [MPTCP_PM_ADDR_ATTR_FLAGS] = { .type = NLA_U32, }, 59 [MPTCP_PM_ADDR_ATTR_IF_IDX] = { .type = NLA_S32, }, 60}; 61 62/* MPTCP_PM_CMD_ADD_ADDR / DEL / GET / FLUSH - do */ 63static 64const struct nla_policy mptcp_pm_endpoint_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1] = { 65 [MPTCP_PM_ENDPOINT_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 66}; 67 68/* MPTCP_PM_CMD_SET_LIMITS - do */ 69static 70const struct nla_policy mptcp_pm_set_limits_nl_policy[MPTCP_PM_ATTR_SUBFLOWS + 1] = { 71 [MPTCP_PM_ATTR_RCV_ADD_ADDRS] = { .type = NLA_U32, }, 72 [MPTCP_PM_ATTR_SUBFLOWS] = { .type = NLA_U32, }, 73}; 74 75/* MPTCP_PM_CMD_SET_FLAGS - do */ 76static 77const struct nla_policy mptcp_pm_set_flags_nl_policy[MPTCP_PM_ATTR_ADDR_REMOTE + 1] = { 78 [MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 79 [MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, }, 80 [MPTCP_PM_ATTR_ADDR_REMOTE] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 81}; 82 83/* MPTCP_PM_CMD_ANNOUNCE - do */ 84static 85const struct nla_policy mptcp_pm_announce_nl_policy[MPTCP_PM_ATTR_TOKEN + 1] = { 86 [MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 87 [MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, }, 88}; 89 90/* MPTCP_PM_CMD_REMOVE - do */ 91static 92const struct nla_policy mptcp_pm_remove_nl_policy[MPTCP_PM_ATTR_LOC_ID + 1] = { 93 [MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, }, 94 [MPTCP_PM_ATTR_LOC_ID] = { .type = NLA_U8, }, 95}; 96 97/* MPTCP_PM_CMD_SUBFLOW_CREATE / DESTROY - do */ 98static 99const struct nla_policy mptcp_pm_subflow_create_nl_policy[MPTCP_PM_ATTR_ADDR_REMOTE + 1] = { 100 [MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 101 [MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, }, 102 [MPTCP_PM_ATTR_ADDR_REMOTE] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 103}; 104 | |
105static struct pm_nl_pernet *pm_nl_get_pernet(const struct net *net) 106{ 107 return net_generic(net, pm_nl_pernet_id); 108} 109 110static struct pm_nl_pernet * 111pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk) 112{ --- 1216 unchanged lines hidden (view full) --- 1329next: 1330 sock_put(sk); 1331 cond_resched(); 1332 } 1333 1334 return 0; 1335} 1336 | 51static struct pm_nl_pernet *pm_nl_get_pernet(const struct net *net) 52{ 53 return net_generic(net, pm_nl_pernet_id); 54} 55 56static struct pm_nl_pernet * 57pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk) 58{ --- 1216 unchanged lines hidden (view full) --- 1275next: 1276 sock_put(sk); 1277 cond_resched(); 1278 } 1279 1280 return 0; 1281} 1282 |
1337static int mptcp_pm_nl_add_addr_doit(struct sk_buff *skb, struct genl_info *info) | 1283int mptcp_pm_nl_add_addr_doit(struct sk_buff *skb, struct genl_info *info) |
1338{ 1339 struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR]; 1340 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1341 struct mptcp_pm_addr_entry addr, *entry; 1342 int ret; 1343 1344 ret = mptcp_pm_parse_entry(attr, info, true, &addr); 1345 if (ret < 0) --- 164 unchanged lines hidden (view full) --- 1510next: 1511 sock_put(sk); 1512 cond_resched(); 1513 } 1514 1515 return 0; 1516} 1517 | 1284{ 1285 struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR]; 1286 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1287 struct mptcp_pm_addr_entry addr, *entry; 1288 int ret; 1289 1290 ret = mptcp_pm_parse_entry(attr, info, true, &addr); 1291 if (ret < 0) --- 164 unchanged lines hidden (view full) --- 1456next: 1457 sock_put(sk); 1458 cond_resched(); 1459 } 1460 1461 return 0; 1462} 1463 |
1518static int mptcp_pm_nl_del_addr_doit(struct sk_buff *skb, struct genl_info *info) | 1464int mptcp_pm_nl_del_addr_doit(struct sk_buff *skb, struct genl_info *info) |
1519{ 1520 struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR]; 1521 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1522 struct mptcp_pm_addr_entry addr, *entry; 1523 unsigned int addr_max; 1524 int ret; 1525 1526 ret = mptcp_pm_parse_entry(attr, info, false, &addr); --- 118 unchanged lines hidden (view full) --- 1645static void __reset_counters(struct pm_nl_pernet *pernet) 1646{ 1647 WRITE_ONCE(pernet->add_addr_signal_max, 0); 1648 WRITE_ONCE(pernet->add_addr_accept_max, 0); 1649 WRITE_ONCE(pernet->local_addr_max, 0); 1650 pernet->addrs = 0; 1651} 1652 | 1465{ 1466 struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR]; 1467 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1468 struct mptcp_pm_addr_entry addr, *entry; 1469 unsigned int addr_max; 1470 int ret; 1471 1472 ret = mptcp_pm_parse_entry(attr, info, false, &addr); --- 118 unchanged lines hidden (view full) --- 1591static void __reset_counters(struct pm_nl_pernet *pernet) 1592{ 1593 WRITE_ONCE(pernet->add_addr_signal_max, 0); 1594 WRITE_ONCE(pernet->add_addr_accept_max, 0); 1595 WRITE_ONCE(pernet->local_addr_max, 0); 1596 pernet->addrs = 0; 1597} 1598 |
1653static int mptcp_pm_nl_flush_addrs_doit(struct sk_buff *skb, struct genl_info *info) | 1599int mptcp_pm_nl_flush_addrs_doit(struct sk_buff *skb, struct genl_info *info) |
1654{ 1655 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1656 LIST_HEAD(free_list); 1657 1658 spin_lock_bh(&pernet->lock); 1659 list_splice_init(&pernet->local_addr_list, &free_list); 1660 __reset_counters(pernet); 1661 pernet->next_id = 1; --- 39 unchanged lines hidden (view full) --- 1701 nla_nest_end(skb, attr); 1702 return 0; 1703 1704nla_put_failure: 1705 nla_nest_cancel(skb, attr); 1706 return -EMSGSIZE; 1707} 1708 | 1600{ 1601 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1602 LIST_HEAD(free_list); 1603 1604 spin_lock_bh(&pernet->lock); 1605 list_splice_init(&pernet->local_addr_list, &free_list); 1606 __reset_counters(pernet); 1607 pernet->next_id = 1; --- 39 unchanged lines hidden (view full) --- 1647 nla_nest_end(skb, attr); 1648 return 0; 1649 1650nla_put_failure: 1651 nla_nest_cancel(skb, attr); 1652 return -EMSGSIZE; 1653} 1654 |
1709static int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info) | 1655int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info) |
1710{ 1711 struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR]; 1712 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1713 struct mptcp_pm_addr_entry addr, *entry; 1714 struct sk_buff *msg; 1715 void *reply; 1716 int ret; 1717 --- 33 unchanged lines hidden (view full) --- 1751unlock_fail: 1752 spin_unlock_bh(&pernet->lock); 1753 1754fail: 1755 nlmsg_free(msg); 1756 return ret; 1757} 1758 | 1656{ 1657 struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR]; 1658 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1659 struct mptcp_pm_addr_entry addr, *entry; 1660 struct sk_buff *msg; 1661 void *reply; 1662 int ret; 1663 --- 33 unchanged lines hidden (view full) --- 1697unlock_fail: 1698 spin_unlock_bh(&pernet->lock); 1699 1700fail: 1701 nlmsg_free(msg); 1702 return ret; 1703} 1704 |
1759static int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg, 1760 struct netlink_callback *cb) | 1705int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg, 1706 struct netlink_callback *cb) |
1761{ 1762 struct net *net = sock_net(msg->sk); 1763 struct mptcp_pm_addr_entry *entry; 1764 struct pm_nl_pernet *pernet; 1765 int id = cb->args[0]; 1766 void *hdr; 1767 int i; 1768 --- 40 unchanged lines hidden (view full) --- 1809 *limit = nla_get_u32(attr); 1810 if (*limit > MPTCP_PM_ADDR_MAX) { 1811 GENL_SET_ERR_MSG(info, "limit greater than maximum"); 1812 return -EINVAL; 1813 } 1814 return 0; 1815} 1816 | 1707{ 1708 struct net *net = sock_net(msg->sk); 1709 struct mptcp_pm_addr_entry *entry; 1710 struct pm_nl_pernet *pernet; 1711 int id = cb->args[0]; 1712 void *hdr; 1713 int i; 1714 --- 40 unchanged lines hidden (view full) --- 1755 *limit = nla_get_u32(attr); 1756 if (*limit > MPTCP_PM_ADDR_MAX) { 1757 GENL_SET_ERR_MSG(info, "limit greater than maximum"); 1758 return -EINVAL; 1759 } 1760 return 0; 1761} 1762 |
1817static int 1818mptcp_pm_nl_set_limits_doit(struct sk_buff *skb, struct genl_info *info) | 1763int mptcp_pm_nl_set_limits_doit(struct sk_buff *skb, struct genl_info *info) |
1819{ 1820 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1821 unsigned int rcv_addrs, subflows; 1822 int ret; 1823 1824 spin_lock_bh(&pernet->lock); 1825 rcv_addrs = pernet->add_addr_accept_max; 1826 ret = parse_limit(info, MPTCP_PM_ATTR_RCV_ADD_ADDRS, &rcv_addrs); --- 8 unchanged lines hidden (view full) --- 1835 WRITE_ONCE(pernet->add_addr_accept_max, rcv_addrs); 1836 WRITE_ONCE(pernet->subflows_max, subflows); 1837 1838unlock: 1839 spin_unlock_bh(&pernet->lock); 1840 return ret; 1841} 1842 | 1764{ 1765 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1766 unsigned int rcv_addrs, subflows; 1767 int ret; 1768 1769 spin_lock_bh(&pernet->lock); 1770 rcv_addrs = pernet->add_addr_accept_max; 1771 ret = parse_limit(info, MPTCP_PM_ATTR_RCV_ADD_ADDRS, &rcv_addrs); --- 8 unchanged lines hidden (view full) --- 1780 WRITE_ONCE(pernet->add_addr_accept_max, rcv_addrs); 1781 WRITE_ONCE(pernet->subflows_max, subflows); 1782 1783unlock: 1784 spin_unlock_bh(&pernet->lock); 1785 return ret; 1786} 1787 |
1843static int 1844mptcp_pm_nl_get_limits_doit(struct sk_buff *skb, struct genl_info *info) | 1788int mptcp_pm_nl_get_limits_doit(struct sk_buff *skb, struct genl_info *info) |
1845{ 1846 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1847 struct sk_buff *msg; 1848 void *reply; 1849 1850 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 1851 if (!msg) 1852 return -ENOMEM; --- 92 unchanged lines hidden (view full) --- 1945 entry->flags = (entry->flags & ~mask) | (addr->flags & mask); 1946 *addr = *entry; 1947 spin_unlock_bh(&pernet->lock); 1948 1949 mptcp_nl_set_flags(net, &addr->addr, bkup, changed); 1950 return 0; 1951} 1952 | 1789{ 1790 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1791 struct sk_buff *msg; 1792 void *reply; 1793 1794 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 1795 if (!msg) 1796 return -ENOMEM; --- 92 unchanged lines hidden (view full) --- 1889 entry->flags = (entry->flags & ~mask) | (addr->flags & mask); 1890 *addr = *entry; 1891 spin_unlock_bh(&pernet->lock); 1892 1893 mptcp_nl_set_flags(net, &addr->addr, bkup, changed); 1894 return 0; 1895} 1896 |
1953static int mptcp_pm_nl_set_flags_doit(struct sk_buff *skb, struct genl_info *info) | 1897int mptcp_pm_nl_set_flags_doit(struct sk_buff *skb, struct genl_info *info) |
1954{ 1955 struct mptcp_pm_addr_entry remote = { .addr = { .family = AF_UNSPEC }, }; 1956 struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, }; 1957 struct nlattr *attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; 1958 struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN]; 1959 struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; 1960 struct net *net = sock_net(skb->sk); 1961 u8 bkup = 0; --- 347 unchanged lines hidden (view full) --- 2309 genlmsg_end(skb, nlh); 2310 mptcp_nl_mcast_send(net, skb, gfp); 2311 return; 2312 2313nla_put_failure: 2314 nlmsg_free(skb); 2315} 2316 | 1898{ 1899 struct mptcp_pm_addr_entry remote = { .addr = { .family = AF_UNSPEC }, }; 1900 struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, }; 1901 struct nlattr *attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; 1902 struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN]; 1903 struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; 1904 struct net *net = sock_net(skb->sk); 1905 u8 bkup = 0; --- 347 unchanged lines hidden (view full) --- 2253 genlmsg_end(skb, nlh); 2254 mptcp_nl_mcast_send(net, skb, gfp); 2255 return; 2256 2257nla_put_failure: 2258 nlmsg_free(skb); 2259} 2260 |
2317static const struct genl_ops mptcp_pm_nl_ops[] = { 2318 { 2319 .cmd = MPTCP_PM_CMD_ADD_ADDR, 2320 .validate = GENL_DONT_VALIDATE_STRICT, 2321 .doit = mptcp_pm_nl_add_addr_doit, 2322 .policy = mptcp_pm_endpoint_nl_policy, 2323 .maxattr = MPTCP_PM_ENDPOINT_ADDR, 2324 .flags = GENL_UNS_ADMIN_PERM, 2325 }, 2326 { 2327 .cmd = MPTCP_PM_CMD_DEL_ADDR, 2328 .validate = GENL_DONT_VALIDATE_STRICT, 2329 .doit = mptcp_pm_nl_del_addr_doit, 2330 .policy = mptcp_pm_endpoint_nl_policy, 2331 .maxattr = MPTCP_PM_ENDPOINT_ADDR, 2332 .flags = GENL_UNS_ADMIN_PERM, 2333 }, 2334 { 2335 .cmd = MPTCP_PM_CMD_GET_ADDR, 2336 .validate = GENL_DONT_VALIDATE_STRICT, 2337 .doit = mptcp_pm_nl_get_addr_doit, 2338 .dumpit = mptcp_pm_nl_get_addr_dumpit, 2339 .policy = mptcp_pm_endpoint_nl_policy, 2340 .maxattr = MPTCP_PM_ENDPOINT_ADDR, 2341 .flags = GENL_UNS_ADMIN_PERM, 2342 }, 2343 { 2344 .cmd = MPTCP_PM_CMD_FLUSH_ADDRS, 2345 .validate = GENL_DONT_VALIDATE_STRICT, 2346 .doit = mptcp_pm_nl_flush_addrs_doit, 2347 .policy = mptcp_pm_endpoint_nl_policy, 2348 .maxattr = MPTCP_PM_ENDPOINT_ADDR, 2349 .flags = GENL_UNS_ADMIN_PERM, 2350 }, 2351 { 2352 .cmd = MPTCP_PM_CMD_SET_LIMITS, 2353 .validate = GENL_DONT_VALIDATE_STRICT, 2354 .doit = mptcp_pm_nl_set_limits_doit, 2355 .policy = mptcp_pm_set_limits_nl_policy, 2356 .maxattr = MPTCP_PM_ATTR_SUBFLOWS, 2357 .flags = GENL_UNS_ADMIN_PERM, 2358 }, 2359 { 2360 .cmd = MPTCP_PM_CMD_GET_LIMITS, 2361 .validate = GENL_DONT_VALIDATE_STRICT, 2362 .doit = mptcp_pm_nl_get_limits_doit, 2363 .policy = mptcp_pm_set_limits_nl_policy, 2364 .maxattr = MPTCP_PM_ATTR_SUBFLOWS, 2365 }, 2366 { 2367 .cmd = MPTCP_PM_CMD_SET_FLAGS, 2368 .validate = GENL_DONT_VALIDATE_STRICT, 2369 .doit = mptcp_pm_nl_set_flags_doit, 2370 .policy = mptcp_pm_set_flags_nl_policy, 2371 .maxattr = MPTCP_PM_ATTR_ADDR_REMOTE, 2372 .flags = GENL_UNS_ADMIN_PERM, 2373 }, 2374 { 2375 .cmd = MPTCP_PM_CMD_ANNOUNCE, 2376 .validate = GENL_DONT_VALIDATE_STRICT, 2377 .doit = mptcp_pm_nl_announce_doit, 2378 .policy = mptcp_pm_announce_nl_policy, 2379 .maxattr = MPTCP_PM_ATTR_TOKEN, 2380 .flags = GENL_UNS_ADMIN_PERM, 2381 }, 2382 { 2383 .cmd = MPTCP_PM_CMD_REMOVE, 2384 .validate = GENL_DONT_VALIDATE_STRICT, 2385 .doit = mptcp_pm_nl_remove_doit, 2386 .policy = mptcp_pm_remove_nl_policy, 2387 .maxattr = MPTCP_PM_ATTR_LOC_ID, 2388 .flags = GENL_UNS_ADMIN_PERM, 2389 }, 2390 { 2391 .cmd = MPTCP_PM_CMD_SUBFLOW_CREATE, 2392 .validate = GENL_DONT_VALIDATE_STRICT, 2393 .doit = mptcp_pm_nl_subflow_create_doit, 2394 .policy = mptcp_pm_subflow_create_nl_policy, 2395 .maxattr = MPTCP_PM_ATTR_ADDR_REMOTE, 2396 .flags = GENL_UNS_ADMIN_PERM, 2397 }, 2398 { 2399 .cmd = MPTCP_PM_CMD_SUBFLOW_DESTROY, 2400 .validate = GENL_DONT_VALIDATE_STRICT, 2401 .doit = mptcp_pm_nl_subflow_destroy_doit, 2402 .policy = mptcp_pm_subflow_create_nl_policy, 2403 .maxattr = MPTCP_PM_ATTR_ADDR_REMOTE, 2404 .flags = GENL_UNS_ADMIN_PERM, 2405 }, 2406}; 2407 | |
2408static struct genl_family mptcp_genl_family __ro_after_init = { 2409 .name = MPTCP_PM_NAME, 2410 .version = MPTCP_PM_VER, 2411 .netnsok = true, 2412 .module = THIS_MODULE, 2413 .ops = mptcp_pm_nl_ops, 2414 .n_ops = ARRAY_SIZE(mptcp_pm_nl_ops), 2415 .resv_start_op = MPTCP_PM_CMD_SUBFLOW_DESTROY + 1, --- 53 unchanged lines hidden --- | 2261static struct genl_family mptcp_genl_family __ro_after_init = { 2262 .name = MPTCP_PM_NAME, 2263 .version = MPTCP_PM_VER, 2264 .netnsok = true, 2265 .module = THIS_MODULE, 2266 .ops = mptcp_pm_nl_ops, 2267 .n_ops = ARRAY_SIZE(mptcp_pm_nl_ops), 2268 .resv_start_op = MPTCP_PM_CMD_SUBFLOW_DESTROY + 1, --- 53 unchanged lines hidden --- |