*/
        skb_get(skb);
        set_arp_failure_handler(skb, arp_failure_discard);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        len = skb->len;
        req = (struct tx_data_wr *) skb_push(skb, sizeof(*req));
        req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA));
        skb_get(skb);
        skb->priority = CPL_PRIORITY_DATA;
        set_arp_failure_handler(skb, arp_failure_discard);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        req = (struct tx_data_wr *) skb_push(skb, sizeof(*req));
        req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA));
        req->wr_lo = htonl(V_WR_TID(ep->hwtid));
         */
        skb_get(skb);
        set_arp_failure_handler(skb, arp_failure_discard);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        len = skb->len;
        req = (struct tx_data_wr *) skb_push(skb, sizeof(*req));
        req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA));
 
 
         skb_reset_mac_header(skb);    /* Point to entire packet. */
         skb_pull(skb,3);
-        skb->h.raw      = skb->data;    /* Point to data (Skip header). */
+        skb_reset_transport_header(skb);    /* Point to data (Skip header). */
 
         /* Update the counters. */
         lp->stats.rx_packets++;
 
        /* copy ddp(s,e)hdr + contents */
        memcpy(skb->data,(void*)ltdmabuf,len);
 
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
 
        stats->rx_packets++;
        stats->rx_bytes+=skb->len;
        cbuf.laptype = skb->data[2];
        skb_pull(skb,3);        /* skip past LLAP header */
        cbuf.length = skb->len; /* this is host order */
-       skb->h.raw=skb->data;
+       skb_reset_transport_header(skb);
 
        if(debug & DEBUG_UPPER) {
                printk("command ");
 
        rq->offload_pkts++;
        skb_reset_mac_header(skb);
        skb_reset_network_header(skb);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
 
        if (rq->polling) {
                rx_gather[gather_idx++] = skb;
 
 
 static inline struct dccp_hdr *dccp_zeroed_hdr(struct sk_buff *skb, int headlen)
 {
-       skb->h.raw = skb_push(skb, headlen);
-       memset(skb->h.raw, 0, headlen);
-       return dccp_hdr(skb);
+       skb_push(skb, headlen);
+       skb_reset_transport_header(skb);
+       return memset(skb->h.raw, 0, headlen);
 }
 
 static inline struct dccp_hdr_ext *dccp_hdrx(const struct sk_buff *skb)
 
        skb->tail += len;
 }
 
+static inline void skb_reset_transport_header(struct sk_buff *skb)
+{
+       skb->h.raw = skb->data;
+}
+
 static inline unsigned char *skb_network_header(const struct sk_buff *skb)
 {
        return skb->nh.raw;
 
        /* Set up the buffer */
        skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
        skb_reset_network_header(skb);
-       skb->h.raw       = skb->data;
+       skb_reset_transport_header(skb);
        skb_put(skb, sizeof(*eah));
        skb->protocol    = htons(ETH_P_ATALK);
        skb->dev         = dev;
        /* Set up the buffer */
        skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
        skb_reset_network_header(skb);
-       skb->h.raw       = skb->data;
+       skb_reset_transport_header(skb);
        skb_put(skb, sizeof(*eah));
        skb->protocol    = htons(ETH_P_ATALK);
        skb->dev         = dev;
        /* Set up the buffer */
        skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
        skb_reset_network_header(skb);
-       skb->h.raw       = skb->data;
+       skb_reset_transport_header(skb);
        skb_put(skb, sizeof(*eah));
        skb->protocol    = htons(ETH_P_ATALK);
        skb->dev         = dev;
 
        skb->protocol = htons(ETH_P_IP);
        skb_pull(skb, 13);
        skb->dev   = dev;
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
 
        stats = dev->priv;
        stats->rx_packets++;
                /* Non routable, so force a drop if we slip up later */
                ddp->deh_len_hops = htons(skb->len + (DDP_MAXHOPS << 10));
        }
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
 
        return atalk_rcv(skb, dev, pt, orig_dev);
 freeit:
 
        if (!ax25_sk(sk)->pidincl)
                skb_pull(skb, 1);               /* Remove PID */
 
-       skb->h.raw = skb->data;
-       copied     = skb->len;
+       skb_reset_transport_header(skb);
+       copied = skb->len;
 
        if (copied > size) {
                copied = size;
 
 
                                        skbn->dev   = ax25->ax25_dev->dev;
                                        skb_reset_network_header(skbn);
-                                       skbn->h.raw = skbn->data;
+                                       skb_reset_transport_header(skbn);
 
                                        /* Copy data from the fragments */
                                        while ((skbo = skb_dequeue(&ax25->frag_queue)) != NULL) {
         *      Process the AX.25/LAPB frame.
         */
 
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
 
        if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) {
                kfree_skb(skb);
                switch (skb->data[1]) {
                case AX25_P_IP:
                        skb_pull(skb,2);                /* drop PID/CTRL */
-                       skb->h.raw    = skb->data;
+                       skb_reset_transport_header(skb);
                        skb_reset_network_header(skb);
                        skb->dev      = dev;
                        skb->pkt_type = PACKET_HOST;
 
                case AX25_P_ARP:
                        skb_pull(skb,2);
-                       skb->h.raw    = skb->data;
+                       skb_reset_transport_header(skb);
                        skb_reset_network_header(skb);
                        skb->dev      = dev;
                        skb->pkt_type = PACKET_HOST;
 
                copied = len;
        }
 
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
 
        skb_free_datagram(sk, skb);
 
        struct hci_acl_hdr *hdr;
        int len = skb->len;
 
-       hdr = (struct hci_acl_hdr *) skb_push(skb, HCI_ACL_HDR_SIZE);
+       skb_push(skb, HCI_ACL_HDR_SIZE);
+       skb_reset_transport_header(skb);
+       hdr = (struct hci_acl_hdr *)skb->h.raw;
        hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags));
        hdr->dlen   = cpu_to_le16(len);
-
-       skb->h.raw = (void *) hdr;
 }
 
 int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags)
        hdr.handle = cpu_to_le16(conn->handle);
        hdr.dlen   = skb->len;
 
-       skb->h.raw = skb_push(skb, HCI_SCO_HDR_SIZE);
+       skb_push(skb, HCI_SCO_HDR_SIZE);
+       skb_reset_transport_header(skb);
        memcpy(skb->h.raw, &hdr, HCI_SCO_HDR_SIZE);
 
        skb->dev = (void *) hdev;
 
                copied = len;
        }
 
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
 
        hci_sock_cmsg(sk, msg, skb);
 
        __get_cpu_var(netdev_rx_stat).total++;
 
        skb_reset_network_header(skb);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        skb->mac_len = skb->nh.raw - skb->mac.raw;
 
        pt_prev = NULL;
 
                return;
 
        skb_reset_network_header(skb);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        arp = arp_hdr(skb);
 
        if ((arp->ar_hrd != htons(ARPHRD_ETHER) &&
 
        if (!pskb_may_pull(skb, 2))
                goto free_out;
 
-       skb->h.raw    = skb->data;
+       skb_reset_transport_header(skb);
        cb->nsp_flags = *ptr++;
 
        if (decnet_debug_level & 2)
 
        struct dst_entry *dst;
        struct flowi fl;
 
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        scp->stamp = jiffies;
 
        dst = sk_dst_check(sk, 0);
 
                goto drop_it;
 
        skb_pull(skb, 20);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
 
        /* Destination info */
        ptr += 2;
                goto drop_it;
 
        skb_pull(skb, 5);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
 
        cb->dst = *(__le16 *)ptr;
        ptr += 2;
 
        if (unlikely(!pskb_may_pull(skb, ihl)))
                goto out;
 
-       skb->h.raw = __skb_pull(skb, ihl);
+       __skb_pull(skb, ihl);
+       skb_reset_transport_header(skb);
        iph = ip_hdr(skb);
        proto = iph->protocol & (MAX_INET_PROTOS - 1);
        err = -EPROTONOSUPPORT;
        if (unlikely(!pskb_may_pull(skb, ihl)))
                goto out;
 
-       skb->h.raw = __skb_pull(skb, ihl);
+       __skb_pull(skb, ihl);
+       skb_reset_transport_header(skb);
        iph = ip_hdr(skb);
        id = ntohs(iph->id);
        proto = iph->protocol & (MAX_INET_PROTOS - 1);
 
        }
        ((struct iphdr*)work_buf)->protocol = ah->nexthdr;
        skb->nh.raw += ah_hlen;
-       skb->h.raw = memcpy(skb_network_header(skb), work_buf, ihl);
+       memcpy(skb_network_header(skb), work_buf, ihl);
+       skb->h.raw = skb->nh.raw;
        __skb_pull(skb, ah_hlen + ihl);
 
        return 0;
 
        __skb_pull(skb, ip_hdrlen(skb));
 
        /* Point into the IP datagram, just past the header. */
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
 
        rcu_read_lock();
        {
 
                         * before previous one went down. */
                        if (frag) {
                                frag->ip_summed = CHECKSUM_NONE;
-                               frag->h.raw = frag->data;
+                               skb_reset_transport_header(frag);
                                __skb_push(frag, hlen);
                                skb_reset_network_header(frag);
                                memcpy(skb_network_header(frag), iph, hlen);
 
                 */
                skb_push(skb, sizeof(struct iphdr));
                skb_reset_network_header(skb);
-               skb->h.raw = skb->data;
+               skb_reset_transport_header(skb);
                msg = (struct igmpmsg *)skb_network_header(skb);
                memcpy(msg, skb_network_header(pkt), sizeof(struct iphdr));
                msg->im_msgtype = IGMPMSG_WHOLEPKT;
 
         * transport header to point to ESP.  Keep UDP on the stack
         * for later.
         */
-       skb->h.raw = __skb_pull(skb, len);
+       __skb_pull(skb, len);
+       skb_reset_transport_header(skb);
 
        /* modify the protocol (it's ESP!) */
        iph->protocol = IPPROTO_ESP;
 
                skb->nh.raw = skb->h.raw;
        }
        ip_hdr(skb)->tot_len = htons(skb->len + ihl);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        return 0;
 }
 
 
        if (hdr->version != 6)
                goto err;
 
-       skb->h.raw = (u8 *)(hdr + 1);
+       skb->h.raw = skb->nh.raw + sizeof(*hdr);
        IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr);
 
        pkt_len = ntohs(hdr->payload_len);
 
                         * before previous one went down. */
                        if (frag) {
                                frag->ip_summed = CHECKSUM_NONE;
-                               frag->h.raw = frag->data;
+                               skb_reset_transport_header(frag);
                                fh = (struct frag_hdr*)__skb_push(frag, sizeof(struct frag_hdr));
                                __skb_push(frag, hlen);
                                skb_reset_network_header(frag);
                skb_reserve(frag, LL_RESERVED_SPACE(rt->u.dst.dev));
                skb_put(frag, len + hlen + sizeof(struct frag_hdr));
                skb_reset_network_header(frag);
-               fh = (struct frag_hdr*)(frag->data + hlen);
-               frag->h.raw = frag->data + hlen + sizeof(struct frag_hdr);
+               fh = (struct frag_hdr *)(skb_network_header(frag) + hlen);
+               frag->h.raw = frag->nh.raw + hlen + sizeof(struct frag_hdr);
 
                /*
                 *      Charge the memory for the fragment to any owner
                skb_reset_network_header(skb);
 
                /* initialize protocol header pointer */
-               skb->h.raw = skb->data + fragheaderlen;
+               skb->h.raw = skb->nh.raw + fragheaderlen;
 
                skb->ip_summed = CHECKSUM_PARTIAL;
                skb->csum = 0;
 
        rcu_read_lock();
        ops = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr);
        if (likely(ops && ops->gso_send_check)) {
-               skb->h.raw = skb->data;
+               skb_reset_transport_header(skb);
                err = ops->gso_send_check(skb);
        }
        rcu_read_unlock();
        rcu_read_lock();
        ops = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr);
        if (likely(ops && ops->gso_segment)) {
-               skb->h.raw = skb->data;
+               skb_reset_transport_header(skb);
                segs = ops->gso_segment(skb, features);
        }
        rcu_read_unlock();
 
        head->nh.raw += sizeof(struct frag_hdr);
 
        skb_shinfo(head)->frag_list = head->next;
