if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
                goto discard_it;
 
-       th = tcp_hdr(skb);
+       th = (const struct tcphdr *)skb->data;
 
-       if (th->doff < sizeof(struct tcphdr) / 4)
+       if (unlikely(th->doff < sizeof(struct tcphdr) / 4))
                goto bad_packet;
        if (!pskb_may_pull(skb, th->doff * 4))
                goto discard_it;
        if (skb_checksum_init(skb, IPPROTO_TCP, inet_compute_pseudo))
                goto csum_error;
 
-       th = tcp_hdr(skb);
+       th = (const struct tcphdr *)skb->data;
        iph = ip_hdr(skb);
        /* This is tricky : We move IPCB at its correct location into TCP_SKB_CB()
         * barrier() makes sure compiler wont play fool^Waliasing games.
 
  * be sent.
  */
 static void tcp_ecn_send(struct sock *sk, struct sk_buff *skb,
-                               int tcp_header_len)
+                        struct tcphdr *th, int tcp_header_len)
 {
        struct tcp_sock *tp = tcp_sk(sk);
 
                        INET_ECN_xmit(sk);
                        if (tp->ecn_flags & TCP_ECN_QUEUE_CWR) {
                                tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR;
-                               tcp_hdr(skb)->cwr = 1;
+                               th->cwr = 1;
                                skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN;
                        }
                } else if (!tcp_ca_needs_ecn(sk)) {
                        INET_ECN_dontxmit(sk);
                }
                if (tp->ecn_flags & TCP_ECN_DEMAND_CWR)
-                       tcp_hdr(skb)->ece = 1;
+                       th->ece = 1;
        }
 }
 
        atomic_add(skb->truesize, &sk->sk_wmem_alloc);
 
        /* Build TCP header and checksum it. */
-       th = tcp_hdr(skb);
+       th = (struct tcphdr *)skb->data;
        th->source              = inet->inet_sport;
        th->dest                = inet->inet_dport;
        th->seq                 = htonl(tcb->seq);
        *(((__be16 *)th) + 6)   = htons(((tcp_header_size >> 2) << 12) |
                                        tcb->tcp_flags);
 
-       if (unlikely(tcb->tcp_flags & TCPHDR_SYN)) {
-               /* RFC1323: The window in SYN & SYN/ACK segments
-                * is never scaled.
-                */
-               th->window      = htons(min(tp->rcv_wnd, 65535U));
-       } else {
-               th->window      = htons(tcp_select_window(sk));
-       }
        th->check               = 0;
        th->urg_ptr             = 0;
 
 
        tcp_options_write((__be32 *)(th + 1), tp, &opts);
        skb_shinfo(skb)->gso_type = sk->sk_gso_type;
-       if (likely((tcb->tcp_flags & TCPHDR_SYN) == 0))
-               tcp_ecn_send(sk, skb, tcp_header_size);
-
+       if (likely(!(tcb->tcp_flags & TCPHDR_SYN))) {
+               th->window      = htons(tcp_select_window(sk));
+               tcp_ecn_send(sk, skb, th, tcp_header_size);
+       } else {
+               /* RFC1323: The window in SYN & SYN/ACK segments
+                * is never scaled.
+                */
+               th->window      = htons(min(tp->rcv_wnd, 65535U));
+       }
 #ifdef CONFIG_TCP_MD5SIG
        /* Calculate the MD5 hash, as we have all we need now */
        if (md5) {
        skb_push(skb, tcp_header_size);
        skb_reset_transport_header(skb);
 
-       th = tcp_hdr(skb);
+       th = (struct tcphdr *)skb->data;
        memset(th, 0, sizeof(struct tcphdr));
        th->syn = 1;
        th->ack = 1;
 
        if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
                goto discard_it;
 
-       th = tcp_hdr(skb);
+       th = (const struct tcphdr *)skb->data;
 
-       if (th->doff < sizeof(struct tcphdr)/4)
+       if (unlikely(th->doff < sizeof(struct tcphdr)/4))
                goto bad_packet;
        if (!pskb_may_pull(skb, th->doff*4))
                goto discard_it;
        if (skb_checksum_init(skb, IPPROTO_TCP, ip6_compute_pseudo))
                goto csum_error;
 
-       th = tcp_hdr(skb);
+       th = (const struct tcphdr *)skb->data;
        hdr = ipv6_hdr(skb);
 
 lookup: