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