|
@@ -360,7 +360,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
|
|
|
struct ipv6hdr, daddr);
|
|
|
sin->sin6_addr = ip6h->daddr;
|
|
|
if (np->sndflow)
|
|
|
- sin->sin6_flowinfo = *(__be32 *)ip6h & IPV6_FLOWINFO_MASK;
|
|
|
+ sin->sin6_flowinfo = ip6_flowinfo(ip6h);
|
|
|
if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL)
|
|
|
sin->sin6_scope_id = IP6CB(skb)->iif;
|
|
|
} else {
|
|
@@ -491,9 +491,10 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
|
|
|
put_cmsg(msg, SOL_IPV6, IPV6_TCLASS, sizeof(tclass), &tclass);
|
|
|
}
|
|
|
|
|
|
- if (np->rxopt.bits.rxflow && (*(__be32 *)nh & IPV6_FLOWINFO_MASK)) {
|
|
|
- __be32 flowinfo = *(__be32 *)nh & IPV6_FLOWINFO_MASK;
|
|
|
- put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo);
|
|
|
+ if (np->rxopt.bits.rxflow) {
|
|
|
+ __be32 flowinfo = ip6_flowinfo((struct ipv6hdr *)nh);
|
|
|
+ if (flowinfo)
|
|
|
+ put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo);
|
|
|
}
|
|
|
|
|
|
/* HbH is allowed only once */
|