return !!(ident.csum_neutral);
 }
 
-void ila_update_ipv6_locator(struct sk_buff *skb, struct ila_params *p);
+void ila_update_ipv6_locator(struct sk_buff *skb, struct ila_params *p,
+                            bool set_csum_neutral);
 
 void ila_init_saved_csum(struct ila_params *p);
 
 
        iaddr->loc = p->locator;
 }
 
-void ila_update_ipv6_locator(struct sk_buff *skb, struct ila_params *p)
+void ila_update_ipv6_locator(struct sk_buff *skb, struct ila_params *p,
+                            bool set_csum_neutral)
 {
        struct ipv6hdr *ip6h = ipv6_hdr(skb);
        struct ila_addr *iaddr = ila_a2i(&ip6h->daddr);
                 * is a locator being translated to a SIR address.
                 * Perform (receiver) checksum-neutral translation.
                 */
-               ila_csum_do_neutral(iaddr, p);
+               if (!set_csum_neutral)
+                       ila_csum_do_neutral(iaddr, p);
        } else {
                switch (p->csum_mode) {
                case ILA_CSUM_ADJUST_TRANSPORT:
 
        if (skb->protocol != htons(ETH_P_IPV6))
                goto drop;
 
-       ila_update_ipv6_locator(skb, ila_params_lwtunnel(dst->lwtstate));
+       ila_update_ipv6_locator(skb, ila_params_lwtunnel(dst->lwtstate), true);
 
        return dst->lwtstate->orig_output(net, sk, skb);
 
        if (skb->protocol != htons(ETH_P_IPV6))
                goto drop;
 
-       ila_update_ipv6_locator(skb, ila_params_lwtunnel(dst->lwtstate));
+       ila_update_ipv6_locator(skb, ila_params_lwtunnel(dst->lwtstate), false);
 
        return dst->lwtstate->orig_input(skb);
 
 
        }
 }
 
-static int ila_xlat_addr(struct sk_buff *skb);
+static int ila_xlat_addr(struct sk_buff *skb, bool set_csum_neutral);
 
 static unsigned int
 ila_nf_input(void *priv,
             struct sk_buff *skb,
             const struct nf_hook_state *state)
 {
-       ila_xlat_addr(skb);
+       ila_xlat_addr(skb, false);
        return NF_ACCEPT;
 }
 
        .size = sizeof(struct ila_net),
 };
 
-static int ila_xlat_addr(struct sk_buff *skb)
+static int ila_xlat_addr(struct sk_buff *skb, bool set_csum_neutral)
 {
        struct ila_map *ila;
        struct ipv6hdr *ip6h = ipv6_hdr(skb);
 
        ila = ila_lookup_wildcards(iaddr, skb->dev->ifindex, ilan);
        if (ila)
-               ila_update_ipv6_locator(skb, &ila->xp.ip);
+               ila_update_ipv6_locator(skb, &ila->xp.ip, set_csum_neutral);
 
        rcu_read_unlock();