diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 105 |
1 files changed, 59 insertions, 46 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index f7e6c2c2d2bb..708dc203b034 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -146,13 +146,15 @@ EXPORT_SYMBOL_GPL(tcp_twsk_unique); | |||
146 | /* This will initiate an outgoing connection. */ | 146 | /* This will initiate an outgoing connection. */ |
147 | int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | 147 | int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) |
148 | { | 148 | { |
149 | struct sockaddr_in *usin = (struct sockaddr_in *)uaddr; | ||
149 | struct inet_sock *inet = inet_sk(sk); | 150 | struct inet_sock *inet = inet_sk(sk); |
150 | struct tcp_sock *tp = tcp_sk(sk); | 151 | struct tcp_sock *tp = tcp_sk(sk); |
151 | struct sockaddr_in *usin = (struct sockaddr_in *)uaddr; | ||
152 | __be16 orig_sport, orig_dport; | 152 | __be16 orig_sport, orig_dport; |
153 | struct rtable *rt; | ||
154 | __be32 daddr, nexthop; | 153 | __be32 daddr, nexthop; |
154 | struct flowi4 *fl4; | ||
155 | struct rtable *rt; | ||
155 | int err; | 156 | int err; |
157 | struct ip_options_rcu *inet_opt; | ||
156 | 158 | ||
157 | if (addr_len < sizeof(struct sockaddr_in)) | 159 | if (addr_len < sizeof(struct sockaddr_in)) |
158 | return -EINVAL; | 160 | return -EINVAL; |
@@ -161,15 +163,18 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
161 | return -EAFNOSUPPORT; | 163 | return -EAFNOSUPPORT; |
162 | 164 | ||
163 | nexthop = daddr = usin->sin_addr.s_addr; | 165 | nexthop = daddr = usin->sin_addr.s_addr; |
164 | if (inet->opt && inet->opt->srr) { | 166 | inet_opt = rcu_dereference_protected(inet->inet_opt, |
167 | sock_owned_by_user(sk)); | ||
168 | if (inet_opt && inet_opt->opt.srr) { | ||
165 | if (!daddr) | 169 | if (!daddr) |
166 | return -EINVAL; | 170 | return -EINVAL; |
167 | nexthop = inet->opt->faddr; | 171 | nexthop = inet_opt->opt.faddr; |
168 | } | 172 | } |
169 | 173 | ||
170 | orig_sport = inet->inet_sport; | 174 | orig_sport = inet->inet_sport; |
171 | orig_dport = usin->sin_port; | 175 | orig_dport = usin->sin_port; |
172 | rt = ip_route_connect(nexthop, inet->inet_saddr, | 176 | fl4 = &inet->cork.fl.u.ip4; |
177 | rt = ip_route_connect(fl4, nexthop, inet->inet_saddr, | ||
173 | RT_CONN_FLAGS(sk), sk->sk_bound_dev_if, | 178 | RT_CONN_FLAGS(sk), sk->sk_bound_dev_if, |
174 | IPPROTO_TCP, | 179 | IPPROTO_TCP, |
175 | orig_sport, orig_dport, sk, true); | 180 | orig_sport, orig_dport, sk, true); |
@@ -185,11 +190,11 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
185 | return -ENETUNREACH; | 190 | return -ENETUNREACH; |
186 | } | 191 | } |
187 | 192 | ||
188 | if (!inet->opt || !inet->opt->srr) | 193 | if (!inet_opt || !inet_opt->opt.srr) |
189 | daddr = rt->rt_dst; | 194 | daddr = fl4->daddr; |
190 | 195 | ||
191 | if (!inet->inet_saddr) | 196 | if (!inet->inet_saddr) |
192 | inet->inet_saddr = rt->rt_src; | 197 | inet->inet_saddr = fl4->saddr; |
193 | inet->inet_rcv_saddr = inet->inet_saddr; | 198 | inet->inet_rcv_saddr = inet->inet_saddr; |
194 | 199 | ||
195 | if (tp->rx_opt.ts_recent_stamp && inet->inet_daddr != daddr) { | 200 | if (tp->rx_opt.ts_recent_stamp && inet->inet_daddr != daddr) { |
@@ -200,8 +205,8 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
200 | } | 205 | } |
201 | 206 | ||
202 | if (tcp_death_row.sysctl_tw_recycle && | 207 | if (tcp_death_row.sysctl_tw_recycle && |
203 | !tp->rx_opt.ts_recent_stamp && rt->rt_dst == daddr) { | 208 | !tp->rx_opt.ts_recent_stamp && fl4->daddr == daddr) { |
204 | struct inet_peer *peer = rt_get_peer(rt); | 209 | struct inet_peer *peer = rt_get_peer(rt, fl4->daddr); |
205 | /* | 210 | /* |
206 | * VJ's idea. We save last timestamp seen from | 211 | * VJ's idea. We save last timestamp seen from |
207 | * the destination in peer table, when entering state | 212 | * the destination in peer table, when entering state |
@@ -221,8 +226,8 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
221 | inet->inet_daddr = daddr; | 226 | inet->inet_daddr = daddr; |
222 | 227 | ||
223 | inet_csk(sk)->icsk_ext_hdr_len = 0; | 228 | inet_csk(sk)->icsk_ext_hdr_len = 0; |
224 | if (inet->opt) | 229 | if (inet_opt) |
225 | inet_csk(sk)->icsk_ext_hdr_len = inet->opt->optlen; | 230 | inet_csk(sk)->icsk_ext_hdr_len = inet_opt->opt.optlen; |
226 | 231 | ||
227 | tp->rx_opt.mss_clamp = TCP_MSS_DEFAULT; | 232 | tp->rx_opt.mss_clamp = TCP_MSS_DEFAULT; |
228 | 233 | ||
@@ -236,8 +241,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
236 | if (err) | 241 | if (err) |
237 | goto failure; | 242 | goto failure; |
238 | 243 | ||
239 | rt = ip_route_newports(rt, IPPROTO_TCP, | 244 | rt = ip_route_newports(fl4, rt, orig_sport, orig_dport, |
240 | orig_sport, orig_dport, | ||
241 | inet->inet_sport, inet->inet_dport, sk); | 245 | inet->inet_sport, inet->inet_dport, sk); |
242 | if (IS_ERR(rt)) { | 246 | if (IS_ERR(rt)) { |
243 | err = PTR_ERR(rt); | 247 | err = PTR_ERR(rt); |
@@ -279,7 +283,7 @@ EXPORT_SYMBOL(tcp_v4_connect); | |||
279 | /* | 283 | /* |
280 | * This routine does path mtu discovery as defined in RFC1191. | 284 | * This routine does path mtu discovery as defined in RFC1191. |
281 | */ | 285 | */ |
282 | static void do_pmtu_discovery(struct sock *sk, struct iphdr *iph, u32 mtu) | 286 | static void do_pmtu_discovery(struct sock *sk, const struct iphdr *iph, u32 mtu) |
283 | { | 287 | { |
284 | struct dst_entry *dst; | 288 | struct dst_entry *dst; |
285 | struct inet_sock *inet = inet_sk(sk); | 289 | struct inet_sock *inet = inet_sk(sk); |
@@ -341,7 +345,7 @@ static void do_pmtu_discovery(struct sock *sk, struct iphdr *iph, u32 mtu) | |||
341 | 345 | ||
342 | void tcp_v4_err(struct sk_buff *icmp_skb, u32 info) | 346 | void tcp_v4_err(struct sk_buff *icmp_skb, u32 info) |
343 | { | 347 | { |
344 | struct iphdr *iph = (struct iphdr *)icmp_skb->data; | 348 | const struct iphdr *iph = (const struct iphdr *)icmp_skb->data; |
345 | struct tcphdr *th = (struct tcphdr *)(icmp_skb->data + (iph->ihl << 2)); | 349 | struct tcphdr *th = (struct tcphdr *)(icmp_skb->data + (iph->ihl << 2)); |
346 | struct inet_connection_sock *icsk; | 350 | struct inet_connection_sock *icsk; |
347 | struct tcp_sock *tp; | 351 | struct tcp_sock *tp; |
@@ -647,7 +651,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb) | |||
647 | arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0; | 651 | arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0; |
648 | 652 | ||
649 | net = dev_net(skb_dst(skb)->dev); | 653 | net = dev_net(skb_dst(skb)->dev); |
650 | ip_send_reply(net->ipv4.tcp_sock, skb, | 654 | ip_send_reply(net->ipv4.tcp_sock, skb, ip_hdr(skb)->saddr, |
651 | &arg, arg.iov[0].iov_len); | 655 | &arg, arg.iov[0].iov_len); |
652 | 656 | ||
653 | TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); | 657 | TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); |
@@ -722,7 +726,7 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack, | |||
722 | if (oif) | 726 | if (oif) |
723 | arg.bound_dev_if = oif; | 727 | arg.bound_dev_if = oif; |
724 | 728 | ||
725 | ip_send_reply(net->ipv4.tcp_sock, skb, | 729 | ip_send_reply(net->ipv4.tcp_sock, skb, ip_hdr(skb)->saddr, |
726 | &arg, arg.iov[0].iov_len); | 730 | &arg, arg.iov[0].iov_len); |
727 | 731 | ||
728 | TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); | 732 | TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); |
@@ -765,11 +769,12 @@ static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst, | |||
765 | struct request_values *rvp) | 769 | struct request_values *rvp) |
766 | { | 770 | { |
767 | const struct inet_request_sock *ireq = inet_rsk(req); | 771 | const struct inet_request_sock *ireq = inet_rsk(req); |
772 | struct flowi4 fl4; | ||
768 | int err = -1; | 773 | int err = -1; |
769 | struct sk_buff * skb; | 774 | struct sk_buff * skb; |
770 | 775 | ||
771 | /* First, grab a route. */ | 776 | /* First, grab a route. */ |
772 | if (!dst && (dst = inet_csk_route_req(sk, req)) == NULL) | 777 | if (!dst && (dst = inet_csk_route_req(sk, &fl4, req)) == NULL) |
773 | return -1; | 778 | return -1; |
774 | 779 | ||
775 | skb = tcp_make_synack(sk, dst, req, rvp); | 780 | skb = tcp_make_synack(sk, dst, req, rvp); |
@@ -820,17 +825,18 @@ static void syn_flood_warning(const struct sk_buff *skb) | |||
820 | /* | 825 | /* |
821 | * Save and compile IPv4 options into the request_sock if needed. | 826 | * Save and compile IPv4 options into the request_sock if needed. |
822 | */ | 827 | */ |
823 | static struct ip_options *tcp_v4_save_options(struct sock *sk, | 828 | static struct ip_options_rcu *tcp_v4_save_options(struct sock *sk, |
824 | struct sk_buff *skb) | 829 | struct sk_buff *skb) |
825 | { | 830 | { |
826 | struct ip_options *opt = &(IPCB(skb)->opt); | 831 | const struct ip_options *opt = &(IPCB(skb)->opt); |
827 | struct ip_options *dopt = NULL; | 832 | struct ip_options_rcu *dopt = NULL; |
828 | 833 | ||
829 | if (opt && opt->optlen) { | 834 | if (opt && opt->optlen) { |
830 | int opt_size = optlength(opt); | 835 | int opt_size = sizeof(*dopt) + opt->optlen; |
836 | |||
831 | dopt = kmalloc(opt_size, GFP_ATOMIC); | 837 | dopt = kmalloc(opt_size, GFP_ATOMIC); |
832 | if (dopt) { | 838 | if (dopt) { |
833 | if (ip_options_echo(dopt, skb)) { | 839 | if (ip_options_echo(&dopt->opt, skb)) { |
834 | kfree(dopt); | 840 | kfree(dopt); |
835 | dopt = NULL; | 841 | dopt = NULL; |
836 | } | 842 | } |
@@ -1333,6 +1339,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1333 | req->cookie_ts = tmp_opt.tstamp_ok; | 1339 | req->cookie_ts = tmp_opt.tstamp_ok; |
1334 | } else if (!isn) { | 1340 | } else if (!isn) { |
1335 | struct inet_peer *peer = NULL; | 1341 | struct inet_peer *peer = NULL; |
1342 | struct flowi4 fl4; | ||
1336 | 1343 | ||
1337 | /* VJ's idea. We save last timestamp seen | 1344 | /* VJ's idea. We save last timestamp seen |
1338 | * from the destination in peer table, when entering | 1345 | * from the destination in peer table, when entering |
@@ -1345,9 +1352,9 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1345 | */ | 1352 | */ |
1346 | if (tmp_opt.saw_tstamp && | 1353 | if (tmp_opt.saw_tstamp && |
1347 | tcp_death_row.sysctl_tw_recycle && | 1354 | tcp_death_row.sysctl_tw_recycle && |
1348 | (dst = inet_csk_route_req(sk, req)) != NULL && | 1355 | (dst = inet_csk_route_req(sk, &fl4, req)) != NULL && |
1349 | (peer = rt_get_peer((struct rtable *)dst)) != NULL && | 1356 | fl4.daddr == saddr && |
1350 | peer->daddr.addr.a4 == saddr) { | 1357 | (peer = rt_get_peer((struct rtable *)dst, fl4.daddr)) != NULL) { |
1351 | inet_peer_refcheck(peer); | 1358 | inet_peer_refcheck(peer); |
1352 | if ((u32)get_seconds() - peer->tcp_ts_stamp < TCP_PAWS_MSL && | 1359 | if ((u32)get_seconds() - peer->tcp_ts_stamp < TCP_PAWS_MSL && |
1353 | (s32)(peer->tcp_ts - req->ts_recent) > | 1360 | (s32)(peer->tcp_ts - req->ts_recent) > |
@@ -1411,19 +1418,16 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1411 | #ifdef CONFIG_TCP_MD5SIG | 1418 | #ifdef CONFIG_TCP_MD5SIG |
1412 | struct tcp_md5sig_key *key; | 1419 | struct tcp_md5sig_key *key; |
1413 | #endif | 1420 | #endif |
1421 | struct ip_options_rcu *inet_opt; | ||
1414 | 1422 | ||
1415 | if (sk_acceptq_is_full(sk)) | 1423 | if (sk_acceptq_is_full(sk)) |
1416 | goto exit_overflow; | 1424 | goto exit_overflow; |
1417 | 1425 | ||
1418 | if (!dst && (dst = inet_csk_route_req(sk, req)) == NULL) | ||
1419 | goto exit; | ||
1420 | |||
1421 | newsk = tcp_create_openreq_child(sk, req, skb); | 1426 | newsk = tcp_create_openreq_child(sk, req, skb); |
1422 | if (!newsk) | 1427 | if (!newsk) |
1423 | goto exit_nonewsk; | 1428 | goto exit_nonewsk; |
1424 | 1429 | ||
1425 | newsk->sk_gso_type = SKB_GSO_TCPV4; | 1430 | newsk->sk_gso_type = SKB_GSO_TCPV4; |
1426 | sk_setup_caps(newsk, dst); | ||
1427 | 1431 | ||
1428 | newtp = tcp_sk(newsk); | 1432 | newtp = tcp_sk(newsk); |
1429 | newinet = inet_sk(newsk); | 1433 | newinet = inet_sk(newsk); |
@@ -1431,15 +1435,21 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1431 | newinet->inet_daddr = ireq->rmt_addr; | 1435 | newinet->inet_daddr = ireq->rmt_addr; |
1432 | newinet->inet_rcv_saddr = ireq->loc_addr; | 1436 | newinet->inet_rcv_saddr = ireq->loc_addr; |
1433 | newinet->inet_saddr = ireq->loc_addr; | 1437 | newinet->inet_saddr = ireq->loc_addr; |
1434 | newinet->opt = ireq->opt; | 1438 | inet_opt = ireq->opt; |
1439 | rcu_assign_pointer(newinet->inet_opt, inet_opt); | ||
1435 | ireq->opt = NULL; | 1440 | ireq->opt = NULL; |
1436 | newinet->mc_index = inet_iif(skb); | 1441 | newinet->mc_index = inet_iif(skb); |
1437 | newinet->mc_ttl = ip_hdr(skb)->ttl; | 1442 | newinet->mc_ttl = ip_hdr(skb)->ttl; |
1438 | inet_csk(newsk)->icsk_ext_hdr_len = 0; | 1443 | inet_csk(newsk)->icsk_ext_hdr_len = 0; |
1439 | if (newinet->opt) | 1444 | if (inet_opt) |
1440 | inet_csk(newsk)->icsk_ext_hdr_len = newinet->opt->optlen; | 1445 | inet_csk(newsk)->icsk_ext_hdr_len = inet_opt->opt.optlen; |
1441 | newinet->inet_id = newtp->write_seq ^ jiffies; | 1446 | newinet->inet_id = newtp->write_seq ^ jiffies; |
1442 | 1447 | ||
1448 | if (!dst && (dst = inet_csk_route_child_sock(sk, newsk, req)) == NULL) | ||
1449 | goto put_and_exit; | ||
1450 | |||
1451 | sk_setup_caps(newsk, dst); | ||
1452 | |||
1443 | tcp_mtup_init(newsk); | 1453 | tcp_mtup_init(newsk); |
1444 | tcp_sync_mss(newsk, dst_mtu(dst)); | 1454 | tcp_sync_mss(newsk, dst_mtu(dst)); |
1445 | newtp->advmss = dst_metric_advmss(dst); | 1455 | newtp->advmss = dst_metric_advmss(dst); |
@@ -1467,10 +1477,8 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1467 | } | 1477 | } |
1468 | #endif | 1478 | #endif |
1469 | 1479 | ||
1470 | if (__inet_inherit_port(sk, newsk) < 0) { | 1480 | if (__inet_inherit_port(sk, newsk) < 0) |
1471 | sock_put(newsk); | 1481 | goto put_and_exit; |
1472 | goto exit; | ||
1473 | } | ||
1474 | __inet_hash_nolisten(newsk, NULL); | 1482 | __inet_hash_nolisten(newsk, NULL); |
1475 | 1483 | ||
1476 | return newsk; | 1484 | return newsk; |
@@ -1482,6 +1490,9 @@ exit_nonewsk: | |||
1482 | exit: | 1490 | exit: |
1483 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); | 1491 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); |
1484 | return NULL; | 1492 | return NULL; |
1493 | put_and_exit: | ||
1494 | sock_put(newsk); | ||
1495 | goto exit; | ||
1485 | } | 1496 | } |
1486 | EXPORT_SYMBOL(tcp_v4_syn_recv_sock); | 1497 | EXPORT_SYMBOL(tcp_v4_syn_recv_sock); |
1487 | 1498 | ||
@@ -1578,6 +1589,7 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
1578 | goto discard; | 1589 | goto discard; |
1579 | 1590 | ||
1580 | if (nsk != sk) { | 1591 | if (nsk != sk) { |
1592 | sock_rps_save_rxhash(nsk, skb->rxhash); | ||
1581 | if (tcp_child_process(sk, nsk, skb)) { | 1593 | if (tcp_child_process(sk, nsk, skb)) { |
1582 | rsk = nsk; | 1594 | rsk = nsk; |
1583 | goto reset; | 1595 | goto reset; |
@@ -1764,12 +1776,13 @@ struct inet_peer *tcp_v4_get_peer(struct sock *sk, bool *release_it) | |||
1764 | struct inet_sock *inet = inet_sk(sk); | 1776 | struct inet_sock *inet = inet_sk(sk); |
1765 | struct inet_peer *peer; | 1777 | struct inet_peer *peer; |
1766 | 1778 | ||
1767 | if (!rt || rt->rt_dst != inet->inet_daddr) { | 1779 | if (!rt || |
1780 | inet->cork.fl.u.ip4.daddr != inet->inet_daddr) { | ||
1768 | peer = inet_getpeer_v4(inet->inet_daddr, 1); | 1781 | peer = inet_getpeer_v4(inet->inet_daddr, 1); |
1769 | *release_it = true; | 1782 | *release_it = true; |
1770 | } else { | 1783 | } else { |
1771 | if (!rt->peer) | 1784 | if (!rt->peer) |
1772 | rt_bind_peer(rt, 1); | 1785 | rt_bind_peer(rt, inet->inet_daddr, 1); |
1773 | peer = rt->peer; | 1786 | peer = rt->peer; |
1774 | *release_it = false; | 1787 | *release_it = false; |
1775 | } | 1788 | } |
@@ -2359,7 +2372,7 @@ static void get_openreq4(struct sock *sk, struct request_sock *req, | |||
2359 | int ttd = req->expires - jiffies; | 2372 | int ttd = req->expires - jiffies; |
2360 | 2373 | ||
2361 | seq_printf(f, "%4d: %08X:%04X %08X:%04X" | 2374 | seq_printf(f, "%4d: %08X:%04X %08X:%04X" |
2362 | " %02X %08X:%08X %02X:%08lX %08X %5d %8d %u %d %p%n", | 2375 | " %02X %08X:%08X %02X:%08lX %08X %5d %8d %u %d %pK%n", |
2363 | i, | 2376 | i, |
2364 | ireq->loc_addr, | 2377 | ireq->loc_addr, |
2365 | ntohs(inet_sk(sk)->inet_sport), | 2378 | ntohs(inet_sk(sk)->inet_sport), |
@@ -2414,7 +2427,7 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len) | |||
2414 | rx_queue = max_t(int, tp->rcv_nxt - tp->copied_seq, 0); | 2427 | rx_queue = max_t(int, tp->rcv_nxt - tp->copied_seq, 0); |
2415 | 2428 | ||
2416 | seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " | 2429 | seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " |
2417 | "%08X %5d %8d %lu %d %p %lu %lu %u %u %d%n", | 2430 | "%08X %5d %8d %lu %d %pK %lu %lu %u %u %d%n", |
2418 | i, src, srcp, dest, destp, sk->sk_state, | 2431 | i, src, srcp, dest, destp, sk->sk_state, |
2419 | tp->write_seq - tp->snd_una, | 2432 | tp->write_seq - tp->snd_una, |
2420 | rx_queue, | 2433 | rx_queue, |
@@ -2449,7 +2462,7 @@ static void get_timewait4_sock(struct inet_timewait_sock *tw, | |||
2449 | srcp = ntohs(tw->tw_sport); | 2462 | srcp = ntohs(tw->tw_sport); |
2450 | 2463 | ||
2451 | seq_printf(f, "%4d: %08X:%04X %08X:%04X" | 2464 | seq_printf(f, "%4d: %08X:%04X %08X:%04X" |
2452 | " %02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p%n", | 2465 | " %02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %pK%n", |
2453 | i, src, srcp, dest, destp, tw->tw_substate, 0, 0, | 2466 | i, src, srcp, dest, destp, tw->tw_substate, 0, 0, |
2454 | 3, jiffies_to_clock_t(ttd), 0, 0, 0, 0, | 2467 | 3, jiffies_to_clock_t(ttd), 0, 0, 0, 0, |
2455 | atomic_read(&tw->tw_refcnt), tw, len); | 2468 | atomic_read(&tw->tw_refcnt), tw, len); |
@@ -2527,7 +2540,7 @@ void tcp4_proc_exit(void) | |||
2527 | 2540 | ||
2528 | struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff *skb) | 2541 | struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff *skb) |
2529 | { | 2542 | { |
2530 | struct iphdr *iph = skb_gro_network_header(skb); | 2543 | const struct iphdr *iph = skb_gro_network_header(skb); |
2531 | 2544 | ||
2532 | switch (skb->ip_summed) { | 2545 | switch (skb->ip_summed) { |
2533 | case CHECKSUM_COMPLETE: | 2546 | case CHECKSUM_COMPLETE: |
@@ -2548,7 +2561,7 @@ struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff *skb) | |||
2548 | 2561 | ||
2549 | int tcp4_gro_complete(struct sk_buff *skb) | 2562 | int tcp4_gro_complete(struct sk_buff *skb) |
2550 | { | 2563 | { |
2551 | struct iphdr *iph = ip_hdr(skb); | 2564 | const struct iphdr *iph = ip_hdr(skb); |
2552 | struct tcphdr *th = tcp_hdr(skb); | 2565 | struct tcphdr *th = tcp_hdr(skb); |
2553 | 2566 | ||
2554 | th->check = ~tcp_v4_check(skb->len - skb_transport_offset(skb), | 2567 | th->check = ~tcp_v4_check(skb->len - skb_transport_offset(skb), |