Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Arnaldo Carvalho de Melo and committed by
David S. Miller
c676270b e48c414e

+33 -22
+3
include/net/inet_timewait_sock.h
··· 142 142 } 143 143 } 144 144 145 + extern struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, 146 + const int state); 147 + 145 148 extern void __inet_twsk_kill(struct inet_timewait_sock *tw, 146 149 struct inet_hashinfo *hashinfo); 147 150
+28
net/ipv4/inet_timewait_sock.c
··· 81 81 82 82 write_unlock(&ehead->lock); 83 83 } 84 + 85 + struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, const int state) 86 + { 87 + struct inet_timewait_sock *tw = kmem_cache_alloc(sk->sk_prot_creator->twsk_slab, 88 + SLAB_ATOMIC); 89 + if (tw != NULL) { 90 + const struct inet_sock *inet = inet_sk(sk); 91 + 92 + /* Give us an identity. */ 93 + tw->tw_daddr = inet->daddr; 94 + tw->tw_rcv_saddr = inet->rcv_saddr; 95 + tw->tw_bound_dev_if = sk->sk_bound_dev_if; 96 + tw->tw_num = inet->num; 97 + tw->tw_state = TCP_TIME_WAIT; 98 + tw->tw_substate = state; 99 + tw->tw_sport = inet->sport; 100 + tw->tw_dport = inet->dport; 101 + tw->tw_family = sk->sk_family; 102 + tw->tw_reuse = sk->sk_reuse; 103 + tw->tw_hashent = sk->sk_hashent; 104 + tw->tw_ipv6only = 0; 105 + tw->tw_prot = sk->sk_prot_creator; 106 + atomic_set(&tw->tw_refcnt, 1); 107 + inet_twsk_dead_node_init(tw); 108 + } 109 + 110 + return tw; 111 + }
+2 -22
net/ipv4/tcp_minisocks.c
··· 267 267 recycle_ok = tp->af_specific->remember_stamp(sk); 268 268 269 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 272 if (tw != NULL) { 273 273 struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw); 274 - const struct inet_sock *inet = inet_sk(sk); 275 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 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 277 tcptw->tw_rcv_nxt = tp->rcv_nxt; 296 278 tcptw->tw_snd_nxt = tp->snd_nxt; 297 279 tcptw->tw_rcv_wnd = tcp_receive_window(tp); 298 280 tcptw->tw_ts_recent = tp->rx_opt.ts_recent; 299 281 tcptw->tw_ts_recent_stamp = tp->rx_opt.ts_recent_stamp; 300 - inet_twsk_dead_node_init(tw); 301 282 302 283 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 303 284 if (tw->tw_family == PF_INET6) { ··· 288 307 ipv6_addr_copy(&tcp6tw->tw_v6_daddr, &np->daddr); 289 308 ipv6_addr_copy(&tcp6tw->tw_v6_rcv_saddr, &np->rcv_saddr); 290 309 tw->tw_ipv6only = np->ipv6only; 291 - } else 292 - tw->tw_ipv6only = 0; 310 + } 293 311 #endif 294 312 /* Linkage updates. */ 295 313 __inet_twsk_hashdance(tw, sk, &tcp_hashinfo);