diff -Naur nat46-6.old/nat46/modules/nat46-core.c nat46-6.new/nat46/modules/nat46-core.c --- nat46-6.old/nat46/modules/nat46-core.c 2017-04-17 09:59:50.025700000 +0530 +++ nat46-6.new/nat46/modules/nat46-core.c 2017-04-17 10:11:16.107523000 +0530 @@ -807,11 +807,12 @@ } void fill_v4hdr_from_v6hdr(struct iphdr * iph, struct ipv6hdr *ip6h, __u32 v4saddr, __u32 v4daddr, __u16 id, __u16 frag_off, __u16 proto, int l3_payload_len) { + uint32_t ver_class_flow = ntohl(*(__be32 *)ip6h); iph->ttl = ip6h->hop_limit; iph->saddr = v4saddr; iph->daddr = v4daddr; iph->protocol = proto; - *((__be16 *)iph) = htons((4 << 12) | (5 << 8) | (0x00/*tos*/ & 0xff)); + *((__be16 *)iph) = htons((4 << 12) | (5 << 8) | ((ver_class_flow >> 20) & 0xff)); iph->frag_off = frag_off; iph->id = id; iph->tot_len = htons( l3_payload_len + IPV4HDRSIZE ); @@ -1743,8 +1744,8 @@ nat46_instance_t *nat46 = get_nat46_instance(old_skb); struct sk_buff *new_skb; uint16_t sport = 0, dport = 0; + uint8_t tclass; - int tclass = 0; int flowlabel = 0; int do_l4_translate = 0; @@ -1752,6 +1753,7 @@ struct ipv6hdr * hdr6; struct iphdr * hdr4 = ip_hdr(old_skb); + tclass = hdr4->tos; char v6saddr[16], v6daddr[16]; @@ -1829,7 +1831,6 @@ memset(hdr6, 0, sizeof(*hdr6) + (add_frag_header?8:0)); /* build IPv6 header */ - tclass = 0; /* traffic class */ *(__be32 *)hdr6 = htonl(0x60000000 | (tclass << 20)) | flowlabel; /* version, priority, flowlabel */ /* IPv6 length is a payload length, IPv4 is hdr+payload */