iph->tos &= ~INET_ECN_MASK;
 }
 
-static inline void ipv4_copy_dscp(struct iphdr *outer, struct iphdr *inner)
+static inline void ipv4_copy_dscp(unsigned int dscp, struct iphdr *inner)
 {
-       u32 dscp = ipv4_get_dsfield(outer) & ~INET_ECN_MASK;
+       dscp &= ~INET_ECN_MASK;
        ipv4_change_dsfield(inner, INET_ECN_MASK, dscp);
 }
 
        *(__be32*)iph &= ~htonl(INET_ECN_MASK << 20);
 }
 
-static inline void ipv6_copy_dscp(struct ipv6hdr *outer, struct ipv6hdr *inner)
+static inline void ipv6_copy_dscp(unsigned int dscp, struct ipv6hdr *inner)
 {
-       u32 dscp = ipv6_get_dsfield(outer) & ~INET_ECN_MASK;
+       dscp &= ~INET_ECN_MASK;
        ipv6_change_dsfield(inner, INET_ECN_MASK, dscp);
 }
 
 
        iph = ip_hdr(skb);
        if (iph->protocol == IPPROTO_IPIP) {
                if (x->props.flags & XFRM_STATE_DECAP_DSCP)
-                       ipv4_copy_dscp(iph, ipip_hdr(skb));
+                       ipv4_copy_dscp(ipv4_get_dsfield(iph), ipip_hdr(skb));
                if (!(x->props.flags & XFRM_STATE_NOECN))
                        ipip_ecn_decapsulate(skb);
        }
 
                                        struct sk_buff *skb)
 {
        if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY)
-               ipv6_copy_dscp(ipv6h, ipv6_hdr(skb));
+               ipv6_copy_dscp(ipv6_get_dsfield(ipv6h), ipv6_hdr(skb));
 
        if (INET_ECN_is_ce(ipv6_get_dsfield(ipv6h)))
                IP6_ECN_set_ce(ipv6_hdr(skb));
 
        nh = skb_network_header(skb);
        if (nh[IP6CB(skb)->nhoff] == IPPROTO_IPV6) {
                if (x->props.flags & XFRM_STATE_DECAP_DSCP)
-                       ipv6_copy_dscp(ipv6_hdr(skb), ipipv6_hdr(skb));
+                       ipv6_copy_dscp(ipv6_get_dsfield(ipv6_hdr(skb)),
+                                      ipipv6_hdr(skb));
                if (!(x->props.flags & XFRM_STATE_NOECN))
                        ipip6_ecn_decapsulate(skb);
        } else {