1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter.git synced 2025-03-09 15:40:20 +00:00
Ycarus 2018-10-17 12:02:41 +02:00
parent bcdc53d0dd
commit c725009877

View file

@ -4558,7 +4558,7 @@ diff -aurN ../linux-4.9.131/net/ipv4/tcp_ipv4.c ./net/ipv4/tcp_ipv4.c
+ if (!sock_owned_by_user(meta_sk)) { + if (!sock_owned_by_user(meta_sk)) {
tcp_v4_mtu_reduced(sk); tcp_v4_mtu_reduced(sk);
} else { } else {
if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, &tp->tsq_flags)) if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, &sk->sk_tsq_flags))
sock_hold(sk); sock_hold(sk);
+ if (mptcp(tp)) + if (mptcp(tp))
+ mptcp_tsq_flags(sk); + mptcp_tsq_flags(sk);
@ -5401,43 +5401,47 @@ diff -aurN ../linux-4.9.131/net/ipv4/tcp_output.c ./net/ipv4/tcp_output.c
local_irq_save(flags); local_irq_save(flags);
list_splice_init(&tsq->head, &list); list_splice_init(&tsq->head, &list);
@@ -774,15 +786,25 @@ @@ -785,14 +796,28 @@
list_del(&tp->tsq_node); smp_mb__before_atomic();
clear_bit(TSQ_QUEUED, &sk->sk_tsq_flags);
sk = (struct sock *)tp; - if (!sk->sk_lock.owned &&
- bh_lock_sock(sk);
+ meta_sk = mptcp(tp) ? mptcp_meta_sk(sk) : sk; + meta_sk = mptcp(tp) ? mptcp_meta_sk(sk) : sk;
+ bh_lock_sock(meta_sk);
- if (!sock_owned_by_user(sk)) {
+ if (!sock_owned_by_user(meta_sk)) {
tcp_tsq_handler(sk);
+ if (mptcp(tp))
+ tcp_tsq_handler(meta_sk);
} else {
+ if (mptcp(tp) && sk->sk_state == TCP_CLOSE)
+ goto exit;
+ +
/* defer the work to tcp_release_cb() */ + if (!meta_sk->sk_lock.owned &&
set_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags); test_bit(TCP_TSQ_DEFERRED, &sk->sk_tsq_flags)) {
+ - bh_lock_sock(sk);
+ if (mptcp(tp)) - if (!sock_owned_by_user(sk)) {
+ mptcp_tsq_flags(sk); + bh_lock_sock(meta_sk);
+ if (!sock_owned_by_user(meta_sk)) {
clear_bit(TCP_TSQ_DEFERRED, &sk->sk_tsq_flags);
tcp_tsq_handler(sk);
+ if (mptcp(tp))
+ tcp_tsq_handler(meta_sk);
+ } else if (mptcp(tp)) {
+ if (sk->sk_state != TCP_CLOSE)
+ mptcp_tsq_flags(sk);
+ }
+ bh_unlock_sock(meta_sk);
+ } else {
+ if (mptcp(tp)) {
+ bh_lock_sock(meta_sk);
+ if (sk->sk_state != TCP_CLOSE)
+ mptcp_tsq_flags(sk);
+ bh_unlock_sock(meta_sk);
}
- bh_unlock_sock(sk);
} }
- bh_unlock_sock(sk);
+exit:
+ bh_unlock_sock(meta_sk);
clear_bit(TSQ_QUEUED, &tp->tsq_flags);
sk_free(sk); sk_free(sk);
@@ -792,7 +814,10 @@ @@ -792,7 +814,10 @@
#define TCP_DEFERRED_ALL ((1UL << TCP_TSQ_DEFERRED) | \ #define TCP_DEFERRED_ALL (TCPF_TSQ_DEFERRED | \
(1UL << TCP_WRITE_TIMER_DEFERRED) | \ TCPF_WRITE_TIMER_DEFERRED | \
(1UL << TCP_DELACK_TIMER_DEFERRED) | \ TCPF_DELACK_TIMER_DEFERRED | \
- (1UL << TCP_MTU_REDUCED_DEFERRED)) - TCPF_MTU_REDUCED_DEFERRED)
+ (1UL << TCP_MTU_REDUCED_DEFERRED) | \ + TCPF_MTU_REDUCED_DEFERRED | \
+ (1UL << MPTCP_PATH_MANAGER_DEFERRED) |\ + MPTCP_PATH_MANAGER_DEFERRED |\
+ (1UL << MPTCP_SUB_DEFERRED)) + MPTCP_SUB_DEFERRED)
+ +
/** /**
* tcp_release_cb - tcp release_sock() callback * tcp_release_cb - tcp release_sock() callback
@ -5873,7 +5877,7 @@ diff -aurN ../linux-4.9.131/net/ipv4/tcp_timer.c ./net/ipv4/tcp_timer.c
- __NET_INC_STATS(sock_net(sk), LINUX_MIB_DELAYEDACKLOCKED); - __NET_INC_STATS(sock_net(sk), LINUX_MIB_DELAYEDACKLOCKED);
+ __NET_INC_STATS(sock_net(meta_sk), LINUX_MIB_DELAYEDACKLOCKED); + __NET_INC_STATS(sock_net(meta_sk), LINUX_MIB_DELAYEDACKLOCKED);
/* deleguate our work to tcp_release_cb() */ /* deleguate our work to tcp_release_cb() */
if (!test_and_set_bit(TCP_DELACK_TIMER_DEFERRED, &tcp_sk(sk)->tsq_flags)) if (!test_and_set_bit(TCP_DELACK_TIMER_DEFERRED, &sk->sk_tsq_flags))
sock_hold(sk); sock_hold(sk);
+ if (mptcp(tp)) + if (mptcp(tp))
+ mptcp_tsq_flags(sk); + mptcp_tsq_flags(sk);
@ -5905,7 +5909,7 @@ diff -aurN ../linux-4.9.131/net/ipv4/tcp_timer.c ./net/ipv4/tcp_timer.c
tcp_write_timer_handler(sk); tcp_write_timer_handler(sk);
} else { } else {
/* delegate our work to tcp_release_cb() */ /* delegate our work to tcp_release_cb() */
if (!test_and_set_bit(TCP_WRITE_TIMER_DEFERRED, &tcp_sk(sk)->tsq_flags)) if (!test_and_set_bit(TCP_WRITE_TIMER_DEFERRED, &sk->sk_tsq_flags))
sock_hold(sk); sock_hold(sk);
+ if (mptcp(tcp_sk(sk))) + if (mptcp(tcp_sk(sk)))
+ mptcp_tsq_flags(sk); + mptcp_tsq_flags(sk);
@ -6268,7 +6272,7 @@ diff -aurN ../linux-4.9.131/net/ipv6/tcp_ipv6.c ./net/ipv6/tcp_ipv6.c
- else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, - else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,
+ else { + else {
+ if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, + if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,
&tp->tsq_flags)) &sk->sk_tsq_flags))
- sock_hold(sk); - sock_hold(sk);
+ sock_hold(sk); + sock_hold(sk);
+ if (mptcp(tp)) + if (mptcp(tp))