Commit ade6648b authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

parents 2ad56496 fad87aca
...@@ -861,7 +861,8 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len, ...@@ -861,7 +861,8 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len,
u16 flags; u16 flags;
/* All of a TSO frame must be composed of paged data. */ /* All of a TSO frame must be composed of paged data. */
BUG_ON(skb->len != skb->data_len); if (skb->len != skb->data_len)
return tcp_fragment(sk, skb, len, mss_now);
buff = sk_stream_alloc_pskb(sk, 0, 0, GFP_ATOMIC); buff = sk_stream_alloc_pskb(sk, 0, 0, GFP_ATOMIC);
if (unlikely(buff == NULL)) if (unlikely(buff == NULL))
...@@ -974,6 +975,8 @@ static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle) ...@@ -974,6 +975,8 @@ static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle)
sent_pkts = 0; sent_pkts = 0;
while ((skb = sk->sk_send_head)) { while ((skb = sk->sk_send_head)) {
unsigned int limit;
tso_segs = tcp_init_tso_segs(sk, skb, mss_now); tso_segs = tcp_init_tso_segs(sk, skb, mss_now);
BUG_ON(!tso_segs); BUG_ON(!tso_segs);
...@@ -994,8 +997,9 @@ static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle) ...@@ -994,8 +997,9 @@ static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle)
break; break;
} }
limit = mss_now;
if (tso_segs > 1) { if (tso_segs > 1) {
u32 limit = tcp_window_allows(tp, skb, limit = tcp_window_allows(tp, skb,
mss_now, cwnd_quota); mss_now, cwnd_quota);
if (skb->len < limit) { if (skb->len < limit) {
...@@ -1004,14 +1008,11 @@ static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle) ...@@ -1004,14 +1008,11 @@ static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle)
if (trim) if (trim)
limit = skb->len - trim; limit = skb->len - trim;
} }
if (skb->len > limit) {
if (tso_fragment(sk, skb, limit, mss_now))
break;
} }
} else if (unlikely(skb->len > mss_now)) {
if (unlikely(tcp_fragment(sk, skb, mss_now, mss_now))) if (skb->len > limit &&
unlikely(tso_fragment(sk, skb, limit, mss_now)))
break; break;
}
TCP_SKB_CB(skb)->when = tcp_time_stamp; TCP_SKB_CB(skb)->when = tcp_time_stamp;
...@@ -1064,10 +1065,13 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now) ...@@ -1064,10 +1065,13 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now)
cwnd_quota = tcp_snd_test(sk, skb, mss_now, TCP_NAGLE_PUSH); cwnd_quota = tcp_snd_test(sk, skb, mss_now, TCP_NAGLE_PUSH);
if (likely(cwnd_quota)) { if (likely(cwnd_quota)) {
unsigned int limit;
BUG_ON(!tso_segs); BUG_ON(!tso_segs);
limit = mss_now;
if (tso_segs > 1) { if (tso_segs > 1) {
u32 limit = tcp_window_allows(tp, skb, limit = tcp_window_allows(tp, skb,
mss_now, cwnd_quota); mss_now, cwnd_quota);
if (skb->len < limit) { if (skb->len < limit) {
...@@ -1076,14 +1080,11 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now) ...@@ -1076,14 +1080,11 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now)
if (trim) if (trim)
limit = skb->len - trim; limit = skb->len - trim;
} }
if (skb->len > limit) {
if (unlikely(tso_fragment(sk, skb, limit, mss_now)))
return;
} }
} else if (unlikely(skb->len > mss_now)) {
if (unlikely(tcp_fragment(sk, skb, mss_now, mss_now))) if (skb->len > limit &&
unlikely(tso_fragment(sk, skb, limit, mss_now)))
return; return;
}
/* Send it out now. */ /* Send it out now. */
TCP_SKB_CB(skb)->when = tcp_time_stamp; TCP_SKB_CB(skb)->when = tcp_time_stamp;
......
...@@ -198,13 +198,14 @@ static inline int ip6_input_finish(struct sk_buff *skb) ...@@ -198,13 +198,14 @@ static inline int ip6_input_finish(struct sk_buff *skb)
if (!raw_sk) { if (!raw_sk) {
if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
IP6_INC_STATS_BH(IPSTATS_MIB_INUNKNOWNPROTOS); IP6_INC_STATS_BH(IPSTATS_MIB_INUNKNOWNPROTOS);
icmpv6_param_prob(skb, ICMPV6_UNK_NEXTHDR, nhoff); icmpv6_send(skb, ICMPV6_PARAMPROB,
ICMPV6_UNK_NEXTHDR, nhoff,
skb->dev);
} }
} else { } else
IP6_INC_STATS_BH(IPSTATS_MIB_INDELIVERS); IP6_INC_STATS_BH(IPSTATS_MIB_INDELIVERS);
kfree_skb(skb); kfree_skb(skb);
} }
}
rcu_read_unlock(); rcu_read_unlock();
return 0; return 0;
......
...@@ -328,6 +328,8 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb) ...@@ -328,6 +328,8 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
if (skb->ip_summed != CHECKSUM_UNNECESSARY) { if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_HW) {
skb_postpull_rcsum(skb, skb->nh.raw,
skb->h.raw - skb->nh.raw);
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
if (csum_ipv6_magic(&skb->nh.ipv6h->saddr, if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
&skb->nh.ipv6h->daddr, &skb->nh.ipv6h->daddr,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment