1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Implement address_announced/address_removed/subflow_established/ | 3 | Some path manager related refactoring and cleanups. |
4 | subflow_closed interfaces. | 4 | - patch 1, a cleanup. |
5 | - patches 2-4, drop mptcp_pm_is_userspace() and mptcp_pm_is_kernel(). | ||
6 | - patches 5-6, change remote of set_flags as mptcp_pm_addr_entry type. | ||
5 | 7 | ||
6 | Depends on: | 8 | Geliang Tang (6): |
7 | - BPF path manager, part 4, v5 | 9 | mptcp: pm: use pm variable instead of msk->pm |
8 | Based-on: <cover.1740019794.git.tanggeliang@kylinos.cn> | 10 | mptcp: pm: userspace: drop is_userspace in free_local_addr_list |
11 | mptcp: pm: drop is_kernel in alloc_anno_list | ||
12 | mptcp: pm: in-kernel: drop is_userspace in remove_id_zero | ||
13 | mptcp: pm: add remote parameter for set_flags | ||
14 | mptcp: pm: in-kernel: drop changed parameter of set_flags | ||
9 | 15 | ||
10 | Geliang Tang (9): | 16 | net/mptcp/pm.c | 28 ++++++++---- |
11 | mptcp: pm: in-kernel: add address_removed/subflow_closed | 17 | net/mptcp/pm_netlink.c | 93 +++++++++++++++++++++------------------- |
12 | mptcp: pm: in-kernel: address_announced interface | 18 | net/mptcp/pm_userspace.c | 25 +++-------- |
13 | mptcp: pm: in-kernel: address_removed interface | 19 | net/mptcp/protocol.h | 5 ++- |
14 | mptcp: pm: in-kernel: subflow_established interface | 20 | 4 files changed, 77 insertions(+), 74 deletions(-) |
15 | mptcp: pm: in-kernel: subflow_closed interface | ||
16 | mptcp: pm: userspace: address_announced interface | ||
17 | mptcp: pm: userspace: address_removed interface | ||
18 | mptcp: pm: userspace: subflow_established interface | ||
19 | mptcp: pm: userspace: subflow_closed interface | ||
20 | |||
21 | net/mptcp/pm_netlink.c | 115 ++++++++++++++------ | ||
22 | net/mptcp/pm_userspace.c | 220 +++++++++++++++++++++++---------------- | ||
23 | 2 files changed, 215 insertions(+), 120 deletions(-) | ||
24 | 21 | ||
25 | -- | 22 | -- |
26 | 2.43.0 | 23 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Extract subflow_closed() interface of the userspace PM from the handler of | 3 | The variable "pm" has been defined in mptcp_pm_fully_established() |
4 | netlink command MPTCP_PM_CMD_SUBFLOW_DESTROY | 4 | and mptcp_pm_data_reset() as "sk->pm", so use "pm" directly instead |
5 | 5 | of using "sk->pm". | |
6 | mptcp_pm_nl_subflow_destroy_doit(), | ||
7 | |||
8 | only leave the code for obtaining msk through "info", parsing local address | ||
9 | entry and parsing remote address info in the handler. | ||
10 | |||
11 | This interface is invoked under holding the msk socket lock. | ||
12 | 6 | ||
13 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 7 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
14 | --- | 8 | --- |
15 | net/mptcp/pm_userspace.c | 45 ++++++++++++++++++++++++++-------------- | 9 | net/mptcp/pm.c | 8 ++++---- |
16 | 1 file changed, 30 insertions(+), 15 deletions(-) | 10 | 1 file changed, 4 insertions(+), 4 deletions(-) |
17 | 11 | ||
18 | diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c | 12 | diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c |
19 | index XXXXXXX..XXXXXXX 100644 | 13 | index XXXXXXX..XXXXXXX 100644 |
20 | --- a/net/mptcp/pm_userspace.c | 14 | --- a/net/mptcp/pm.c |
21 | +++ b/net/mptcp/pm_userspace.c | 15 | +++ b/net/mptcp/pm.c |
22 | @@ -XXX,XX +XXX,XX @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk, | 16 | @@ -XXX,XX +XXX,XX @@ void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk) |
23 | return NULL; | 17 | * be sure to serve this event only once. |
18 | */ | ||
19 | if (READ_ONCE(pm->work_pending) && | ||
20 | - !(msk->pm.status & BIT(MPTCP_PM_ALREADY_ESTABLISHED))) | ||
21 | + !(pm->status & BIT(MPTCP_PM_ALREADY_ESTABLISHED))) | ||
22 | mptcp_pm_schedule_work(msk, MPTCP_PM_ESTABLISHED); | ||
23 | |||
24 | - if ((msk->pm.status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)) == 0) | ||
25 | + if ((pm->status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)) == 0) | ||
26 | announce = true; | ||
27 | |||
28 | - msk->pm.status |= BIT(MPTCP_PM_ALREADY_ESTABLISHED); | ||
29 | + pm->status |= BIT(MPTCP_PM_ALREADY_ESTABLISHED); | ||
30 | spin_unlock_bh(&pm->lock); | ||
31 | |||
32 | if (announce) | ||
33 | @@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk) | ||
34 | WRITE_ONCE(pm->addr_signal, 0); | ||
35 | WRITE_ONCE(pm->remote_deny_join_id0, false); | ||
36 | pm->status = 0; | ||
37 | - bitmap_fill(msk->pm.id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); | ||
38 | + bitmap_fill(pm->id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); | ||
24 | } | 39 | } |
25 | 40 | ||
26 | +static int mptcp_userspace_pm_subflow_closed(struct mptcp_sock *msk, | 41 | void mptcp_pm_data_init(struct mptcp_sock *msk) |
27 | + struct mptcp_pm_param *param) | ||
28 | +{ | ||
29 | + struct mptcp_pm_addr_entry *local = ¶m->entry; | ||
30 | + struct mptcp_addr_info *remote = ¶m->addr; | ||
31 | + struct sock *ssk, *sk = (struct sock *)msk; | ||
32 | + | ||
33 | + ssk = mptcp_nl_find_ssk(msk, &local->addr, remote); | ||
34 | + if (!ssk) | ||
35 | + return -ESRCH; | ||
36 | + | ||
37 | + spin_lock_bh(&msk->pm.lock); | ||
38 | + mptcp_userspace_pm_delete_local_addr(msk, local); | ||
39 | + spin_unlock_bh(&msk->pm.lock); | ||
40 | + mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN); | ||
41 | + mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk)); | ||
42 | + MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW); | ||
43 | + | ||
44 | + return 0; | ||
45 | +} | ||
46 | + | ||
47 | int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info) | ||
48 | { | ||
49 | struct mptcp_pm_addr_entry addr_l; | ||
50 | struct mptcp_addr_info addr_r; | ||
51 | struct nlattr *raddr, *laddr; | ||
52 | + struct mptcp_pm_param param; | ||
53 | struct mptcp_sock *msk; | ||
54 | - struct sock *sk, *ssk; | ||
55 | int err = -EINVAL; | ||
56 | + struct sock *sk; | ||
57 | |||
58 | if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR) || | ||
59 | GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE)) | ||
60 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info | ||
61 | } | ||
62 | |||
63 | lock_sock(sk); | ||
64 | - ssk = mptcp_nl_find_ssk(msk, &addr_l.addr, &addr_r); | ||
65 | - if (!ssk) { | ||
66 | - GENL_SET_ERR_MSG(info, "subflow not found"); | ||
67 | - err = -ESRCH; | ||
68 | - goto release_sock; | ||
69 | - } | ||
70 | - | ||
71 | - spin_lock_bh(&msk->pm.lock); | ||
72 | - mptcp_userspace_pm_delete_local_addr(msk, &addr_l); | ||
73 | - spin_unlock_bh(&msk->pm.lock); | ||
74 | - mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN); | ||
75 | - mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk)); | ||
76 | - MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW); | ||
77 | -release_sock: | ||
78 | + mptcp_pm_param_set_contexts(¶m, &addr_l, &addr_r); | ||
79 | + err = msk->pm.ops && msk->pm.ops->subflow_closed ? | ||
80 | + msk->pm.ops->subflow_closed(msk, ¶m) : | ||
81 | + mptcp_userspace_pm_subflow_closed(msk, ¶m); | ||
82 | release_sock(sk); | ||
83 | + if (err) | ||
84 | + GENL_SET_ERR_MSG(info, "subflow not found"); | ||
85 | |||
86 | destroy_err: | ||
87 | sock_put(sk); | ||
88 | @@ -XXX,XX +XXX,XX @@ static struct mptcp_pm_ops mptcp_userspace_pm = { | ||
89 | .address_announced = mptcp_userspace_pm_address_announced, | ||
90 | .address_removed = mptcp_userspace_pm_address_removed, | ||
91 | .subflow_established = mptcp_userspace_pm_subflow_established, | ||
92 | + .subflow_closed = mptcp_userspace_pm_subflow_closed, | ||
93 | .get_local_id = mptcp_userspace_pm_get_local_id, | ||
94 | .get_priority = mptcp_userspace_pm_get_priority, | ||
95 | .type = MPTCP_PM_TYPE_USERSPACE, | ||
96 | -- | 42 | -- |
97 | 2.43.0 | 43 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Extract address_removed() interface of the userspace PM from the handler | 3 | To reduce the path manager's reliance on mptcp_pm_is_userspace() |
4 | of netlink command MPTCP_PM_CMD_REMOVE mptcp_pm_nl_remove_doit(), only | 4 | and mptcp_pm_is_kernel() helpers, this patch drops the check for |
5 | leave the code for parsing address id and obtaining msk through "info" | 5 | mptcp_pm_is_userspace() in mptcp_free_local_addr_list() and |
6 | in the handler. | 6 | replaces it with a check to see if userspace_pm_local_addr_list |
7 | 7 | is empty. | |
8 | This interface is invoked under holding the msk socket lock. | ||
9 | 8 | ||
10 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 9 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
11 | --- | 10 | --- |
12 | net/mptcp/pm_userspace.c | 74 ++++++++++++++++++++-------------------- | 11 | net/mptcp/pm_userspace.c | 2 +- |
13 | 1 file changed, 37 insertions(+), 37 deletions(-) | 12 | 1 file changed, 1 insertion(+), 1 deletion(-) |
14 | 13 | ||
15 | diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c | 14 | diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c |
16 | index XXXXXXX..XXXXXXX 100644 | 15 | index XXXXXXX..XXXXXXX 100644 |
17 | --- a/net/mptcp/pm_userspace.c | 16 | --- a/net/mptcp/pm_userspace.c |
18 | +++ b/net/mptcp/pm_userspace.c | 17 | +++ b/net/mptcp/pm_userspace.c |
19 | @@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk) | 18 | @@ -XXX,XX +XXX,XX @@ void mptcp_free_local_addr_list(struct mptcp_sock *msk) |
20 | { | 19 | struct sock *sk = (struct sock *)msk; |
21 | struct mptcp_rm_list list = { .nr = 0 }; | 20 | LIST_HEAD(free_list); |
22 | struct mptcp_subflow_context *subflow; | 21 | |
23 | - struct sock *sk = (struct sock *)msk; | 22 | - if (!mptcp_pm_is_userspace(msk)) |
24 | bool has_id_0 = false; | 23 | + if (list_empty(&msk->pm.userspace_pm_local_addr_list)) |
25 | - int err = -EINVAL; | 24 | return; |
26 | 25 | ||
27 | - lock_sock(sk); | 26 | spin_lock_bh(&msk->pm.lock); |
28 | mptcp_for_each_subflow(msk, subflow) { | ||
29 | if (READ_ONCE(subflow->local_id) == 0) { | ||
30 | has_id_0 = true; | ||
31 | @@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk) | ||
32 | } | ||
33 | } | ||
34 | if (!has_id_0) | ||
35 | - goto remove_err; | ||
36 | + return -EINVAL; | ||
37 | |||
38 | list.ids[list.nr++] = 0; | ||
39 | |||
40 | @@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk) | ||
41 | mptcp_pm_remove_addr(msk, &list); | ||
42 | spin_unlock_bh(&msk->pm.lock); | ||
43 | |||
44 | - err = 0; | ||
45 | - | ||
46 | -remove_err: | ||
47 | - release_sock(sk); | ||
48 | - return err; | ||
49 | + return 0; | ||
50 | } | ||
51 | |||
52 | void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk, | ||
53 | @@ -XXX,XX +XXX,XX @@ void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk, | ||
54 | spin_unlock_bh(&msk->pm.lock); | ||
55 | } | ||
56 | |||
57 | +static int mptcp_userspace_pm_address_removed(struct mptcp_sock *msk, | ||
58 | + struct mptcp_pm_param *param) | ||
59 | +{ | ||
60 | + struct mptcp_pm_addr_entry *entry; | ||
61 | + u8 id = param->addr.id; | ||
62 | + | ||
63 | + if (id == 0) | ||
64 | + return mptcp_userspace_pm_remove_id_zero_address(msk); | ||
65 | + | ||
66 | + spin_lock_bh(&msk->pm.lock); | ||
67 | + entry = mptcp_userspace_pm_lookup_addr_by_id(msk, id); | ||
68 | + if (!entry) { | ||
69 | + spin_unlock_bh(&msk->pm.lock); | ||
70 | + return -EINVAL; | ||
71 | + } | ||
72 | + | ||
73 | + list_del_rcu(&entry->list); | ||
74 | + spin_unlock_bh(&msk->pm.lock); | ||
75 | + | ||
76 | + mptcp_pm_remove_addr_entry(msk, entry); | ||
77 | + | ||
78 | + sock_kfree_s((struct sock *)msk, entry, sizeof(*entry)); | ||
79 | + | ||
80 | + return 0; | ||
81 | +} | ||
82 | + | ||
83 | int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info) | ||
84 | { | ||
85 | - struct mptcp_pm_addr_entry *match; | ||
86 | + struct mptcp_addr_info addr; | ||
87 | + struct mptcp_pm_param param; | ||
88 | struct mptcp_sock *msk; | ||
89 | struct nlattr *id; | ||
90 | int err = -EINVAL; | ||
91 | struct sock *sk; | ||
92 | - u8 id_val; | ||
93 | |||
94 | if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_LOC_ID)) | ||
95 | return err; | ||
96 | |||
97 | id = info->attrs[MPTCP_PM_ATTR_LOC_ID]; | ||
98 | - id_val = nla_get_u8(id); | ||
99 | + addr.id = nla_get_u8(id); | ||
100 | |||
101 | msk = mptcp_userspace_pm_get_sock(info); | ||
102 | if (!msk) | ||
103 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info) | ||
104 | |||
105 | sk = (struct sock *)msk; | ||
106 | |||
107 | - if (id_val == 0) { | ||
108 | - err = mptcp_userspace_pm_remove_id_zero_address(msk); | ||
109 | - goto out; | ||
110 | - } | ||
111 | - | ||
112 | lock_sock(sk); | ||
113 | - | ||
114 | - spin_lock_bh(&msk->pm.lock); | ||
115 | - match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val); | ||
116 | - if (!match) { | ||
117 | - spin_unlock_bh(&msk->pm.lock); | ||
118 | - release_sock(sk); | ||
119 | - goto out; | ||
120 | - } | ||
121 | - | ||
122 | - list_del_rcu(&match->list); | ||
123 | - spin_unlock_bh(&msk->pm.lock); | ||
124 | - | ||
125 | - mptcp_pm_remove_addr_entry(msk, match); | ||
126 | - | ||
127 | + mptcp_pm_param_set_contexts(¶m, NULL, &addr); | ||
128 | + err = msk->pm.ops && msk->pm.ops->address_removed ? | ||
129 | + msk->pm.ops->address_removed(msk, ¶m) : | ||
130 | + mptcp_userspace_pm_address_removed(msk, ¶m); | ||
131 | release_sock(sk); | ||
132 | - | ||
133 | - sock_kfree_s(sk, match, sizeof(*match)); | ||
134 | - | ||
135 | - err = 0; | ||
136 | -out: | ||
137 | if (err) | ||
138 | NL_SET_ERR_MSG_ATTR_FMT(info->extack, id, | ||
139 | "address with id %u not found", | ||
140 | - id_val); | ||
141 | + addr.id); | ||
142 | |||
143 | sock_put(sk); | ||
144 | return err; | ||
145 | @@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr, | ||
146 | |||
147 | static struct mptcp_pm_ops mptcp_userspace_pm = { | ||
148 | .address_announced = mptcp_userspace_pm_address_announced, | ||
149 | + .address_removed = mptcp_userspace_pm_address_removed, | ||
150 | .get_local_id = mptcp_userspace_pm_get_local_id, | ||
151 | .get_priority = mptcp_userspace_pm_get_priority, | ||
152 | .type = MPTCP_PM_TYPE_USERSPACE, | ||
153 | -- | 27 | -- |
154 | 2.43.0 | 28 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Update mptcp_pm_nl_subflow_established() to match the parameters and | 3 | To reduce the path manager's reliance on mptcp_pm_is_userspace() |
4 | return value of subflow_established() interface and define it as the | 4 | and mptcp_pm_is_kernel() helpers, this patch drops the check for |
5 | interface of the in-kernel netlink PM. | 5 | mptcp_pm_is_kernel() in the function mptcp_pm_alloc_anno_list(). |
6 | 6 | Instead, add a new parameter "reissue" for this function, pass | |
7 | This interface is invoked under holding the msk socket lock. | 7 | "false" to this function in the in-kernel PM while pass "true" |
8 | to it in the userspace PM. | ||
8 | 9 | ||
9 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 10 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
10 | --- | 11 | --- |
11 | net/mptcp/pm_netlink.c | 11 +++++++++-- | 12 | net/mptcp/pm_netlink.c | 7 ++++--- |
12 | 1 file changed, 9 insertions(+), 2 deletions(-) | 13 | net/mptcp/pm_userspace.c | 2 +- |
14 | net/mptcp/protocol.h | 3 ++- | ||
15 | 3 files changed, 7 insertions(+), 5 deletions(-) | ||
13 | 16 | ||
14 | diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c | 17 | diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c |
15 | index XXXXXXX..XXXXXXX 100644 | 18 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/net/mptcp/pm_netlink.c | 19 | --- a/net/mptcp/pm_netlink.c |
17 | +++ b/net/mptcp/pm_netlink.c | 20 | +++ b/net/mptcp/pm_netlink.c |
18 | @@ -XXX,XX +XXX,XX @@ static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) | 21 | @@ -XXX,XX +XXX,XX @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, |
19 | mptcp_pm_create_subflow_or_signal_addr(msk); | ||
20 | } | 22 | } |
21 | 23 | ||
22 | -static void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk) | 24 | bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, |
23 | +static int mptcp_pm_nl_subflow_established(struct mptcp_sock *msk, | 25 | - const struct mptcp_addr_info *addr) |
24 | + struct mptcp_pm_param *param) | 26 | + const struct mptcp_addr_info *addr, |
27 | + bool reissue) | ||
25 | { | 28 | { |
26 | mptcp_pm_create_subflow_or_signal_addr(msk); | 29 | struct mptcp_pm_add_entry *add_entry = NULL; |
27 | + | 30 | struct sock *sk = (struct sock *)msk; |
28 | + return 0; | 31 | @@ -XXX,XX +XXX,XX @@ bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, |
29 | } | 32 | add_entry = mptcp_lookup_anno_list_by_saddr(msk, addr); |
30 | 33 | ||
31 | /* Fill all the local addresses into the array addrs[], | 34 | if (add_entry) { |
32 | @@ -XXX,XX +XXX,XX @@ static void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, | 35 | - if (WARN_ON_ONCE(mptcp_pm_is_kernel(msk))) |
33 | void mptcp_pm_nl_work(struct mptcp_sock *msk) | 36 | + if (WARN_ON_ONCE(!reissue)) |
34 | { | 37 | return false; |
35 | struct mptcp_pm_data *pm = &msk->pm; | 38 | |
36 | + struct mptcp_pm_param param; | 39 | sk_reset_timer(sk, &add_entry->add_timer, |
37 | 40 | @@ -XXX,XX +XXX,XX @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) | |
38 | msk_owned_by_me(msk); | 41 | /* If the alloc fails, we are on memory pressure, not worth |
39 | 42 | * continuing, and trying to create subflows. | |
40 | @@ -XXX,XX +XXX,XX @@ void mptcp_pm_nl_work(struct mptcp_sock *msk) | 43 | */ |
41 | } | 44 | - if (!mptcp_pm_alloc_anno_list(msk, &local.addr)) |
42 | if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) { | 45 | + if (!mptcp_pm_alloc_anno_list(msk, &local.addr, false)) |
43 | pm->status &= ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED); | 46 | return; |
44 | - mptcp_pm_nl_subflow_established(msk); | 47 | |
45 | + msk->pm.ops && msk->pm.ops->subflow_established ? | 48 | __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); |
46 | + msk->pm.ops->subflow_established(msk, ¶m) : | 49 | diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c |
47 | + mptcp_pm_nl_subflow_established(msk, ¶m); | 50 | index XXXXXXX..XXXXXXX 100644 |
48 | } | 51 | --- a/net/mptcp/pm_userspace.c |
49 | 52 | +++ b/net/mptcp/pm_userspace.c | |
50 | spin_unlock_bh(&msk->pm.lock); | 53 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info) |
51 | @@ -XXX,XX +XXX,XX @@ static struct pernet_operations mptcp_pm_pernet_ops = { | 54 | lock_sock(sk); |
52 | static struct mptcp_pm_ops mptcp_netlink_pm = { | 55 | spin_lock_bh(&msk->pm.lock); |
53 | .address_announced = mptcp_pm_nl_address_announced, | 56 | |
54 | .address_removed = mptcp_pm_nl_address_removed, | 57 | - if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr)) { |
55 | + .subflow_established = mptcp_pm_nl_subflow_established, | 58 | + if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr, true)) { |
56 | .get_local_id = mptcp_pm_nl_get_local_id, | 59 | msk->pm.add_addr_signaled++; |
57 | .get_priority = mptcp_pm_nl_get_priority, | 60 | mptcp_pm_announce_addr(msk, &addr_val.addr, false); |
58 | .type = MPTCP_PM_TYPE_KERNEL, | 61 | mptcp_pm_nl_addr_send_ack(msk); |
62 | diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h | ||
63 | index XXXXXXX..XXXXXXX 100644 | ||
64 | --- a/net/mptcp/protocol.h | ||
65 | +++ b/net/mptcp/protocol.h | ||
66 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk, | ||
67 | struct mptcp_addr_info *rem, | ||
68 | u8 bkup); | ||
69 | bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, | ||
70 | - const struct mptcp_addr_info *addr); | ||
71 | + const struct mptcp_addr_info *addr, | ||
72 | + bool reissue); | ||
73 | void mptcp_pm_free_anno_list(struct mptcp_sock *msk); | ||
74 | bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk); | ||
75 | struct mptcp_pm_add_entry * | ||
59 | -- | 76 | -- |
60 | 2.43.0 | 77 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | This patch defines the code in the loop of traversing all msks in | 3 | There're duplicate operations in mptcp_nl_remove_subflow_and_signal_addr() |
4 | mptcp_nl_remove_subflow_and_signal_addr() as two new helpers, | 4 | and mptcp_nl_remove_id_zero_address(), both of which traverse all mptcp |
5 | mptcp_pm_nl_address_removed() and mptcp_pm_nl_subflow_closed(), | 5 | sockets in the net namespace. This patch drops the traversal operation in |
6 | used for signaling a RM_ADDR and closing a subflow respectively. | 6 | the latter and reuse the traversal loop of the former to do the removal of |
7 | id zero address. | ||
8 | |||
9 | An additional benefit is that the check for mptcp_pm_is_userspace() in | ||
10 | mptcp_nl_remove_id_zero_address() is dropped, which reduces the path | ||
11 | manager's reliance on mptcp_pm_is_userspace() and mptcp_pm_is_kernel() | ||
12 | helpers. | ||
7 | 13 | ||
8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 14 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
9 | --- | 15 | --- |
10 | net/mptcp/pm_netlink.c | 60 +++++++++++++++++++++++++++--------------- | 16 | net/mptcp/pm_netlink.c | 77 ++++++++++++++++++++---------------------- |
11 | 1 file changed, 39 insertions(+), 21 deletions(-) | 17 | 1 file changed, 37 insertions(+), 40 deletions(-) |
12 | 18 | ||
13 | diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c | 19 | diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c |
14 | index XXXXXXX..XXXXXXX 100644 | 20 | index XXXXXXX..XXXXXXX 100644 |
15 | --- a/net/mptcp/pm_netlink.c | 21 | --- a/net/mptcp/pm_netlink.c |
16 | +++ b/net/mptcp/pm_netlink.c | 22 | +++ b/net/mptcp/pm_netlink.c |
17 | @@ -XXX,XX +XXX,XX @@ static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id) | 23 | @@ -XXX,XX +XXX,XX @@ static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id) |
18 | msk->pm.local_addr_used--; | 24 | msk->pm.local_addr_used--; |
19 | } | 25 | } |
20 | 26 | ||
21 | +static int mptcp_pm_nl_address_removed(struct mptcp_sock *msk, | 27 | +static void mptcp_nl_remove_id_zero_address(struct mptcp_sock *msk, |
22 | + const struct mptcp_pm_addr_entry *local) | 28 | + const struct mptcp_addr_info *addr) |
23 | +{ | 29 | +{ |
24 | + bool remove_subflow; | 30 | + struct mptcp_rm_list list = { .nr = 0 }; |
31 | + struct mptcp_addr_info msk_local; | ||
25 | + | 32 | + |
26 | + remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, &local->addr); | 33 | + if (list_empty(&msk->conn_list)) |
27 | + mptcp_pm_remove_anno_addr(msk, &local->addr, remove_subflow && | 34 | + return; |
28 | + !(local->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT)); | ||
29 | + return 0; | ||
30 | +} | ||
31 | + | 35 | + |
32 | +static int mptcp_pm_nl_subflow_closed(struct mptcp_sock *msk, | 36 | + mptcp_local_address((struct sock_common *)msk, &msk_local); |
33 | + const struct mptcp_pm_addr_entry *local) | 37 | + if (!mptcp_addresses_equal(&msk_local, addr, addr->port)) |
34 | +{ | 38 | + return; |
35 | + struct mptcp_rm_list list = { .nr = 1 }; | ||
36 | + bool remove_subflow; | ||
37 | + | 39 | + |
38 | + list.ids[0] = mptcp_endp_get_local_id(msk, &local->addr); | 40 | + list.ids[list.nr++] = 0; |
39 | + remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, &local->addr); | ||
40 | + if (remove_subflow) { | ||
41 | + spin_lock_bh(&msk->pm.lock); | ||
42 | + mptcp_pm_nl_rm_subflow_received(msk, &list); | ||
43 | + spin_unlock_bh(&msk->pm.lock); | ||
44 | + } | ||
45 | + | 41 | + |
46 | + if (local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) { | 42 | + spin_lock_bh(&msk->pm.lock); |
47 | + spin_lock_bh(&msk->pm.lock); | 43 | + mptcp_pm_remove_addr(msk, &list); |
48 | + __mark_subflow_endp_available(msk, list.ids[0]); | 44 | + mptcp_pm_nl_rm_subflow_received(msk, &list); |
49 | + spin_unlock_bh(&msk->pm.lock); | 45 | + __mark_subflow_endp_available(msk, 0); |
50 | + } | 46 | + spin_unlock_bh(&msk->pm.lock); |
51 | + | ||
52 | + if (msk->mpc_endpoint_id == local->addr.id) | ||
53 | + msk->mpc_endpoint_id = 0; | ||
54 | + | ||
55 | + return 0; | ||
56 | +} | 47 | +} |
57 | + | 48 | + |
58 | static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net, | 49 | static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net, |
59 | const struct mptcp_pm_addr_entry *entry) | 50 | const struct mptcp_pm_addr_entry *entry) |
60 | { | 51 | { |
61 | const struct mptcp_addr_info *addr = &entry->addr; | ||
62 | - struct mptcp_rm_list list = { .nr = 1 }; | ||
63 | long s_slot = 0, s_num = 0; | ||
64 | struct mptcp_sock *msk; | ||
65 | |||
66 | @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net, | 52 | @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net, |
67 | |||
68 | while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { | ||
69 | struct sock *sk = (struct sock *)msk; | ||
70 | - bool remove_subflow; | ||
71 | |||
72 | if (mptcp_pm_is_userspace(msk)) | ||
73 | goto next; | 53 | goto next; |
74 | 54 | ||
75 | lock_sock(sk); | 55 | lock_sock(sk); |
76 | - remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, addr); | 56 | + if (entry->addr.id == 0) { |
77 | - mptcp_pm_remove_anno_addr(msk, addr, remove_subflow && | 57 | + mptcp_nl_remove_id_zero_address(msk, &entry->addr); |
78 | - !(entry->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT)); | 58 | + goto out; |
59 | + } | ||
60 | + | ||
61 | remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, addr); | ||
62 | mptcp_pm_remove_anno_addr(msk, addr, remove_subflow && | ||
63 | !(entry->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT)); | ||
64 | @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net, | ||
65 | |||
66 | if (msk->mpc_endpoint_id == entry->addr.id) | ||
67 | msk->mpc_endpoint_id = 0; | ||
68 | - release_sock(sk); | ||
79 | - | 69 | - |
80 | - list.ids[0] = mptcp_endp_get_local_id(msk, addr); | 70 | -next: |
81 | - if (remove_subflow) { | 71 | - sock_put(sk); |
82 | - spin_lock_bh(&msk->pm.lock); | 72 | - cond_resched(); |
83 | - mptcp_pm_nl_rm_subflow_received(msk, &list); | 73 | - } |
84 | - spin_unlock_bh(&msk->pm.lock); | ||
85 | - } | ||
86 | - | 74 | - |
87 | - if (entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) { | 75 | - return 0; |
88 | - spin_lock_bh(&msk->pm.lock); | 76 | -} |
89 | - __mark_subflow_endp_available(msk, list.ids[0]); | ||
90 | - spin_unlock_bh(&msk->pm.lock); | ||
91 | - } | ||
92 | - | 77 | - |
93 | - if (msk->mpc_endpoint_id == entry->addr.id) | 78 | -static int mptcp_nl_remove_id_zero_address(struct net *net, |
94 | - msk->mpc_endpoint_id = 0; | 79 | - struct mptcp_addr_info *addr) |
95 | + mptcp_pm_nl_address_removed(msk, entry); | 80 | -{ |
96 | + mptcp_pm_nl_subflow_closed(msk, entry); | 81 | - struct mptcp_rm_list list = { .nr = 0 }; |
82 | - long s_slot = 0, s_num = 0; | ||
83 | - struct mptcp_sock *msk; | ||
84 | - | ||
85 | - list.ids[list.nr++] = 0; | ||
86 | - | ||
87 | - while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { | ||
88 | - struct sock *sk = (struct sock *)msk; | ||
89 | - struct mptcp_addr_info msk_local; | ||
90 | - | ||
91 | - if (list_empty(&msk->conn_list) || mptcp_pm_is_userspace(msk)) | ||
92 | - goto next; | ||
93 | - | ||
94 | - mptcp_local_address((struct sock_common *)msk, &msk_local); | ||
95 | - if (!mptcp_addresses_equal(&msk_local, addr, addr->port)) | ||
96 | - goto next; | ||
97 | - | ||
98 | - lock_sock(sk); | ||
99 | - spin_lock_bh(&msk->pm.lock); | ||
100 | - mptcp_pm_remove_addr(msk, &list); | ||
101 | - mptcp_pm_nl_rm_subflow_received(msk, &list); | ||
102 | - __mark_subflow_endp_available(msk, 0); | ||
103 | - spin_unlock_bh(&msk->pm.lock); | ||
104 | +out: | ||
97 | release_sock(sk); | 105 | release_sock(sk); |
98 | 106 | ||
99 | next: | 107 | next: |
108 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_del_addr_doit(struct sk_buff *skb, struct genl_info *info) | ||
109 | * id addresses. Additionally zero id is not accounted for in id_bitmap. | ||
110 | * Let's use an 'mptcp_rm_list' instead of the common remove code. | ||
111 | */ | ||
112 | - if (addr.addr.id == 0) | ||
113 | - return mptcp_nl_remove_id_zero_address(sock_net(skb->sk), &addr.addr); | ||
114 | + if (addr.addr.id == 0) { | ||
115 | + entry = &addr; | ||
116 | + goto del_addr; | ||
117 | + } | ||
118 | |||
119 | spin_lock_bh(&pernet->lock); | ||
120 | entry = __lookup_addr_by_id(pernet, addr.addr.id); | ||
121 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_del_addr_doit(struct sk_buff *skb, struct genl_info *info) | ||
122 | __clear_bit(entry->addr.id, pernet->id_bitmap); | ||
123 | spin_unlock_bh(&pernet->lock); | ||
124 | |||
125 | +del_addr: | ||
126 | mptcp_nl_remove_subflow_and_signal_addr(sock_net(skb->sk), entry); | ||
127 | - synchronize_rcu(); | ||
128 | - __mptcp_pm_release_addr_entry(entry); | ||
129 | + if (entry->addr.id) { | ||
130 | + synchronize_rcu(); | ||
131 | + __mptcp_pm_release_addr_entry(entry); | ||
132 | + } | ||
133 | |||
134 | return ret; | ||
135 | } | ||
100 | -- | 136 | -- |
101 | 2.43.0 | 137 | 2.43.0 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
2 | 1 | ||
3 | Extract address_announced() interface of the in-kernel netlink PM from | ||
4 | the helper mptcp_nl_add_subflow_or_signal_addr(), only leave the code | ||
5 | for traversing all msk in the helper. | ||
6 | |||
7 | This interface is invoked under holding the msk socket lock. | ||
8 | |||
9 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | ||
10 | --- | ||
11 | net/mptcp/pm_netlink.c | 34 +++++++++++++++++++++++++--------- | ||
12 | 1 file changed, 25 insertions(+), 9 deletions(-) | ||
13 | |||
14 | diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c | ||
15 | index XXXXXXX..XXXXXXX 100644 | ||
16 | --- a/net/mptcp/pm_netlink.c | ||
17 | +++ b/net/mptcp/pm_netlink.c | ||
18 | @@ -XXX,XX +XXX,XX @@ static struct pm_nl_pernet *genl_info_pm_nl(struct genl_info *info) | ||
19 | return pm_nl_get_pernet(genl_info_net(info)); | ||
20 | } | ||
21 | |||
22 | +static int mptcp_pm_nl_address_announced(struct mptcp_sock *msk, | ||
23 | + struct mptcp_pm_param *param) | ||
24 | +{ | ||
25 | + struct mptcp_addr_info *addr = ¶m->addr; | ||
26 | + struct mptcp_addr_info mpc_addr; | ||
27 | + | ||
28 | + /* if the endp linked to the init sf is re-added with a != ID */ | ||
29 | + mptcp_local_address((struct sock_common *)msk, &mpc_addr); | ||
30 | + | ||
31 | + spin_lock_bh(&msk->pm.lock); | ||
32 | + if (mptcp_addresses_equal(addr, &mpc_addr, addr->port)) | ||
33 | + msk->mpc_endpoint_id = addr->id; | ||
34 | + | ||
35 | + mptcp_pm_create_subflow_or_signal_addr(msk); | ||
36 | + spin_unlock_bh(&msk->pm.lock); | ||
37 | + | ||
38 | + return 0; | ||
39 | +} | ||
40 | + | ||
41 | static int mptcp_nl_add_subflow_or_signal_addr(struct net *net, | ||
42 | struct mptcp_addr_info *addr) | ||
43 | { | ||
44 | @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_add_subflow_or_signal_addr(struct net *net, | ||
45 | |||
46 | while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { | ||
47 | struct sock *sk = (struct sock *)msk; | ||
48 | - struct mptcp_addr_info mpc_addr; | ||
49 | + struct mptcp_pm_param param; | ||
50 | |||
51 | if (!READ_ONCE(msk->fully_established) || | ||
52 | mptcp_pm_is_userspace(msk)) | ||
53 | goto next; | ||
54 | |||
55 | - /* if the endp linked to the init sf is re-added with a != ID */ | ||
56 | - mptcp_local_address((struct sock_common *)msk, &mpc_addr); | ||
57 | - | ||
58 | lock_sock(sk); | ||
59 | - spin_lock_bh(&msk->pm.lock); | ||
60 | - if (mptcp_addresses_equal(addr, &mpc_addr, addr->port)) | ||
61 | - msk->mpc_endpoint_id = addr->id; | ||
62 | - mptcp_pm_create_subflow_or_signal_addr(msk); | ||
63 | - spin_unlock_bh(&msk->pm.lock); | ||
64 | + mptcp_pm_param_set_contexts(¶m, NULL, addr); | ||
65 | + msk->pm.ops && msk->pm.ops->address_announced ? | ||
66 | + msk->pm.ops->address_announced(msk, ¶m) : | ||
67 | + mptcp_pm_nl_address_announced(msk, ¶m); | ||
68 | release_sock(sk); | ||
69 | |||
70 | next: | ||
71 | @@ -XXX,XX +XXX,XX @@ static struct pernet_operations mptcp_pm_pernet_ops = { | ||
72 | }; | ||
73 | |||
74 | static struct mptcp_pm_ops mptcp_netlink_pm = { | ||
75 | + .address_announced = mptcp_pm_nl_address_announced, | ||
76 | .get_local_id = mptcp_pm_nl_get_local_id, | ||
77 | .get_priority = mptcp_pm_nl_get_priority, | ||
78 | .type = MPTCP_PM_TYPE_KERNEL, | ||
79 | -- | ||
80 | 2.43.0 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
2 | 1 | ||
3 | Update the 2nd parameter of mptcp_pm_nl_address_removed(), and define it | ||
4 | as the address_removed() interface of the in-kernel netlink PM. | ||
5 | |||
6 | This interface is invoked under holding the msk socket lock. | ||
7 | |||
8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | ||
9 | --- | ||
10 | net/mptcp/pm_netlink.c | 10 ++++++++-- | ||
11 | 1 file changed, 8 insertions(+), 2 deletions(-) | ||
12 | |||
13 | diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/net/mptcp/pm_netlink.c | ||
16 | +++ b/net/mptcp/pm_netlink.c | ||
17 | @@ -XXX,XX +XXX,XX @@ static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id) | ||
18 | } | ||
19 | |||
20 | static int mptcp_pm_nl_address_removed(struct mptcp_sock *msk, | ||
21 | - const struct mptcp_pm_addr_entry *local) | ||
22 | + struct mptcp_pm_param *param) | ||
23 | { | ||
24 | + struct mptcp_pm_addr_entry *local = ¶m->entry; | ||
25 | bool remove_subflow; | ||
26 | |||
27 | remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, &local->addr); | ||
28 | @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net, | ||
29 | |||
30 | while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { | ||
31 | struct sock *sk = (struct sock *)msk; | ||
32 | + struct mptcp_pm_param param; | ||
33 | |||
34 | if (mptcp_pm_is_userspace(msk)) | ||
35 | goto next; | ||
36 | |||
37 | lock_sock(sk); | ||
38 | - mptcp_pm_nl_address_removed(msk, entry); | ||
39 | + mptcp_pm_param_set_contexts(¶m, entry, NULL); | ||
40 | + msk->pm.ops && msk->pm.ops->address_removed ? | ||
41 | + msk->pm.ops->address_removed(msk, ¶m) : | ||
42 | + mptcp_pm_nl_address_removed(msk, ¶m); | ||
43 | mptcp_pm_nl_subflow_closed(msk, entry); | ||
44 | release_sock(sk); | ||
45 | |||
46 | @@ -XXX,XX +XXX,XX @@ static struct pernet_operations mptcp_pm_pernet_ops = { | ||
47 | |||
48 | static struct mptcp_pm_ops mptcp_netlink_pm = { | ||
49 | .address_announced = mptcp_pm_nl_address_announced, | ||
50 | + .address_removed = mptcp_pm_nl_address_removed, | ||
51 | .get_local_id = mptcp_pm_nl_get_local_id, | ||
52 | .get_priority = mptcp_pm_nl_get_priority, | ||
53 | .type = MPTCP_PM_TYPE_KERNEL, | ||
54 | -- | ||
55 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Extract subflow_established() interface of the userspace PM from the | 3 | The remote address of set_flags() interface is useful for userspace PM, |
4 | handler of netlink command MPTCP_PM_CMD_SUBFLOW_CREATE | 4 | but unused in in-kernel PM. |
5 | 5 | ||
6 | mptcp_pm_nl_subflow_create_doit(), | 6 | But an additional "changed" parameter needs to be passed to set_flags() of |
7 | in-kernel PM. One option is to add a "u8 changed" parameter to set_flags() | ||
8 | interface: | ||
7 | 9 | ||
8 | only leave the code for obtaining msk through "info", parsing local address | 10 | set_flags(struct mptcp_pm_addr_entry *local, |
9 | entry and parsing remote address info in the handler. | 11 | struct mptcp_addr_info *remote, |
12 | u8 changed) | ||
10 | 13 | ||
11 | This interface is invoked under holding the msk socket lock. | 14 | A better option is to add a struct mptcp_pm_addr_entry "remote" parameter |
15 | for set_flags(), so that "remote->addr" can be used for userspace PM, and | ||
16 | "remote->flags" can be used for in-kernel PM to replace the additional | ||
17 | "changed" parameter. | ||
12 | 18 | ||
13 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 19 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
14 | --- | 20 | --- |
15 | net/mptcp/pm_userspace.c | 54 +++++++++++++++++++++++++--------------- | 21 | net/mptcp/pm.c | 20 ++++++++++++++++---- |
16 | 1 file changed, 34 insertions(+), 20 deletions(-) | 22 | net/mptcp/pm_netlink.c | 1 + |
23 | net/mptcp/pm_userspace.c | 21 +++------------------ | ||
24 | net/mptcp/protocol.h | 2 ++ | ||
25 | 4 files changed, 22 insertions(+), 22 deletions(-) | ||
17 | 26 | ||
27 | diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c | ||
28 | index XXXXXXX..XXXXXXX 100644 | ||
29 | --- a/net/mptcp/pm.c | ||
30 | +++ b/net/mptcp/pm.c | ||
31 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg, | ||
32 | static int mptcp_pm_set_flags(struct genl_info *info) | ||
33 | { | ||
34 | struct mptcp_pm_addr_entry loc = { .addr = { .family = AF_UNSPEC }, }; | ||
35 | - struct nlattr *attr_loc; | ||
36 | + struct mptcp_pm_addr_entry rem = { .addr = { .family = AF_UNSPEC }, }; | ||
37 | + struct nlattr *attr_loc, *attr_rem; | ||
38 | int ret = -EINVAL; | ||
39 | |||
40 | if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR)) | ||
41 | @@ -XXX,XX +XXX,XX @@ static int mptcp_pm_set_flags(struct genl_info *info) | ||
42 | if (ret < 0) | ||
43 | return ret; | ||
44 | |||
45 | - if (info->attrs[MPTCP_PM_ATTR_TOKEN]) | ||
46 | - return mptcp_userspace_pm_set_flags(&loc, info); | ||
47 | - return mptcp_pm_nl_set_flags(&loc, info); | ||
48 | + if (info->attrs[MPTCP_PM_ATTR_TOKEN]) { | ||
49 | + attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; | ||
50 | + ret = mptcp_pm_parse_entry(attr_rem, info, false, &rem); | ||
51 | + if (ret < 0) | ||
52 | + return ret; | ||
53 | + | ||
54 | + if (rem.addr.family == AF_UNSPEC) { | ||
55 | + NL_SET_ERR_MSG_ATTR(info->extack, attr_rem, | ||
56 | + "invalid remote address family"); | ||
57 | + return -EINVAL; | ||
58 | + } | ||
59 | + return mptcp_userspace_pm_set_flags(&loc, &rem, info); | ||
60 | + } | ||
61 | + return mptcp_pm_nl_set_flags(&loc, &rem, info); | ||
62 | } | ||
63 | |||
64 | int mptcp_pm_nl_set_flags_doit(struct sk_buff *skb, struct genl_info *info) | ||
65 | diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c | ||
66 | index XXXXXXX..XXXXXXX 100644 | ||
67 | --- a/net/mptcp/pm_netlink.c | ||
68 | +++ b/net/mptcp/pm_netlink.c | ||
69 | @@ -XXX,XX +XXX,XX @@ static void mptcp_nl_set_flags(struct net *net, | ||
70 | } | ||
71 | |||
72 | int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local, | ||
73 | + struct mptcp_pm_addr_entry *remote, | ||
74 | struct genl_info *info) | ||
75 | { | ||
76 | struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; | ||
18 | diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c | 77 | diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c |
19 | index XXXXXXX..XXXXXXX 100644 | 78 | index XXXXXXX..XXXXXXX 100644 |
20 | --- a/net/mptcp/pm_userspace.c | 79 | --- a/net/mptcp/pm_userspace.c |
21 | +++ b/net/mptcp/pm_userspace.c | 80 | +++ b/net/mptcp/pm_userspace.c |
22 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info) | 81 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info |
23 | return err; | ||
24 | } | 82 | } |
25 | 83 | ||
26 | +static int mptcp_userspace_pm_subflow_established(struct mptcp_sock *msk, | 84 | int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local, |
27 | + struct mptcp_pm_param *param) | 85 | + struct mptcp_pm_addr_entry *remote, |
28 | +{ | 86 | struct genl_info *info) |
29 | + struct mptcp_pm_addr_entry *entry = ¶m->entry; | ||
30 | + struct mptcp_addr_info *remote = ¶m->addr; | ||
31 | + struct sock *sk = (struct sock *)msk; | ||
32 | + struct mptcp_pm_local local; | ||
33 | + int err; | ||
34 | + | ||
35 | + err = mptcp_userspace_pm_append_new_local_addr(msk, entry, false); | ||
36 | + if (err < 0) | ||
37 | + return err; | ||
38 | + | ||
39 | + local.addr = entry->addr; | ||
40 | + local.flags = entry->flags; | ||
41 | + local.ifindex = entry->ifindex; | ||
42 | + | ||
43 | + err = __mptcp_subflow_connect(sk, &local, remote); | ||
44 | + spin_lock_bh(&msk->pm.lock); | ||
45 | + if (err) | ||
46 | + mptcp_userspace_pm_delete_local_addr(msk, entry); | ||
47 | + else | ||
48 | + msk->pm.subflows++; | ||
49 | + spin_unlock_bh(&msk->pm.lock); | ||
50 | + | ||
51 | + return err; | ||
52 | +} | ||
53 | + | ||
54 | int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info) | ||
55 | { | 87 | { |
56 | struct mptcp_pm_addr_entry entry = { 0 }; | 88 | - struct mptcp_addr_info rem = { .family = AF_UNSPEC, }; |
57 | struct mptcp_addr_info addr_r; | 89 | struct mptcp_pm_addr_entry *entry; |
58 | struct nlattr *raddr, *laddr; | 90 | - struct nlattr *attr, *attr_rem; |
59 | - struct mptcp_pm_local local; | ||
60 | + struct mptcp_pm_param param; | ||
61 | struct mptcp_sock *msk; | 91 | struct mptcp_sock *msk; |
62 | int err = -EINVAL; | 92 | + struct nlattr *attr; |
93 | int ret = -EINVAL; | ||
63 | struct sock *sk; | 94 | struct sock *sk; |
64 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info) | 95 | u8 bkup = 0; |
65 | goto create_err; | 96 | |
97 | - if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE)) | ||
98 | - return ret; | ||
99 | - | ||
100 | msk = mptcp_userspace_pm_get_sock(info); | ||
101 | if (!msk) | ||
102 | return ret; | ||
103 | @@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local, | ||
104 | goto set_flags_err; | ||
66 | } | 105 | } |
67 | 106 | ||
68 | - err = mptcp_userspace_pm_append_new_local_addr(msk, &entry, false); | 107 | - attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; |
69 | - if (err < 0) { | 108 | - ret = mptcp_pm_parse_addr(attr_rem, info, &rem); |
70 | - NL_SET_ERR_MSG_ATTR(info->extack, laddr, | 109 | - if (ret < 0) |
71 | - "did not match address and id"); | 110 | - goto set_flags_err; |
72 | - goto create_err; | 111 | - |
112 | - if (rem.family == AF_UNSPEC) { | ||
113 | - NL_SET_ERR_MSG_ATTR(info->extack, attr_rem, | ||
114 | - "invalid remote address family"); | ||
115 | - ret = -EINVAL; | ||
116 | - goto set_flags_err; | ||
73 | - } | 117 | - } |
74 | - | 118 | - |
75 | - local.addr = entry.addr; | 119 | if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP) |
76 | - local.flags = entry.flags; | 120 | bkup = 1; |
77 | - local.ifindex = entry.ifindex; | 121 | |
78 | - | 122 | @@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local, |
123 | spin_unlock_bh(&msk->pm.lock); | ||
124 | |||
79 | lock_sock(sk); | 125 | lock_sock(sk); |
80 | - err = __mptcp_subflow_connect(sk, &local, &addr_r); | 126 | - ret = mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, &rem, bkup); |
81 | + mptcp_pm_param_set_contexts(¶m, &entry, &addr_r); | 127 | + ret = mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, &remote->addr, bkup); |
82 | + err = msk->pm.ops && msk->pm.ops->subflow_established ? | ||
83 | + msk->pm.ops->subflow_established(msk, ¶m) : | ||
84 | + mptcp_userspace_pm_subflow_established(msk, ¶m); | ||
85 | release_sock(sk); | 128 | release_sock(sk); |
86 | 129 | ||
87 | if (err) | 130 | /* mptcp_pm_nl_mp_prio_send_ack() only fails in one case */ |
88 | GENL_SET_ERR_MSG_FMT(info, "connect error: %d", err); | 131 | diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h |
89 | 132 | index XXXXXXX..XXXXXXX 100644 | |
90 | - spin_lock_bh(&msk->pm.lock); | 133 | --- a/net/mptcp/protocol.h |
91 | - if (err) | 134 | +++ b/net/mptcp/protocol.h |
92 | - mptcp_userspace_pm_delete_local_addr(msk, &entry); | 135 | @@ -XXX,XX +XXX,XX @@ bool mptcp_lookup_subflow_by_saddr(const struct list_head *list, |
93 | - else | 136 | bool mptcp_remove_anno_list_by_saddr(struct mptcp_sock *msk, |
94 | - msk->pm.subflows++; | 137 | const struct mptcp_addr_info *addr); |
95 | - spin_unlock_bh(&msk->pm.lock); | 138 | int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local, |
96 | - | 139 | + struct mptcp_pm_addr_entry *remote, |
97 | create_err: | 140 | struct genl_info *info); |
98 | sock_put(sk); | 141 | int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local, |
99 | return err; | 142 | + struct mptcp_pm_addr_entry *remote, |
100 | @@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr, | 143 | struct genl_info *info); |
101 | static struct mptcp_pm_ops mptcp_userspace_pm = { | 144 | int mptcp_pm_announce_addr(struct mptcp_sock *msk, |
102 | .address_announced = mptcp_userspace_pm_address_announced, | 145 | const struct mptcp_addr_info *addr, |
103 | .address_removed = mptcp_userspace_pm_address_removed, | ||
104 | + .subflow_established = mptcp_userspace_pm_subflow_established, | ||
105 | .get_local_id = mptcp_userspace_pm_get_local_id, | ||
106 | .get_priority = mptcp_userspace_pm_get_priority, | ||
107 | .type = MPTCP_PM_TYPE_USERSPACE, | ||
108 | -- | 146 | -- |
109 | 2.43.0 | 147 | 2.43.0 | diff view generated by jsdifflib |
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | 1 | From: Geliang Tang <tanggeliang@kylinos.cn> |
---|---|---|---|
2 | 2 | ||
3 | Update the 2nd parameter of mptcp_pm_nl_subflow_closed(), and define it | 3 | To drop the additional "changed" parameter of mptcp_nl_set_flags(), |
4 | as the subflow_closed() interface of the in-kernel netlink PM. | 4 | store "entry->flags" to "remote->flags" before modifying it in |
5 | 5 | mptcp_pm_nl_set_flags(), so that "changed" value can be obtained by | |
6 | This interface is invoked under holding the msk socket lock. | 6 | comparing "local->flags" and "remote->flags" in mptcp_nl_set_flags(). |
7 | 7 | ||
8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | 8 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> |
9 | --- | 9 | --- |
10 | net/mptcp/pm_netlink.c | 8 ++++++-- | 10 | net/mptcp/pm_netlink.c | 8 ++++++-- |
11 | 1 file changed, 6 insertions(+), 2 deletions(-) | 11 | 1 file changed, 6 insertions(+), 2 deletions(-) |
12 | 12 | ||
13 | diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c | 13 | diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c |
14 | index XXXXXXX..XXXXXXX 100644 | 14 | index XXXXXXX..XXXXXXX 100644 |
15 | --- a/net/mptcp/pm_netlink.c | 15 | --- a/net/mptcp/pm_netlink.c |
16 | +++ b/net/mptcp/pm_netlink.c | 16 | +++ b/net/mptcp/pm_netlink.c |
17 | @@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_address_removed(struct mptcp_sock *msk, | 17 | @@ -XXX,XX +XXX,XX @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk, |
18 | |||
19 | static void mptcp_nl_set_flags(struct net *net, | ||
20 | struct mptcp_pm_addr_entry *local, | ||
21 | - u8 changed) | ||
22 | + struct mptcp_pm_addr_entry *remote) | ||
23 | { | ||
24 | u8 is_subflow = !!(local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW); | ||
25 | u8 bkup = !!(local->flags & MPTCP_PM_ADDR_FLAG_BACKUP); | ||
26 | + u8 changed, mask = MPTCP_PM_ADDR_FLAG_BACKUP | | ||
27 | + MPTCP_PM_ADDR_FLAG_FULLMESH; | ||
28 | long s_slot = 0, s_num = 0; | ||
29 | struct mptcp_sock *msk; | ||
30 | |||
31 | + changed = (local->flags ^ remote->flags) & mask; | ||
32 | if (changed == MPTCP_PM_ADDR_FLAG_FULLMESH && !is_subflow) | ||
33 | return; | ||
34 | |||
35 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local, | ||
36 | return -EINVAL; | ||
37 | } | ||
38 | |||
39 | + remote->flags = entry->flags; | ||
40 | changed = (local->flags ^ entry->flags) & mask; | ||
41 | entry->flags = (entry->flags & ~mask) | (local->flags & mask); | ||
42 | *local = *entry; | ||
43 | spin_unlock_bh(&pernet->lock); | ||
44 | |||
45 | - mptcp_nl_set_flags(net, local, changed); | ||
46 | + mptcp_nl_set_flags(net, local, remote); | ||
47 | return 0; | ||
18 | } | 48 | } |
19 | 49 | ||
20 | static int mptcp_pm_nl_subflow_closed(struct mptcp_sock *msk, | ||
21 | - const struct mptcp_pm_addr_entry *local) | ||
22 | + struct mptcp_pm_param *param) | ||
23 | { | ||
24 | + struct mptcp_pm_addr_entry *local = ¶m->entry; | ||
25 | struct mptcp_rm_list list = { .nr = 1 }; | ||
26 | bool remove_subflow; | ||
27 | |||
28 | @@ -XXX,XX +XXX,XX @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net, | ||
29 | msk->pm.ops && msk->pm.ops->address_removed ? | ||
30 | msk->pm.ops->address_removed(msk, ¶m) : | ||
31 | mptcp_pm_nl_address_removed(msk, ¶m); | ||
32 | - mptcp_pm_nl_subflow_closed(msk, entry); | ||
33 | + msk->pm.ops && msk->pm.ops->subflow_closed ? | ||
34 | + msk->pm.ops->subflow_closed(msk, ¶m) : | ||
35 | + mptcp_pm_nl_subflow_closed(msk, ¶m); | ||
36 | release_sock(sk); | ||
37 | |||
38 | next: | ||
39 | @@ -XXX,XX +XXX,XX @@ static struct mptcp_pm_ops mptcp_netlink_pm = { | ||
40 | .address_announced = mptcp_pm_nl_address_announced, | ||
41 | .address_removed = mptcp_pm_nl_address_removed, | ||
42 | .subflow_established = mptcp_pm_nl_subflow_established, | ||
43 | + .subflow_closed = mptcp_pm_nl_subflow_closed, | ||
44 | .get_local_id = mptcp_pm_nl_get_local_id, | ||
45 | .get_priority = mptcp_pm_nl_get_priority, | ||
46 | .type = MPTCP_PM_TYPE_KERNEL, | ||
47 | -- | 50 | -- |
48 | 2.43.0 | 51 | 2.43.0 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | From: Geliang Tang <tanggeliang@kylinos.cn> | ||
2 | 1 | ||
3 | Extract address_announced() interface of the userspace PM from the handler | ||
4 | of netlink command MPTCP_PM_CMD_ANNOUNCE mptcp_pm_nl_announce_doit(), only | ||
5 | leave the code for obtaining msk through "info" and parsing address entry | ||
6 | in the handler. | ||
7 | |||
8 | This interface is invoked under holding the msk socket lock. | ||
9 | |||
10 | Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> | ||
11 | --- | ||
12 | net/mptcp/pm_userspace.c | 49 ++++++++++++++++++++++++++-------------- | ||
13 | 1 file changed, 32 insertions(+), 17 deletions(-) | ||
14 | |||
15 | diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c | ||
16 | index XXXXXXX..XXXXXXX 100644 | ||
17 | --- a/net/mptcp/pm_userspace.c | ||
18 | +++ b/net/mptcp/pm_userspace.c | ||
19 | @@ -XXX,XX +XXX,XX @@ static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *in | ||
20 | return msk; | ||
21 | } | ||
22 | |||
23 | +static int mptcp_userspace_pm_address_announced(struct mptcp_sock *msk, | ||
24 | + struct mptcp_pm_param *param) | ||
25 | +{ | ||
26 | + struct mptcp_pm_addr_entry *local = ¶m->entry; | ||
27 | + int err; | ||
28 | + | ||
29 | + err = mptcp_userspace_pm_append_new_local_addr(msk, local, false); | ||
30 | + if (err < 0) | ||
31 | + return err; | ||
32 | + | ||
33 | + spin_lock_bh(&msk->pm.lock); | ||
34 | + | ||
35 | + if (mptcp_pm_alloc_anno_list(msk, &local->addr)) { | ||
36 | + msk->pm.add_addr_signaled++; | ||
37 | + mptcp_pm_announce_addr(msk, &local->addr, false); | ||
38 | + mptcp_pm_nl_addr_send_ack(msk); | ||
39 | + } | ||
40 | + | ||
41 | + spin_unlock_bh(&msk->pm.lock); | ||
42 | + | ||
43 | + return 0; | ||
44 | +} | ||
45 | + | ||
46 | int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info) | ||
47 | { | ||
48 | struct mptcp_pm_addr_entry addr_val; | ||
49 | + struct mptcp_pm_param param; | ||
50 | struct mptcp_sock *msk; | ||
51 | struct nlattr *addr; | ||
52 | int err = -EINVAL; | ||
53 | @@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info) | ||
54 | goto announce_err; | ||
55 | } | ||
56 | |||
57 | - err = mptcp_userspace_pm_append_new_local_addr(msk, &addr_val, false); | ||
58 | - if (err < 0) { | ||
59 | - NL_SET_ERR_MSG_ATTR(info->extack, addr, | ||
60 | - "did not match address and id"); | ||
61 | - goto announce_err; | ||
62 | - } | ||
63 | - | ||
64 | lock_sock(sk); | ||
65 | - spin_lock_bh(&msk->pm.lock); | ||
66 | - | ||
67 | - if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr)) { | ||
68 | - msk->pm.add_addr_signaled++; | ||
69 | - mptcp_pm_announce_addr(msk, &addr_val.addr, false); | ||
70 | - mptcp_pm_nl_addr_send_ack(msk); | ||
71 | - } | ||
72 | - | ||
73 | - spin_unlock_bh(&msk->pm.lock); | ||
74 | + mptcp_pm_param_set_contexts(¶m, &addr_val, NULL); | ||
75 | + err = msk->pm.ops && msk->pm.ops->address_announced ? | ||
76 | + msk->pm.ops->address_announced(msk, ¶m) : | ||
77 | + mptcp_userspace_pm_address_announced(msk, ¶m); | ||
78 | release_sock(sk); | ||
79 | + if (err) | ||
80 | + NL_SET_ERR_MSG_ATTR(info->extack, addr, | ||
81 | + "did not match address and id"); | ||
82 | |||
83 | - err = 0; | ||
84 | announce_err: | ||
85 | sock_put(sk); | ||
86 | return err; | ||
87 | @@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr, | ||
88 | } | ||
89 | |||
90 | static struct mptcp_pm_ops mptcp_userspace_pm = { | ||
91 | + .address_announced = mptcp_userspace_pm_address_announced, | ||
92 | .get_local_id = mptcp_userspace_pm_get_local_id, | ||
93 | .get_priority = mptcp_userspace_pm_get_priority, | ||
94 | .type = MPTCP_PM_TYPE_USERSPACE, | ||
95 | -- | ||
96 | 2.43.0 | diff view generated by jsdifflib |