diff options
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/ip_gre.c | 3 | ||||
| -rw-r--r-- | net/ipv4/ip_output.c | 2 | ||||
| -rw-r--r-- | net/ipv4/ip_tunnel.c | 6 | ||||
| -rw-r--r-- | net/ipv4/ip_vti.c | 3 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ipt_ULOG.c | 19 | ||||
| -rw-r--r-- | net/ipv4/route.c | 7 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 29 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 23 | ||||
| -rw-r--r-- | net/ipv4/tcp_output.c | 10 |
9 files changed, 70 insertions, 32 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index c625e4dad4b0..2a83591492dd 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
| @@ -235,7 +235,7 @@ static void ipgre_err(struct sk_buff *skb, u32 info) | |||
| 235 | */ | 235 | */ |
| 236 | struct net *net = dev_net(skb->dev); | 236 | struct net *net = dev_net(skb->dev); |
| 237 | struct ip_tunnel_net *itn; | 237 | struct ip_tunnel_net *itn; |
| 238 | const struct iphdr *iph = (const struct iphdr *)skb->data; | 238 | const struct iphdr *iph; |
| 239 | const int type = icmp_hdr(skb)->type; | 239 | const int type = icmp_hdr(skb)->type; |
| 240 | const int code = icmp_hdr(skb)->code; | 240 | const int code = icmp_hdr(skb)->code; |
| 241 | struct ip_tunnel *t; | 241 | struct ip_tunnel *t; |
| @@ -281,6 +281,7 @@ static void ipgre_err(struct sk_buff *skb, u32 info) | |||
| 281 | else | 281 | else |
| 282 | itn = net_generic(net, ipgre_net_id); | 282 | itn = net_generic(net, ipgre_net_id); |
| 283 | 283 | ||
| 284 | iph = (const struct iphdr *)skb->data; | ||
| 284 | t = ip_tunnel_lookup(itn, skb->dev->ifindex, tpi.flags, | 285 | t = ip_tunnel_lookup(itn, skb->dev->ifindex, tpi.flags, |
| 285 | iph->daddr, iph->saddr, tpi.key); | 286 | iph->daddr, iph->saddr, tpi.key); |
| 286 | 287 | ||
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 147abf5275aa..4bcabf3ab4ca 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -84,7 +84,7 @@ int sysctl_ip_default_ttl __read_mostly = IPDEFTTL; | |||
| 84 | EXPORT_SYMBOL(sysctl_ip_default_ttl); | 84 | EXPORT_SYMBOL(sysctl_ip_default_ttl); |
| 85 | 85 | ||
| 86 | /* Generate a checksum for an outgoing IP datagram. */ | 86 | /* Generate a checksum for an outgoing IP datagram. */ |
| 87 | __inline__ void ip_send_check(struct iphdr *iph) | 87 | void ip_send_check(struct iphdr *iph) |
| 88 | { | 88 | { |
| 89 | iph->check = 0; | 89 | iph->check = 0; |
| 90 | iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); | 90 | iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index e4147ec1665a..7fa8f08fa7ae 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
| @@ -503,6 +503,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | |||
| 503 | 503 | ||
| 504 | inner_iph = (const struct iphdr *)skb_inner_network_header(skb); | 504 | inner_iph = (const struct iphdr *)skb_inner_network_header(skb); |
| 505 | 505 | ||
| 506 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); | ||
| 506 | dst = tnl_params->daddr; | 507 | dst = tnl_params->daddr; |
| 507 | if (dst == 0) { | 508 | if (dst == 0) { |
| 508 | /* NBMA tunnel */ | 509 | /* NBMA tunnel */ |
| @@ -658,7 +659,6 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | |||
| 658 | 659 | ||
| 659 | skb_dst_drop(skb); | 660 | skb_dst_drop(skb); |
| 660 | skb_dst_set(skb, &rt->dst); | 661 | skb_dst_set(skb, &rt->dst); |
| 661 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); | ||
| 662 | 662 | ||
| 663 | /* Push down and install the IP header. */ | 663 | /* Push down and install the IP header. */ |
| 664 | skb_push(skb, sizeof(struct iphdr)); | 664 | skb_push(skb, sizeof(struct iphdr)); |
| @@ -853,7 +853,7 @@ void ip_tunnel_dellink(struct net_device *dev, struct list_head *head) | |||
| 853 | } | 853 | } |
| 854 | EXPORT_SYMBOL_GPL(ip_tunnel_dellink); | 854 | EXPORT_SYMBOL_GPL(ip_tunnel_dellink); |
| 855 | 855 | ||
| 856 | int __net_init ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, | 856 | int ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, |
| 857 | struct rtnl_link_ops *ops, char *devname) | 857 | struct rtnl_link_ops *ops, char *devname) |
| 858 | { | 858 | { |
| 859 | struct ip_tunnel_net *itn = net_generic(net, ip_tnl_net_id); | 859 | struct ip_tunnel_net *itn = net_generic(net, ip_tnl_net_id); |
| @@ -899,7 +899,7 @@ static void ip_tunnel_destroy(struct ip_tunnel_net *itn, struct list_head *head) | |||
| 899 | unregister_netdevice_queue(itn->fb_tunnel_dev, head); | 899 | unregister_netdevice_queue(itn->fb_tunnel_dev, head); |
| 900 | } | 900 | } |
| 901 | 901 | ||
| 902 | void __net_exit ip_tunnel_delete_net(struct ip_tunnel_net *itn) | 902 | void ip_tunnel_delete_net(struct ip_tunnel_net *itn) |
| 903 | { | 903 | { |
| 904 | LIST_HEAD(list); | 904 | LIST_HEAD(list); |
| 905 | 905 | ||
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index 9d2bdb2c1d3f..c118f6b576bb 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c | |||
| @@ -361,8 +361,7 @@ static netdev_tx_t vti_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 361 | tunnel->err_count = 0; | 361 | tunnel->err_count = 0; |
| 362 | } | 362 | } |
| 363 | 363 | ||
| 364 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | | 364 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); |
| 365 | IPSKB_REROUTED); | ||
| 366 | skb_dst_drop(skb); | 365 | skb_dst_drop(skb); |
| 367 | skb_dst_set(skb, &rt->dst); | 366 | skb_dst_set(skb, &rt->dst); |
| 368 | nf_reset(skb); | 367 | nf_reset(skb); |
diff --git a/net/ipv4/netfilter/ipt_ULOG.c b/net/ipv4/netfilter/ipt_ULOG.c index f8a222cb6448..ff4b781b1056 100644 --- a/net/ipv4/netfilter/ipt_ULOG.c +++ b/net/ipv4/netfilter/ipt_ULOG.c | |||
| @@ -162,7 +162,8 @@ static struct sk_buff *ulog_alloc_skb(unsigned int size) | |||
| 162 | return skb; | 162 | return skb; |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | static void ipt_ulog_packet(unsigned int hooknum, | 165 | static void ipt_ulog_packet(struct net *net, |
| 166 | unsigned int hooknum, | ||
| 166 | const struct sk_buff *skb, | 167 | const struct sk_buff *skb, |
| 167 | const struct net_device *in, | 168 | const struct net_device *in, |
| 168 | const struct net_device *out, | 169 | const struct net_device *out, |
| @@ -174,7 +175,6 @@ static void ipt_ulog_packet(unsigned int hooknum, | |||
| 174 | size_t size, copy_len; | 175 | size_t size, copy_len; |
| 175 | struct nlmsghdr *nlh; | 176 | struct nlmsghdr *nlh; |
| 176 | struct timeval tv; | 177 | struct timeval tv; |
| 177 | struct net *net = dev_net(in ? in : out); | ||
| 178 | struct ulog_net *ulog = ulog_pernet(net); | 178 | struct ulog_net *ulog = ulog_pernet(net); |
| 179 | 179 | ||
| 180 | /* ffs == find first bit set, necessary because userspace | 180 | /* ffs == find first bit set, necessary because userspace |
| @@ -231,8 +231,10 @@ static void ipt_ulog_packet(unsigned int hooknum, | |||
| 231 | put_unaligned(tv.tv_usec, &pm->timestamp_usec); | 231 | put_unaligned(tv.tv_usec, &pm->timestamp_usec); |
| 232 | put_unaligned(skb->mark, &pm->mark); | 232 | put_unaligned(skb->mark, &pm->mark); |
| 233 | pm->hook = hooknum; | 233 | pm->hook = hooknum; |
| 234 | if (prefix != NULL) | 234 | if (prefix != NULL) { |
| 235 | strncpy(pm->prefix, prefix, sizeof(pm->prefix)); | 235 | strncpy(pm->prefix, prefix, sizeof(pm->prefix) - 1); |
| 236 | pm->prefix[sizeof(pm->prefix) - 1] = '\0'; | ||
| 237 | } | ||
| 236 | else if (loginfo->prefix[0] != '\0') | 238 | else if (loginfo->prefix[0] != '\0') |
| 237 | strncpy(pm->prefix, loginfo->prefix, sizeof(pm->prefix)); | 239 | strncpy(pm->prefix, loginfo->prefix, sizeof(pm->prefix)); |
| 238 | else | 240 | else |
| @@ -291,12 +293,15 @@ alloc_failure: | |||
| 291 | static unsigned int | 293 | static unsigned int |
| 292 | ulog_tg(struct sk_buff *skb, const struct xt_action_param *par) | 294 | ulog_tg(struct sk_buff *skb, const struct xt_action_param *par) |
| 293 | { | 295 | { |
| 294 | ipt_ulog_packet(par->hooknum, skb, par->in, par->out, | 296 | struct net *net = dev_net(par->in ? par->in : par->out); |
| 297 | |||
| 298 | ipt_ulog_packet(net, par->hooknum, skb, par->in, par->out, | ||
| 295 | par->targinfo, NULL); | 299 | par->targinfo, NULL); |
| 296 | return XT_CONTINUE; | 300 | return XT_CONTINUE; |
| 297 | } | 301 | } |
| 298 | 302 | ||
| 299 | static void ipt_logfn(u_int8_t pf, | 303 | static void ipt_logfn(struct net *net, |
| 304 | u_int8_t pf, | ||
| 300 | unsigned int hooknum, | 305 | unsigned int hooknum, |
| 301 | const struct sk_buff *skb, | 306 | const struct sk_buff *skb, |
| 302 | const struct net_device *in, | 307 | const struct net_device *in, |
| @@ -318,7 +323,7 @@ static void ipt_logfn(u_int8_t pf, | |||
| 318 | strlcpy(loginfo.prefix, prefix, sizeof(loginfo.prefix)); | 323 | strlcpy(loginfo.prefix, prefix, sizeof(loginfo.prefix)); |
| 319 | } | 324 | } |
| 320 | 325 | ||
| 321 | ipt_ulog_packet(hooknum, skb, in, out, &loginfo, prefix); | 326 | ipt_ulog_packet(net, hooknum, skb, in, out, &loginfo, prefix); |
| 322 | } | 327 | } |
| 323 | 328 | ||
| 324 | static int ulog_tg_check(const struct xt_tgchk_param *par) | 329 | static int ulog_tg_check(const struct xt_tgchk_param *par) |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 550781a17b34..d35bbf0cf404 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -737,10 +737,15 @@ static void ip_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buf | |||
| 737 | { | 737 | { |
| 738 | struct rtable *rt; | 738 | struct rtable *rt; |
| 739 | struct flowi4 fl4; | 739 | struct flowi4 fl4; |
| 740 | const struct iphdr *iph = (const struct iphdr *) skb->data; | ||
| 741 | int oif = skb->dev->ifindex; | ||
| 742 | u8 tos = RT_TOS(iph->tos); | ||
| 743 | u8 prot = iph->protocol; | ||
| 744 | u32 mark = skb->mark; | ||
| 740 | 745 | ||
| 741 | rt = (struct rtable *) dst; | 746 | rt = (struct rtable *) dst; |
| 742 | 747 | ||
| 743 | ip_rt_build_flow_key(&fl4, sk, skb); | 748 | __build_flow_key(&fl4, sk, iph, oif, tos, prot, mark, 0); |
| 744 | __ip_do_redirect(rt, skb, &fl4, true); | 749 | __ip_do_redirect(rt, skb, &fl4, true); |
| 745 | } | 750 | } |
| 746 | 751 | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index dcb116dde216..ab450c099aa4 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -2887,6 +2887,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, | |||
| 2887 | unsigned int mss; | 2887 | unsigned int mss; |
| 2888 | struct sk_buff *gso_skb = skb; | 2888 | struct sk_buff *gso_skb = skb; |
| 2889 | __sum16 newcheck; | 2889 | __sum16 newcheck; |
| 2890 | bool ooo_okay, copy_destructor; | ||
| 2890 | 2891 | ||
| 2891 | if (!pskb_may_pull(skb, sizeof(*th))) | 2892 | if (!pskb_may_pull(skb, sizeof(*th))) |
| 2892 | goto out; | 2893 | goto out; |
| @@ -2927,10 +2928,18 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, | |||
| 2927 | goto out; | 2928 | goto out; |
| 2928 | } | 2929 | } |
| 2929 | 2930 | ||
| 2931 | copy_destructor = gso_skb->destructor == tcp_wfree; | ||
| 2932 | ooo_okay = gso_skb->ooo_okay; | ||
| 2933 | /* All segments but the first should have ooo_okay cleared */ | ||
| 2934 | skb->ooo_okay = 0; | ||
| 2935 | |||
| 2930 | segs = skb_segment(skb, features); | 2936 | segs = skb_segment(skb, features); |
| 2931 | if (IS_ERR(segs)) | 2937 | if (IS_ERR(segs)) |
| 2932 | goto out; | 2938 | goto out; |
| 2933 | 2939 | ||
| 2940 | /* Only first segment might have ooo_okay set */ | ||
| 2941 | segs->ooo_okay = ooo_okay; | ||
| 2942 | |||
| 2934 | delta = htonl(oldlen + (thlen + mss)); | 2943 | delta = htonl(oldlen + (thlen + mss)); |
| 2935 | 2944 | ||
| 2936 | skb = segs; | 2945 | skb = segs; |
| @@ -2950,6 +2959,17 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, | |||
| 2950 | thlen, skb->csum)); | 2959 | thlen, skb->csum)); |
| 2951 | 2960 | ||
| 2952 | seq += mss; | 2961 | seq += mss; |
| 2962 | if (copy_destructor) { | ||
| 2963 | skb->destructor = gso_skb->destructor; | ||
| 2964 | skb->sk = gso_skb->sk; | ||
| 2965 | /* {tcp|sock}_wfree() use exact truesize accounting : | ||
| 2966 | * sum(skb->truesize) MUST be exactly be gso_skb->truesize | ||
| 2967 | * So we account mss bytes of 'true size' for each segment. | ||
| 2968 | * The last segment will contain the remaining. | ||
| 2969 | */ | ||
| 2970 | skb->truesize = mss; | ||
| 2971 | gso_skb->truesize -= mss; | ||
| 2972 | } | ||
| 2953 | skb = skb->next; | 2973 | skb = skb->next; |
| 2954 | th = tcp_hdr(skb); | 2974 | th = tcp_hdr(skb); |
| 2955 | 2975 | ||
| @@ -2962,7 +2982,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, | |||
| 2962 | * is freed at TX completion, and not right now when gso_skb | 2982 | * is freed at TX completion, and not right now when gso_skb |
| 2963 | * is freed by GSO engine | 2983 | * is freed by GSO engine |
| 2964 | */ | 2984 | */ |
| 2965 | if (gso_skb->destructor == tcp_wfree) { | 2985 | if (copy_destructor) { |
| 2966 | swap(gso_skb->sk, skb->sk); | 2986 | swap(gso_skb->sk, skb->sk); |
| 2967 | swap(gso_skb->destructor, skb->destructor); | 2987 | swap(gso_skb->destructor, skb->destructor); |
| 2968 | swap(gso_skb->truesize, skb->truesize); | 2988 | swap(gso_skb->truesize, skb->truesize); |
| @@ -3269,8 +3289,11 @@ int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *hp, | |||
| 3269 | 3289 | ||
| 3270 | for (i = 0; i < shi->nr_frags; ++i) { | 3290 | for (i = 0; i < shi->nr_frags; ++i) { |
| 3271 | const struct skb_frag_struct *f = &shi->frags[i]; | 3291 | const struct skb_frag_struct *f = &shi->frags[i]; |
| 3272 | struct page *page = skb_frag_page(f); | 3292 | unsigned int offset = f->page_offset; |
| 3273 | sg_set_page(&sg, page, skb_frag_size(f), f->page_offset); | 3293 | struct page *page = skb_frag_page(f) + (offset >> PAGE_SHIFT); |
| 3294 | |||
| 3295 | sg_set_page(&sg, page, skb_frag_size(f), | ||
| 3296 | offset_in_page(offset)); | ||
| 3274 | if (crypto_hash_update(desc, &sg, skb_frag_size(f))) | 3297 | if (crypto_hash_update(desc, &sg, skb_frag_size(f))) |
| 3275 | return 1; | 3298 | return 1; |
| 3276 | } | 3299 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 08bbe6096528..9c6225780bd5 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -2743,8 +2743,8 @@ static void tcp_process_loss(struct sock *sk, int flag, bool is_dupack) | |||
| 2743 | * tcp_xmit_retransmit_queue(). | 2743 | * tcp_xmit_retransmit_queue(). |
| 2744 | */ | 2744 | */ |
| 2745 | static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | 2745 | static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, |
| 2746 | int prior_sacked, bool is_dupack, | 2746 | int prior_sacked, int prior_packets, |
| 2747 | int flag) | 2747 | bool is_dupack, int flag) |
| 2748 | { | 2748 | { |
| 2749 | struct inet_connection_sock *icsk = inet_csk(sk); | 2749 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 2750 | struct tcp_sock *tp = tcp_sk(sk); | 2750 | struct tcp_sock *tp = tcp_sk(sk); |
| @@ -2804,7 +2804,8 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | |||
| 2804 | tcp_add_reno_sack(sk); | 2804 | tcp_add_reno_sack(sk); |
| 2805 | } else | 2805 | } else |
| 2806 | do_lost = tcp_try_undo_partial(sk, pkts_acked); | 2806 | do_lost = tcp_try_undo_partial(sk, pkts_acked); |
| 2807 | newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; | 2807 | newly_acked_sacked = prior_packets - tp->packets_out + |
| 2808 | tp->sacked_out - prior_sacked; | ||
| 2808 | break; | 2809 | break; |
| 2809 | case TCP_CA_Loss: | 2810 | case TCP_CA_Loss: |
| 2810 | tcp_process_loss(sk, flag, is_dupack); | 2811 | tcp_process_loss(sk, flag, is_dupack); |
| @@ -2818,7 +2819,8 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | |||
| 2818 | if (is_dupack) | 2819 | if (is_dupack) |
| 2819 | tcp_add_reno_sack(sk); | 2820 | tcp_add_reno_sack(sk); |
| 2820 | } | 2821 | } |
| 2821 | newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; | 2822 | newly_acked_sacked = prior_packets - tp->packets_out + |
| 2823 | tp->sacked_out - prior_sacked; | ||
| 2822 | 2824 | ||
| 2823 | if (icsk->icsk_ca_state <= TCP_CA_Disorder) | 2825 | if (icsk->icsk_ca_state <= TCP_CA_Disorder) |
| 2824 | tcp_try_undo_dsack(sk); | 2826 | tcp_try_undo_dsack(sk); |
| @@ -3330,9 +3332,10 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3330 | bool is_dupack = false; | 3332 | bool is_dupack = false; |
| 3331 | u32 prior_in_flight; | 3333 | u32 prior_in_flight; |
| 3332 | u32 prior_fackets; | 3334 | u32 prior_fackets; |
| 3333 | int prior_packets; | 3335 | int prior_packets = tp->packets_out; |
| 3334 | int prior_sacked = tp->sacked_out; | 3336 | int prior_sacked = tp->sacked_out; |
| 3335 | int pkts_acked = 0; | 3337 | int pkts_acked = 0; |
| 3338 | int previous_packets_out = 0; | ||
| 3336 | 3339 | ||
| 3337 | /* If the ack is older than previous acks | 3340 | /* If the ack is older than previous acks |
| 3338 | * then we can probably ignore it. | 3341 | * then we can probably ignore it. |
| @@ -3403,14 +3406,14 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3403 | sk->sk_err_soft = 0; | 3406 | sk->sk_err_soft = 0; |
| 3404 | icsk->icsk_probes_out = 0; | 3407 | icsk->icsk_probes_out = 0; |
| 3405 | tp->rcv_tstamp = tcp_time_stamp; | 3408 | tp->rcv_tstamp = tcp_time_stamp; |
| 3406 | prior_packets = tp->packets_out; | ||
| 3407 | if (!prior_packets) | 3409 | if (!prior_packets) |
| 3408 | goto no_queue; | 3410 | goto no_queue; |
| 3409 | 3411 | ||
| 3410 | /* See if we can take anything off of the retransmit queue. */ | 3412 | /* See if we can take anything off of the retransmit queue. */ |
| 3413 | previous_packets_out = tp->packets_out; | ||
| 3411 | flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una); | 3414 | flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una); |
| 3412 | 3415 | ||
| 3413 | pkts_acked = prior_packets - tp->packets_out; | 3416 | pkts_acked = previous_packets_out - tp->packets_out; |
| 3414 | 3417 | ||
| 3415 | if (tcp_ack_is_dubious(sk, flag)) { | 3418 | if (tcp_ack_is_dubious(sk, flag)) { |
| 3416 | /* Advance CWND, if state allows this. */ | 3419 | /* Advance CWND, if state allows this. */ |
| @@ -3418,7 +3421,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3418 | tcp_cong_avoid(sk, ack, prior_in_flight); | 3421 | tcp_cong_avoid(sk, ack, prior_in_flight); |
| 3419 | is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); | 3422 | is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); |
| 3420 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, | 3423 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, |
| 3421 | is_dupack, flag); | 3424 | prior_packets, is_dupack, flag); |
| 3422 | } else { | 3425 | } else { |
| 3423 | if (flag & FLAG_DATA_ACKED) | 3426 | if (flag & FLAG_DATA_ACKED) |
| 3424 | tcp_cong_avoid(sk, ack, prior_in_flight); | 3427 | tcp_cong_avoid(sk, ack, prior_in_flight); |
| @@ -3441,7 +3444,7 @@ no_queue: | |||
| 3441 | /* If data was DSACKed, see if we can undo a cwnd reduction. */ | 3444 | /* If data was DSACKed, see if we can undo a cwnd reduction. */ |
| 3442 | if (flag & FLAG_DSACKING_ACK) | 3445 | if (flag & FLAG_DSACKING_ACK) |
| 3443 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, | 3446 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, |
| 3444 | is_dupack, flag); | 3447 | prior_packets, is_dupack, flag); |
| 3445 | /* If this ack opens up a zero window, clear backoff. It was | 3448 | /* If this ack opens up a zero window, clear backoff. It was |
| 3446 | * being used to time the probes, and is probably far higher than | 3449 | * being used to time the probes, and is probably far higher than |
| 3447 | * it needs to be for normal retransmission. | 3450 | * it needs to be for normal retransmission. |
| @@ -3464,7 +3467,7 @@ old_ack: | |||
| 3464 | if (TCP_SKB_CB(skb)->sacked) { | 3467 | if (TCP_SKB_CB(skb)->sacked) { |
| 3465 | flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una); | 3468 | flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una); |
| 3466 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, | 3469 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, |
| 3467 | is_dupack, flag); | 3470 | prior_packets, is_dupack, flag); |
| 3468 | } | 3471 | } |
| 3469 | 3472 | ||
| 3470 | SOCK_DEBUG(sk, "Ack %u before %u:%u\n", ack, tp->snd_una, tp->snd_nxt); | 3473 | SOCK_DEBUG(sk, "Ack %u before %u:%u\n", ack, tp->snd_una, tp->snd_nxt); |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 536d40929ba6..ec335fabd5cc 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -874,11 +874,13 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, | |||
| 874 | &md5); | 874 | &md5); |
| 875 | tcp_header_size = tcp_options_size + sizeof(struct tcphdr); | 875 | tcp_header_size = tcp_options_size + sizeof(struct tcphdr); |
| 876 | 876 | ||
| 877 | if (tcp_packets_in_flight(tp) == 0) { | 877 | if (tcp_packets_in_flight(tp) == 0) |
| 878 | tcp_ca_event(sk, CA_EVENT_TX_START); | 878 | tcp_ca_event(sk, CA_EVENT_TX_START); |
| 879 | skb->ooo_okay = 1; | 879 | |
| 880 | } else | 880 | /* if no packet is in qdisc/device queue, then allow XPS to select |
| 881 | skb->ooo_okay = 0; | 881 | * another queue. |
| 882 | */ | ||
| 883 | skb->ooo_okay = sk_wmem_alloc_get(sk) == 0; | ||
| 882 | 884 | ||
| 883 | skb_push(skb, tcp_header_size); | 885 | skb_push(skb, tcp_header_size); |
| 884 | skb_reset_transport_header(skb); | 886 | skb_reset_transport_header(skb); |