-       head->h.raw = head->data;
+       skb_reset_transport_header(head);
        skb_push(head, head->data - skb_network_header(head));
        atomic_sub(head->truesize, &nf_ct_frag6_mem);
 
 
        head->nh.raw += sizeof(struct frag_hdr);
 
        skb_shinfo(head)->frag_list = head->next;
-       head->h.raw = head->data;
+       skb_reset_transport_header(head);
        skb_push(head, head->data - skb_network_header(head));
        atomic_sub(head->truesize, &ip6_frag_mem);
 
 
        }
        ipv6_hdr(skb)->payload_len = htons(skb->len + ihl -
                                           sizeof(struct ipv6hdr));
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        return 0;
 }
 
 
        if (skb2) {
                skb_reserve(skb2, out_offset);
                skb_reset_network_header(skb2);
-               skb2->h.raw = skb2->data;
+               skb_reset_transport_header(skb2);
                skb_put(skb2, skb->len);
                memcpy(ipx_hdr(skb2), ipx_hdr(skb), skb->len);
                memcpy(skb2->cb, skb->cb, sizeof(skb->cb));
 
 
        /* Fill in IPX header */
        skb_reset_network_header(skb);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        skb_put(skb, sizeof(struct ipxhdr));
        ipx = ipx_hdr(skb);
        ipx->ipx_pktsize = htons(len + sizeof(struct ipxhdr));
 
        if (!skb)
                return err;
 
-       skb->h.raw = skb->data;
-       copied     = skb->len;
+       skb_reset_transport_header(skb);
+       copied = skb->len;
 
        if (copied > size) {
                IRDA_DEBUG(2, "%s(), Received truncated frame (%zd < %zd)!\n",
 
        skb->dev = self->netdev;
        skb_reset_mac_header(skb);
        skb_reset_network_header(skb);
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        skb->protocol = htons(ETH_P_IRDA);
        skb->priority = TC_PRIO_BESTEFFORT;
 
 
                        return;
                }
 
-               skb->h.raw = skb->data;
+               skb_reset_transport_header(skb);
                skb_reset_network_header(skb);
                skb->len = msg->length;
        }
 
                copied = len;
        }
 
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
        if (err)
                goto out_free;
 
                skb_reset_mac_header(skb);
                skb_reserve(skb, 50);
                skb_reset_network_header(skb);
