]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/ipv4/tcp_output.c
net: replace ipfragok with skb->local_df
[net-next-2.6.git] / net / ipv4 / tcp_output.c
index 4a1605d3f909666321b6b6c1684354bbc58a22f6..2b7d71fb84396877c1ce2b4b6c6e2470248b6c1d 100644 (file)
@@ -37,6 +37,7 @@
 #include <net/tcp.h>
 
 #include <linux/compiler.h>
+#include <linux/gfp.h>
 #include <linux/module.h>
 
 /* People can turn this off for buggy TCP's found in printers etc. */
@@ -349,6 +350,7 @@ static inline void TCP_ECN_send(struct sock *sk, struct sk_buff *skb,
  */
 static void tcp_init_nondata_skb(struct sk_buff *skb, u32 seq, u8 flags)
 {
+       skb->ip_summed = CHECKSUM_PARTIAL;
        skb->csum = 0;
 
        TCP_SKB_CB(skb)->flags = flags;
@@ -877,7 +879,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
        }
 #endif
 
-       icsk->icsk_af_ops->send_check(sk, skb->len, skb);
+       icsk->icsk_af_ops->send_check(sk, skb);
 
        if (likely(tcb->flags & TCPCB_FLAG_ACK))
                tcp_event_ack_sent(sk, tcp_skb_pcount(skb));
@@ -888,7 +890,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
        if (after(tcb->end_seq, tp->snd_nxt) || tcb->seq == tcb->end_seq)
                TCP_INC_STATS(sock_net(sk), TCP_MIB_OUTSEGS);
 
-       err = icsk->icsk_af_ops->queue_xmit(skb, 0);
+       err = icsk->icsk_af_ops->queue_xmit(skb);
        if (likely(err <= 0))
                return err;
 
@@ -2395,13 +2397,17 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
        struct tcp_extend_values *xvp = tcp_xv(rvp);
        struct inet_request_sock *ireq = inet_rsk(req);
        struct tcp_sock *tp = tcp_sk(sk);
+       const struct tcp_cookie_values *cvp = tp->cookie_values;
        struct tcphdr *th;
        struct sk_buff *skb;
        struct tcp_md5sig_key *md5;
        int tcp_header_size;
        int mss;
+       int s_data_desired = 0;
 
-       skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15, 1, GFP_ATOMIC);
+       if (cvp != NULL && cvp->s_data_constant && cvp->s_data_desired)
+               s_data_desired = cvp->s_data_desired;
+       skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15 + s_data_desired, 1, GFP_ATOMIC);
        if (skb == NULL)
                return NULL;
 
@@ -2457,16 +2463,12 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
                             TCPCB_FLAG_SYN | TCPCB_FLAG_ACK);
 
        if (OPTION_COOKIE_EXTENSION & opts.options) {
-               const struct tcp_cookie_values *cvp = tp->cookie_values;
-
-               if (cvp != NULL &&
-                   cvp->s_data_constant &&
-                   cvp->s_data_desired > 0) {
-                       u8 *buf = skb_put(skb, cvp->s_data_desired);
+               if (s_data_desired) {
+                       u8 *buf = skb_put(skb, s_data_desired);
 
                        /* copy data directly from the listening socket. */
-                       memcpy(buf, cvp->s_data_payload, cvp->s_data_desired);
-                       TCP_SKB_CB(skb)->end_seq += cvp->s_data_desired;
+                       memcpy(buf, cvp->s_data_payload, s_data_desired);
+                       TCP_SKB_CB(skb)->end_seq += s_data_desired;
                }
 
                if (opts.hash_size > 0) {