|
@@ -3552,6 +3552,24 @@ static bool tcp_process_frto(struct sock *sk, int flag)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+/* RFC 5961 7 [ACK Throttling] */
|
|
|
+static void tcp_send_challenge_ack(struct sock *sk)
|
|
|
+{
|
|
|
+ /* unprotected vars, we dont care of overwrites */
|
|
|
+ static u32 challenge_timestamp;
|
|
|
+ static unsigned int challenge_count;
|
|
|
+ u32 now = jiffies / HZ;
|
|
|
+
|
|
|
+ if (now != challenge_timestamp) {
|
|
|
+ challenge_timestamp = now;
|
|
|
+ challenge_count = 0;
|
|
|
+ }
|
|
|
+ if (++challenge_count <= sysctl_tcp_challenge_ack_limit) {
|
|
|
+ NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK);
|
|
|
+ tcp_send_ack(sk);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/* This routine deals with incoming acks, but not outgoing ones. */
|
|
|
static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
|
|
|
{
|
|
@@ -3571,8 +3589,14 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
|
|
|
/* If the ack is older than previous acks
|
|
|
* then we can probably ignore it.
|
|
|
*/
|
|
|
- if (before(ack, prior_snd_una))
|
|
|
+ if (before(ack, prior_snd_una)) {
|
|
|
+ /* RFC 5961 5.2 [Blind Data Injection Attack].[Mitigation] */
|
|
|
+ if (before(ack, prior_snd_una - tp->max_window)) {
|
|
|
+ tcp_send_challenge_ack(sk);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
goto old_ack;
|
|
|
+ }
|
|
|
|
|
|
/* If the ack includes data we haven't sent yet, discard
|
|
|
* this segment (RFC793 Section 3.9).
|
|
@@ -5241,23 +5265,6 @@ out:
|
|
|
}
|
|
|
#endif /* CONFIG_NET_DMA */
|
|
|
|
|
|
-static void tcp_send_challenge_ack(struct sock *sk)
|
|
|
-{
|
|
|
- /* unprotected vars, we dont care of overwrites */
|
|
|
- static u32 challenge_timestamp;
|
|
|
- static unsigned int challenge_count;
|
|
|
- u32 now = jiffies / HZ;
|
|
|
-
|
|
|
- if (now != challenge_timestamp) {
|
|
|
- challenge_timestamp = now;
|
|
|
- challenge_count = 0;
|
|
|
- }
|
|
|
- if (++challenge_count <= sysctl_tcp_challenge_ack_limit) {
|
|
|
- NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK);
|
|
|
- tcp_send_ack(sk);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/* Does PAWS and seqno based validation of an incoming segment, flags will
|
|
|
* play significant role here.
|
|
|
*/
|