aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/tcp_ipv6.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r--net/ipv6/tcp_ipv6.c114
1 files changed, 57 insertions, 57 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 5c71501fc917..f67033b4bb66 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -156,7 +156,6 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
156 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel); 156 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
157 if (flowlabel == NULL) 157 if (flowlabel == NULL)
158 return -EINVAL; 158 return -EINVAL;
159 usin->sin6_addr = flowlabel->dst;
160 fl6_sock_release(flowlabel); 159 fl6_sock_release(flowlabel);
161 } 160 }
162 } 161 }
@@ -192,13 +191,13 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
192 } 191 }
193 192
194 if (tp->rx_opt.ts_recent_stamp && 193 if (tp->rx_opt.ts_recent_stamp &&
195 !ipv6_addr_equal(&np->daddr, &usin->sin6_addr)) { 194 !ipv6_addr_equal(&sk->sk_v6_daddr, &usin->sin6_addr)) {
196 tp->rx_opt.ts_recent = 0; 195 tp->rx_opt.ts_recent = 0;
197 tp->rx_opt.ts_recent_stamp = 0; 196 tp->rx_opt.ts_recent_stamp = 0;
198 tp->write_seq = 0; 197 tp->write_seq = 0;
199 } 198 }
200 199
201 np->daddr = usin->sin6_addr; 200 sk->sk_v6_daddr = usin->sin6_addr;
202 np->flow_label = fl6.flowlabel; 201 np->flow_label = fl6.flowlabel;
203 202
204 /* 203 /*
@@ -237,17 +236,17 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
237 } else { 236 } else {
238 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); 237 ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr);
239 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, 238 ipv6_addr_set_v4mapped(inet->inet_rcv_saddr,
240 &np->rcv_saddr); 239 &sk->sk_v6_rcv_saddr);
241 } 240 }
242 241
243 return err; 242 return err;
244 } 243 }
245 244
246 if (!ipv6_addr_any(&np->rcv_saddr)) 245 if (!ipv6_addr_any(&sk->sk_v6_rcv_saddr))
247 saddr = &np->rcv_saddr; 246 saddr = &sk->sk_v6_rcv_saddr;
248 247
249 fl6.flowi6_proto = IPPROTO_TCP; 248 fl6.flowi6_proto = IPPROTO_TCP;
250 fl6.daddr = np->daddr; 249 fl6.daddr = sk->sk_v6_daddr;
251 fl6.saddr = saddr ? *saddr : np->saddr; 250 fl6.saddr = saddr ? *saddr : np->saddr;
252 fl6.flowi6_oif = sk->sk_bound_dev_if; 251 fl6.flowi6_oif = sk->sk_bound_dev_if;
253 fl6.flowi6_mark = sk->sk_mark; 252 fl6.flowi6_mark = sk->sk_mark;
@@ -266,7 +265,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
266 265
267 if (saddr == NULL) { 266 if (saddr == NULL) {
268 saddr = &fl6.saddr; 267 saddr = &fl6.saddr;
269 np->rcv_saddr = *saddr; 268 sk->sk_v6_rcv_saddr = *saddr;
270 } 269 }
271 270
272 /* set the source address */ 271 /* set the source address */
@@ -279,7 +278,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
279 rt = (struct rt6_info *) dst; 278 rt = (struct rt6_info *) dst;
280 if (tcp_death_row.sysctl_tw_recycle && 279 if (tcp_death_row.sysctl_tw_recycle &&
281 !tp->rx_opt.ts_recent_stamp && 280 !tp->rx_opt.ts_recent_stamp &&
282 ipv6_addr_equal(&rt->rt6i_dst.addr, &np->daddr)) 281 ipv6_addr_equal(&rt->rt6i_dst.addr, &sk->sk_v6_daddr))
283 tcp_fetch_timewait_stamp(sk, dst); 282 tcp_fetch_timewait_stamp(sk, dst);
284 283
285 icsk->icsk_ext_hdr_len = 0; 284 icsk->icsk_ext_hdr_len = 0;
@@ -298,7 +297,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
298 297
299 if (!tp->write_seq && likely(!tp->repair)) 298 if (!tp->write_seq && likely(!tp->repair))
300 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32, 299 tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,
301 np->daddr.s6_addr32, 300 sk->sk_v6_daddr.s6_addr32,
302 inet->inet_sport, 301 inet->inet_sport,
303 inet->inet_dport); 302 inet->inet_dport);
304 303
@@ -465,7 +464,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct dst_entry *dst,
465 struct request_sock *req, 464 struct request_sock *req,
466 u16 queue_mapping) 465 u16 queue_mapping)
467{ 466{
468 struct inet6_request_sock *treq = inet6_rsk(req); 467 struct inet_request_sock *ireq = inet_rsk(req);
469 struct ipv6_pinfo *np = inet6_sk(sk); 468 struct ipv6_pinfo *np = inet6_sk(sk);
470 struct sk_buff * skb; 469 struct sk_buff * skb;
471 int err = -ENOMEM; 470 int err = -ENOMEM;
@@ -477,9 +476,10 @@ static int tcp_v6_send_synack(struct sock *sk, struct dst_entry *dst,
477 skb = tcp_make_synack(sk, dst, req, NULL); 476 skb = tcp_make_synack(sk, dst, req, NULL);
478 477
479 if (skb) { 478 if (skb) {
480 __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr); 479 __tcp_v6_send_check(skb, &ireq->ir_v6_loc_addr,
480 &ireq->ir_v6_rmt_addr);
481 481
482 fl6->daddr = treq->rmt_addr; 482 fl6->daddr = ireq->ir_v6_rmt_addr;
483 skb_set_queue_mapping(skb, queue_mapping); 483 skb_set_queue_mapping(skb, queue_mapping);
484 err = ip6_xmit(sk, skb, fl6, np->opt, np->tclass); 484 err = ip6_xmit(sk, skb, fl6, np->opt, np->tclass);
485 err = net_xmit_eval(err); 485 err = net_xmit_eval(err);
@@ -502,7 +502,7 @@ static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req)
502 502
503static void tcp_v6_reqsk_destructor(struct request_sock *req) 503static void tcp_v6_reqsk_destructor(struct request_sock *req)
504{ 504{
505 kfree_skb(inet6_rsk(req)->pktopts); 505 kfree_skb(inet_rsk(req)->pktopts);
506} 506}
507 507
508#ifdef CONFIG_TCP_MD5SIG 508#ifdef CONFIG_TCP_MD5SIG
@@ -515,13 +515,13 @@ static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
515static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk, 515static struct tcp_md5sig_key *tcp_v6_md5_lookup(struct sock *sk,
516 struct sock *addr_sk) 516 struct sock *addr_sk)
517{ 517{
518 return tcp_v6_md5_do_lookup(sk, &inet6_sk(addr_sk)->daddr); 518 return tcp_v6_md5_do_lookup(sk, &addr_sk->sk_v6_daddr);
519} 519}
520 520
521static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk, 521static struct tcp_md5sig_key *tcp_v6_reqsk_md5_lookup(struct sock *sk,
522 struct request_sock *req) 522 struct request_sock *req)
523{ 523{
524 return tcp_v6_md5_do_lookup(sk, &inet6_rsk(req)->rmt_addr); 524 return tcp_v6_md5_do_lookup(sk, &inet_rsk(req)->ir_v6_rmt_addr);
525} 525}
526 526
527static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval, 527static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,
@@ -621,10 +621,10 @@ static int tcp_v6_md5_hash_skb(char *md5_hash, struct tcp_md5sig_key *key,
621 621
622 if (sk) { 622 if (sk) {
623 saddr = &inet6_sk(sk)->saddr; 623 saddr = &inet6_sk(sk)->saddr;
624 daddr = &inet6_sk(sk)->daddr; 624 daddr = &sk->sk_v6_daddr;
625 } else if (req) { 625 } else if (req) {
626 saddr = &inet6_rsk(req)->loc_addr; 626 saddr = &inet_rsk(req)->ir_v6_loc_addr;
627 daddr = &inet6_rsk(req)->rmt_addr; 627 daddr = &inet_rsk(req)->ir_v6_rmt_addr;
628 } else { 628 } else {
629 const struct ipv6hdr *ip6h = ipv6_hdr(skb); 629 const struct ipv6hdr *ip6h = ipv6_hdr(skb);
630 saddr = &ip6h->saddr; 630 saddr = &ip6h->saddr;
@@ -949,7 +949,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
949{ 949{
950 struct tcp_options_received tmp_opt; 950 struct tcp_options_received tmp_opt;
951 struct request_sock *req; 951 struct request_sock *req;
952 struct inet6_request_sock *treq; 952 struct inet_request_sock *ireq;
953 struct ipv6_pinfo *np = inet6_sk(sk); 953 struct ipv6_pinfo *np = inet6_sk(sk);
954 struct tcp_sock *tp = tcp_sk(sk); 954 struct tcp_sock *tp = tcp_sk(sk);
955 __u32 isn = TCP_SKB_CB(skb)->when; 955 __u32 isn = TCP_SKB_CB(skb)->when;
@@ -994,25 +994,25 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
994 tmp_opt.tstamp_ok = tmp_opt.saw_tstamp; 994 tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
995 tcp_openreq_init(req, &tmp_opt, skb); 995 tcp_openreq_init(req, &tmp_opt, skb);
996 996
997 treq = inet6_rsk(req); 997 ireq = inet_rsk(req);
998 treq->rmt_addr = ipv6_hdr(skb)->saddr; 998 ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr;
999 treq->loc_addr = ipv6_hdr(skb)->daddr; 999 ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
1000 if (!want_cookie || tmp_opt.tstamp_ok) 1000 if (!want_cookie || tmp_opt.tstamp_ok)
1001 TCP_ECN_create_request(req, skb, sock_net(sk)); 1001 TCP_ECN_create_request(req, skb, sock_net(sk));
1002 1002
1003 treq->iif = sk->sk_bound_dev_if; 1003 ireq->ir_iif = sk->sk_bound_dev_if;
1004 1004
1005 /* So that link locals have meaning */ 1005 /* So that link locals have meaning */
1006 if (!sk->sk_bound_dev_if && 1006 if (!sk->sk_bound_dev_if &&
1007 ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL) 1007 ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL)
1008 treq->iif = inet6_iif(skb); 1008 ireq->ir_iif = inet6_iif(skb);
1009 1009
1010 if (!isn) { 1010 if (!isn) {
1011 if (ipv6_opt_accepted(sk, skb) || 1011 if (ipv6_opt_accepted(sk, skb) ||
1012 np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo || 1012 np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
1013 np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) { 1013 np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
1014 atomic_inc(&skb->users); 1014 atomic_inc(&skb->users);
1015 treq->pktopts = skb; 1015 ireq->pktopts = skb;
1016 } 1016 }
1017 1017
1018 if (want_cookie) { 1018 if (want_cookie) {
@@ -1051,7 +1051,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1051 * to the moment of synflood. 1051 * to the moment of synflood.
1052 */ 1052 */
1053 LIMIT_NETDEBUG(KERN_DEBUG "TCP: drop open request from %pI6/%u\n", 1053 LIMIT_NETDEBUG(KERN_DEBUG "TCP: drop open request from %pI6/%u\n",
1054 &treq->rmt_addr, ntohs(tcp_hdr(skb)->source)); 1054 &ireq->ir_v6_rmt_addr, ntohs(tcp_hdr(skb)->source));
1055 goto drop_and_release; 1055 goto drop_and_release;
1056 } 1056 }
1057 1057
@@ -1086,7 +1086,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1086 struct request_sock *req, 1086 struct request_sock *req,
1087 struct dst_entry *dst) 1087 struct dst_entry *dst)
1088{ 1088{
1089 struct inet6_request_sock *treq; 1089 struct inet_request_sock *ireq;
1090 struct ipv6_pinfo *newnp, *np = inet6_sk(sk); 1090 struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
1091 struct tcp6_sock *newtcp6sk; 1091 struct tcp6_sock *newtcp6sk;
1092 struct inet_sock *newinet; 1092 struct inet_sock *newinet;
@@ -1116,11 +1116,11 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1116 1116
1117 memcpy(newnp, np, sizeof(struct ipv6_pinfo)); 1117 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1118 1118
1119 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newnp->daddr); 1119 ipv6_addr_set_v4mapped(newinet->inet_daddr, &newsk->sk_v6_daddr);
1120 1120
1121 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr); 1121 ipv6_addr_set_v4mapped(newinet->inet_saddr, &newnp->saddr);
1122 1122
1123 newnp->rcv_saddr = newnp->saddr; 1123 newsk->sk_v6_rcv_saddr = newnp->saddr;
1124 1124
1125 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped; 1125 inet_csk(newsk)->icsk_af_ops = &ipv6_mapped;
1126 newsk->sk_backlog_rcv = tcp_v4_do_rcv; 1126 newsk->sk_backlog_rcv = tcp_v4_do_rcv;
@@ -1151,7 +1151,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1151 return newsk; 1151 return newsk;
1152 } 1152 }
1153 1153
1154 treq = inet6_rsk(req); 1154 ireq = inet_rsk(req);
1155 1155
1156 if (sk_acceptq_is_full(sk)) 1156 if (sk_acceptq_is_full(sk))
1157 goto out_overflow; 1157 goto out_overflow;
@@ -1185,10 +1185,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1185 1185
1186 memcpy(newnp, np, sizeof(struct ipv6_pinfo)); 1186 memcpy(newnp, np, sizeof(struct ipv6_pinfo));
1187 1187
1188 newnp->daddr = treq->rmt_addr; 1188 newsk->sk_v6_daddr = ireq->ir_v6_rmt_addr;
1189 newnp->saddr = treq->loc_addr; 1189 newnp->saddr = ireq->ir_v6_loc_addr;
1190 newnp->rcv_saddr = treq->loc_addr; 1190 newsk->sk_v6_rcv_saddr = ireq->ir_v6_loc_addr;
1191 newsk->sk_bound_dev_if = treq->iif; 1191 newsk->sk_bound_dev_if = ireq->ir_iif;
1192 1192
1193 /* Now IPv6 options... 1193 /* Now IPv6 options...
1194 1194
@@ -1203,11 +1203,11 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1203 1203
1204 /* Clone pktoptions received with SYN */ 1204 /* Clone pktoptions received with SYN */
1205 newnp->pktoptions = NULL; 1205 newnp->pktoptions = NULL;
1206 if (treq->pktopts != NULL) { 1206 if (ireq->pktopts != NULL) {
1207 newnp->pktoptions = skb_clone(treq->pktopts, 1207 newnp->pktoptions = skb_clone(ireq->pktopts,
1208 sk_gfp_atomic(sk, GFP_ATOMIC)); 1208 sk_gfp_atomic(sk, GFP_ATOMIC));
1209 consume_skb(treq->pktopts); 1209 consume_skb(ireq->pktopts);
1210 treq->pktopts = NULL; 1210 ireq->pktopts = NULL;
1211 if (newnp->pktoptions) 1211 if (newnp->pktoptions)
1212 skb_set_owner_r(newnp->pktoptions, newsk); 1212 skb_set_owner_r(newnp->pktoptions, newsk);
1213 } 1213 }
@@ -1244,13 +1244,13 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1244 1244
1245#ifdef CONFIG_TCP_MD5SIG 1245#ifdef CONFIG_TCP_MD5SIG
1246 /* Copy over the MD5 key from the original socket */ 1246 /* Copy over the MD5 key from the original socket */
1247 if ((key = tcp_v6_md5_do_lookup(sk, &newnp->daddr)) != NULL) { 1247 if ((key = tcp_v6_md5_do_lookup(sk, &newsk->sk_v6_daddr)) != NULL) {
1248 /* We're using one, so create a matching key 1248 /* We're using one, so create a matching key
1249 * on the newsk structure. If we fail to get 1249 * on the newsk structure. If we fail to get
1250 * memory, then we end up not copying the key 1250 * memory, then we end up not copying the key
1251 * across. Shucks. 1251 * across. Shucks.
1252 */ 1252 */
1253 tcp_md5_do_add(newsk, (union tcp_md5_addr *)&newnp->daddr, 1253 tcp_md5_do_add(newsk, (union tcp_md5_addr *)&newsk->sk_v6_daddr,
1254 AF_INET6, key->key, key->keylen, 1254 AF_INET6, key->key, key->keylen,
1255 sk_gfp_atomic(sk, GFP_ATOMIC)); 1255 sk_gfp_atomic(sk, GFP_ATOMIC));
1256 } 1256 }
@@ -1722,8 +1722,8 @@ static void get_openreq6(struct seq_file *seq,
1722 const struct sock *sk, struct request_sock *req, int i, kuid_t uid) 1722 const struct sock *sk, struct request_sock *req, int i, kuid_t uid)
1723{ 1723{
1724 int ttd = req->expires - jiffies; 1724 int ttd = req->expires - jiffies;
1725 const struct in6_addr *src = &inet6_rsk(req)->loc_addr; 1725 const struct in6_addr *src = &inet_rsk(req)->ir_v6_loc_addr;
1726 const struct in6_addr *dest = &inet6_rsk(req)->rmt_addr; 1726 const struct in6_addr *dest = &inet_rsk(req)->ir_v6_rmt_addr;
1727 1727
1728 if (ttd < 0) 1728 if (ttd < 0)
1729 ttd = 0; 1729 ttd = 0;
@@ -1734,10 +1734,10 @@ static void get_openreq6(struct seq_file *seq,
1734 i, 1734 i,
1735 src->s6_addr32[0], src->s6_addr32[1], 1735 src->s6_addr32[0], src->s6_addr32[1],
1736 src->s6_addr32[2], src->s6_addr32[3], 1736 src->s6_addr32[2], src->s6_addr32[3],
1737 ntohs(inet_rsk(req)->loc_port), 1737 inet_rsk(req)->ir_num,
1738 dest->s6_addr32[0], dest->s6_addr32[1], 1738 dest->s6_addr32[0], dest->s6_addr32[1],
1739 dest->s6_addr32[2], dest->s6_addr32[3], 1739 dest->s6_addr32[2], dest->s6_addr32[3],
1740 ntohs(inet_rsk(req)->rmt_port), 1740 ntohs(inet_rsk(req)->ir_rmt_port),
1741 TCP_SYN_RECV, 1741 TCP_SYN_RECV,
1742 0,0, /* could print option size, but that is af dependent. */ 1742 0,0, /* could print option size, but that is af dependent. */
1743 1, /* timers active (only the expire timer) */ 1743 1, /* timers active (only the expire timer) */
@@ -1758,10 +1758,9 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
1758 const struct inet_sock *inet = inet_sk(sp); 1758 const struct inet_sock *inet = inet_sk(sp);
1759 const struct tcp_sock *tp = tcp_sk(sp); 1759 const struct tcp_sock *tp = tcp_sk(sp);
1760 const struct inet_connection_sock *icsk = inet_csk(sp); 1760 const struct inet_connection_sock *icsk = inet_csk(sp);
1761 const struct ipv6_pinfo *np = inet6_sk(sp);
1762 1761
1763 dest = &np->daddr; 1762 dest = &sp->sk_v6_daddr;
1764 src = &np->rcv_saddr; 1763 src = &sp->sk_v6_rcv_saddr;
1765 destp = ntohs(inet->inet_dport); 1764 destp = ntohs(inet->inet_dport);
1766 srcp = ntohs(inet->inet_sport); 1765 srcp = ntohs(inet->inet_sport);
1767 1766
@@ -1810,11 +1809,10 @@ static void get_timewait6_sock(struct seq_file *seq,
1810{ 1809{
1811 const struct in6_addr *dest, *src; 1810 const struct in6_addr *dest, *src;
1812 __u16 destp, srcp; 1811 __u16 destp, srcp;
1813 const struct inet6_timewait_sock *tw6 = inet6_twsk((struct sock *)tw); 1812 s32 delta = tw->tw_ttd - inet_tw_time_stamp();
1814 long delta = tw->tw_ttd - jiffies;
1815 1813
1816 dest = &tw6->tw_v6_daddr; 1814 dest = &tw->tw_v6_daddr;
1817 src = &tw6->tw_v6_rcv_saddr; 1815 src = &tw->tw_v6_rcv_saddr;
1818 destp = ntohs(tw->tw_dport); 1816 destp = ntohs(tw->tw_dport);
1819 srcp = ntohs(tw->tw_sport); 1817 srcp = ntohs(tw->tw_sport);
1820 1818
@@ -1834,6 +1832,7 @@ static void get_timewait6_sock(struct seq_file *seq,
1834static int tcp6_seq_show(struct seq_file *seq, void *v) 1832static int tcp6_seq_show(struct seq_file *seq, void *v)
1835{ 1833{
1836 struct tcp_iter_state *st; 1834 struct tcp_iter_state *st;
1835 struct sock *sk = v;
1837 1836
1838 if (v == SEQ_START_TOKEN) { 1837 if (v == SEQ_START_TOKEN) {
1839 seq_puts(seq, 1838 seq_puts(seq,
@@ -1849,14 +1848,14 @@ static int tcp6_seq_show(struct seq_file *seq, void *v)
1849 switch (st->state) { 1848 switch (st->state) {
1850 case TCP_SEQ_STATE_LISTENING: 1849 case TCP_SEQ_STATE_LISTENING:
1851 case TCP_SEQ_STATE_ESTABLISHED: 1850 case TCP_SEQ_STATE_ESTABLISHED:
1852 get_tcp6_sock(seq, v, st->num); 1851 if (sk->sk_state == TCP_TIME_WAIT)
1852 get_timewait6_sock(seq, v, st->num);
1853 else
1854 get_tcp6_sock(seq, v, st->num);
1853 break; 1855 break;
1854 case TCP_SEQ_STATE_OPENREQ: 1856 case TCP_SEQ_STATE_OPENREQ:
1855 get_openreq6(seq, st->syn_wait_sk, v, st->num, st->uid); 1857 get_openreq6(seq, st->syn_wait_sk, v, st->num, st->uid);
1856 break; 1858 break;
1857 case TCP_SEQ_STATE_TIME_WAIT:
1858 get_timewait6_sock(seq, v, st->num);
1859 break;
1860 } 1859 }
1861out: 1860out:
1862 return 0; 1861 return 0;
@@ -1929,6 +1928,7 @@ struct proto tcpv6_prot = {
1929 .memory_allocated = &tcp_memory_allocated, 1928 .memory_allocated = &tcp_memory_allocated,
1930 .memory_pressure = &tcp_memory_pressure, 1929 .memory_pressure = &tcp_memory_pressure,
1931 .orphan_count = &tcp_orphan_count, 1930 .orphan_count = &tcp_orphan_count,
1931 .sysctl_mem = sysctl_tcp_mem,
1932 .sysctl_wmem = sysctl_tcp_wmem, 1932 .sysctl_wmem = sysctl_tcp_wmem,
1933 .sysctl_rmem = sysctl_tcp_rmem, 1933 .sysctl_rmem = sysctl_tcp_rmem,
1934 .max_header = MAX_TCP_HEADER, 1934 .max_header = MAX_TCP_HEADER,