Skip to content

Commit 01cacb0

Browse files
Paolo Abenidavem330
Paolo Abeni
authored andcommitted
mptcp: add netlink-based PM
Expose a new netlink family to userspace to control the PM, setting: - list of local addresses to be signalled. - list of local addresses used to created subflows. - maximum number of add_addr option to react When the msk is fully established, the PM netlink attempts to announce the 'signal' list via the ADD_ADDR option. Since we currently lack the ADD_ADDR echo (and related event) only the first addr is sent. After exhausting the 'announce' list, the PM tries to create subflow for each addr in 'local' list, waiting for each connection to be completed before attempting the next one. Idea is to add an additional PM hook for ADD_ADDR echo, to allow the PM netlink announcing multiple addresses, in sequence. Co-developed-by: Matthieu Baerts <[email protected]> Signed-off-by: Matthieu Baerts <[email protected]> Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent fc51895 commit 01cacb0

File tree

5 files changed

+928
-2
lines changed

5 files changed

+928
-2
lines changed

include/uapi/linux/mptcp.h

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,58 @@ enum {
3232
};
3333

3434
#define MPTCP_SUBFLOW_ATTR_MAX (__MPTCP_SUBFLOW_ATTR_MAX - 1)
35+
36+
/* netlink interface */
37+
#define MPTCP_PM_NAME "mptcp_pm"
38+
#define MPTCP_PM_CMD_GRP_NAME "mptcp_pm_cmds"
39+
#define MPTCP_PM_VER 0x1
40+
41+
/*
42+
* ATTR types defined for MPTCP
43+
*/
44+
enum {
45+
MPTCP_PM_ATTR_UNSPEC,
46+
47+
MPTCP_PM_ATTR_ADDR, /* nested address */
48+
MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */
49+
MPTCP_PM_ATTR_SUBFLOWS, /* u32 */
50+
51+
__MPTCP_PM_ATTR_MAX
52+
};
53+
54+
#define MPTCP_PM_ATTR_MAX (__MPTCP_PM_ATTR_MAX - 1)
55+
56+
enum {
57+
MPTCP_PM_ADDR_ATTR_UNSPEC,
58+
59+
MPTCP_PM_ADDR_ATTR_FAMILY, /* u16 */
60+
MPTCP_PM_ADDR_ATTR_ID, /* u8 */
61+
MPTCP_PM_ADDR_ATTR_ADDR4, /* struct in_addr */
62+
MPTCP_PM_ADDR_ATTR_ADDR6, /* struct in6_addr */
63+
MPTCP_PM_ADDR_ATTR_PORT, /* u16 */
64+
MPTCP_PM_ADDR_ATTR_FLAGS, /* u32 */
65+
MPTCP_PM_ADDR_ATTR_IF_IDX, /* s32 */
66+
67+
__MPTCP_PM_ADDR_ATTR_MAX
68+
};
69+
70+
#define MPTCP_PM_ADDR_ATTR_MAX (__MPTCP_PM_ADDR_ATTR_MAX - 1)
71+
72+
#define MPTCP_PM_ADDR_FLAG_SIGNAL (1 << 0)
73+
#define MPTCP_PM_ADDR_FLAG_SUBFLOW (1 << 1)
74+
#define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2)
75+
76+
enum {
77+
MPTCP_PM_CMD_UNSPEC,
78+
79+
MPTCP_PM_CMD_ADD_ADDR,
80+
MPTCP_PM_CMD_DEL_ADDR,
81+
MPTCP_PM_CMD_GET_ADDR,
82+
MPTCP_PM_CMD_FLUSH_ADDRS,
83+
MPTCP_PM_CMD_SET_LIMITS,
84+
MPTCP_PM_CMD_GET_LIMITS,
85+
86+
__MPTCP_PM_CMD_AFTER_LAST
87+
};
88+
3589
#endif /* _UAPI_MPTCP_H */

net/mptcp/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# SPDX-License-Identifier: GPL-2.0
22
obj-$(CONFIG_MPTCP) += mptcp.o
33

4-
mptcp-y := protocol.o subflow.o options.o token.o crypto.o ctrl.o pm.o diag.o mib.o
4+
mptcp-y := protocol.o subflow.o options.o token.o crypto.o ctrl.o pm.o diag.o \
5+
mib.o pm_netlink.o

net/mptcp/pm.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ bool mptcp_pm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
176176

177177
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
178178
{
179-
return 0;
179+
return mptcp_pm_nl_get_local_id(msk, skc);
180180
}
181181

182182
static void pm_worker(struct work_struct *work)
@@ -192,12 +192,15 @@ static void pm_worker(struct work_struct *work)
192192
pr_debug("msk=%p status=%x", msk, pm->status);
193193
if (pm->status & BIT(MPTCP_PM_ADD_ADDR_RECEIVED)) {
194194
pm->status &= ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED);
195+
mptcp_pm_nl_add_addr_received(msk);
195196
}
196197
if (pm->status & BIT(MPTCP_PM_ESTABLISHED)) {
197198
pm->status &= ~BIT(MPTCP_PM_ESTABLISHED);
199+
mptcp_pm_nl_fully_established(msk);
198200
}
199201
if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) {
200202
pm->status &= ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED);
203+
mptcp_pm_nl_subflow_established(msk);
201204
}
202205

203206
spin_unlock_bh(&msk->pm.lock);
@@ -219,6 +222,8 @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
219222

220223
spin_lock_init(&msk->pm.lock);
221224
INIT_WORK(&msk->pm.work, pm_worker);
225+
226+
mptcp_pm_nl_data_init(msk);
222227
}
223228

224229
void mptcp_pm_close(struct mptcp_sock *msk)
@@ -232,4 +237,6 @@ void mptcp_pm_init(void)
232237
pm_wq = alloc_workqueue("pm_wq", WQ_UNBOUND | WQ_MEM_RECLAIM, 8);
233238
if (!pm_wq)
234239
panic("Failed to allocate workqueue");
240+
241+
mptcp_pm_nl_init();
235242
}

0 commit comments

Comments
 (0)