mirror of https://github.com/OpenIPC/firmware.git
115 lines
3.9 KiB
Diff
115 lines
3.9 KiB
Diff
diff -drupN a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
|
|
--- a/net/ipv4/tcp_input.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/net/ipv4/tcp_input.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -100,6 +100,7 @@ int sysctl_tcp_thin_dupack __read_mostly
|
|
int sysctl_tcp_moderate_rcvbuf __read_mostly = 1;
|
|
int sysctl_tcp_early_retrans __read_mostly = 3;
|
|
int sysctl_tcp_invalid_ratelimit __read_mostly = HZ/2;
|
|
+int sysctl_tcp_default_init_rwnd __read_mostly = TCP_INIT_CWND * 2;
|
|
|
|
#define FLAG_DATA 0x01 /* Incoming frame contained data. */
|
|
#define FLAG_WIN_UPDATE 0x02 /* Incoming ACK was a window update. */
|
|
@@ -1974,8 +1975,6 @@ void tcp_enter_loss(struct sock *sk)
|
|
NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPSACKRENEGING);
|
|
tp->sacked_out = 0;
|
|
tp->fackets_out = 0;
|
|
- /* Mark SACK reneging until we recover from this loss event. */
|
|
- tp->is_sack_reneg = 1;
|
|
}
|
|
tcp_clear_all_retrans_hints(tp);
|
|
|
|
@@ -2473,7 +2472,6 @@ static bool tcp_try_undo_recovery(struct
|
|
return true;
|
|
}
|
|
tcp_set_ca_state(sk, TCP_CA_Open);
|
|
- tp->is_sack_reneg = 0;
|
|
return false;
|
|
}
|
|
|
|
@@ -2505,10 +2503,8 @@ static bool tcp_try_undo_loss(struct soc
|
|
NET_INC_STATS(sock_net(sk),
|
|
LINUX_MIB_TCPSPURIOUSRTOS);
|
|
inet_csk(sk)->icsk_retransmits = 0;
|
|
- if (frto_undo || tcp_is_sack(tp)) {
|
|
+ if (frto_undo || tcp_is_sack(tp))
|
|
tcp_set_ca_state(sk, TCP_CA_Open);
|
|
- tp->is_sack_reneg = 0;
|
|
- }
|
|
return true;
|
|
}
|
|
return false;
|
|
@@ -3611,7 +3607,6 @@ static int tcp_ack(struct sock *sk, cons
|
|
struct tcp_sacktag_state sack_state;
|
|
struct rate_sample rs = { .prior_delivered = 0 };
|
|
u32 prior_snd_una = tp->snd_una;
|
|
- bool is_sack_reneg = tp->is_sack_reneg;
|
|
u32 ack_seq = TCP_SKB_CB(skb)->seq;
|
|
u32 ack = TCP_SKB_CB(skb)->ack_seq;
|
|
bool is_dupack = false;
|
|
@@ -3735,7 +3730,7 @@ static int tcp_ack(struct sock *sk, cons
|
|
tcp_schedule_loss_probe(sk);
|
|
delivered = tp->delivered - delivered; /* freshly ACKed or SACKed */
|
|
lost = tp->lost - lost; /* freshly marked lost */
|
|
- tcp_rate_gen(sk, delivered, lost, is_sack_reneg, &now, &rs);
|
|
+ tcp_rate_gen(sk, delivered, lost, &now, &rs);
|
|
tcp_cong_control(sk, ack, delivered, flag, &rs);
|
|
tcp_xmit_recovery(sk, rexmit);
|
|
return 1;
|
|
@@ -4370,6 +4365,23 @@ static bool tcp_try_coalesce(struct sock
|
|
return true;
|
|
}
|
|
|
|
+static bool tcp_ooo_try_coalesce(struct sock *sk,
|
|
+ struct sk_buff *to,
|
|
+ struct sk_buff *from,
|
|
+ bool *fragstolen)
|
|
+{
|
|
+ bool res = tcp_try_coalesce(sk, to, from, fragstolen);
|
|
+
|
|
+ /* In case tcp_drop() is called later, update to->gso_segs */
|
|
+ if (res) {
|
|
+ u32 gso_segs = max_t(u16, 1, skb_shinfo(to)->gso_segs) +
|
|
+ max_t(u16, 1, skb_shinfo(from)->gso_segs);
|
|
+
|
|
+ skb_shinfo(to)->gso_segs = min_t(u32, gso_segs, 0xFFFF);
|
|
+ }
|
|
+ return res;
|
|
+}
|
|
+
|
|
static void tcp_drop(struct sock *sk, struct sk_buff *skb)
|
|
{
|
|
sk_drops_add(sk, skb);
|
|
@@ -4493,7 +4505,7 @@ static void tcp_data_queue_ofo(struct so
|
|
/* In the typical case, we are adding an skb to the end of the list.
|
|
* Use of ooo_last_skb avoids the O(Log(N)) rbtree lookup.
|
|
*/
|
|
- if (tcp_try_coalesce(sk, tp->ooo_last_skb, skb, &fragstolen)) {
|
|
+ if (tcp_ooo_try_coalesce(sk, tp->ooo_last_skb, skb, &fragstolen)) {
|
|
coalesce_done:
|
|
tcp_grow_window(sk, skb);
|
|
kfree_skb_partial(skb, fragstolen);
|
|
@@ -4543,7 +4555,7 @@ coalesce_done:
|
|
tcp_drop(sk, skb1);
|
|
goto merge_right;
|
|
}
|
|
- } else if (tcp_try_coalesce(sk, skb1, skb, &fragstolen)) {
|
|
+ } else if (tcp_ooo_try_coalesce(sk, skb1, skb, &fragstolen)) {
|
|
goto coalesce_done;
|
|
}
|
|
p = &parent->rb_right;
|
|
@@ -6362,13 +6374,7 @@ int tcp_conn_request(struct request_sock
|
|
goto drop;
|
|
}
|
|
|
|
-
|
|
- /* Accept backlog is full. If we have already queued enough
|
|
- * of warm entries in syn queue, drop request. It is better than
|
|
- * clogging syn queue with openreqs with exponentially increasing
|
|
- * timeout.
|
|
- */
|
|
- if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) {
|
|
+ if (sk_acceptq_is_full(sk)) {
|
|
NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
|
|
goto drop;
|
|
}
|