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