|
@@ -491,8 +491,9 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb);
|
|
|
|
|
|
/* syncookies: remember time of last synqueue overflow
|
|
|
* But do not dirty this field too often (once per second is enough)
|
|
|
+ * It is racy as we do not hold a lock, but race is very minor.
|
|
|
*/
|
|
|
-static inline void tcp_synq_overflow(struct sock *sk)
|
|
|
+static inline void tcp_synq_overflow(const struct sock *sk)
|
|
|
{
|
|
|
unsigned long last_overflow = tcp_sk(sk)->rx_opt.ts_recent_stamp;
|
|
|
unsigned long now = jiffies;
|
|
@@ -519,8 +520,7 @@ static inline u32 tcp_cookie_time(void)
|
|
|
|
|
|
u32 __cookie_v4_init_sequence(const struct iphdr *iph, const struct tcphdr *th,
|
|
|
u16 *mssp);
|
|
|
-__u32 cookie_v4_init_sequence(struct sock *sk, const struct sk_buff *skb,
|
|
|
- __u16 *mss);
|
|
|
+__u32 cookie_v4_init_sequence(const struct sk_buff *skb, __u16 *mss);
|
|
|
__u32 cookie_init_timestamp(struct request_sock *req);
|
|
|
bool cookie_timestamp_decode(struct tcp_options_received *opt);
|
|
|
bool cookie_ecn_ok(const struct tcp_options_received *opt,
|
|
@@ -533,8 +533,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb);
|
|
|
|
|
|
u32 __cookie_v6_init_sequence(const struct ipv6hdr *iph,
|
|
|
const struct tcphdr *th, u16 *mssp);
|
|
|
-__u32 cookie_v6_init_sequence(struct sock *sk, const struct sk_buff *skb,
|
|
|
- __u16 *mss);
|
|
|
+__u32 cookie_v6_init_sequence(const struct sk_buff *skb, __u16 *mss);
|
|
|
#endif
|
|
|
/* tcp_output.c */
|
|
|
|
|
@@ -1709,7 +1708,7 @@ struct tcp_request_sock_ops {
|
|
|
const struct sock *sk_listener,
|
|
|
struct sk_buff *skb);
|
|
|
#ifdef CONFIG_SYN_COOKIES
|
|
|
- __u32 (*cookie_init_seq)(struct sock *sk, const struct sk_buff *skb,
|
|
|
+ __u32 (*cookie_init_seq)(const struct sk_buff *skb,
|
|
|
__u16 *mss);
|
|
|
#endif
|
|
|
struct dst_entry *(*route_req)(struct sock *sk, struct flowi *fl,
|
|
@@ -1725,14 +1724,16 @@ struct tcp_request_sock_ops {
|
|
|
|
|
|
#ifdef CONFIG_SYN_COOKIES
|
|
|
static inline __u32 cookie_init_sequence(const struct tcp_request_sock_ops *ops,
|
|
|
- struct sock *sk, struct sk_buff *skb,
|
|
|
+ const struct sock *sk, struct sk_buff *skb,
|
|
|
__u16 *mss)
|
|
|
{
|
|
|
- return ops->cookie_init_seq(sk, skb, mss);
|
|
|
+ tcp_synq_overflow(sk);
|
|
|
+ NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_SYNCOOKIESSENT);
|
|
|
+ return ops->cookie_init_seq(skb, mss);
|
|
|
}
|
|
|
#else
|
|
|
static inline __u32 cookie_init_sequence(const struct tcp_request_sock_ops *ops,
|
|
|
- struct sock *sk, struct sk_buff *skb,
|
|
|
+ const struct sock *sk, struct sk_buff *skb,
|
|
|
__u16 *mss)
|
|
|
{
|
|
|
return 0;
|