Merge branch 'listener_refactor'
Eric Dumazet says: ==================== inet: tcp listener refactoring, part 8 These patches prepare request socks being hashed into general ehash table : We declare 3 aliases (ireq_state, ireq_refcnt, ireq_family) Note that refcnt is not yet handled, this will be done later. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
5ff0d16aac
14 changed files with 84 additions and 41 deletions
|
@ -27,6 +27,7 @@
|
||||||
#include <net/sock.h>
|
#include <net/sock.h>
|
||||||
#include <net/request_sock.h>
|
#include <net/request_sock.h>
|
||||||
#include <net/netns/hash.h>
|
#include <net/netns/hash.h>
|
||||||
|
#include <net/tcp_states.h>
|
||||||
|
|
||||||
/** struct ip_options - IP Options
|
/** struct ip_options - IP Options
|
||||||
*
|
*
|
||||||
|
@ -79,6 +80,9 @@ struct inet_request_sock {
|
||||||
#define ir_iif req.__req_common.skc_bound_dev_if
|
#define ir_iif req.__req_common.skc_bound_dev_if
|
||||||
#define ir_cookie req.__req_common.skc_cookie
|
#define ir_cookie req.__req_common.skc_cookie
|
||||||
#define ireq_net req.__req_common.skc_net
|
#define ireq_net req.__req_common.skc_net
|
||||||
|
#define ireq_state req.__req_common.skc_state
|
||||||
|
#define ireq_refcnt req.__req_common.skc_refcnt
|
||||||
|
#define ireq_family req.__req_common.skc_family
|
||||||
|
|
||||||
kmemcheck_bitfield_begin(flags);
|
kmemcheck_bitfield_begin(flags);
|
||||||
u16 snd_wscale : 4,
|
u16 snd_wscale : 4,
|
||||||
|
@ -249,6 +253,8 @@ static inline struct request_sock *inet_reqsk_alloc(struct request_sock_ops *ops
|
||||||
if (req != NULL) {
|
if (req != NULL) {
|
||||||
kmemcheck_annotate_bitfield(ireq, flags);
|
kmemcheck_annotate_bitfield(ireq, flags);
|
||||||
ireq->opt = NULL;
|
ireq->opt = NULL;
|
||||||
|
atomic64_set(&ireq->ir_cookie, 0);
|
||||||
|
ireq->ireq_state = TCP_NEW_SYN_RECV;
|
||||||
}
|
}
|
||||||
|
|
||||||
return req;
|
return req;
|
||||||
|
|
|
@ -49,6 +49,8 @@ int inet_rtx_syn_ack(struct sock *parent, struct request_sock *req);
|
||||||
*/
|
*/
|
||||||
struct request_sock {
|
struct request_sock {
|
||||||
struct sock_common __req_common;
|
struct sock_common __req_common;
|
||||||
|
#define rsk_refcnt __req_common.skc_refcnt
|
||||||
|
|
||||||
struct request_sock *dl_next;
|
struct request_sock *dl_next;
|
||||||
u16 mss;
|
u16 mss;
|
||||||
u8 num_retrans; /* number of retransmits */
|
u8 num_retrans; /* number of retransmits */
|
||||||
|
@ -75,6 +77,11 @@ static inline struct request_sock *reqsk_alloc(const struct request_sock_ops *op
|
||||||
return req;
|
return req;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct request_sock *inet_reqsk(struct sock *sk)
|
||||||
|
{
|
||||||
|
return (struct request_sock *)sk;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void __reqsk_free(struct request_sock *req)
|
static inline void __reqsk_free(struct request_sock *req)
|
||||||
{
|
{
|
||||||
kmem_cache_free(req->rsk_ops->slab, req);
|
kmem_cache_free(req->rsk_ops->slab, req);
|
||||||
|
@ -86,6 +93,12 @@ static inline void reqsk_free(struct request_sock *req)
|
||||||
__reqsk_free(req);
|
__reqsk_free(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void reqsk_put(struct request_sock *req)
|
||||||
|
{
|
||||||
|
if (atomic_dec_and_test(&req->rsk_refcnt))
|
||||||
|
reqsk_free(req);
|
||||||
|
}
|
||||||
|
|
||||||
extern int sysctl_max_syn_backlog;
|
extern int sysctl_max_syn_backlog;
|
||||||
|
|
||||||
/** struct listen_sock - listen state
|
/** struct listen_sock - listen state
|
||||||
|
|
|
@ -1625,7 +1625,7 @@ static inline void sock_put(struct sock *sk)
|
||||||
sk_free(sk);
|
sk_free(sk);
|
||||||
}
|
}
|
||||||
/* Generic version of sock_put(), dealing with all sockets
|
/* Generic version of sock_put(), dealing with all sockets
|
||||||
* (TCP_TIMEWAIT, ESTABLISHED...)
|
* (TCP_TIMEWAIT, TCP_NEW_SYN_RECV, ESTABLISHED...)
|
||||||
*/
|
*/
|
||||||
void sock_gen_put(struct sock *sk);
|
void sock_gen_put(struct sock *sk);
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ enum {
|
||||||
TCP_LAST_ACK,
|
TCP_LAST_ACK,
|
||||||
TCP_LISTEN,
|
TCP_LISTEN,
|
||||||
TCP_CLOSING, /* Now a valid state */
|
TCP_CLOSING, /* Now a valid state */
|
||||||
|
TCP_NEW_SYN_RECV,
|
||||||
|
|
||||||
TCP_MAX_STATES /* Leave at the end! */
|
TCP_MAX_STATES /* Leave at the end! */
|
||||||
};
|
};
|
||||||
|
@ -44,7 +45,8 @@ enum {
|
||||||
TCPF_CLOSE_WAIT = (1 << 8),
|
TCPF_CLOSE_WAIT = (1 << 8),
|
||||||
TCPF_LAST_ACK = (1 << 9),
|
TCPF_LAST_ACK = (1 << 9),
|
||||||
TCPF_LISTEN = (1 << 10),
|
TCPF_LISTEN = (1 << 10),
|
||||||
TCPF_CLOSING = (1 << 11)
|
TCPF_CLOSING = (1 << 11),
|
||||||
|
TCPF_NEW_SYN_RECV = (1 << 12),
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _LINUX_TCP_STATES_H */
|
#endif /* _LINUX_TCP_STATES_H */
|
||||||
|
|
|
@ -1668,6 +1668,8 @@ void sock_edemux(struct sk_buff *skb)
|
||||||
|
|
||||||
if (sk->sk_state == TCP_TIME_WAIT)
|
if (sk->sk_state == TCP_TIME_WAIT)
|
||||||
inet_twsk_put(inet_twsk(sk));
|
inet_twsk_put(inet_twsk(sk));
|
||||||
|
else if (sk->sk_state == TCP_NEW_SYN_RECV)
|
||||||
|
reqsk_put(inet_reqsk(sk));
|
||||||
else
|
else
|
||||||
sock_put(sk);
|
sock_put(sk);
|
||||||
}
|
}
|
||||||
|
@ -2726,6 +2728,42 @@ static inline void release_proto_idx(struct proto *prot)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void req_prot_cleanup(struct request_sock_ops *rsk_prot)
|
||||||
|
{
|
||||||
|
if (!rsk_prot)
|
||||||
|
return;
|
||||||
|
kfree(rsk_prot->slab_name);
|
||||||
|
rsk_prot->slab_name = NULL;
|
||||||
|
if (rsk_prot->slab) {
|
||||||
|
kmem_cache_destroy(rsk_prot->slab);
|
||||||
|
rsk_prot->slab = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int req_prot_init(const struct proto *prot)
|
||||||
|
{
|
||||||
|
struct request_sock_ops *rsk_prot = prot->rsk_prot;
|
||||||
|
|
||||||
|
if (!rsk_prot)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
rsk_prot->slab_name = kasprintf(GFP_KERNEL, "request_sock_%s",
|
||||||
|
prot->name);
|
||||||
|
if (!rsk_prot->slab_name)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
rsk_prot->slab = kmem_cache_create(rsk_prot->slab_name,
|
||||||
|
rsk_prot->obj_size, 0,
|
||||||
|
SLAB_HWCACHE_ALIGN, NULL);
|
||||||
|
|
||||||
|
if (!rsk_prot->slab) {
|
||||||
|
pr_crit("%s: Can't create request sock SLAB cache!\n",
|
||||||
|
prot->name);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int proto_register(struct proto *prot, int alloc_slab)
|
int proto_register(struct proto *prot, int alloc_slab)
|
||||||
{
|
{
|
||||||
if (alloc_slab) {
|
if (alloc_slab) {
|
||||||
|
@ -2739,21 +2777,8 @@ int proto_register(struct proto *prot, int alloc_slab)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prot->rsk_prot != NULL) {
|
if (req_prot_init(prot))
|
||||||
prot->rsk_prot->slab_name = kasprintf(GFP_KERNEL, "request_sock_%s", prot->name);
|
goto out_free_request_sock_slab;
|
||||||
if (prot->rsk_prot->slab_name == NULL)
|
|
||||||
goto out_free_sock_slab;
|
|
||||||
|
|
||||||
prot->rsk_prot->slab = kmem_cache_create(prot->rsk_prot->slab_name,
|
|
||||||
prot->rsk_prot->obj_size, 0,
|
|
||||||
SLAB_HWCACHE_ALIGN, NULL);
|
|
||||||
|
|
||||||
if (prot->rsk_prot->slab == NULL) {
|
|
||||||
pr_crit("%s: Can't create request sock SLAB cache!\n",
|
|
||||||
prot->name);
|
|
||||||
goto out_free_request_sock_slab_name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prot->twsk_prot != NULL) {
|
if (prot->twsk_prot != NULL) {
|
||||||
prot->twsk_prot->twsk_slab_name = kasprintf(GFP_KERNEL, "tw_sock_%s", prot->name);
|
prot->twsk_prot->twsk_slab_name = kasprintf(GFP_KERNEL, "tw_sock_%s", prot->name);
|
||||||
|
@ -2782,14 +2807,8 @@ int proto_register(struct proto *prot, int alloc_slab)
|
||||||
out_free_timewait_sock_slab_name:
|
out_free_timewait_sock_slab_name:
|
||||||
kfree(prot->twsk_prot->twsk_slab_name);
|
kfree(prot->twsk_prot->twsk_slab_name);
|
||||||
out_free_request_sock_slab:
|
out_free_request_sock_slab:
|
||||||
if (prot->rsk_prot && prot->rsk_prot->slab) {
|
req_prot_cleanup(prot->rsk_prot);
|
||||||
kmem_cache_destroy(prot->rsk_prot->slab);
|
|
||||||
prot->rsk_prot->slab = NULL;
|
|
||||||
}
|
|
||||||
out_free_request_sock_slab_name:
|
|
||||||
if (prot->rsk_prot)
|
|
||||||
kfree(prot->rsk_prot->slab_name);
|
|
||||||
out_free_sock_slab:
|
|
||||||
kmem_cache_destroy(prot->slab);
|
kmem_cache_destroy(prot->slab);
|
||||||
prot->slab = NULL;
|
prot->slab = NULL;
|
||||||
out:
|
out:
|
||||||
|
@ -2809,11 +2828,7 @@ void proto_unregister(struct proto *prot)
|
||||||
prot->slab = NULL;
|
prot->slab = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prot->rsk_prot != NULL && prot->rsk_prot->slab != NULL) {
|
req_prot_cleanup(prot->rsk_prot);
|
||||||
kmem_cache_destroy(prot->rsk_prot->slab);
|
|
||||||
kfree(prot->rsk_prot->slab_name);
|
|
||||||
prot->rsk_prot->slab = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prot->twsk_prot != NULL && prot->twsk_prot->twsk_slab != NULL) {
|
if (prot->twsk_prot != NULL && prot->twsk_prot->twsk_slab != NULL) {
|
||||||
kmem_cache_destroy(prot->twsk_prot->twsk_slab);
|
kmem_cache_destroy(prot->twsk_prot->twsk_slab);
|
||||||
|
|
|
@ -642,7 +642,7 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
|
||||||
ireq->ir_loc_addr = ip_hdr(skb)->daddr;
|
ireq->ir_loc_addr = ip_hdr(skb)->daddr;
|
||||||
ireq->ir_rmt_addr = ip_hdr(skb)->saddr;
|
ireq->ir_rmt_addr = ip_hdr(skb)->saddr;
|
||||||
write_pnet(&ireq->ireq_net, sock_net(sk));
|
write_pnet(&ireq->ireq_net, sock_net(sk));
|
||||||
atomic64_set(&ireq->ir_cookie, 0);
|
ireq->ireq_family = AF_INET;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Step 3: Process LISTEN state
|
* Step 3: Process LISTEN state
|
||||||
|
|
|
@ -403,6 +403,8 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
|
||||||
ireq = inet_rsk(req);
|
ireq = inet_rsk(req);
|
||||||
ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr;
|
ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr;
|
||||||
ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
|
ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
|
||||||
|
write_pnet(&ireq->ireq_net, sock_net(sk));
|
||||||
|
ireq->ireq_family = AF_INET6;
|
||||||
|
|
||||||
if (ipv6_opt_accepted(sk, skb, IP6CB(skb)) ||
|
if (ipv6_opt_accepted(sk, skb, IP6CB(skb)) ||
|
||||||
np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
|
np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
|
||||||
|
|
|
@ -718,7 +718,6 @@ static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk,
|
||||||
const struct nlmsghdr *unlh)
|
const struct nlmsghdr *unlh)
|
||||||
{
|
{
|
||||||
const struct inet_request_sock *ireq = inet_rsk(req);
|
const struct inet_request_sock *ireq = inet_rsk(req);
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
|
||||||
struct inet_diag_msg *r;
|
struct inet_diag_msg *r;
|
||||||
struct nlmsghdr *nlh;
|
struct nlmsghdr *nlh;
|
||||||
long tmo;
|
long tmo;
|
||||||
|
@ -729,7 +728,7 @@ static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk,
|
||||||
return -EMSGSIZE;
|
return -EMSGSIZE;
|
||||||
|
|
||||||
r = nlmsg_data(nlh);
|
r = nlmsg_data(nlh);
|
||||||
r->idiag_family = sk->sk_family;
|
r->idiag_family = ireq->ireq_family;
|
||||||
r->idiag_state = TCP_SYN_RECV;
|
r->idiag_state = TCP_SYN_RECV;
|
||||||
r->idiag_timer = 1;
|
r->idiag_timer = 1;
|
||||||
r->idiag_retrans = req->num_retrans;
|
r->idiag_retrans = req->num_retrans;
|
||||||
|
@ -744,7 +743,7 @@ static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk,
|
||||||
if (tmo < 0)
|
if (tmo < 0)
|
||||||
tmo = 0;
|
tmo = 0;
|
||||||
|
|
||||||
r->id.idiag_sport = inet->inet_sport;
|
r->id.idiag_sport = htons(ireq->ir_num);
|
||||||
r->id.idiag_dport = ireq->ir_rmt_port;
|
r->id.idiag_dport = ireq->ir_rmt_port;
|
||||||
|
|
||||||
memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
|
memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
|
||||||
|
|
|
@ -262,6 +262,8 @@ void sock_gen_put(struct sock *sk)
|
||||||
|
|
||||||
if (sk->sk_state == TCP_TIME_WAIT)
|
if (sk->sk_state == TCP_TIME_WAIT)
|
||||||
inet_twsk_free(inet_twsk(sk));
|
inet_twsk_free(inet_twsk(sk));
|
||||||
|
else if (sk->sk_state == TCP_NEW_SYN_RECV)
|
||||||
|
reqsk_free(inet_reqsk(sk));
|
||||||
else
|
else
|
||||||
sk_free(sk);
|
sk_free(sk);
|
||||||
}
|
}
|
||||||
|
|
|
@ -347,6 +347,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb)
|
||||||
treq->snt_synack = tcp_opt.saw_tstamp ? tcp_opt.rcv_tsecr : 0;
|
treq->snt_synack = tcp_opt.saw_tstamp ? tcp_opt.rcv_tsecr : 0;
|
||||||
treq->listener = NULL;
|
treq->listener = NULL;
|
||||||
write_pnet(&ireq->ireq_net, sock_net(sk));
|
write_pnet(&ireq->ireq_net, sock_net(sk));
|
||||||
|
ireq->ireq_family = AF_INET;
|
||||||
|
|
||||||
/* 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)
|
||||||
|
|
|
@ -5966,7 +5966,6 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
|
||||||
tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
|
tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
|
||||||
tcp_openreq_init(req, &tmp_opt, skb, sk);
|
tcp_openreq_init(req, &tmp_opt, skb, sk);
|
||||||
write_pnet(&inet_rsk(req)->ireq_net, sock_net(sk));
|
write_pnet(&inet_rsk(req)->ireq_net, sock_net(sk));
|
||||||
atomic64_set(&inet_rsk(req)->ir_cookie, 0);
|
|
||||||
|
|
||||||
af_ops->init_req(req, sk, skb);
|
af_ops->init_req(req, sk, skb);
|
||||||
|
|
||||||
|
|
|
@ -1228,6 +1228,7 @@ static void tcp_v4_init_req(struct request_sock *req, struct sock *sk,
|
||||||
ireq->ir_rmt_addr = ip_hdr(skb)->saddr;
|
ireq->ir_rmt_addr = ip_hdr(skb)->saddr;
|
||||||
ireq->no_srccheck = inet_sk(sk)->transparent;
|
ireq->no_srccheck = inet_sk(sk)->transparent;
|
||||||
ireq->opt = tcp_v4_save_options(skb);
|
ireq->opt = tcp_v4_save_options(skb);
|
||||||
|
ireq->ireq_family = AF_INET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dst_entry *tcp_v4_route_req(struct sock *sk, struct flowi *fl,
|
static struct dst_entry *tcp_v4_route_req(struct sock *sk, struct flowi *fl,
|
||||||
|
@ -2204,7 +2205,7 @@ void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(tcp_proc_unregister);
|
EXPORT_SYMBOL(tcp_proc_unregister);
|
||||||
|
|
||||||
static void get_openreq4(const struct sock *sk, const struct request_sock *req,
|
static void get_openreq4(const struct request_sock *req,
|
||||||
struct seq_file *f, int i, kuid_t uid)
|
struct seq_file *f, int i, kuid_t uid)
|
||||||
{
|
{
|
||||||
const struct inet_request_sock *ireq = inet_rsk(req);
|
const struct inet_request_sock *ireq = inet_rsk(req);
|
||||||
|
@ -2214,7 +2215,7 @@ static void get_openreq4(const struct sock *sk, const struct request_sock *req,
|
||||||
" %02X %08X:%08X %02X:%08lX %08X %5u %8d %u %d %pK",
|
" %02X %08X:%08X %02X:%08lX %08X %5u %8d %u %d %pK",
|
||||||
i,
|
i,
|
||||||
ireq->ir_loc_addr,
|
ireq->ir_loc_addr,
|
||||||
ntohs(inet_sk(sk)->inet_sport),
|
ireq->ir_num,
|
||||||
ireq->ir_rmt_addr,
|
ireq->ir_rmt_addr,
|
||||||
ntohs(ireq->ir_rmt_port),
|
ntohs(ireq->ir_rmt_port),
|
||||||
TCP_SYN_RECV,
|
TCP_SYN_RECV,
|
||||||
|
@ -2225,7 +2226,7 @@ static void get_openreq4(const struct sock *sk, const struct request_sock *req,
|
||||||
from_kuid_munged(seq_user_ns(f), uid),
|
from_kuid_munged(seq_user_ns(f), uid),
|
||||||
0, /* non standard timer */
|
0, /* non standard timer */
|
||||||
0, /* open_requests have no inode */
|
0, /* open_requests have no inode */
|
||||||
atomic_read(&sk->sk_refcnt),
|
0,
|
||||||
req);
|
req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2332,7 +2333,7 @@ static int tcp4_seq_show(struct seq_file *seq, void *v)
|
||||||
get_tcp4_sock(v, seq, st->num);
|
get_tcp4_sock(v, seq, st->num);
|
||||||
break;
|
break;
|
||||||
case TCP_SEQ_STATE_OPENREQ:
|
case TCP_SEQ_STATE_OPENREQ:
|
||||||
get_openreq4(st->syn_wait_sk, v, seq, st->num, st->uid);
|
get_openreq4(v, seq, st->num, st->uid);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -196,6 +196,8 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb)
|
||||||
ireq = inet_rsk(req);
|
ireq = inet_rsk(req);
|
||||||
treq = tcp_rsk(req);
|
treq = tcp_rsk(req);
|
||||||
treq->listener = NULL;
|
treq->listener = NULL;
|
||||||
|
write_pnet(&ireq->ireq_net, sock_net(sk));
|
||||||
|
ireq->ireq_family = AF_INET6;
|
||||||
|
|
||||||
if (security_inet_conn_request(sk, skb, req))
|
if (security_inet_conn_request(sk, skb, req))
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
|
@ -749,6 +749,7 @@ static void tcp_v6_init_req(struct request_sock *req, struct sock *sk,
|
||||||
atomic_inc(&skb->users);
|
atomic_inc(&skb->users);
|
||||||
ireq->pktopts = skb;
|
ireq->pktopts = skb;
|
||||||
}
|
}
|
||||||
|
ireq->ireq_family = AF_INET6;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dst_entry *tcp_v6_route_req(struct sock *sk, struct flowi *fl,
|
static struct dst_entry *tcp_v6_route_req(struct sock *sk, struct flowi *fl,
|
||||||
|
@ -1689,7 +1690,7 @@ static void tcp_v6_destroy_sock(struct sock *sk)
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
/* Proc filesystem TCPv6 sock list dumping. */
|
/* Proc filesystem TCPv6 sock list dumping. */
|
||||||
static void get_openreq6(struct seq_file *seq,
|
static void get_openreq6(struct seq_file *seq,
|
||||||
const struct sock *sk, struct request_sock *req, int i, kuid_t uid)
|
struct request_sock *req, int i, kuid_t uid)
|
||||||
{
|
{
|
||||||
int ttd = req->expires - jiffies;
|
int ttd = req->expires - jiffies;
|
||||||
const struct in6_addr *src = &inet_rsk(req)->ir_v6_loc_addr;
|
const struct in6_addr *src = &inet_rsk(req)->ir_v6_loc_addr;
|
||||||
|
@ -1827,7 +1828,7 @@ static int tcp6_seq_show(struct seq_file *seq, void *v)
|
||||||
get_tcp6_sock(seq, v, st->num);
|
get_tcp6_sock(seq, v, st->num);
|
||||||
break;
|
break;
|
||||||
case TCP_SEQ_STATE_OPENREQ:
|
case TCP_SEQ_STATE_OPENREQ:
|
||||||
get_openreq6(seq, st->syn_wait_sk, v, st->num, st->uid);
|
get_openreq6(seq, v, st->num, st->uid);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
|
Loading…
Add table
Reference in a new issue