diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 236 |
1 files changed, 149 insertions, 87 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index cad73b7dfef0..1f5e6049883e 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -5,8 +5,6 @@ | |||
| 5 | * | 5 | * |
| 6 | * Implementation of the Transmission Control Protocol(TCP). | 6 | * Implementation of the Transmission Control Protocol(TCP). |
| 7 | * | 7 | * |
| 8 | * Version: $Id: tcp_input.c,v 1.243 2002/02/01 22:01:04 davem Exp $ | ||
| 9 | * | ||
| 10 | * Authors: Ross Biro | 8 | * Authors: Ross Biro |
| 11 | * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> | 9 | * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> |
| 12 | * Mark Evans, <evansmp@uhura.aston.ac.uk> | 10 | * Mark Evans, <evansmp@uhura.aston.ac.uk> |
| @@ -604,7 +602,7 @@ static u32 tcp_rto_min(struct sock *sk) | |||
| 604 | u32 rto_min = TCP_RTO_MIN; | 602 | u32 rto_min = TCP_RTO_MIN; |
| 605 | 603 | ||
| 606 | if (dst && dst_metric_locked(dst, RTAX_RTO_MIN)) | 604 | if (dst && dst_metric_locked(dst, RTAX_RTO_MIN)) |
| 607 | rto_min = dst_metric(dst, RTAX_RTO_MIN); | 605 | rto_min = dst_metric_rtt(dst, RTAX_RTO_MIN); |
| 608 | return rto_min; | 606 | return rto_min; |
| 609 | } | 607 | } |
| 610 | 608 | ||
| @@ -731,6 +729,7 @@ void tcp_update_metrics(struct sock *sk) | |||
| 731 | if (dst && (dst->flags & DST_HOST)) { | 729 | if (dst && (dst->flags & DST_HOST)) { |
| 732 | const struct inet_connection_sock *icsk = inet_csk(sk); | 730 | const struct inet_connection_sock *icsk = inet_csk(sk); |
| 733 | int m; | 731 | int m; |
| 732 | unsigned long rtt; | ||
| 734 | 733 | ||
| 735 | if (icsk->icsk_backoff || !tp->srtt) { | 734 | if (icsk->icsk_backoff || !tp->srtt) { |
| 736 | /* This session failed to estimate rtt. Why? | 735 | /* This session failed to estimate rtt. Why? |
| @@ -742,7 +741,8 @@ void tcp_update_metrics(struct sock *sk) | |||
| 742 | return; | 741 | return; |
| 743 | } | 742 | } |
| 744 | 743 | ||
| 745 | m = dst_metric(dst, RTAX_RTT) - tp->srtt; | 744 | rtt = dst_metric_rtt(dst, RTAX_RTT); |
| 745 | m = rtt - tp->srtt; | ||
| 746 | 746 | ||
| 747 | /* If newly calculated rtt larger than stored one, | 747 | /* If newly calculated rtt larger than stored one, |
| 748 | * store new one. Otherwise, use EWMA. Remember, | 748 | * store new one. Otherwise, use EWMA. Remember, |
| @@ -750,12 +750,13 @@ void tcp_update_metrics(struct sock *sk) | |||
| 750 | */ | 750 | */ |
| 751 | if (!(dst_metric_locked(dst, RTAX_RTT))) { | 751 | if (!(dst_metric_locked(dst, RTAX_RTT))) { |
| 752 | if (m <= 0) | 752 | if (m <= 0) |
| 753 | dst->metrics[RTAX_RTT - 1] = tp->srtt; | 753 | set_dst_metric_rtt(dst, RTAX_RTT, tp->srtt); |
| 754 | else | 754 | else |
| 755 | dst->metrics[RTAX_RTT - 1] -= (m >> 3); | 755 | set_dst_metric_rtt(dst, RTAX_RTT, rtt - (m >> 3)); |
| 756 | } | 756 | } |
| 757 | 757 | ||
| 758 | if (!(dst_metric_locked(dst, RTAX_RTTVAR))) { | 758 | if (!(dst_metric_locked(dst, RTAX_RTTVAR))) { |
| 759 | unsigned long var; | ||
| 759 | if (m < 0) | 760 | if (m < 0) |
| 760 | m = -m; | 761 | m = -m; |
| 761 | 762 | ||
| @@ -764,11 +765,13 @@ void tcp_update_metrics(struct sock *sk) | |||
| 764 | if (m < tp->mdev) | 765 | if (m < tp->mdev) |
| 765 | m = tp->mdev; | 766 | m = tp->mdev; |
| 766 | 767 | ||
| 767 | if (m >= dst_metric(dst, RTAX_RTTVAR)) | 768 | var = dst_metric_rtt(dst, RTAX_RTTVAR); |
| 768 | dst->metrics[RTAX_RTTVAR - 1] = m; | 769 | if (m >= var) |
| 770 | var = m; | ||
| 769 | else | 771 | else |
| 770 | dst->metrics[RTAX_RTTVAR-1] -= | 772 | var -= (var - m) >> 2; |
| 771 | (dst_metric(dst, RTAX_RTTVAR) - m)>>2; | 773 | |
| 774 | set_dst_metric_rtt(dst, RTAX_RTTVAR, var); | ||
| 772 | } | 775 | } |
| 773 | 776 | ||
| 774 | if (tp->snd_ssthresh >= 0xFFFF) { | 777 | if (tp->snd_ssthresh >= 0xFFFF) { |
| @@ -899,7 +902,7 @@ static void tcp_init_metrics(struct sock *sk) | |||
| 899 | if (dst_metric(dst, RTAX_RTT) == 0) | 902 | if (dst_metric(dst, RTAX_RTT) == 0) |
| 900 | goto reset; | 903 | goto reset; |
| 901 | 904 | ||
| 902 | if (!tp->srtt && dst_metric(dst, RTAX_RTT) < (TCP_TIMEOUT_INIT << 3)) | 905 | if (!tp->srtt && dst_metric_rtt(dst, RTAX_RTT) < (TCP_TIMEOUT_INIT << 3)) |
| 903 | goto reset; | 906 | goto reset; |
| 904 | 907 | ||
| 905 | /* Initial rtt is determined from SYN,SYN-ACK. | 908 | /* Initial rtt is determined from SYN,SYN-ACK. |
| @@ -916,12 +919,12 @@ static void tcp_init_metrics(struct sock *sk) | |||
| 916 | * to low value, and then abruptly stops to do it and starts to delay | 919 | * to low value, and then abruptly stops to do it and starts to delay |
| 917 | * ACKs, wait for troubles. | 920 | * ACKs, wait for troubles. |
| 918 | */ | 921 | */ |
| 919 | if (dst_metric(dst, RTAX_RTT) > tp->srtt) { | 922 | if (dst_metric_rtt(dst, RTAX_RTT) > tp->srtt) { |
| 920 | tp->srtt = dst_metric(dst, RTAX_RTT); | 923 | tp->srtt = dst_metric_rtt(dst, RTAX_RTT); |
| 921 | tp->rtt_seq = tp->snd_nxt; | 924 | tp->rtt_seq = tp->snd_nxt; |
| 922 | } | 925 | } |
| 923 | if (dst_metric(dst, RTAX_RTTVAR) > tp->mdev) { | 926 | if (dst_metric_rtt(dst, RTAX_RTTVAR) > tp->mdev) { |
| 924 | tp->mdev = dst_metric(dst, RTAX_RTTVAR); | 927 | tp->mdev = dst_metric_rtt(dst, RTAX_RTTVAR); |
| 925 | tp->mdev_max = tp->rttvar = max(tp->mdev, tcp_rto_min(sk)); | 928 | tp->mdev_max = tp->rttvar = max(tp->mdev, tcp_rto_min(sk)); |
| 926 | } | 929 | } |
| 927 | tcp_set_rto(sk); | 930 | tcp_set_rto(sk); |
| @@ -949,17 +952,21 @@ static void tcp_update_reordering(struct sock *sk, const int metric, | |||
| 949 | { | 952 | { |
| 950 | struct tcp_sock *tp = tcp_sk(sk); | 953 | struct tcp_sock *tp = tcp_sk(sk); |
| 951 | if (metric > tp->reordering) { | 954 | if (metric > tp->reordering) { |
| 955 | int mib_idx; | ||
| 956 | |||
| 952 | tp->reordering = min(TCP_MAX_REORDERING, metric); | 957 | tp->reordering = min(TCP_MAX_REORDERING, metric); |
| 953 | 958 | ||
| 954 | /* This exciting event is worth to be remembered. 8) */ | 959 | /* This exciting event is worth to be remembered. 8) */ |
| 955 | if (ts) | 960 | if (ts) |
| 956 | NET_INC_STATS_BH(LINUX_MIB_TCPTSREORDER); | 961 | mib_idx = LINUX_MIB_TCPTSREORDER; |
| 957 | else if (tcp_is_reno(tp)) | 962 | else if (tcp_is_reno(tp)) |
| 958 | NET_INC_STATS_BH(LINUX_MIB_TCPRENOREORDER); | 963 | mib_idx = LINUX_MIB_TCPRENOREORDER; |
| 959 | else if (tcp_is_fack(tp)) | 964 | else if (tcp_is_fack(tp)) |
| 960 | NET_INC_STATS_BH(LINUX_MIB_TCPFACKREORDER); | 965 | mib_idx = LINUX_MIB_TCPFACKREORDER; |
| 961 | else | 966 | else |
| 962 | NET_INC_STATS_BH(LINUX_MIB_TCPSACKREORDER); | 967 | mib_idx = LINUX_MIB_TCPSACKREORDER; |
| 968 | |||
| 969 | NET_INC_STATS_BH(sock_net(sk), mib_idx); | ||
| 963 | #if FASTRETRANS_DEBUG > 1 | 970 | #if FASTRETRANS_DEBUG > 1 |
| 964 | printk(KERN_DEBUG "Disorder%d %d %u f%u s%u rr%d\n", | 971 | printk(KERN_DEBUG "Disorder%d %d %u f%u s%u rr%d\n", |
| 965 | tp->rx_opt.sack_ok, inet_csk(sk)->icsk_ca_state, | 972 | tp->rx_opt.sack_ok, inet_csk(sk)->icsk_ca_state, |
| @@ -1155,7 +1162,7 @@ static void tcp_mark_lost_retrans(struct sock *sk) | |||
| 1155 | tp->lost_out += tcp_skb_pcount(skb); | 1162 | tp->lost_out += tcp_skb_pcount(skb); |
| 1156 | TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; | 1163 | TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; |
| 1157 | } | 1164 | } |
| 1158 | NET_INC_STATS_BH(LINUX_MIB_TCPLOSTRETRANSMIT); | 1165 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPLOSTRETRANSMIT); |
| 1159 | } else { | 1166 | } else { |
| 1160 | if (before(ack_seq, new_low_seq)) | 1167 | if (before(ack_seq, new_low_seq)) |
| 1161 | new_low_seq = ack_seq; | 1168 | new_low_seq = ack_seq; |
| @@ -1167,10 +1174,11 @@ static void tcp_mark_lost_retrans(struct sock *sk) | |||
| 1167 | tp->lost_retrans_low = new_low_seq; | 1174 | tp->lost_retrans_low = new_low_seq; |
| 1168 | } | 1175 | } |
| 1169 | 1176 | ||
| 1170 | static int tcp_check_dsack(struct tcp_sock *tp, struct sk_buff *ack_skb, | 1177 | static int tcp_check_dsack(struct sock *sk, struct sk_buff *ack_skb, |
| 1171 | struct tcp_sack_block_wire *sp, int num_sacks, | 1178 | struct tcp_sack_block_wire *sp, int num_sacks, |
| 1172 | u32 prior_snd_una) | 1179 | u32 prior_snd_una) |
| 1173 | { | 1180 | { |
| 1181 | struct tcp_sock *tp = tcp_sk(sk); | ||
| 1174 | u32 start_seq_0 = get_unaligned_be32(&sp[0].start_seq); | 1182 | u32 start_seq_0 = get_unaligned_be32(&sp[0].start_seq); |
| 1175 | u32 end_seq_0 = get_unaligned_be32(&sp[0].end_seq); | 1183 | u32 end_seq_0 = get_unaligned_be32(&sp[0].end_seq); |
| 1176 | int dup_sack = 0; | 1184 | int dup_sack = 0; |
| @@ -1178,7 +1186,7 @@ static int tcp_check_dsack(struct tcp_sock *tp, struct sk_buff *ack_skb, | |||
| 1178 | if (before(start_seq_0, TCP_SKB_CB(ack_skb)->ack_seq)) { | 1186 | if (before(start_seq_0, TCP_SKB_CB(ack_skb)->ack_seq)) { |
| 1179 | dup_sack = 1; | 1187 | dup_sack = 1; |
| 1180 | tcp_dsack_seen(tp); | 1188 | tcp_dsack_seen(tp); |
| 1181 | NET_INC_STATS_BH(LINUX_MIB_TCPDSACKRECV); | 1189 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPDSACKRECV); |
| 1182 | } else if (num_sacks > 1) { | 1190 | } else if (num_sacks > 1) { |
| 1183 | u32 end_seq_1 = get_unaligned_be32(&sp[1].end_seq); | 1191 | u32 end_seq_1 = get_unaligned_be32(&sp[1].end_seq); |
| 1184 | u32 start_seq_1 = get_unaligned_be32(&sp[1].start_seq); | 1192 | u32 start_seq_1 = get_unaligned_be32(&sp[1].start_seq); |
| @@ -1187,7 +1195,8 @@ static int tcp_check_dsack(struct tcp_sock *tp, struct sk_buff *ack_skb, | |||
| 1187 | !before(start_seq_0, start_seq_1)) { | 1195 | !before(start_seq_0, start_seq_1)) { |
| 1188 | dup_sack = 1; | 1196 | dup_sack = 1; |
| 1189 | tcp_dsack_seen(tp); | 1197 | tcp_dsack_seen(tp); |
| 1190 | NET_INC_STATS_BH(LINUX_MIB_TCPDSACKOFORECV); | 1198 | NET_INC_STATS_BH(sock_net(sk), |
| 1199 | LINUX_MIB_TCPDSACKOFORECV); | ||
| 1191 | } | 1200 | } |
| 1192 | } | 1201 | } |
| 1193 | 1202 | ||
| @@ -1414,10 +1423,10 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, | |||
| 1414 | unsigned char *ptr = (skb_transport_header(ack_skb) + | 1423 | unsigned char *ptr = (skb_transport_header(ack_skb) + |
| 1415 | TCP_SKB_CB(ack_skb)->sacked); | 1424 | TCP_SKB_CB(ack_skb)->sacked); |
| 1416 | struct tcp_sack_block_wire *sp_wire = (struct tcp_sack_block_wire *)(ptr+2); | 1425 | struct tcp_sack_block_wire *sp_wire = (struct tcp_sack_block_wire *)(ptr+2); |
| 1417 | struct tcp_sack_block sp[4]; | 1426 | struct tcp_sack_block sp[TCP_NUM_SACKS]; |
| 1418 | struct tcp_sack_block *cache; | 1427 | struct tcp_sack_block *cache; |
| 1419 | struct sk_buff *skb; | 1428 | struct sk_buff *skb; |
| 1420 | int num_sacks = (ptr[1] - TCPOLEN_SACK_BASE) >> 3; | 1429 | int num_sacks = min(TCP_NUM_SACKS, (ptr[1] - TCPOLEN_SACK_BASE) >> 3); |
| 1421 | int used_sacks; | 1430 | int used_sacks; |
| 1422 | int reord = tp->packets_out; | 1431 | int reord = tp->packets_out; |
| 1423 | int flag = 0; | 1432 | int flag = 0; |
| @@ -1432,7 +1441,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, | |||
| 1432 | tcp_highest_sack_reset(sk); | 1441 | tcp_highest_sack_reset(sk); |
| 1433 | } | 1442 | } |
| 1434 | 1443 | ||
| 1435 | found_dup_sack = tcp_check_dsack(tp, ack_skb, sp_wire, | 1444 | found_dup_sack = tcp_check_dsack(sk, ack_skb, sp_wire, |
| 1436 | num_sacks, prior_snd_una); | 1445 | num_sacks, prior_snd_una); |
| 1437 | if (found_dup_sack) | 1446 | if (found_dup_sack) |
| 1438 | flag |= FLAG_DSACKING_ACK; | 1447 | flag |= FLAG_DSACKING_ACK; |
| @@ -1458,18 +1467,22 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, | |||
| 1458 | if (!tcp_is_sackblock_valid(tp, dup_sack, | 1467 | if (!tcp_is_sackblock_valid(tp, dup_sack, |
| 1459 | sp[used_sacks].start_seq, | 1468 | sp[used_sacks].start_seq, |
| 1460 | sp[used_sacks].end_seq)) { | 1469 | sp[used_sacks].end_seq)) { |
| 1470 | int mib_idx; | ||
| 1471 | |||
| 1461 | if (dup_sack) { | 1472 | if (dup_sack) { |
| 1462 | if (!tp->undo_marker) | 1473 | if (!tp->undo_marker) |
| 1463 | NET_INC_STATS_BH(LINUX_MIB_TCPDSACKIGNOREDNOUNDO); | 1474 | mib_idx = LINUX_MIB_TCPDSACKIGNOREDNOUNDO; |
| 1464 | else | 1475 | else |
| 1465 | NET_INC_STATS_BH(LINUX_MIB_TCPDSACKIGNOREDOLD); | 1476 | mib_idx = LINUX_MIB_TCPDSACKIGNOREDOLD; |
| 1466 | } else { | 1477 | } else { |
| 1467 | /* Don't count olds caused by ACK reordering */ | 1478 | /* Don't count olds caused by ACK reordering */ |
| 1468 | if ((TCP_SKB_CB(ack_skb)->ack_seq != tp->snd_una) && | 1479 | if ((TCP_SKB_CB(ack_skb)->ack_seq != tp->snd_una) && |
| 1469 | !after(sp[used_sacks].end_seq, tp->snd_una)) | 1480 | !after(sp[used_sacks].end_seq, tp->snd_una)) |
| 1470 | continue; | 1481 | continue; |
| 1471 | NET_INC_STATS_BH(LINUX_MIB_TCPSACKDISCARD); | 1482 | mib_idx = LINUX_MIB_TCPSACKDISCARD; |
| 1472 | } | 1483 | } |
| 1484 | |||
| 1485 | NET_INC_STATS_BH(sock_net(sk), mib_idx); | ||
| 1473 | if (i == 0) | 1486 | if (i == 0) |
| 1474 | first_sack_index = -1; | 1487 | first_sack_index = -1; |
| 1475 | continue; | 1488 | continue; |
| @@ -1962,7 +1975,7 @@ static int tcp_check_sack_reneging(struct sock *sk, int flag) | |||
| 1962 | { | 1975 | { |
| 1963 | if (flag & FLAG_SACK_RENEGING) { | 1976 | if (flag & FLAG_SACK_RENEGING) { |
| 1964 | struct inet_connection_sock *icsk = inet_csk(sk); | 1977 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 1965 | NET_INC_STATS_BH(LINUX_MIB_TCPSACKRENEGING); | 1978 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSACKRENEGING); |
| 1966 | 1979 | ||
| 1967 | tcp_enter_loss(sk, 1); | 1980 | tcp_enter_loss(sk, 1); |
| 1968 | icsk->icsk_retransmits++; | 1981 | icsk->icsk_retransmits++; |
| @@ -2382,15 +2395,19 @@ static int tcp_try_undo_recovery(struct sock *sk) | |||
| 2382 | struct tcp_sock *tp = tcp_sk(sk); | 2395 | struct tcp_sock *tp = tcp_sk(sk); |
| 2383 | 2396 | ||
| 2384 | if (tcp_may_undo(tp)) { | 2397 | if (tcp_may_undo(tp)) { |
| 2398 | int mib_idx; | ||
| 2399 | |||
| 2385 | /* Happy end! We did not retransmit anything | 2400 | /* Happy end! We did not retransmit anything |
| 2386 | * or our original transmission succeeded. | 2401 | * or our original transmission succeeded. |
| 2387 | */ | 2402 | */ |
| 2388 | DBGUNDO(sk, inet_csk(sk)->icsk_ca_state == TCP_CA_Loss ? "loss" : "retrans"); | 2403 | DBGUNDO(sk, inet_csk(sk)->icsk_ca_state == TCP_CA_Loss ? "loss" : "retrans"); |
| 2389 | tcp_undo_cwr(sk, 1); | 2404 | tcp_undo_cwr(sk, 1); |
| 2390 | if (inet_csk(sk)->icsk_ca_state == TCP_CA_Loss) | 2405 | if (inet_csk(sk)->icsk_ca_state == TCP_CA_Loss) |
| 2391 | NET_INC_STATS_BH(LINUX_MIB_TCPLOSSUNDO); | 2406 | mib_idx = LINUX_MIB_TCPLOSSUNDO; |
| 2392 | else | 2407 | else |
| 2393 | NET_INC_STATS_BH(LINUX_MIB_TCPFULLUNDO); | 2408 | mib_idx = LINUX_MIB_TCPFULLUNDO; |
| 2409 | |||
| 2410 | NET_INC_STATS_BH(sock_net(sk), mib_idx); | ||
| 2394 | tp->undo_marker = 0; | 2411 | tp->undo_marker = 0; |
| 2395 | } | 2412 | } |
| 2396 | if (tp->snd_una == tp->high_seq && tcp_is_reno(tp)) { | 2413 | if (tp->snd_una == tp->high_seq && tcp_is_reno(tp)) { |
| @@ -2413,7 +2430,7 @@ static void tcp_try_undo_dsack(struct sock *sk) | |||
| 2413 | DBGUNDO(sk, "D-SACK"); | 2430 | DBGUNDO(sk, "D-SACK"); |
| 2414 | tcp_undo_cwr(sk, 1); | 2431 | tcp_undo_cwr(sk, 1); |
| 2415 | tp->undo_marker = 0; | 2432 | tp->undo_marker = 0; |
| 2416 | NET_INC_STATS_BH(LINUX_MIB_TCPDSACKUNDO); | 2433 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPDSACKUNDO); |
| 2417 | } | 2434 | } |
| 2418 | } | 2435 | } |
| 2419 | 2436 | ||
| @@ -2436,7 +2453,7 @@ static int tcp_try_undo_partial(struct sock *sk, int acked) | |||
| 2436 | 2453 | ||
| 2437 | DBGUNDO(sk, "Hoe"); | 2454 | DBGUNDO(sk, "Hoe"); |
| 2438 | tcp_undo_cwr(sk, 0); | 2455 | tcp_undo_cwr(sk, 0); |
| 2439 | NET_INC_STATS_BH(LINUX_MIB_TCPPARTIALUNDO); | 2456 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPPARTIALUNDO); |
| 2440 | 2457 | ||
| 2441 | /* So... Do not make Hoe's retransmit yet. | 2458 | /* So... Do not make Hoe's retransmit yet. |
| 2442 | * If the first packet was delayed, the rest | 2459 | * If the first packet was delayed, the rest |
| @@ -2465,7 +2482,7 @@ static int tcp_try_undo_loss(struct sock *sk) | |||
| 2465 | DBGUNDO(sk, "partial loss"); | 2482 | DBGUNDO(sk, "partial loss"); |
| 2466 | tp->lost_out = 0; | 2483 | tp->lost_out = 0; |
| 2467 | tcp_undo_cwr(sk, 1); | 2484 | tcp_undo_cwr(sk, 1); |
| 2468 | NET_INC_STATS_BH(LINUX_MIB_TCPLOSSUNDO); | 2485 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPLOSSUNDO); |
| 2469 | inet_csk(sk)->icsk_retransmits = 0; | 2486 | inet_csk(sk)->icsk_retransmits = 0; |
| 2470 | tp->undo_marker = 0; | 2487 | tp->undo_marker = 0; |
| 2471 | if (tcp_is_sack(tp)) | 2488 | if (tcp_is_sack(tp)) |
| @@ -2562,7 +2579,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, int flag) | |||
| 2562 | int is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); | 2579 | int is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); |
| 2563 | int do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) && | 2580 | int do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) && |
| 2564 | (tcp_fackets_out(tp) > tp->reordering)); | 2581 | (tcp_fackets_out(tp) > tp->reordering)); |
| 2565 | int fast_rexmit = 0; | 2582 | int fast_rexmit = 0, mib_idx; |
| 2566 | 2583 | ||
| 2567 | if (WARN_ON(!tp->packets_out && tp->sacked_out)) | 2584 | if (WARN_ON(!tp->packets_out && tp->sacked_out)) |
| 2568 | tp->sacked_out = 0; | 2585 | tp->sacked_out = 0; |
| @@ -2584,7 +2601,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, int flag) | |||
| 2584 | icsk->icsk_ca_state != TCP_CA_Open && | 2601 | icsk->icsk_ca_state != TCP_CA_Open && |
| 2585 | tp->fackets_out > tp->reordering) { | 2602 | tp->fackets_out > tp->reordering) { |
| 2586 | tcp_mark_head_lost(sk, tp->fackets_out - tp->reordering); | 2603 | tcp_mark_head_lost(sk, tp->fackets_out - tp->reordering); |
| 2587 | NET_INC_STATS_BH(LINUX_MIB_TCPLOSS); | 2604 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPLOSS); |
| 2588 | } | 2605 | } |
| 2589 | 2606 | ||
| 2590 | /* D. Check consistency of the current state. */ | 2607 | /* D. Check consistency of the current state. */ |
| @@ -2685,9 +2702,11 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, int flag) | |||
| 2685 | /* Otherwise enter Recovery state */ | 2702 | /* Otherwise enter Recovery state */ |
| 2686 | 2703 | ||
| 2687 | if (tcp_is_reno(tp)) | 2704 | if (tcp_is_reno(tp)) |
| 2688 | NET_INC_STATS_BH(LINUX_MIB_TCPRENORECOVERY); | 2705 | mib_idx = LINUX_MIB_TCPRENORECOVERY; |
| 2689 | else | 2706 | else |
| 2690 | NET_INC_STATS_BH(LINUX_MIB_TCPSACKRECOVERY); | 2707 | mib_idx = LINUX_MIB_TCPSACKRECOVERY; |
| 2708 | |||
| 2709 | NET_INC_STATS_BH(sock_net(sk), mib_idx); | ||
| 2691 | 2710 | ||
| 2692 | tp->high_seq = tp->snd_nxt; | 2711 | tp->high_seq = tp->snd_nxt; |
| 2693 | tp->prior_ssthresh = 0; | 2712 | tp->prior_ssthresh = 0; |
| @@ -3198,7 +3217,7 @@ static int tcp_process_frto(struct sock *sk, int flag) | |||
| 3198 | } | 3217 | } |
| 3199 | tp->frto_counter = 0; | 3218 | tp->frto_counter = 0; |
| 3200 | tp->undo_marker = 0; | 3219 | tp->undo_marker = 0; |
| 3201 | NET_INC_STATS_BH(LINUX_MIB_TCPSPURIOUSRTOS); | 3220 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSPURIOUSRTOS); |
| 3202 | } | 3221 | } |
| 3203 | return 0; | 3222 | return 0; |
| 3204 | } | 3223 | } |
| @@ -3251,12 +3270,12 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag) | |||
| 3251 | 3270 | ||
| 3252 | tcp_ca_event(sk, CA_EVENT_FAST_ACK); | 3271 | tcp_ca_event(sk, CA_EVENT_FAST_ACK); |
| 3253 | 3272 | ||
| 3254 | NET_INC_STATS_BH(LINUX_MIB_TCPHPACKS); | 3273 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPHPACKS); |
| 3255 | } else { | 3274 | } else { |
| 3256 | if (ack_seq != TCP_SKB_CB(skb)->end_seq) | 3275 | if (ack_seq != TCP_SKB_CB(skb)->end_seq) |
| 3257 | flag |= FLAG_DATA; | 3276 | flag |= FLAG_DATA; |
| 3258 | else | 3277 | else |
| 3259 | NET_INC_STATS_BH(LINUX_MIB_TCPPUREACKS); | 3278 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPPUREACKS); |
| 3260 | 3279 | ||
| 3261 | flag |= tcp_ack_update_window(sk, skb, ack, ack_seq); | 3280 | flag |= tcp_ack_update_window(sk, skb, ack, ack_seq); |
| 3262 | 3281 | ||
| @@ -3450,6 +3469,43 @@ static int tcp_fast_parse_options(struct sk_buff *skb, struct tcphdr *th, | |||
| 3450 | return 1; | 3469 | return 1; |
| 3451 | } | 3470 | } |
| 3452 | 3471 | ||
| 3472 | #ifdef CONFIG_TCP_MD5SIG | ||
| 3473 | /* | ||
| 3474 | * Parse MD5 Signature option | ||
| 3475 | */ | ||
| 3476 | u8 *tcp_parse_md5sig_option(struct tcphdr *th) | ||
| 3477 | { | ||
| 3478 | int length = (th->doff << 2) - sizeof (*th); | ||
| 3479 | u8 *ptr = (u8*)(th + 1); | ||
| 3480 | |||
| 3481 | /* If the TCP option is too short, we can short cut */ | ||
| 3482 | if (length < TCPOLEN_MD5SIG) | ||
| 3483 | return NULL; | ||
| 3484 | |||
| 3485 | while (length > 0) { | ||
| 3486 | int opcode = *ptr++; | ||
| 3487 | int opsize; | ||
| 3488 | |||
| 3489 | switch(opcode) { | ||
| 3490 | case TCPOPT_EOL: | ||
| 3491 | return NULL; | ||
| 3492 | case TCPOPT_NOP: | ||
| 3493 | length--; | ||
| 3494 | continue; | ||
| 3495 | default: | ||
| 3496 | opsize = *ptr++; | ||
| 3497 | if (opsize < 2 || opsize > length) | ||
| 3498 | return NULL; | ||
| 3499 | if (opcode == TCPOPT_MD5SIG) | ||
| 3500 | return ptr; | ||
| 3501 | } | ||
| 3502 | ptr += opsize - 2; | ||
| 3503 | length -= opsize; | ||
| 3504 | } | ||
| 3505 | return NULL; | ||
| 3506 | } | ||
| 3507 | #endif | ||
| 3508 | |||
| 3453 | static inline void tcp_store_ts_recent(struct tcp_sock *tp) | 3509 | static inline void tcp_store_ts_recent(struct tcp_sock *tp) |
| 3454 | { | 3510 | { |
| 3455 | tp->rx_opt.ts_recent = tp->rx_opt.rcv_tsval; | 3511 | tp->rx_opt.ts_recent = tp->rx_opt.rcv_tsval; |
| @@ -3662,26 +3718,33 @@ static inline int tcp_sack_extend(struct tcp_sack_block *sp, u32 seq, | |||
| 3662 | return 0; | 3718 | return 0; |
| 3663 | } | 3719 | } |
| 3664 | 3720 | ||
| 3665 | static void tcp_dsack_set(struct tcp_sock *tp, u32 seq, u32 end_seq) | 3721 | static void tcp_dsack_set(struct sock *sk, u32 seq, u32 end_seq) |
| 3666 | { | 3722 | { |
| 3723 | struct tcp_sock *tp = tcp_sk(sk); | ||
| 3724 | |||
| 3667 | if (tcp_is_sack(tp) && sysctl_tcp_dsack) { | 3725 | if (tcp_is_sack(tp) && sysctl_tcp_dsack) { |
| 3726 | int mib_idx; | ||
| 3727 | |||
| 3668 | if (before(seq, tp->rcv_nxt)) | 3728 | if (before(seq, tp->rcv_nxt)) |
| 3669 | NET_INC_STATS_BH(LINUX_MIB_TCPDSACKOLDSENT); | 3729 | mib_idx = LINUX_MIB_TCPDSACKOLDSENT; |
| 3670 | else | 3730 | else |
| 3671 | NET_INC_STATS_BH(LINUX_MIB_TCPDSACKOFOSENT); | 3731 | mib_idx = LINUX_MIB_TCPDSACKOFOSENT; |
| 3732 | |||
| 3733 | NET_INC_STATS_BH(sock_net(sk), mib_idx); | ||
| 3672 | 3734 | ||
| 3673 | tp->rx_opt.dsack = 1; | 3735 | tp->rx_opt.dsack = 1; |
| 3674 | tp->duplicate_sack[0].start_seq = seq; | 3736 | tp->duplicate_sack[0].start_seq = seq; |
| 3675 | tp->duplicate_sack[0].end_seq = end_seq; | 3737 | tp->duplicate_sack[0].end_seq = end_seq; |
| 3676 | tp->rx_opt.eff_sacks = min(tp->rx_opt.num_sacks + 1, | 3738 | tp->rx_opt.eff_sacks = tp->rx_opt.num_sacks + 1; |
| 3677 | 4 - tp->rx_opt.tstamp_ok); | ||
| 3678 | } | 3739 | } |
| 3679 | } | 3740 | } |
| 3680 | 3741 | ||
| 3681 | static void tcp_dsack_extend(struct tcp_sock *tp, u32 seq, u32 end_seq) | 3742 | static void tcp_dsack_extend(struct sock *sk, u32 seq, u32 end_seq) |
| 3682 | { | 3743 | { |
| 3744 | struct tcp_sock *tp = tcp_sk(sk); | ||
| 3745 | |||
| 3683 | if (!tp->rx_opt.dsack) | 3746 | if (!tp->rx_opt.dsack) |
| 3684 | tcp_dsack_set(tp, seq, end_seq); | 3747 | tcp_dsack_set(sk, seq, end_seq); |
| 3685 | else | 3748 | else |
| 3686 | tcp_sack_extend(tp->duplicate_sack, seq, end_seq); | 3749 | tcp_sack_extend(tp->duplicate_sack, seq, end_seq); |
| 3687 | } | 3750 | } |
| @@ -3692,7 +3755,7 @@ static void tcp_send_dupack(struct sock *sk, struct sk_buff *skb) | |||
| 3692 | 3755 | ||
| 3693 | if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && | 3756 | if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && |
| 3694 | before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { | 3757 | before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { |
| 3695 | NET_INC_STATS_BH(LINUX_MIB_DELAYEDACKLOST); | 3758 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_DELAYEDACKLOST); |
| 3696 | tcp_enter_quickack_mode(sk); | 3759 | tcp_enter_quickack_mode(sk); |
| 3697 | 3760 | ||
| 3698 | if (tcp_is_sack(tp) && sysctl_tcp_dsack) { | 3761 | if (tcp_is_sack(tp) && sysctl_tcp_dsack) { |
| @@ -3700,7 +3763,7 @@ static void tcp_send_dupack(struct sock *sk, struct sk_buff *skb) | |||
| 3700 | 3763 | ||
| 3701 | if (after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) | 3764 | if (after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) |
| 3702 | end_seq = tp->rcv_nxt; | 3765 | end_seq = tp->rcv_nxt; |
| 3703 | tcp_dsack_set(tp, TCP_SKB_CB(skb)->seq, end_seq); | 3766 | tcp_dsack_set(sk, TCP_SKB_CB(skb)->seq, end_seq); |
| 3704 | } | 3767 | } |
| 3705 | } | 3768 | } |
| 3706 | 3769 | ||
| @@ -3727,9 +3790,8 @@ static void tcp_sack_maybe_coalesce(struct tcp_sock *tp) | |||
| 3727 | * Decrease num_sacks. | 3790 | * Decrease num_sacks. |
| 3728 | */ | 3791 | */ |
| 3729 | tp->rx_opt.num_sacks--; | 3792 | tp->rx_opt.num_sacks--; |
| 3730 | tp->rx_opt.eff_sacks = min(tp->rx_opt.num_sacks + | 3793 | tp->rx_opt.eff_sacks = tp->rx_opt.num_sacks + |
| 3731 | tp->rx_opt.dsack, | 3794 | tp->rx_opt.dsack; |
| 3732 | 4 - tp->rx_opt.tstamp_ok); | ||
| 3733 | for (i = this_sack; i < tp->rx_opt.num_sacks; i++) | 3795 | for (i = this_sack; i < tp->rx_opt.num_sacks; i++) |
| 3734 | sp[i] = sp[i + 1]; | 3796 | sp[i] = sp[i + 1]; |
| 3735 | continue; | 3797 | continue; |
| @@ -3779,7 +3841,7 @@ static void tcp_sack_new_ofo_skb(struct sock *sk, u32 seq, u32 end_seq) | |||
| 3779 | * | 3841 | * |
| 3780 | * If the sack array is full, forget about the last one. | 3842 | * If the sack array is full, forget about the last one. |
| 3781 | */ | 3843 | */ |
| 3782 | if (this_sack >= 4) { | 3844 | if (this_sack >= TCP_NUM_SACKS) { |
| 3783 | this_sack--; | 3845 | this_sack--; |
| 3784 | tp->rx_opt.num_sacks--; | 3846 | tp->rx_opt.num_sacks--; |
| 3785 | sp--; | 3847 | sp--; |
| @@ -3792,8 +3854,7 @@ new_sack: | |||
| 3792 | sp->start_seq = seq; | 3854 | sp->start_seq = seq; |
| 3793 | sp->end_seq = end_seq; | 3855 | sp->end_seq = end_seq; |
| 3794 | tp->rx_opt.num_sacks++; | 3856 | tp->rx_opt.num_sacks++; |
| 3795 | tp->rx_opt.eff_sacks = min(tp->rx_opt.num_sacks + tp->rx_opt.dsack, | 3857 | tp->rx_opt.eff_sacks = tp->rx_opt.num_sacks + tp->rx_opt.dsack; |
| 3796 | 4 - tp->rx_opt.tstamp_ok); | ||
| 3797 | } | 3858 | } |
| 3798 | 3859 | ||
| 3799 | /* RCV.NXT advances, some SACKs should be eaten. */ | 3860 | /* RCV.NXT advances, some SACKs should be eaten. */ |
| @@ -3830,9 +3891,8 @@ static void tcp_sack_remove(struct tcp_sock *tp) | |||
| 3830 | } | 3891 | } |
| 3831 | if (num_sacks != tp->rx_opt.num_sacks) { | 3892 | if (num_sacks != tp->rx_opt.num_sacks) { |
| 3832 | tp->rx_opt.num_sacks = num_sacks; | 3893 | tp->rx_opt.num_sacks = num_sacks; |
| 3833 | tp->rx_opt.eff_sacks = min(tp->rx_opt.num_sacks + | 3894 | tp->rx_opt.eff_sacks = tp->rx_opt.num_sacks + |
| 3834 | tp->rx_opt.dsack, | 3895 | tp->rx_opt.dsack; |
| 3835 | 4 - tp->rx_opt.tstamp_ok); | ||
| 3836 | } | 3896 | } |
| 3837 | } | 3897 | } |
| 3838 | 3898 | ||
| @@ -3853,7 +3913,7 @@ static void tcp_ofo_queue(struct sock *sk) | |||
| 3853 | __u32 dsack = dsack_high; | 3913 | __u32 dsack = dsack_high; |
| 3854 | if (before(TCP_SKB_CB(skb)->end_seq, dsack_high)) | 3914 | if (before(TCP_SKB_CB(skb)->end_seq, dsack_high)) |
| 3855 | dsack_high = TCP_SKB_CB(skb)->end_seq; | 3915 | dsack_high = TCP_SKB_CB(skb)->end_seq; |
| 3856 | tcp_dsack_extend(tp, TCP_SKB_CB(skb)->seq, dsack); | 3916 | tcp_dsack_extend(sk, TCP_SKB_CB(skb)->seq, dsack); |
| 3857 | } | 3917 | } |
| 3858 | 3918 | ||
| 3859 | if (!after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) { | 3919 | if (!after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) { |
| @@ -3911,8 +3971,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) | |||
| 3911 | 3971 | ||
| 3912 | if (tp->rx_opt.dsack) { | 3972 | if (tp->rx_opt.dsack) { |
| 3913 | tp->rx_opt.dsack = 0; | 3973 | tp->rx_opt.dsack = 0; |
| 3914 | tp->rx_opt.eff_sacks = min_t(unsigned int, tp->rx_opt.num_sacks, | 3974 | tp->rx_opt.eff_sacks = tp->rx_opt.num_sacks; |
| 3915 | 4 - tp->rx_opt.tstamp_ok); | ||
| 3916 | } | 3975 | } |
| 3917 | 3976 | ||
| 3918 | /* Queue data for delivery to the user. | 3977 | /* Queue data for delivery to the user. |
| @@ -3981,8 +4040,8 @@ queue_and_out: | |||
| 3981 | 4040 | ||
| 3982 | if (!after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) { | 4041 | if (!after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) { |
| 3983 | /* A retransmit, 2nd most common case. Force an immediate ack. */ | 4042 | /* A retransmit, 2nd most common case. Force an immediate ack. */ |
| 3984 | NET_INC_STATS_BH(LINUX_MIB_DELAYEDACKLOST); | 4043 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_DELAYEDACKLOST); |
| 3985 | tcp_dsack_set(tp, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq); | 4044 | tcp_dsack_set(sk, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq); |
| 3986 | 4045 | ||
| 3987 | out_of_window: | 4046 | out_of_window: |
| 3988 | tcp_enter_quickack_mode(sk); | 4047 | tcp_enter_quickack_mode(sk); |
| @@ -4004,7 +4063,7 @@ drop: | |||
| 4004 | tp->rcv_nxt, TCP_SKB_CB(skb)->seq, | 4063 | tp->rcv_nxt, TCP_SKB_CB(skb)->seq, |
| 4005 | TCP_SKB_CB(skb)->end_seq); | 4064 | TCP_SKB_CB(skb)->end_seq); |
| 4006 | 4065 | ||
| 4007 | tcp_dsack_set(tp, TCP_SKB_CB(skb)->seq, tp->rcv_nxt); | 4066 | tcp_dsack_set(sk, TCP_SKB_CB(skb)->seq, tp->rcv_nxt); |
| 4008 | 4067 | ||
| 4009 | /* If window is closed, drop tail of packet. But after | 4068 | /* If window is closed, drop tail of packet. But after |
| 4010 | * remembering D-SACK for its head made in previous line. | 4069 | * remembering D-SACK for its head made in previous line. |
| @@ -4069,12 +4128,12 @@ drop: | |||
| 4069 | if (!after(end_seq, TCP_SKB_CB(skb1)->end_seq)) { | 4128 | if (!after(end_seq, TCP_SKB_CB(skb1)->end_seq)) { |
| 4070 | /* All the bits are present. Drop. */ | 4129 | /* All the bits are present. Drop. */ |
| 4071 | __kfree_skb(skb); | 4130 | __kfree_skb(skb); |
| 4072 | tcp_dsack_set(tp, seq, end_seq); | 4131 | tcp_dsack_set(sk, seq, end_seq); |
| 4073 | goto add_sack; | 4132 | goto add_sack; |
| 4074 | } | 4133 | } |
| 4075 | if (after(seq, TCP_SKB_CB(skb1)->seq)) { | 4134 | if (after(seq, TCP_SKB_CB(skb1)->seq)) { |
| 4076 | /* Partial overlap. */ | 4135 | /* Partial overlap. */ |
| 4077 | tcp_dsack_set(tp, seq, | 4136 | tcp_dsack_set(sk, seq, |
| 4078 | TCP_SKB_CB(skb1)->end_seq); | 4137 | TCP_SKB_CB(skb1)->end_seq); |
| 4079 | } else { | 4138 | } else { |
| 4080 | skb1 = skb1->prev; | 4139 | skb1 = skb1->prev; |
| @@ -4087,12 +4146,12 @@ drop: | |||
| 4087 | (struct sk_buff *)&tp->out_of_order_queue && | 4146 | (struct sk_buff *)&tp->out_of_order_queue && |
| 4088 | after(end_seq, TCP_SKB_CB(skb1)->seq)) { | 4147 | after(end_seq, TCP_SKB_CB(skb1)->seq)) { |
| 4089 | if (before(end_seq, TCP_SKB_CB(skb1)->end_seq)) { | 4148 | if (before(end_seq, TCP_SKB_CB(skb1)->end_seq)) { |
| 4090 | tcp_dsack_extend(tp, TCP_SKB_CB(skb1)->seq, | 4149 | tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq, |
| 4091 | end_seq); | 4150 | end_seq); |
| 4092 | break; | 4151 | break; |
| 4093 | } | 4152 | } |
| 4094 | __skb_unlink(skb1, &tp->out_of_order_queue); | 4153 | __skb_unlink(skb1, &tp->out_of_order_queue); |
| 4095 | tcp_dsack_extend(tp, TCP_SKB_CB(skb1)->seq, | 4154 | tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq, |
| 4096 | TCP_SKB_CB(skb1)->end_seq); | 4155 | TCP_SKB_CB(skb1)->end_seq); |
| 4097 | __kfree_skb(skb1); | 4156 | __kfree_skb(skb1); |
| 4098 | } | 4157 | } |
| @@ -4123,7 +4182,7 @@ tcp_collapse(struct sock *sk, struct sk_buff_head *list, | |||
| 4123 | struct sk_buff *next = skb->next; | 4182 | struct sk_buff *next = skb->next; |
| 4124 | __skb_unlink(skb, list); | 4183 | __skb_unlink(skb, list); |
| 4125 | __kfree_skb(skb); | 4184 | __kfree_skb(skb); |
| 4126 | NET_INC_STATS_BH(LINUX_MIB_TCPRCVCOLLAPSED); | 4185 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPRCVCOLLAPSED); |
| 4127 | skb = next; | 4186 | skb = next; |
| 4128 | continue; | 4187 | continue; |
| 4129 | } | 4188 | } |
| @@ -4191,7 +4250,7 @@ tcp_collapse(struct sock *sk, struct sk_buff_head *list, | |||
| 4191 | struct sk_buff *next = skb->next; | 4250 | struct sk_buff *next = skb->next; |
| 4192 | __skb_unlink(skb, list); | 4251 | __skb_unlink(skb, list); |
| 4193 | __kfree_skb(skb); | 4252 | __kfree_skb(skb); |
| 4194 | NET_INC_STATS_BH(LINUX_MIB_TCPRCVCOLLAPSED); | 4253 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPRCVCOLLAPSED); |
| 4195 | skb = next; | 4254 | skb = next; |
| 4196 | if (skb == tail || | 4255 | if (skb == tail || |
| 4197 | tcp_hdr(skb)->syn || | 4256 | tcp_hdr(skb)->syn || |
| @@ -4254,7 +4313,7 @@ static int tcp_prune_ofo_queue(struct sock *sk) | |||
| 4254 | int res = 0; | 4313 | int res = 0; |
| 4255 | 4314 | ||
| 4256 | if (!skb_queue_empty(&tp->out_of_order_queue)) { | 4315 | if (!skb_queue_empty(&tp->out_of_order_queue)) { |
| 4257 | NET_INC_STATS_BH(LINUX_MIB_OFOPRUNED); | 4316 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_OFOPRUNED); |
| 4258 | __skb_queue_purge(&tp->out_of_order_queue); | 4317 | __skb_queue_purge(&tp->out_of_order_queue); |
| 4259 | 4318 | ||
| 4260 | /* Reset SACK state. A conforming SACK implementation will | 4319 | /* Reset SACK state. A conforming SACK implementation will |
| @@ -4283,7 +4342,7 @@ static int tcp_prune_queue(struct sock *sk) | |||
| 4283 | 4342 | ||
| 4284 | SOCK_DEBUG(sk, "prune_queue: c=%x\n", tp->copied_seq); | 4343 | SOCK_DEBUG(sk, "prune_queue: c=%x\n", tp->copied_seq); |
| 4285 | 4344 | ||
| 4286 | NET_INC_STATS_BH(LINUX_MIB_PRUNECALLED); | 4345 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PRUNECALLED); |
| 4287 | 4346 | ||
| 4288 | if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) | 4347 | if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) |
| 4289 | tcp_clamp_window(sk); | 4348 | tcp_clamp_window(sk); |
| @@ -4312,7 +4371,7 @@ static int tcp_prune_queue(struct sock *sk) | |||
| 4312 | * drop receive data on the floor. It will get retransmitted | 4371 | * drop receive data on the floor. It will get retransmitted |
| 4313 | * and hopefully then we'll have sufficient space. | 4372 | * and hopefully then we'll have sufficient space. |
| 4314 | */ | 4373 | */ |
| 4315 | NET_INC_STATS_BH(LINUX_MIB_RCVPRUNED); | 4374 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_RCVPRUNED); |
| 4316 | 4375 | ||
| 4317 | /* Massive buffer overcommit. */ | 4376 | /* Massive buffer overcommit. */ |
| 4318 | tp->pred_flags = 0; | 4377 | tp->pred_flags = 0; |
| @@ -4742,7 +4801,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, | |||
| 4742 | tcp_data_snd_check(sk); | 4801 | tcp_data_snd_check(sk); |
| 4743 | return 0; | 4802 | return 0; |
| 4744 | } else { /* Header too small */ | 4803 | } else { /* Header too small */ |
| 4745 | TCP_INC_STATS_BH(TCP_MIB_INERRS); | 4804 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS); |
| 4746 | goto discard; | 4805 | goto discard; |
| 4747 | } | 4806 | } |
| 4748 | } else { | 4807 | } else { |
| @@ -4779,7 +4838,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, | |||
| 4779 | 4838 | ||
| 4780 | __skb_pull(skb, tcp_header_len); | 4839 | __skb_pull(skb, tcp_header_len); |
| 4781 | tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; | 4840 | tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; |
| 4782 | NET_INC_STATS_BH(LINUX_MIB_TCPHPHITSTOUSER); | 4841 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPHPHITSTOUSER); |
| 4783 | } | 4842 | } |
| 4784 | if (copied_early) | 4843 | if (copied_early) |
| 4785 | tcp_cleanup_rbuf(sk, skb->len); | 4844 | tcp_cleanup_rbuf(sk, skb->len); |
| @@ -4802,7 +4861,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, | |||
| 4802 | if ((int)skb->truesize > sk->sk_forward_alloc) | 4861 | if ((int)skb->truesize > sk->sk_forward_alloc) |
| 4803 | goto step5; | 4862 | goto step5; |
| 4804 | 4863 | ||
| 4805 | NET_INC_STATS_BH(LINUX_MIB_TCPHPHITS); | 4864 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPHPHITS); |
| 4806 | 4865 | ||
| 4807 | /* Bulk data transfer: receiver */ | 4866 | /* Bulk data transfer: receiver */ |
| 4808 | __skb_pull(skb, tcp_header_len); | 4867 | __skb_pull(skb, tcp_header_len); |
| @@ -4846,7 +4905,7 @@ slow_path: | |||
| 4846 | if (tcp_fast_parse_options(skb, th, tp) && tp->rx_opt.saw_tstamp && | 4905 | if (tcp_fast_parse_options(skb, th, tp) && tp->rx_opt.saw_tstamp && |
| 4847 | tcp_paws_discard(sk, skb)) { | 4906 | tcp_paws_discard(sk, skb)) { |
| 4848 | if (!th->rst) { | 4907 | if (!th->rst) { |
| 4849 | NET_INC_STATS_BH(LINUX_MIB_PAWSESTABREJECTED); | 4908 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSESTABREJECTED); |
| 4850 | tcp_send_dupack(sk, skb); | 4909 | tcp_send_dupack(sk, skb); |
| 4851 | goto discard; | 4910 | goto discard; |
| 4852 | } | 4911 | } |
| @@ -4881,8 +4940,8 @@ slow_path: | |||
| 4881 | tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq); | 4940 | tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq); |
| 4882 | 4941 | ||
| 4883 | if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { | 4942 | if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { |
| 4884 | TCP_INC_STATS_BH(TCP_MIB_INERRS); | 4943 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS); |
| 4885 | NET_INC_STATS_BH(LINUX_MIB_TCPABORTONSYN); | 4944 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPABORTONSYN); |
| 4886 | tcp_reset(sk); | 4945 | tcp_reset(sk); |
| 4887 | return 1; | 4946 | return 1; |
| 4888 | } | 4947 | } |
| @@ -4904,7 +4963,7 @@ step5: | |||
| 4904 | return 0; | 4963 | return 0; |
| 4905 | 4964 | ||
| 4906 | csum_error: | 4965 | csum_error: |
| 4907 | TCP_INC_STATS_BH(TCP_MIB_INERRS); | 4966 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS); |
| 4908 | 4967 | ||
| 4909 | discard: | 4968 | discard: |
| 4910 | __kfree_skb(skb); | 4969 | __kfree_skb(skb); |
| @@ -4938,7 +4997,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, | |||
| 4938 | if (tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr && | 4997 | if (tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr && |
| 4939 | !between(tp->rx_opt.rcv_tsecr, tp->retrans_stamp, | 4998 | !between(tp->rx_opt.rcv_tsecr, tp->retrans_stamp, |
| 4940 | tcp_time_stamp)) { | 4999 | tcp_time_stamp)) { |
| 4941 | NET_INC_STATS_BH(LINUX_MIB_PAWSACTIVEREJECTED); | 5000 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSACTIVEREJECTED); |
| 4942 | goto reset_and_undo; | 5001 | goto reset_and_undo; |
| 4943 | } | 5002 | } |
| 4944 | 5003 | ||
| @@ -5222,7 +5281,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
| 5222 | if (tcp_fast_parse_options(skb, th, tp) && tp->rx_opt.saw_tstamp && | 5281 | if (tcp_fast_parse_options(skb, th, tp) && tp->rx_opt.saw_tstamp && |
| 5223 | tcp_paws_discard(sk, skb)) { | 5282 | tcp_paws_discard(sk, skb)) { |
| 5224 | if (!th->rst) { | 5283 | if (!th->rst) { |
| 5225 | NET_INC_STATS_BH(LINUX_MIB_PAWSESTABREJECTED); | 5284 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSESTABREJECTED); |
| 5226 | tcp_send_dupack(sk, skb); | 5285 | tcp_send_dupack(sk, skb); |
| 5227 | goto discard; | 5286 | goto discard; |
| 5228 | } | 5287 | } |
| @@ -5251,7 +5310,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
| 5251 | * Check for a SYN in window. | 5310 | * Check for a SYN in window. |
| 5252 | */ | 5311 | */ |
| 5253 | if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { | 5312 | if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { |
| 5254 | NET_INC_STATS_BH(LINUX_MIB_TCPABORTONSYN); | 5313 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPABORTONSYN); |
| 5255 | tcp_reset(sk); | 5314 | tcp_reset(sk); |
| 5256 | return 1; | 5315 | return 1; |
| 5257 | } | 5316 | } |
| @@ -5333,7 +5392,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
| 5333 | (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && | 5392 | (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && |
| 5334 | after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt))) { | 5393 | after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt))) { |
| 5335 | tcp_done(sk); | 5394 | tcp_done(sk); |
| 5336 | NET_INC_STATS_BH(LINUX_MIB_TCPABORTONDATA); | 5395 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPABORTONDATA); |
| 5337 | return 1; | 5396 | return 1; |
| 5338 | } | 5397 | } |
| 5339 | 5398 | ||
| @@ -5393,7 +5452,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
| 5393 | if (sk->sk_shutdown & RCV_SHUTDOWN) { | 5452 | if (sk->sk_shutdown & RCV_SHUTDOWN) { |
| 5394 | if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && | 5453 | if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && |
| 5395 | after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt)) { | 5454 | after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt)) { |
| 5396 | NET_INC_STATS_BH(LINUX_MIB_TCPABORTONDATA); | 5455 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPABORTONDATA); |
| 5397 | tcp_reset(sk); | 5456 | tcp_reset(sk); |
| 5398 | return 1; | 5457 | return 1; |
| 5399 | } | 5458 | } |
| @@ -5422,6 +5481,9 @@ EXPORT_SYMBOL(sysctl_tcp_ecn); | |||
| 5422 | EXPORT_SYMBOL(sysctl_tcp_reordering); | 5481 | EXPORT_SYMBOL(sysctl_tcp_reordering); |
| 5423 | EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); | 5482 | EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); |
| 5424 | EXPORT_SYMBOL(tcp_parse_options); | 5483 | EXPORT_SYMBOL(tcp_parse_options); |
| 5484 | #ifdef CONFIG_TCP_MD5SIG | ||
| 5485 | EXPORT_SYMBOL(tcp_parse_md5sig_option); | ||
| 5486 | #endif | ||
| 5425 | EXPORT_SYMBOL(tcp_rcv_established); | 5487 | EXPORT_SYMBOL(tcp_rcv_established); |
| 5426 | EXPORT_SYMBOL(tcp_rcv_state_process); | 5488 | EXPORT_SYMBOL(tcp_rcv_state_process); |
| 5427 | EXPORT_SYMBOL(tcp_initialize_rcv_mss); | 5489 | EXPORT_SYMBOL(tcp_initialize_rcv_mss); |
