diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 36ed9efb8825..aa5b884a819e 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c @@ -1082,30 +1082,26 @@ static int ip6mr_cache_report(struct mr_table *mrt, struct sk_buff *pkt, } else #endif { - /* - * Copy the IP header - */ + /* Copy the IP header */ + skb_put(skb, sizeof(struct ipv6hdr)); + skb_reset_network_header(skb); + skb_copy_to_linear_data(skb, ipv6_hdr(pkt), + sizeof(struct ipv6hdr)); + + /* Add our header */ + skb_put(skb, sizeof(*msg)); + skb_reset_transport_header(skb); + msg = (struct mrt6msg *)skb_transport_header(skb); - skb_put(skb, sizeof(struct ipv6hdr)); - skb_reset_network_header(skb); - skb_copy_to_linear_data(skb, ipv6_hdr(pkt), sizeof(struct ipv6hdr)); + msg->im6_mbz = 0; + msg->im6_msgtype = assert; + msg->im6_mif = mifi; + msg->im6_pad = 0; + msg->im6_src = ipv6_hdr(pkt)->saddr; + msg->im6_dst = ipv6_hdr(pkt)->daddr; - /* - * Add our header - */ - skb_put(skb, sizeof(*msg)); - skb_reset_transport_header(skb); - msg = (struct mrt6msg *)skb_transport_header(skb); - - msg->im6_mbz = 0; - msg->im6_msgtype = assert; - msg->im6_mif = mifi; - msg->im6_pad = 0; - msg->im6_src = ipv6_hdr(pkt)->saddr; - msg->im6_dst = ipv6_hdr(pkt)->daddr; - - skb_dst_set(skb, dst_clone(skb_dst(pkt))); - skb->ip_summed = CHECKSUM_UNNECESSARY; + skb_dst_set(skb, dst_clone(skb_dst(pkt))); + skb->ip_summed = CHECKSUM_UNNECESSARY; } rcu_read_lock();