David Gwynne([email protected]) on 2018.10.14 07:59:21 +1000:
> pretty straightforward...
> 
> ok?

ok
 
> Index: if_gre.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_gre.c,v
> retrieving revision 1.124
> diff -u -p -r1.124 if_gre.c
> --- if_gre.c  24 Jul 2018 07:40:35 -0000      1.124
> +++ if_gre.c  13 Oct 2018 21:57:23 -0000
> @@ -1896,11 +1896,20 @@ gre_l3_encap_dst(const struct gre_tunnel
>               break;
>       }
>  #ifdef INET6
> -     case AF_INET6:
> -             tos = 0;
> +     case AF_INET6: {
> +             struct ip6_hdr *ip6;
> +
> +             m = m_pullup(m, sizeof(*ip6));
> +             if (m == NULL)
> +                     return (NULL);
> +
> +             ip6 = mtod(m, struct ip6_hdr *);
> +             tos = (ntohl(ip6->ip6_flow) & 0x0ff00000) >> 20;
> +
>               ttloff = offsetof(struct ip6_hdr, ip6_hlim);
>               proto = htons(ETHERTYPE_IPV6);
>               break;
> +     }
>   #endif
>  #ifdef MPLS
>       case AF_MPLS:
> @@ -2001,6 +2010,7 @@ gre_encap_dst_ip(const struct gre_tunnel
>               ip6->ip6_flow = ISSET(m->m_pkthdr.ph_flowid, M_FLOWID_VALID) ?
>                   htonl(m->m_pkthdr.ph_flowid & M_FLOWID_MASK) : 0;
>               ip6->ip6_vfc |= IPV6_VERSION;
> +             ip6->ip6_flow |= htonl((uint32_t)tos << 20);
>               ip6->ip6_plen = htons(len);
>               ip6->ip6_nxt = IPPROTO_GRE;
>               ip6->ip6_hlim = ttl;
> 

Reply via email to