-               skb->h.raw = skb->data;
+               skb_reset_transport_header(skb);
                skb->protocol = htons(ETH_P_802_2);
                skb->dev      = dev;
                if (sk != NULL)
 
                copied = len;
        }
 
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
 
        if (msg->msg_name) {
 
        if (frametype == NR_PROTOEXT &&
            circuit_index == NR_PROTO_IP && circuit_id == NR_PROTO_IP) {
                skb_pull(skb, NR_NETWORK_LEN + NR_TRANSPORT_LEN);
-               skb->h.raw = skb->data;
+               skb_reset_transport_header(skb);
 
                return nr_rx_ip(skb, dev);
        }
        }
 
        if (sk != NULL) {
-               skb->h.raw = skb->data;
+               skb_reset_transport_header(skb);
 
                if (frametype == NR_CONNACK && skb->len == 22)
                        nr_sk(sk)->bpqext = 1;
                return er;
        }
 
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        copied     = skb->len;
 
        if (copied > size) {
 
                if ((skbn = alloc_skb(nr->fraglen, GFP_ATOMIC)) == NULL)
                        return 1;
 
-               skbn->h.raw = skbn->data;
+               skb_reset_transport_header(skbn);
 
                while ((skbo = skb_dequeue(&nr->frag_queue)) != NULL) {
                        memcpy(skb_put(skbn, skbo->len), skbo->data, skbo->len);
 
 
        if ((skbn = alloc_skb(skb->len, GFP_ATOMIC)) != NULL) {
                memcpy(skb_put(skbn, skb->len), skb->data, skb->len);
-               skbn->h.raw = skbn->data;
+               skb_reset_transport_header(skbn);
 
                skb_queue_tail(&loopback_queue, skbn);
 
 
                *asmptr = qbit;
        }
 
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        copied     = skb->len;
 
        if (copied > size) {
 
                dest      = (rose_address *)(skb->data + 4);
                lci_o     = 0xFFF - lci_i;
 
-               skb->h.raw = skb->data;
+               skb_reset_transport_header(skb);
 
                sk = rose_find_socket(lci_o, &rose_loopback_neigh);
                if (sk) {
 
                        }
                }
                else {
-                       skb->h.raw = skb->data;
+                       skb_reset_transport_header(skb);
                        res = rose_process_rx_frame(sk, skb);
                        goto out;
                }
 
                unix_attach_fds(siocb->scm, skb);
        unix_get_secdata(siocb->scm, skb);
 
-       skb->h.raw = skb->data;
+       skb_reset_transport_header(skb);
        err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
        if (err)
                goto out_free;
 
                }
        }
 
-       skb->h.raw = skb->data;
-
+       skb_reset_transport_header(skb);
        copied = skb->len;
 
        if (copied > size) {
 
        if ((sk = x25_find_socket(lci, nb)) != NULL) {
                int queued = 1;
 
-               skb->h.raw = skb->data;
+               skb_reset_transport_header(skb);
                bh_lock_sock(sk);
                if (!sock_owned_by_user(sk)) {
                        queued = x25_process_rx_frame(sk, skb);
 
 
                skb_queue_tail(&x25->fragment_queue, skb);
 
-               skbn->h.raw = skbn->data;
+               skb_reset_transport_header(skbn);
 
                skbo = skb_dequeue(&x25->fragment_queue);
                memcpy(skb_put(skbn, skbo->len), skbo->data, skbo->len);