|
@@ -326,18 +326,6 @@ static inline bool tcp_too_many_orphans(struct sock *sk, int shift)
|
|
|
|
|
|
bool tcp_check_oom(struct sock *sk, int shift);
|
|
|
|
|
|
-/* syncookies: remember time of last synqueue overflow */
|
|
|
-static inline void tcp_synq_overflow(struct sock *sk)
|
|
|
-{
|
|
|
- tcp_sk(sk)->rx_opt.ts_recent_stamp = jiffies;
|
|
|
-}
|
|
|
-
|
|
|
-/* syncookies: no recent synqueue overflow on this listening socket? */
|
|
|
-static inline bool tcp_synq_no_recent_overflow(const struct sock *sk)
|
|
|
-{
|
|
|
- unsigned long last_overflow = tcp_sk(sk)->rx_opt.ts_recent_stamp;
|
|
|
- return time_after(jiffies, last_overflow + TCP_TIMEOUT_FALLBACK);
|
|
|
-}
|
|
|
|
|
|
extern struct proto tcp_prot;
|
|
|
|
|
@@ -483,13 +471,35 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb);
|
|
|
* i.e. a sent cookie is valid only at most for 2*60 seconds (or less if
|
|
|
* the counter advances immediately after a cookie is generated).
|
|
|
*/
|
|
|
-#define MAX_SYNCOOKIE_AGE 2
|
|
|
+#define MAX_SYNCOOKIE_AGE 2
|
|
|
+#define TCP_SYNCOOKIE_PERIOD (60 * HZ)
|
|
|
+#define TCP_SYNCOOKIE_VALID (MAX_SYNCOOKIE_AGE * TCP_SYNCOOKIE_PERIOD)
|
|
|
+
|
|
|
+/* syncookies: remember time of last synqueue overflow
|
|
|
+ * But do not dirty this field too often (once per second is enough)
|
|
|
+ */
|
|
|
+static inline void tcp_synq_overflow(struct sock *sk)
|
|
|
+{
|
|
|
+ unsigned long last_overflow = tcp_sk(sk)->rx_opt.ts_recent_stamp;
|
|
|
+ unsigned long now = jiffies;
|
|
|
+
|
|
|
+ if (time_after(now, last_overflow + HZ))
|
|
|
+ tcp_sk(sk)->rx_opt.ts_recent_stamp = now;
|
|
|
+}
|
|
|
+
|
|
|
+/* syncookies: no recent synqueue overflow on this listening socket? */
|
|
|
+static inline bool tcp_synq_no_recent_overflow(const struct sock *sk)
|
|
|
+{
|
|
|
+ unsigned long last_overflow = tcp_sk(sk)->rx_opt.ts_recent_stamp;
|
|
|
+
|
|
|
+ return time_after(jiffies, last_overflow + TCP_SYNCOOKIE_VALID);
|
|
|
+}
|
|
|
|
|
|
static inline u32 tcp_cookie_time(void)
|
|
|
{
|
|
|
u64 val = get_jiffies_64();
|
|
|
|
|
|
- do_div(val, 60 * HZ);
|
|
|
+ do_div(val, TCP_SYNCOOKIE_PERIOD);
|
|
|
return val;
|
|
|
}
|
|
|
|