mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-03-09 15:40:20 +00:00
Add latest 0.94 MPTCP patch
This commit is contained in:
parent
348afb32e7
commit
189bcdd013
1 changed files with 125 additions and 0 deletions
|
@ -20262,3 +20262,128 @@ diff -aurN linux-4.14.41/net/mptcp/mptcp_wvegas.c mptcp-mptcp_v0.94/net/mptcp/mp
|
|||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_DESCRIPTION("MPTCP wVegas");
|
||||
+MODULE_VERSION("0.1");
|
||||
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
|
||||
index 222b551bb58b..818a0fa3a2a9 100644
|
||||
--- a/include/net/mptcp.h
|
||||
+++ b/include/net/mptcp.h
|
||||
@@ -834,6 +834,7 @@ void mptcp_sub_close_wq(struct work_struct *work);
|
||||
void mptcp_sub_close(struct sock *sk, unsigned long delay);
|
||||
struct sock *mptcp_select_ack_sock(const struct sock *meta_sk);
|
||||
void mptcp_fallback_meta_sk(struct sock *meta_sk);
|
||||
+void mptcp_prepare_for_backlog(struct sock *sk, struct sk_buff *skb);
|
||||
int mptcp_backlog_rcv(struct sock *meta_sk, struct sk_buff *skb);
|
||||
void mptcp_ack_handler(unsigned long);
|
||||
bool mptcp_check_rtt(const struct tcp_sock *tp, int time);
|
||||
@@ -1438,6 +1439,7 @@ static inline bool mptcp_fallback_infinite(const struct sock *sk, int flag)
|
||||
return false;
|
||||
}
|
||||
static inline void mptcp_init_mp_opt(const struct mptcp_options_received *mopt) {}
|
||||
+static inline void mptcp_prepare_for_backlog(struct sock *sk, struct sk_buff *skb) {}
|
||||
static inline bool mptcp_check_rtt(const struct tcp_sock *tp, int time)
|
||||
{
|
||||
return false;
|
||||
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
|
||||
index 830849e683e6..15b90061a38f 100644
|
||||
--- a/net/ipv4/tcp_ipv4.c
|
||||
+++ b/net/ipv4/tcp_ipv4.c
|
||||
@@ -1742,7 +1742,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
|
||||
}
|
||||
|
||||
if (sock_owned_by_user(sk)) {
|
||||
- skb->sk = sk;
|
||||
+ mptcp_prepare_for_backlog(sk, skb);
|
||||
if (unlikely(sk_add_backlog(sk, skb,
|
||||
sk->sk_rcvbuf + sk->sk_sndbuf))) {
|
||||
reqsk_put(req);
|
||||
@@ -1819,7 +1819,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
|
||||
|
||||
bh_lock_sock_nested(meta_sk);
|
||||
if (sock_owned_by_user(meta_sk))
|
||||
- skb->sk = sk;
|
||||
+ mptcp_prepare_for_backlog(sk, skb);
|
||||
} else {
|
||||
meta_sk = sk;
|
||||
bh_lock_sock_nested(sk);
|
||||
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
|
||||
index dd86c448c5af..a2c0187d8366 100644
|
||||
--- a/net/ipv6/tcp_ipv6.c
|
||||
+++ b/net/ipv6/tcp_ipv6.c
|
||||
@@ -1530,7 +1530,7 @@ static int tcp_v6_rcv(struct sk_buff *skb)
|
||||
}
|
||||
|
||||
if (sock_owned_by_user(sk)) {
|
||||
- skb->sk = sk;
|
||||
+ mptcp_prepare_for_backlog(sk, skb);
|
||||
if (unlikely(sk_add_backlog(sk, skb,
|
||||
sk->sk_rcvbuf + sk->sk_sndbuf))) {
|
||||
reqsk_put(req);
|
||||
@@ -1606,7 +1606,7 @@ static int tcp_v6_rcv(struct sk_buff *skb)
|
||||
|
||||
bh_lock_sock_nested(meta_sk);
|
||||
if (sock_owned_by_user(meta_sk))
|
||||
- skb->sk = sk;
|
||||
+ mptcp_prepare_for_backlog(sk, skb);
|
||||
} else {
|
||||
meta_sk = sk;
|
||||
bh_lock_sock_nested(sk);
|
||||
diff --git a/net/mptcp/mptcp_ctrl.c b/net/mptcp/mptcp_ctrl.c
|
||||
index faf8a6cdbcc7..b46682eee745 100644
|
||||
--- a/net/mptcp/mptcp_ctrl.c
|
||||
+++ b/net/mptcp/mptcp_ctrl.c
|
||||
@@ -984,6 +984,16 @@ static void mptcp_sub_inherit_sockopts(const struct sock *meta_sk, struct sock *
|
||||
inet_sk(sub_sk)->recverr = 0;
|
||||
}
|
||||
|
||||
+void mptcp_prepare_for_backlog(struct sock *sk, struct sk_buff *skb)
|
||||
+{
|
||||
+ /* In case of success (in mptcp_backlog_rcv) and error (in kfree_skb) of
|
||||
+ * sk_add_backlog, we will decrement the sk refcount.
|
||||
+ */
|
||||
+ sock_hold(sk);
|
||||
+ skb->sk = sk;
|
||||
+ skb->destructor = sock_efree;
|
||||
+}
|
||||
+
|
||||
int mptcp_backlog_rcv(struct sock *meta_sk, struct sk_buff *skb)
|
||||
{
|
||||
/* skb-sk may be NULL if we receive a packet immediatly after the
|
||||
@@ -992,13 +1002,17 @@ int mptcp_backlog_rcv(struct sock *meta_sk, struct sk_buff *skb)
|
||||
struct sock *sk = skb->sk ? skb->sk : meta_sk;
|
||||
int ret = 0;
|
||||
|
||||
- skb->sk = NULL;
|
||||
-
|
||||
if (unlikely(!refcount_inc_not_zero(&sk->sk_refcnt))) {
|
||||
kfree_skb(skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+ /* Decrement sk refcnt when calling the skb destructor.
|
||||
+ * Refcnt is incremented and skb destructor is set in tcp_v{4,6}_rcv via
|
||||
+ * mptcp_prepare_for_backlog() here above.
|
||||
+ */
|
||||
+ skb_orphan(skb);
|
||||
+
|
||||
if (sk->sk_family == AF_INET)
|
||||
ret = tcp_v4_do_rcv(sk, skb);
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
diff --git a/net/mptcp/mptcp_input.c b/net/mptcp/mptcp_input.c
|
||||
index 1e73b4e857f8..b5344c176f75 100644
|
||||
--- a/net/mptcp/mptcp_input.c
|
||||
+++ b/net/mptcp/mptcp_input.c
|
||||
@@ -1184,7 +1184,6 @@ int mptcp_lookup_join(struct sk_buff *skb, struct inet_timewait_sock *tw)
|
||||
*/
|
||||
bh_lock_sock_nested(meta_sk);
|
||||
if (sock_owned_by_user(meta_sk)) {
|
||||
- skb->sk = meta_sk;
|
||||
if (unlikely(sk_add_backlog(meta_sk, skb,
|
||||
meta_sk->sk_rcvbuf + meta_sk->sk_sndbuf))) {
|
||||
bh_unlock_sock(meta_sk);
|
||||
@@ -1257,7 +1256,6 @@ int mptcp_do_join_short(struct sk_buff *skb,
|
||||
}
|
||||
|
||||
if (sock_owned_by_user(meta_sk)) {
|
||||
- skb->sk = meta_sk;
|
||||
if (unlikely(sk_add_backlog(meta_sk, skb,
|
||||
meta_sk->sk_rcvbuf + meta_sk->sk_sndbuf)))
|
||||
__NET_INC_STATS(net, LINUX_MIB_TCPBACKLOGDROP);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue