diff options
| author | Jeff Garzik <jeff@garzik.org> | 2006-05-20 00:03:38 -0400 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-05-20 00:03:38 -0400 |
| commit | badc48e6605ddeeb2484afae5993c859494decaa (patch) | |
| tree | 7da638f9bb53b1812b71e40ad6deca91d59ad301 /net/ipv4 | |
| parent | 753a6c4ff4c371a3e4e3408aaba4d03f3cfde73a (diff) | |
| parent | 2f880b65fdbc2d4915bddc59d75a176329570fdd (diff) | |
Merge branch 'master' into upstream
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/ip_input.c | 2 | ||||
| -rw-r--r-- | net/ipv4/ip_options.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/arp_tables.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_conntrack_helper_h323.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_conntrack_helper_h323_asn1.c | 10 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_conntrack_proto_sctp.c | 11 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_nat_proto_gre.c | 12 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_nat_standalone.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_tables.c | 6 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ipt_LOG.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ipt_recent.c | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 13 | ||||
| -rw-r--r-- | net/ipv4/tcp_highspeed.c | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 2 |
14 files changed, 42 insertions, 28 deletions
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index 18d7fad474d7..c9026dbf4c93 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c | |||
| @@ -337,7 +337,7 @@ static inline int ip_rcv_finish(struct sk_buff *skb) | |||
| 337 | * Initialise the virtual path cache for the packet. It describes | 337 | * Initialise the virtual path cache for the packet. It describes |
| 338 | * how the packet travels inside Linux networking. | 338 | * how the packet travels inside Linux networking. |
| 339 | */ | 339 | */ |
| 340 | if (likely(skb->dst == NULL)) { | 340 | if (skb->dst == NULL) { |
| 341 | int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, | 341 | int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, |
| 342 | skb->dev); | 342 | skb->dev); |
| 343 | if (unlikely(err)) { | 343 | if (unlikely(err)) { |
diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c index 9bebad07bf2e..cbcae6544622 100644 --- a/net/ipv4/ip_options.c +++ b/net/ipv4/ip_options.c | |||
| @@ -209,7 +209,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb) | |||
| 209 | 209 | ||
| 210 | void ip_options_fragment(struct sk_buff * skb) | 210 | void ip_options_fragment(struct sk_buff * skb) |
| 211 | { | 211 | { |
| 212 | unsigned char * optptr = skb->nh.raw; | 212 | unsigned char * optptr = skb->nh.raw + sizeof(struct iphdr); |
| 213 | struct ip_options * opt = &(IPCB(skb)->opt); | 213 | struct ip_options * opt = &(IPCB(skb)->opt); |
| 214 | int l = opt->optlen; | 214 | int l = opt->optlen; |
| 215 | int optlen; | 215 | int optlen; |
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index c2d92f99a2b8..d0d19192026d 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
| @@ -948,7 +948,7 @@ static int do_add_counters(void __user *user, unsigned int len) | |||
| 948 | 948 | ||
| 949 | write_lock_bh(&t->lock); | 949 | write_lock_bh(&t->lock); |
| 950 | private = t->private; | 950 | private = t->private; |
| 951 | if (private->number != paddc->num_counters) { | 951 | if (private->number != tmp.num_counters) { |
| 952 | ret = -EINVAL; | 952 | ret = -EINVAL; |
| 953 | goto unlock_up_free; | 953 | goto unlock_up_free; |
| 954 | } | 954 | } |
diff --git a/net/ipv4/netfilter/ip_conntrack_helper_h323.c b/net/ipv4/netfilter/ip_conntrack_helper_h323.c index 2c2fb700d835..518f581d39ec 100644 --- a/net/ipv4/netfilter/ip_conntrack_helper_h323.c +++ b/net/ipv4/netfilter/ip_conntrack_helper_h323.c | |||
| @@ -162,6 +162,8 @@ static int get_tpkt_data(struct sk_buff **pskb, struct ip_conntrack *ct, | |||
| 162 | 162 | ||
| 163 | /* Validate TPKT length */ | 163 | /* Validate TPKT length */ |
| 164 | tpktlen = tpkt[2] * 256 + tpkt[3]; | 164 | tpktlen = tpkt[2] * 256 + tpkt[3]; |
| 165 | if (tpktlen < 4) | ||
| 166 | goto clear_out; | ||
| 165 | if (tpktlen > tcpdatalen) { | 167 | if (tpktlen > tcpdatalen) { |
| 166 | if (tcpdatalen == 4) { /* Separate TPKT header */ | 168 | if (tcpdatalen == 4) { /* Separate TPKT header */ |
| 167 | /* Netmeeting sends TPKT header and data separately */ | 169 | /* Netmeeting sends TPKT header and data separately */ |
diff --git a/net/ipv4/netfilter/ip_conntrack_helper_h323_asn1.c b/net/ipv4/netfilter/ip_conntrack_helper_h323_asn1.c index 48078002e450..355a53a5b6cd 100644 --- a/net/ipv4/netfilter/ip_conntrack_helper_h323_asn1.c +++ b/net/ipv4/netfilter/ip_conntrack_helper_h323_asn1.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * ip_conntrack_helper_h323_asn1.c - BER and PER decoding library for H.323 | 2 | * ip_conntrack_helper_h323_asn1.c - BER and PER decoding library for H.323 |
| 3 | * conntrack/NAT module. | 3 | * conntrack/NAT module. |
| 4 | * | 4 | * |
| 5 | * Copyright (c) 2006 by Jing Min Zhao <zhaojingmin@hotmail.com> | 5 | * Copyright (c) 2006 by Jing Min Zhao <zhaojingmin@users.sourceforge.net> |
| 6 | * | 6 | * |
| 7 | * This source code is licensed under General Public License version 2. | 7 | * This source code is licensed under General Public License version 2. |
| 8 | * | 8 | * |
| @@ -703,6 +703,10 @@ int decode_choice(bitstr_t * bs, field_t * f, char *base, int level) | |||
| 703 | type = get_bits(bs, f->sz); | 703 | type = get_bits(bs, f->sz); |
| 704 | } | 704 | } |
| 705 | 705 | ||
| 706 | /* Write Type */ | ||
| 707 | if (base) | ||
| 708 | *(unsigned *) base = type; | ||
| 709 | |||
| 706 | /* Check Range */ | 710 | /* Check Range */ |
| 707 | if (type >= f->ub) { /* Newer version? */ | 711 | if (type >= f->ub) { /* Newer version? */ |
| 708 | BYTE_ALIGN(bs); | 712 | BYTE_ALIGN(bs); |
| @@ -712,10 +716,6 @@ int decode_choice(bitstr_t * bs, field_t * f, char *base, int level) | |||
| 712 | return H323_ERROR_NONE; | 716 | return H323_ERROR_NONE; |
| 713 | } | 717 | } |
| 714 | 718 | ||
| 715 | /* Write Type */ | ||
| 716 | if (base) | ||
| 717 | *(unsigned *) base = type; | ||
| 718 | |||
| 719 | /* Transfer to son level */ | 719 | /* Transfer to son level */ |
| 720 | son = &f->fields[type]; | 720 | son = &f->fields[type]; |
| 721 | if (son->attr & STOP) { | 721 | if (son->attr & STOP) { |
diff --git a/net/ipv4/netfilter/ip_conntrack_proto_sctp.c b/net/ipv4/netfilter/ip_conntrack_proto_sctp.c index 5259abd0fb42..0416073c5600 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_sctp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_sctp.c | |||
| @@ -235,12 +235,15 @@ static int do_basic_checks(struct ip_conntrack *conntrack, | |||
| 235 | flag = 1; | 235 | flag = 1; |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | /* Cookie Ack/Echo chunks not the first OR | 238 | /* |
| 239 | Init / Init Ack / Shutdown compl chunks not the only chunks */ | 239 | * Cookie Ack/Echo chunks not the first OR |
| 240 | if ((sch->type == SCTP_CID_COOKIE_ACK | 240 | * Init / Init Ack / Shutdown compl chunks not the only chunks |
| 241 | * OR zero-length. | ||
| 242 | */ | ||
| 243 | if (((sch->type == SCTP_CID_COOKIE_ACK | ||
| 241 | || sch->type == SCTP_CID_COOKIE_ECHO | 244 | || sch->type == SCTP_CID_COOKIE_ECHO |
| 242 | || flag) | 245 | || flag) |
| 243 | && count !=0 ) { | 246 | && count !=0) || !sch->length) { |
| 244 | DEBUGP("Basic checks failed\n"); | 247 | DEBUGP("Basic checks failed\n"); |
| 245 | return 1; | 248 | return 1; |
| 246 | } | 249 | } |
diff --git a/net/ipv4/netfilter/ip_nat_proto_gre.c b/net/ipv4/netfilter/ip_nat_proto_gre.c index 6c4899d8046a..96ceabaec402 100644 --- a/net/ipv4/netfilter/ip_nat_proto_gre.c +++ b/net/ipv4/netfilter/ip_nat_proto_gre.c | |||
| @@ -49,15 +49,15 @@ gre_in_range(const struct ip_conntrack_tuple *tuple, | |||
| 49 | const union ip_conntrack_manip_proto *min, | 49 | const union ip_conntrack_manip_proto *min, |
| 50 | const union ip_conntrack_manip_proto *max) | 50 | const union ip_conntrack_manip_proto *max) |
| 51 | { | 51 | { |
| 52 | u_int32_t key; | 52 | __be16 key; |
| 53 | 53 | ||
| 54 | if (maniptype == IP_NAT_MANIP_SRC) | 54 | if (maniptype == IP_NAT_MANIP_SRC) |
| 55 | key = tuple->src.u.gre.key; | 55 | key = tuple->src.u.gre.key; |
| 56 | else | 56 | else |
| 57 | key = tuple->dst.u.gre.key; | 57 | key = tuple->dst.u.gre.key; |
| 58 | 58 | ||
| 59 | return ntohl(key) >= ntohl(min->gre.key) | 59 | return ntohs(key) >= ntohs(min->gre.key) |
| 60 | && ntohl(key) <= ntohl(max->gre.key); | 60 | && ntohs(key) <= ntohs(max->gre.key); |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | /* generate unique tuple ... */ | 63 | /* generate unique tuple ... */ |
| @@ -81,14 +81,14 @@ gre_unique_tuple(struct ip_conntrack_tuple *tuple, | |||
| 81 | min = 1; | 81 | min = 1; |
| 82 | range_size = 0xffff; | 82 | range_size = 0xffff; |
| 83 | } else { | 83 | } else { |
| 84 | min = ntohl(range->min.gre.key); | 84 | min = ntohs(range->min.gre.key); |
| 85 | range_size = ntohl(range->max.gre.key) - min + 1; | 85 | range_size = ntohs(range->max.gre.key) - min + 1; |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | DEBUGP("min = %u, range_size = %u\n", min, range_size); | 88 | DEBUGP("min = %u, range_size = %u\n", min, range_size); |
| 89 | 89 | ||
| 90 | for (i = 0; i < range_size; i++, key++) { | 90 | for (i = 0; i < range_size; i++, key++) { |
| 91 | *keyptr = htonl(min + key % range_size); | 91 | *keyptr = htons(min + key % range_size); |
| 92 | if (!ip_nat_used_tuple(tuple, conntrack)) | 92 | if (!ip_nat_used_tuple(tuple, conntrack)) |
| 93 | return 1; | 93 | return 1; |
| 94 | } | 94 | } |
diff --git a/net/ipv4/netfilter/ip_nat_standalone.c b/net/ipv4/netfilter/ip_nat_standalone.c index 8f760b28617e..67e676783da9 100644 --- a/net/ipv4/netfilter/ip_nat_standalone.c +++ b/net/ipv4/netfilter/ip_nat_standalone.c | |||
| @@ -219,8 +219,10 @@ ip_nat_out(unsigned int hooknum, | |||
| 219 | const struct net_device *out, | 219 | const struct net_device *out, |
| 220 | int (*okfn)(struct sk_buff *)) | 220 | int (*okfn)(struct sk_buff *)) |
| 221 | { | 221 | { |
| 222 | #ifdef CONFIG_XFRM | ||
| 222 | struct ip_conntrack *ct; | 223 | struct ip_conntrack *ct; |
| 223 | enum ip_conntrack_info ctinfo; | 224 | enum ip_conntrack_info ctinfo; |
| 225 | #endif | ||
| 224 | unsigned int ret; | 226 | unsigned int ret; |
| 225 | 227 | ||
| 226 | /* root is playing with raw sockets. */ | 228 | /* root is playing with raw sockets. */ |
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 6d1c11563943..cee3397ec277 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
| @@ -1441,7 +1441,7 @@ static int compat_copy_entry_to_user(struct ipt_entry *e, | |||
| 1441 | ret = -EFAULT; | 1441 | ret = -EFAULT; |
| 1442 | origsize = *size; | 1442 | origsize = *size; |
| 1443 | ce = (struct compat_ipt_entry __user *)*dstptr; | 1443 | ce = (struct compat_ipt_entry __user *)*dstptr; |
| 1444 | if (__copy_to_user(ce, e, sizeof(struct ipt_entry))) | 1444 | if (copy_to_user(ce, e, sizeof(struct ipt_entry))) |
| 1445 | goto out; | 1445 | goto out; |
| 1446 | 1446 | ||
| 1447 | *dstptr += sizeof(struct compat_ipt_entry); | 1447 | *dstptr += sizeof(struct compat_ipt_entry); |
| @@ -1459,9 +1459,9 @@ static int compat_copy_entry_to_user(struct ipt_entry *e, | |||
| 1459 | goto out; | 1459 | goto out; |
| 1460 | ret = -EFAULT; | 1460 | ret = -EFAULT; |
| 1461 | next_offset = e->next_offset - (origsize - *size); | 1461 | next_offset = e->next_offset - (origsize - *size); |
| 1462 | if (__put_user(target_offset, &ce->target_offset)) | 1462 | if (put_user(target_offset, &ce->target_offset)) |
| 1463 | goto out; | 1463 | goto out; |
| 1464 | if (__put_user(next_offset, &ce->next_offset)) | 1464 | if (put_user(next_offset, &ce->next_offset)) |
| 1465 | goto out; | 1465 | goto out; |
| 1466 | return 0; | 1466 | return 0; |
| 1467 | out: | 1467 | out: |
diff --git a/net/ipv4/netfilter/ipt_LOG.c b/net/ipv4/netfilter/ipt_LOG.c index 39fd4c2a2386..b98f7b08b084 100644 --- a/net/ipv4/netfilter/ipt_LOG.c +++ b/net/ipv4/netfilter/ipt_LOG.c | |||
| @@ -428,7 +428,7 @@ ipt_log_target(struct sk_buff **pskb, | |||
| 428 | 428 | ||
| 429 | if (loginfo->logflags & IPT_LOG_NFLOG) | 429 | if (loginfo->logflags & IPT_LOG_NFLOG) |
| 430 | nf_log_packet(PF_INET, hooknum, *pskb, in, out, &li, | 430 | nf_log_packet(PF_INET, hooknum, *pskb, in, out, &li, |
| 431 | loginfo->prefix); | 431 | "%s", loginfo->prefix); |
| 432 | else | 432 | else |
| 433 | ipt_log_packet(PF_INET, hooknum, *pskb, in, out, &li, | 433 | ipt_log_packet(PF_INET, hooknum, *pskb, in, out, &li, |
| 434 | loginfo->prefix); | 434 | loginfo->prefix); |
diff --git a/net/ipv4/netfilter/ipt_recent.c b/net/ipv4/netfilter/ipt_recent.c index 143843285702..b847ee409efb 100644 --- a/net/ipv4/netfilter/ipt_recent.c +++ b/net/ipv4/netfilter/ipt_recent.c | |||
| @@ -821,6 +821,7 @@ checkentry(const char *tablename, | |||
| 821 | /* Create our proc 'status' entry. */ | 821 | /* Create our proc 'status' entry. */ |
| 822 | curr_table->status_proc = create_proc_entry(curr_table->name, ip_list_perms, proc_net_ipt_recent); | 822 | curr_table->status_proc = create_proc_entry(curr_table->name, ip_list_perms, proc_net_ipt_recent); |
| 823 | if (!curr_table->status_proc) { | 823 | if (!curr_table->status_proc) { |
| 824 | vfree(hold); | ||
| 824 | printk(KERN_INFO RECENT_NAME ": checkentry: unable to allocate for /proc entry.\n"); | 825 | printk(KERN_INFO RECENT_NAME ": checkentry: unable to allocate for /proc entry.\n"); |
| 825 | /* Destroy the created table */ | 826 | /* Destroy the created table */ |
| 826 | spin_lock_bh(&recent_lock); | 827 | spin_lock_bh(&recent_lock); |
| @@ -845,7 +846,6 @@ checkentry(const char *tablename, | |||
| 845 | spin_unlock_bh(&recent_lock); | 846 | spin_unlock_bh(&recent_lock); |
| 846 | vfree(curr_table->time_info); | 847 | vfree(curr_table->time_info); |
| 847 | vfree(curr_table->hash_table); | 848 | vfree(curr_table->hash_table); |
| 848 | vfree(hold); | ||
| 849 | vfree(curr_table->table); | 849 | vfree(curr_table->table); |
| 850 | vfree(curr_table); | 850 | vfree(curr_table); |
| 851 | return 0; | 851 | return 0; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 87f68e787d0c..e2b7b8055037 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -1468,6 +1468,7 @@ void tcp_close(struct sock *sk, long timeout) | |||
| 1468 | { | 1468 | { |
| 1469 | struct sk_buff *skb; | 1469 | struct sk_buff *skb; |
| 1470 | int data_was_unread = 0; | 1470 | int data_was_unread = 0; |
| 1471 | int state; | ||
| 1471 | 1472 | ||
| 1472 | lock_sock(sk); | 1473 | lock_sock(sk); |
| 1473 | sk->sk_shutdown = SHUTDOWN_MASK; | 1474 | sk->sk_shutdown = SHUTDOWN_MASK; |
| @@ -1544,6 +1545,11 @@ void tcp_close(struct sock *sk, long timeout) | |||
| 1544 | sk_stream_wait_close(sk, timeout); | 1545 | sk_stream_wait_close(sk, timeout); |
| 1545 | 1546 | ||
| 1546 | adjudge_to_death: | 1547 | adjudge_to_death: |
| 1548 | state = sk->sk_state; | ||
| 1549 | sock_hold(sk); | ||
| 1550 | sock_orphan(sk); | ||
| 1551 | atomic_inc(sk->sk_prot->orphan_count); | ||
| 1552 | |||
| 1547 | /* It is the last release_sock in its life. It will remove backlog. */ | 1553 | /* It is the last release_sock in its life. It will remove backlog. */ |
| 1548 | release_sock(sk); | 1554 | release_sock(sk); |
| 1549 | 1555 | ||
| @@ -1555,8 +1561,9 @@ adjudge_to_death: | |||
| 1555 | bh_lock_sock(sk); | 1561 | bh_lock_sock(sk); |
| 1556 | BUG_TRAP(!sock_owned_by_user(sk)); | 1562 | BUG_TRAP(!sock_owned_by_user(sk)); |
| 1557 | 1563 | ||
| 1558 | sock_hold(sk); | 1564 | /* Have we already been destroyed by a softirq or backlog? */ |
| 1559 | sock_orphan(sk); | 1565 | if (state != TCP_CLOSE && sk->sk_state == TCP_CLOSE) |
| 1566 | goto out; | ||
| 1560 | 1567 | ||
| 1561 | /* This is a (useful) BSD violating of the RFC. There is a | 1568 | /* This is a (useful) BSD violating of the RFC. There is a |
| 1562 | * problem with TCP as specified in that the other end could | 1569 | * problem with TCP as specified in that the other end could |
| @@ -1584,7 +1591,6 @@ adjudge_to_death: | |||
| 1584 | if (tmo > TCP_TIMEWAIT_LEN) { | 1591 | if (tmo > TCP_TIMEWAIT_LEN) { |
| 1585 | inet_csk_reset_keepalive_timer(sk, tcp_fin_time(sk)); | 1592 | inet_csk_reset_keepalive_timer(sk, tcp_fin_time(sk)); |
| 1586 | } else { | 1593 | } else { |
| 1587 | atomic_inc(sk->sk_prot->orphan_count); | ||
| 1588 | tcp_time_wait(sk, TCP_FIN_WAIT2, tmo); | 1594 | tcp_time_wait(sk, TCP_FIN_WAIT2, tmo); |
| 1589 | goto out; | 1595 | goto out; |
| 1590 | } | 1596 | } |
| @@ -1603,7 +1609,6 @@ adjudge_to_death: | |||
| 1603 | NET_INC_STATS_BH(LINUX_MIB_TCPABORTONMEMORY); | 1609 | NET_INC_STATS_BH(LINUX_MIB_TCPABORTONMEMORY); |
| 1604 | } | 1610 | } |
| 1605 | } | 1611 | } |
| 1606 | atomic_inc(sk->sk_prot->orphan_count); | ||
| 1607 | 1612 | ||
| 1608 | if (sk->sk_state == TCP_CLOSE) | 1613 | if (sk->sk_state == TCP_CLOSE) |
| 1609 | inet_csk_destroy_sock(sk); | 1614 | inet_csk_destroy_sock(sk); |
diff --git a/net/ipv4/tcp_highspeed.c b/net/ipv4/tcp_highspeed.c index e0e9d1383c7c..b72fa55dfb84 100644 --- a/net/ipv4/tcp_highspeed.c +++ b/net/ipv4/tcp_highspeed.c | |||
| @@ -137,8 +137,8 @@ static void hstcp_cong_avoid(struct sock *sk, u32 adk, u32 rtt, | |||
| 137 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) { | 137 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) { |
| 138 | tp->snd_cwnd_cnt += ca->ai; | 138 | tp->snd_cwnd_cnt += ca->ai; |
| 139 | if (tp->snd_cwnd_cnt >= tp->snd_cwnd) { | 139 | if (tp->snd_cwnd_cnt >= tp->snd_cwnd) { |
| 140 | tp->snd_cwnd++; | ||
| 141 | tp->snd_cwnd_cnt -= tp->snd_cwnd; | 140 | tp->snd_cwnd_cnt -= tp->snd_cwnd; |
| 141 | tp->snd_cwnd++; | ||
| 142 | } | 142 | } |
| 143 | } | 143 | } |
| 144 | } | 144 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 9f0cca4c4fae..4a538bc1683d 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -1662,6 +1662,8 @@ static void tcp_update_scoreboard(struct sock *sk, struct tcp_sock *tp) | |||
| 1662 | if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) { | 1662 | if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) { |
| 1663 | TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; | 1663 | TCP_SKB_CB(skb)->sacked |= TCPCB_LOST; |
| 1664 | tp->lost_out += tcp_skb_pcount(skb); | 1664 | tp->lost_out += tcp_skb_pcount(skb); |
| 1665 | if (IsReno(tp)) | ||
| 1666 | tcp_remove_reno_sacks(sk, tp, tcp_skb_pcount(skb) + 1); | ||
| 1665 | 1667 | ||
| 1666 | /* clear xmit_retrans hint */ | 1668 | /* clear xmit_retrans hint */ |
| 1667 | if (tp->retransmit_skb_hint && | 1669 | if (tp->retransmit_skb_hint && |
