diff options
author | Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 2005-08-09 23:09:59 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2005-08-29 18:42:26 -0400 |
commit | c676270bcd25015b978722ec0352c330dcc87883 (patch) | |
tree | 098cc52c71d68465e7ee5fbae462d58126b68885 /net/ipv4/tcp_minisocks.c | |
parent | e48c414ee61f4ac8d5cff2973e66a7cbc8a93aa5 (diff) |
[INET_TWSK]: Introduce inet_twsk_alloc
With the parts of tcp_time_wait that are not TCP specific, tcp_time_wait uses
it and so will dccp_time_wait.
Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_minisocks.c')
-rw-r--r-- | net/ipv4/tcp_minisocks.c | 24 |
1 files changed, 2 insertions, 22 deletions
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 4112f7a6d108..66ce1790a94f 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c | |||
@@ -267,37 +267,18 @@ void tcp_time_wait(struct sock *sk, int state, int timeo) | |||
267 | recycle_ok = tp->af_specific->remember_stamp(sk); | 267 | recycle_ok = tp->af_specific->remember_stamp(sk); |
268 | 268 | ||
269 | if (tcp_tw_count < sysctl_tcp_max_tw_buckets) | 269 | if (tcp_tw_count < sysctl_tcp_max_tw_buckets) |
270 | tw = kmem_cache_alloc(sk->sk_prot_creator->twsk_slab, SLAB_ATOMIC); | 270 | tw = inet_twsk_alloc(sk, state); |
271 | 271 | ||
272 | if (tw != NULL) { | 272 | if (tw != NULL) { |
273 | struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw); | 273 | struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw); |
274 | const struct inet_sock *inet = inet_sk(sk); | ||
275 | const int rto = (tp->rto << 2) - (tp->rto >> 1); | 274 | const int rto = (tp->rto << 2) - (tp->rto >> 1); |
276 | 275 | ||
277 | /* Remember our protocol */ | ||
278 | tw->tw_prot = sk->sk_prot_creator; | ||
279 | |||
280 | /* Give us an identity. */ | ||
281 | tw->tw_daddr = inet->daddr; | ||
282 | tw->tw_rcv_saddr = inet->rcv_saddr; | ||
283 | tw->tw_bound_dev_if = sk->sk_bound_dev_if; | ||
284 | tw->tw_num = inet->num; | ||
285 | tw->tw_state = TCP_TIME_WAIT; | ||
286 | tw->tw_substate = state; | ||
287 | tw->tw_sport = inet->sport; | ||
288 | tw->tw_dport = inet->dport; | ||
289 | tw->tw_family = sk->sk_family; | ||
290 | tw->tw_reuse = sk->sk_reuse; | ||
291 | tw->tw_rcv_wscale = tp->rx_opt.rcv_wscale; | 276 | tw->tw_rcv_wscale = tp->rx_opt.rcv_wscale; |
292 | atomic_set(&tw->tw_refcnt, 1); | ||
293 | |||
294 | tw->tw_hashent = sk->sk_hashent; | ||
295 | tcptw->tw_rcv_nxt = tp->rcv_nxt; | 277 | tcptw->tw_rcv_nxt = tp->rcv_nxt; |
296 | tcptw->tw_snd_nxt = tp->snd_nxt; | 278 | tcptw->tw_snd_nxt = tp->snd_nxt; |
297 | tcptw->tw_rcv_wnd = tcp_receive_window(tp); | 279 | tcptw->tw_rcv_wnd = tcp_receive_window(tp); |
298 | tcptw->tw_ts_recent = tp->rx_opt.ts_recent; | 280 | tcptw->tw_ts_recent = tp->rx_opt.ts_recent; |
299 | tcptw->tw_ts_recent_stamp = tp->rx_opt.ts_recent_stamp; | 281 | tcptw->tw_ts_recent_stamp = tp->rx_opt.ts_recent_stamp; |
300 | inet_twsk_dead_node_init(tw); | ||
301 | 282 | ||
302 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 283 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
303 | if (tw->tw_family == PF_INET6) { | 284 | if (tw->tw_family == PF_INET6) { |
@@ -307,8 +288,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo) | |||
307 | ipv6_addr_copy(&tcp6tw->tw_v6_daddr, &np->daddr); | 288 | ipv6_addr_copy(&tcp6tw->tw_v6_daddr, &np->daddr); |
308 | ipv6_addr_copy(&tcp6tw->tw_v6_rcv_saddr, &np->rcv_saddr); | 289 | ipv6_addr_copy(&tcp6tw->tw_v6_rcv_saddr, &np->rcv_saddr); |
309 | tw->tw_ipv6only = np->ipv6only; | 290 | tw->tw_ipv6only = np->ipv6only; |
310 | } else | 291 | } |
311 | tw->tw_ipv6only = 0; | ||
312 | #endif | 292 | #endif |
313 | /* Linkage updates. */ | 293 | /* Linkage updates. */ |
314 | __inet_twsk_hashdance(tw, sk, &tcp_hashinfo); | 294 | __inet_twsk_hashdance(tw, sk, &tcp_hashinfo); |