protocol.c (fd49e8ee70b306a003323a17bbcc0633f322c135) protocol.c (6477dd39e62c3a67cfa368ddc127410b4ae424c6)
1// SPDX-License-Identifier: GPL-2.0
2/* Multipath TCP
3 *
4 * Copyright (c) 2017 - 2019, Intel Corporation.
5 */
6
7#define pr_fmt(fmt) "MPTCP: " fmt
8
9#include <linux/kernel.h>
10#include <linux/module.h>
11#include <linux/netdevice.h>
12#include <linux/sched/signal.h>
13#include <linux/atomic.h>
1// SPDX-License-Identifier: GPL-2.0
2/* Multipath TCP
3 *
4 * Copyright (c) 2017 - 2019, Intel Corporation.
5 */
6
7#define pr_fmt(fmt) "MPTCP: " fmt
8
9#include <linux/kernel.h>
10#include <linux/module.h>
11#include <linux/netdevice.h>
12#include <linux/sched/signal.h>
13#include <linux/atomic.h>
14#include <linux/igmp.h>
15#include <net/sock.h>
16#include <net/inet_common.h>
17#include <net/inet_hashtables.h>
18#include <net/protocol.h>
19#include <net/tcp.h>
20#include <net/tcp_states.h>
21#if IS_ENABLED(CONFIG_MPTCP_IPV6)
22#include <net/transp_v6.h>
14#include <net/sock.h>
15#include <net/inet_common.h>
16#include <net/inet_hashtables.h>
17#include <net/protocol.h>
18#include <net/tcp.h>
19#include <net/tcp_states.h>
20#if IS_ENABLED(CONFIG_MPTCP_IPV6)
21#include <net/transp_v6.h>
23#include <net/addrconf.h>
24#endif
25#include <net/mptcp.h>
26#include <net/xfrm.h>
27#include "protocol.h"
28#include "mib.h"
29
30#if IS_ENABLED(CONFIG_MPTCP_IPV6)
31struct mptcp6_sock {

--- 364 unchanged lines hidden (view full) ---

396
397 return true;
398 }
399 }
400
401 return false;
402}
403
22#endif
23#include <net/mptcp.h>
24#include <net/xfrm.h>
25#include "protocol.h"
26#include "mib.h"
27
28#if IS_ENABLED(CONFIG_MPTCP_IPV6)
29struct mptcp6_sock {

--- 364 unchanged lines hidden (view full) ---

394
395 return true;
396 }
397 }
398
399 return false;
400}
401
402static void mptcp_set_datafin_timeout(const struct sock *sk)
403{
404 struct inet_connection_sock *icsk = inet_csk(sk);
405
406 mptcp_sk(sk)->timer_ival = min(TCP_RTO_MAX,
407 TCP_RTO_MIN << icsk->icsk_retransmits);
408}
409
404static void mptcp_set_timeout(const struct sock *sk, const struct sock *ssk)
405{
406 long tout = ssk && inet_csk(ssk)->icsk_pending ?
407 inet_csk(ssk)->icsk_timeout - jiffies : 0;
408
409 if (tout <= 0)
410 tout = mptcp_sk(sk)->timer_ival;
411 mptcp_sk(sk)->timer_ival = tout > 0 ? tout : TCP_RTO_MIN;

--- 637 unchanged lines hidden (view full) ---

1049 if (cleaned) {
1050 if (tcp_under_memory_pressure(sk)) {
1051 __mptcp_update_wmem(sk);
1052 sk_mem_reclaim_partial(sk);
1053 }
1054 }
1055
1056 if (snd_una == READ_ONCE(msk->snd_nxt)) {
410static void mptcp_set_timeout(const struct sock *sk, const struct sock *ssk)
411{
412 long tout = ssk && inet_csk(ssk)->icsk_pending ?
413 inet_csk(ssk)->icsk_timeout - jiffies : 0;
414
415 if (tout <= 0)
416 tout = mptcp_sk(sk)->timer_ival;
417 mptcp_sk(sk)->timer_ival = tout > 0 ? tout : TCP_RTO_MIN;

--- 637 unchanged lines hidden (view full) ---

1055 if (cleaned) {
1056 if (tcp_under_memory_pressure(sk)) {
1057 __mptcp_update_wmem(sk);
1058 sk_mem_reclaim_partial(sk);
1059 }
1060 }
1061
1062 if (snd_una == READ_ONCE(msk->snd_nxt)) {
1057 if (msk->timer_ival)
1063 if (msk->timer_ival && !mptcp_data_fin_enabled(msk))
1058 mptcp_stop_timer(sk);
1059 } else {
1060 mptcp_reset_timer(sk);
1061 }
1062}
1063
1064static void __mptcp_clean_una_wakeup(struct sock *sk)
1065{

--- 1207 unchanged lines hidden (view full) ---

2273 struct mptcp_sendmsg_info info = {};
2274 struct mptcp_data_frag *dfrag;
2275 size_t copied = 0;
2276 struct sock *ssk;
2277 int ret;
2278
2279 __mptcp_clean_una_wakeup(sk);
2280 dfrag = mptcp_rtx_head(sk);
1064 mptcp_stop_timer(sk);
1065 } else {
1066 mptcp_reset_timer(sk);
1067 }
1068}
1069
1070static void __mptcp_clean_una_wakeup(struct sock *sk)
1071{

--- 1207 unchanged lines hidden (view full) ---

2279 struct mptcp_sendmsg_info info = {};
2280 struct mptcp_data_frag *dfrag;
2281 size_t copied = 0;
2282 struct sock *ssk;
2283 int ret;
2284
2285 __mptcp_clean_una_wakeup(sk);
2286 dfrag = mptcp_rtx_head(sk);
2281 if (!dfrag)
2287 if (!dfrag) {
2288 if (mptcp_data_fin_enabled(msk)) {
2289 struct inet_connection_sock *icsk = inet_csk(sk);
2290
2291 icsk->icsk_retransmits++;
2292 mptcp_set_datafin_timeout(sk);
2293 mptcp_send_ack(msk);
2294
2295 goto reset_timer;
2296 }
2297
2282 return;
2298 return;
2299 }
2283
2284 ssk = mptcp_subflow_get_retrans(msk);
2285 if (!ssk)
2286 goto reset_timer;
2287
2288 lock_sock(ssk);
2289
2290 /* limit retransmission to the bytes already sent on some subflows */

--- 166 unchanged lines hidden (view full) ---

2457 if (__mptcp_check_fallback(mptcp_sk(sk))) {
2458 pr_debug("Fallback");
2459 ssk->sk_shutdown |= how;
2460 tcp_shutdown(ssk, how);
2461 } else {
2462 pr_debug("Sending DATA_FIN on subflow %p", ssk);
2463 mptcp_set_timeout(sk, ssk);
2464 tcp_send_ack(ssk);
2300
2301 ssk = mptcp_subflow_get_retrans(msk);
2302 if (!ssk)
2303 goto reset_timer;
2304
2305 lock_sock(ssk);
2306
2307 /* limit retransmission to the bytes already sent on some subflows */

--- 166 unchanged lines hidden (view full) ---

2474 if (__mptcp_check_fallback(mptcp_sk(sk))) {
2475 pr_debug("Fallback");
2476 ssk->sk_shutdown |= how;
2477 tcp_shutdown(ssk, how);
2478 } else {
2479 pr_debug("Sending DATA_FIN on subflow %p", ssk);
2480 mptcp_set_timeout(sk, ssk);
2481 tcp_send_ack(ssk);
2482 if (!mptcp_timer_pending(sk))
2483 mptcp_reset_timer(sk);
2465 }
2466 break;
2467 }
2468
2469 release_sock(ssk);
2470}
2471
2472static const unsigned char new_state[16] = {

--- 400 unchanged lines hidden (view full) ---

2873
2874 release_sock(sk);
2875 break;
2876 }
2877
2878 return ret;
2879}
2880
2484 }
2485 break;
2486 }
2487
2488 release_sock(ssk);
2489}
2490
2491static const unsigned char new_state[16] = {

--- 400 unchanged lines hidden (view full) ---

2892
2893 release_sock(sk);
2894 break;
2895 }
2896
2897 return ret;
2898}
2899
2900static bool mptcp_unsupported(int level, int optname)
2901{
2902 if (level == SOL_IP) {
2903 switch (optname) {
2904 case IP_ADD_MEMBERSHIP:
2905 case IP_ADD_SOURCE_MEMBERSHIP:
2906 case IP_DROP_MEMBERSHIP:
2907 case IP_DROP_SOURCE_MEMBERSHIP:
2908 case IP_BLOCK_SOURCE:
2909 case IP_UNBLOCK_SOURCE:
2910 case MCAST_JOIN_GROUP:
2911 case MCAST_LEAVE_GROUP:
2912 case MCAST_JOIN_SOURCE_GROUP:
2913 case MCAST_LEAVE_SOURCE_GROUP:
2914 case MCAST_BLOCK_SOURCE:
2915 case MCAST_UNBLOCK_SOURCE:
2916 case MCAST_MSFILTER:
2917 return true;
2918 }
2919 return false;
2920 }
2921 if (level == SOL_IPV6) {
2922 switch (optname) {
2923 case IPV6_ADDRFORM:
2924 case IPV6_ADD_MEMBERSHIP:
2925 case IPV6_DROP_MEMBERSHIP:
2926 case IPV6_JOIN_ANYCAST:
2927 case IPV6_LEAVE_ANYCAST:
2928 case MCAST_JOIN_GROUP:
2929 case MCAST_LEAVE_GROUP:
2930 case MCAST_JOIN_SOURCE_GROUP:
2931 case MCAST_LEAVE_SOURCE_GROUP:
2932 case MCAST_BLOCK_SOURCE:
2933 case MCAST_UNBLOCK_SOURCE:
2934 case MCAST_MSFILTER:
2935 return true;
2936 }
2937 return false;
2938 }
2939 return false;
2940}
2941
2881static int mptcp_setsockopt(struct sock *sk, int level, int optname,
2882 sockptr_t optval, unsigned int optlen)
2883{
2884 struct mptcp_sock *msk = mptcp_sk(sk);
2885 struct sock *ssk;
2886
2887 pr_debug("msk=%p", msk);
2888
2942static int mptcp_setsockopt(struct sock *sk, int level, int optname,
2943 sockptr_t optval, unsigned int optlen)
2944{
2945 struct mptcp_sock *msk = mptcp_sk(sk);
2946 struct sock *ssk;
2947
2948 pr_debug("msk=%p", msk);
2949
2950 if (mptcp_unsupported(level, optname))
2951 return -ENOPROTOOPT;
2952
2889 if (level == SOL_SOCKET)
2890 return mptcp_setsockopt_sol_socket(msk, optname, optval, optlen);
2891
2892 /* @@ the meaning of setsockopt() when the socket is connected and
2893 * there are multiple subflows is not yet defined. It is up to the
2894 * MPTCP-level socket to configure the subflows until the subflow
2895 * is in TCP fallback, when TCP socket options are passed through
2896 * to the one remaining subflow.

--- 517 unchanged lines hidden (view full) ---

3414 /* This barrier is coupled with smp_wmb() in tcp_reset() */
3415 smp_rmb();
3416 if (sk->sk_err)
3417 mask |= EPOLLERR;
3418
3419 return mask;
3420}
3421
2953 if (level == SOL_SOCKET)
2954 return mptcp_setsockopt_sol_socket(msk, optname, optval, optlen);
2955
2956 /* @@ the meaning of setsockopt() when the socket is connected and
2957 * there are multiple subflows is not yet defined. It is up to the
2958 * MPTCP-level socket to configure the subflows until the subflow
2959 * is in TCP fallback, when TCP socket options are passed through
2960 * to the one remaining subflow.

--- 517 unchanged lines hidden (view full) ---

3478 /* This barrier is coupled with smp_wmb() in tcp_reset() */
3479 smp_rmb();
3480 if (sk->sk_err)
3481 mask |= EPOLLERR;
3482
3483 return mask;
3484}
3485
3422static int mptcp_release(struct socket *sock)
3423{
3424 struct mptcp_subflow_context *subflow;
3425 struct sock *sk = sock->sk;
3426 struct mptcp_sock *msk;
3427
3428 if (!sk)
3429 return 0;
3430
3431 lock_sock(sk);
3432
3433 msk = mptcp_sk(sk);
3434
3435 mptcp_for_each_subflow(msk, subflow) {
3436 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
3437
3438 ip_mc_drop_socket(ssk);
3439 }
3440
3441 release_sock(sk);
3442
3443 return inet_release(sock);
3444}
3445
3446static const struct proto_ops mptcp_stream_ops = {
3447 .family = PF_INET,
3448 .owner = THIS_MODULE,
3486static const struct proto_ops mptcp_stream_ops = {
3487 .family = PF_INET,
3488 .owner = THIS_MODULE,
3449 .release = mptcp_release,
3489 .release = inet_release,
3450 .bind = mptcp_bind,
3451 .connect = mptcp_stream_connect,
3452 .socketpair = sock_no_socketpair,
3453 .accept = mptcp_stream_accept,
3454 .getname = inet_getname,
3455 .poll = mptcp_poll,
3456 .ioctl = inet_ioctl,
3457 .gettstamp = sock_gettstamp,

--- 75 unchanged lines hidden (view full) ---

3533 panic("Failed to register MPTCP proto.\n");
3534
3535 inet_register_protosw(&mptcp_protosw);
3536
3537 BUILD_BUG_ON(sizeof(struct mptcp_skb_cb) > sizeof_field(struct sk_buff, cb));
3538}
3539
3540#if IS_ENABLED(CONFIG_MPTCP_IPV6)
3490 .bind = mptcp_bind,
3491 .connect = mptcp_stream_connect,
3492 .socketpair = sock_no_socketpair,
3493 .accept = mptcp_stream_accept,
3494 .getname = inet_getname,
3495 .poll = mptcp_poll,
3496 .ioctl = inet_ioctl,
3497 .gettstamp = sock_gettstamp,

--- 75 unchanged lines hidden (view full) ---

3573 panic("Failed to register MPTCP proto.\n");
3574
3575 inet_register_protosw(&mptcp_protosw);
3576
3577 BUILD_BUG_ON(sizeof(struct mptcp_skb_cb) > sizeof_field(struct sk_buff, cb));
3578}
3579
3580#if IS_ENABLED(CONFIG_MPTCP_IPV6)
3541static int mptcp6_release(struct socket *sock)
3542{
3543 struct mptcp_subflow_context *subflow;
3544 struct mptcp_sock *msk;
3545 struct sock *sk = sock->sk;
3546
3547 if (!sk)
3548 return 0;
3549
3550 lock_sock(sk);
3551
3552 msk = mptcp_sk(sk);
3553
3554 mptcp_for_each_subflow(msk, subflow) {
3555 struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
3556
3557 ip_mc_drop_socket(ssk);
3558 ipv6_sock_mc_close(ssk);
3559 ipv6_sock_ac_close(ssk);
3560 }
3561
3562 release_sock(sk);
3563 return inet6_release(sock);
3564}
3565
3566static const struct proto_ops mptcp_v6_stream_ops = {
3567 .family = PF_INET6,
3568 .owner = THIS_MODULE,
3581static const struct proto_ops mptcp_v6_stream_ops = {
3582 .family = PF_INET6,
3583 .owner = THIS_MODULE,
3569 .release = mptcp6_release,
3584 .release = inet6_release,
3570 .bind = mptcp_bind,
3571 .connect = mptcp_stream_connect,
3572 .socketpair = sock_no_socketpair,
3573 .accept = mptcp_stream_accept,
3574 .getname = inet6_getname,
3575 .poll = mptcp_poll,
3576 .ioctl = inet6_ioctl,
3577 .gettstamp = sock_gettstamp,

--- 50 unchanged lines hidden ---
3585 .bind = mptcp_bind,
3586 .connect = mptcp_stream_connect,
3587 .socketpair = sock_no_socketpair,
3588 .accept = mptcp_stream_accept,
3589 .getname = inet6_getname,
3590 .poll = mptcp_poll,
3591 .ioctl = inet6_ioctl,
3592 .gettstamp = sock_gettstamp,

--- 50 unchanged lines hidden ---