mptcp: build ADD_ADDR/echo-ADD_ADDR option according pm.add_signal
[linux-2.6-microblaze.git] / net / mptcp / pm.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Multipath TCP
3  *
4  * Copyright (c) 2019, Intel Corporation.
5  */
6 #define pr_fmt(fmt) "MPTCP: " fmt
7
8 #include <linux/kernel.h>
9 #include <net/tcp.h>
10 #include <net/mptcp.h>
11 #include "protocol.h"
12
13 #include "mib.h"
14
15 /* path manager command handlers */
16
17 int mptcp_pm_announce_addr(struct mptcp_sock *msk,
18                            const struct mptcp_addr_info *addr,
19                            bool echo)
20 {
21         u8 add_addr = READ_ONCE(msk->pm.addr_signal);
22
23         pr_debug("msk=%p, local_id=%d, echo=%d", msk, addr->id, echo);
24
25         lockdep_assert_held(&msk->pm.lock);
26
27         if (add_addr &
28             (echo ? BIT(MPTCP_ADD_ADDR_ECHO) : BIT(MPTCP_ADD_ADDR_SIGNAL))) {
29                 pr_warn("addr_signal error, add_addr=%d, echo=%d", add_addr, echo);
30                 return -EINVAL;
31         }
32
33         if (echo) {
34                 msk->pm.remote = *addr;
35                 add_addr |= BIT(MPTCP_ADD_ADDR_ECHO);
36         } else {
37                 msk->pm.local = *addr;
38                 add_addr |= BIT(MPTCP_ADD_ADDR_SIGNAL);
39         }
40         if (addr->family == AF_INET6)
41                 add_addr |= BIT(MPTCP_ADD_ADDR_IPV6);
42         if (addr->port)
43                 add_addr |= BIT(MPTCP_ADD_ADDR_PORT);
44         WRITE_ONCE(msk->pm.addr_signal, add_addr);
45         return 0;
46 }
47
48 int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list)
49 {
50         u8 rm_addr = READ_ONCE(msk->pm.addr_signal);
51
52         pr_debug("msk=%p, rm_list_nr=%d", msk, rm_list->nr);
53
54         if (rm_addr) {
55                 pr_warn("addr_signal error, rm_addr=%d", rm_addr);
56                 return -EINVAL;
57         }
58
59         msk->pm.rm_list_tx = *rm_list;
60         rm_addr |= BIT(MPTCP_RM_ADDR_SIGNAL);
61         WRITE_ONCE(msk->pm.addr_signal, rm_addr);
62         mptcp_pm_nl_addr_send_ack(msk);
63         return 0;
64 }
65
66 int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list)
67 {
68         pr_debug("msk=%p, rm_list_nr=%d", msk, rm_list->nr);
69
70         spin_lock_bh(&msk->pm.lock);
71         mptcp_pm_nl_rm_subflow_received(msk, rm_list);
72         spin_unlock_bh(&msk->pm.lock);
73         return 0;
74 }
75
76 /* path manager event handlers */
77
78 void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int server_side)
79 {
80         struct mptcp_pm_data *pm = &msk->pm;
81
82         pr_debug("msk=%p, token=%u side=%d", msk, msk->token, server_side);
83
84         WRITE_ONCE(pm->server_side, server_side);
85         mptcp_event(MPTCP_EVENT_CREATED, msk, ssk, GFP_ATOMIC);
86 }
87
88 bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk)
89 {
90         struct mptcp_pm_data *pm = &msk->pm;
91         unsigned int subflows_max;
92         int ret = 0;
93
94         subflows_max = mptcp_pm_get_subflows_max(msk);
95
96         pr_debug("msk=%p subflows=%d max=%d allow=%d", msk, pm->subflows,
97                  subflows_max, READ_ONCE(pm->accept_subflow));
98
99         /* try to avoid acquiring the lock below */
100         if (!READ_ONCE(pm->accept_subflow))
101                 return false;
102
103         spin_lock_bh(&pm->lock);
104         if (READ_ONCE(pm->accept_subflow)) {
105                 ret = pm->subflows < subflows_max;
106                 if (ret && ++pm->subflows == subflows_max)
107                         WRITE_ONCE(pm->accept_subflow, false);
108         }
109         spin_unlock_bh(&pm->lock);
110
111         return ret;
112 }
113
114 /* return true if the new status bit is currently cleared, that is, this event
115  * can be server, eventually by an already scheduled work
116  */
117 static bool mptcp_pm_schedule_work(struct mptcp_sock *msk,
118                                    enum mptcp_pm_status new_status)
119 {
120         pr_debug("msk=%p status=%x new=%lx", msk, msk->pm.status,
121                  BIT(new_status));
122         if (msk->pm.status & BIT(new_status))
123                 return false;
124
125         msk->pm.status |= BIT(new_status);
126         mptcp_schedule_work((struct sock *)msk);
127         return true;
128 }
129
130 void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp)
131 {
132         struct mptcp_pm_data *pm = &msk->pm;
133         bool announce = false;
134
135         pr_debug("msk=%p", msk);
136
137         spin_lock_bh(&pm->lock);
138
139         /* mptcp_pm_fully_established() can be invoked by multiple
140          * racing paths - accept() and check_fully_established()
141          * be sure to serve this event only once.
142          */
143         if (READ_ONCE(pm->work_pending) &&
144             !(msk->pm.status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)))
145                 mptcp_pm_schedule_work(msk, MPTCP_PM_ESTABLISHED);
146
147         if ((msk->pm.status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)) == 0)
148                 announce = true;
149
150         msk->pm.status |= BIT(MPTCP_PM_ALREADY_ESTABLISHED);
151         spin_unlock_bh(&pm->lock);
152
153         if (announce)
154                 mptcp_event(MPTCP_EVENT_ESTABLISHED, msk, ssk, gfp);
155 }
156
157 void mptcp_pm_connection_closed(struct mptcp_sock *msk)
158 {
159         pr_debug("msk=%p", msk);
160 }
161
162 void mptcp_pm_subflow_established(struct mptcp_sock *msk)
163 {
164         struct mptcp_pm_data *pm = &msk->pm;
165
166         pr_debug("msk=%p", msk);
167
168         if (!READ_ONCE(pm->work_pending))
169                 return;
170
171         spin_lock_bh(&pm->lock);
172
173         if (READ_ONCE(pm->work_pending))
174                 mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED);
175
176         spin_unlock_bh(&pm->lock);
177 }
178
179 void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id)
180 {
181         pr_debug("msk=%p", msk);
182 }
183
184 void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
185                                 const struct mptcp_addr_info *addr)
186 {
187         struct mptcp_pm_data *pm = &msk->pm;
188
189         pr_debug("msk=%p remote_id=%d accept=%d", msk, addr->id,
190                  READ_ONCE(pm->accept_addr));
191
192         mptcp_event_addr_announced(msk, addr);
193
194         spin_lock_bh(&pm->lock);
195
196         if (!READ_ONCE(pm->accept_addr)) {
197                 mptcp_pm_announce_addr(msk, addr, true);
198                 mptcp_pm_add_addr_send_ack(msk);
199         } else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
200                 pm->remote = *addr;
201         }
202
203         spin_unlock_bh(&pm->lock);
204 }
205
206 void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
207                               struct mptcp_addr_info *addr)
208 {
209         struct mptcp_pm_data *pm = &msk->pm;
210
211         pr_debug("msk=%p", msk);
212
213         spin_lock_bh(&pm->lock);
214
215         if (mptcp_lookup_anno_list_by_saddr(msk, addr) && READ_ONCE(pm->work_pending))
216                 mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED);
217
218         spin_unlock_bh(&pm->lock);
219 }
220
221 void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk)
222 {
223         if (!mptcp_pm_should_add_signal(msk))
224                 return;
225
226         mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_SEND_ACK);
227 }
228
229 void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
230                                const struct mptcp_rm_list *rm_list)
231 {
232         struct mptcp_pm_data *pm = &msk->pm;
233         u8 i;
234
235         pr_debug("msk=%p remote_ids_nr=%d", msk, rm_list->nr);
236
237         for (i = 0; i < rm_list->nr; i++)
238                 mptcp_event_addr_removed(msk, rm_list->ids[i]);
239
240         spin_lock_bh(&pm->lock);
241         mptcp_pm_schedule_work(msk, MPTCP_PM_RM_ADDR_RECEIVED);
242         pm->rm_list_rx = *rm_list;
243         spin_unlock_bh(&pm->lock);
244 }
245
246 void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup)
247 {
248         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
249
250         pr_debug("subflow->backup=%d, bkup=%d\n", subflow->backup, bkup);
251         subflow->backup = bkup;
252
253         mptcp_event(MPTCP_EVENT_SUB_PRIORITY, mptcp_sk(subflow->conn), sk, GFP_ATOMIC);
254 }
255
256 /* path manager helpers */
257
258 bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, struct sk_buff *skb,
259                               unsigned int opt_size, unsigned int remaining,
260                               struct mptcp_addr_info *addr, bool *echo,
261                               bool *port, bool *drop_other_suboptions)
262 {
263         int ret = false;
264         u8 add_addr;
265         u8 family;
266
267         spin_lock_bh(&msk->pm.lock);
268
269         /* double check after the lock is acquired */
270         if (!mptcp_pm_should_add_signal(msk))
271                 goto out_unlock;
272
273         /* always drop every other options for pure ack ADD_ADDR; this is a
274          * plain dup-ack from TCP perspective. The other MPTCP-relevant info,
275          * if any, will be carried by the 'original' TCP ack
276          */
277         if (skb && skb_is_tcp_pure_ack(skb)) {
278                 remaining += opt_size;
279                 *drop_other_suboptions = true;
280         }
281
282         *echo = mptcp_pm_should_add_signal_echo(msk);
283         *port = mptcp_pm_should_add_signal_port(msk);
284
285         family = *echo ? msk->pm.remote.family : msk->pm.local.family;
286         if (remaining < mptcp_add_addr_len(family, *echo, *port))
287                 goto out_unlock;
288
289         if (*echo) {
290                 *addr = msk->pm.remote;
291                 add_addr = msk->pm.addr_signal & ~BIT(MPTCP_ADD_ADDR_ECHO);
292         } else {
293                 *addr = msk->pm.local;
294                 add_addr = msk->pm.addr_signal & ~BIT(MPTCP_ADD_ADDR_SIGNAL);
295         }
296         WRITE_ONCE(msk->pm.addr_signal, add_addr);
297         ret = true;
298
299 out_unlock:
300         spin_unlock_bh(&msk->pm.lock);
301         return ret;
302 }
303
304 bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
305                              struct mptcp_rm_list *rm_list)
306 {
307         int ret = false, len;
308         u8 rm_addr;
309
310         spin_lock_bh(&msk->pm.lock);
311
312         /* double check after the lock is acquired */
313         if (!mptcp_pm_should_rm_signal(msk))
314                 goto out_unlock;
315
316         rm_addr = msk->pm.addr_signal & ~BIT(MPTCP_RM_ADDR_SIGNAL);
317         len = mptcp_rm_addr_len(&msk->pm.rm_list_tx);
318         if (len < 0) {
319                 WRITE_ONCE(msk->pm.addr_signal, rm_addr);
320                 goto out_unlock;
321         }
322         if (remaining < len)
323                 goto out_unlock;
324
325         *rm_list = msk->pm.rm_list_tx;
326         WRITE_ONCE(msk->pm.addr_signal, rm_addr);
327         ret = true;
328
329 out_unlock:
330         spin_unlock_bh(&msk->pm.lock);
331         return ret;
332 }
333
334 int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
335 {
336         return mptcp_pm_nl_get_local_id(msk, skc);
337 }
338
339 void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk)
340 {
341         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
342         u32 rcv_tstamp = READ_ONCE(tcp_sk(ssk)->rcv_tstamp);
343
344         /* keep track of rtx periods with no progress */
345         if (!subflow->stale_count) {
346                 subflow->stale_rcv_tstamp = rcv_tstamp;
347                 subflow->stale_count++;
348         } else if (subflow->stale_rcv_tstamp == rcv_tstamp) {
349                 if (subflow->stale_count < U8_MAX)
350                         subflow->stale_count++;
351                 mptcp_pm_nl_subflow_chk_stale(msk, ssk);
352         } else {
353                 subflow->stale_count = 0;
354                 mptcp_subflow_set_active(subflow);
355         }
356 }
357
358 void mptcp_pm_data_init(struct mptcp_sock *msk)
359 {
360         msk->pm.add_addr_signaled = 0;
361         msk->pm.add_addr_accepted = 0;
362         msk->pm.local_addr_used = 0;
363         msk->pm.subflows = 0;
364         msk->pm.rm_list_tx.nr = 0;
365         msk->pm.rm_list_rx.nr = 0;
366         WRITE_ONCE(msk->pm.work_pending, false);
367         WRITE_ONCE(msk->pm.addr_signal, 0);
368         WRITE_ONCE(msk->pm.accept_addr, false);
369         WRITE_ONCE(msk->pm.accept_subflow, false);
370         WRITE_ONCE(msk->pm.remote_deny_join_id0, false);
371         msk->pm.status = 0;
372
373         spin_lock_init(&msk->pm.lock);
374         INIT_LIST_HEAD(&msk->pm.anno_list);
375
376         mptcp_pm_nl_data_init(msk);
377 }
378
379 void __init mptcp_pm_init(void)
380 {
381         mptcp_pm_nl_init();
382 }