ipv4: share tcp_v4_save_options() with cookie_v4_check()
cookie_v4_check() allocates ip_options_rcu in the same way with tcp_v4_save_options(), we can just make it a helper function. Cc: Krzysztof Kolasa <kkolasa@winsoft.pl> Cc: Eric Dumazet <edumazet@google.com> Signed-off-by: Cong Wang <cwang@twopensource.com> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2077eebf7d
commit
e25f866fbc
|
@ -1666,4 +1666,24 @@ int tcpv4_offload_init(void);
|
||||||
void tcp_v4_init(void);
|
void tcp_v4_init(void);
|
||||||
void tcp_init(void);
|
void tcp_init(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Save and compile IPv4 options, return a pointer to it
|
||||||
|
*/
|
||||||
|
static inline struct ip_options_rcu *tcp_v4_save_options(struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
const struct ip_options *opt = &TCP_SKB_CB(skb)->header.h4.opt;
|
||||||
|
struct ip_options_rcu *dopt = NULL;
|
||||||
|
|
||||||
|
if (opt && opt->optlen) {
|
||||||
|
int opt_size = sizeof(*dopt) + opt->optlen;
|
||||||
|
|
||||||
|
dopt = kmalloc(opt_size, GFP_ATOMIC);
|
||||||
|
if (dopt && __ip_options_echo(&dopt->opt, skb, opt)) {
|
||||||
|
kfree(dopt);
|
||||||
|
dopt = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dopt;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* _TCP_H */
|
#endif /* _TCP_H */
|
||||||
|
|
|
@ -317,15 +317,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
|
||||||
/* We throwed the options of the initial SYN away, so we hope
|
/* We throwed the options of the initial SYN away, so we hope
|
||||||
* the ACK carries the same options again (see RFC1122 4.2.3.8)
|
* the ACK carries the same options again (see RFC1122 4.2.3.8)
|
||||||
*/
|
*/
|
||||||
if (opt && opt->optlen) {
|
ireq->opt = tcp_v4_save_options(skb);
|
||||||
int opt_size = sizeof(struct ip_options_rcu) + opt->optlen;
|
|
||||||
|
|
||||||
ireq->opt = kmalloc(opt_size, GFP_ATOMIC);
|
|
||||||
if (ireq->opt != NULL && __ip_options_echo(&ireq->opt->opt, skb, opt)) {
|
|
||||||
kfree(ireq->opt);
|
|
||||||
ireq->opt = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (security_inet_conn_request(sk, skb, req)) {
|
if (security_inet_conn_request(sk, skb, req)) {
|
||||||
reqsk_free(req);
|
reqsk_free(req);
|
||||||
|
|
|
@ -880,26 +880,6 @@ bool tcp_syn_flood_action(struct sock *sk,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(tcp_syn_flood_action);
|
EXPORT_SYMBOL(tcp_syn_flood_action);
|
||||||
|
|
||||||
/*
|
|
||||||
* Save and compile IPv4 options into the request_sock if needed.
|
|
||||||
*/
|
|
||||||
static struct ip_options_rcu *tcp_v4_save_options(struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
const struct ip_options *opt = &TCP_SKB_CB(skb)->header.h4.opt;
|
|
||||||
struct ip_options_rcu *dopt = NULL;
|
|
||||||
|
|
||||||
if (opt && opt->optlen) {
|
|
||||||
int opt_size = sizeof(*dopt) + opt->optlen;
|
|
||||||
|
|
||||||
dopt = kmalloc(opt_size, GFP_ATOMIC);
|
|
||||||
if (dopt && __ip_options_echo(&dopt->opt, skb, opt)) {
|
|
||||||
kfree(dopt);
|
|
||||||
dopt = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return dopt;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_TCP_MD5SIG
|
#ifdef CONFIG_TCP_MD5SIG
|
||||||
/*
|
/*
|
||||||
* RFC2385 MD5 checksumming requires a mapping of
|
* RFC2385 MD5 checksumming requires a mapping of
|
||||||
|
|
Loading…
Reference in New Issue