|
@@ -558,8 +558,8 @@ void ip6_datagram_recv_specific_ctl(struct sock *sk, struct msghdr *msg,
|
|
|
}
|
|
|
|
|
|
/* HbH is allowed only once */
|
|
|
- if (np->rxopt.bits.hopopts && opt->hop) {
|
|
|
- u8 *ptr = nh + opt->hop;
|
|
|
+ if (np->rxopt.bits.hopopts && (opt->flags & IP6SKB_HOPBYHOP)) {
|
|
|
+ u8 *ptr = nh + sizeof(struct ipv6hdr);
|
|
|
put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr);
|
|
|
}
|
|
|
|
|
@@ -620,8 +620,8 @@ void ip6_datagram_recv_specific_ctl(struct sock *sk, struct msghdr *msg,
|
|
|
int hlim = ipv6_hdr(skb)->hop_limit;
|
|
|
put_cmsg(msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim);
|
|
|
}
|
|
|
- if (np->rxopt.bits.ohopopts && opt->hop) {
|
|
|
- u8 *ptr = nh + opt->hop;
|
|
|
+ if (np->rxopt.bits.ohopopts && (opt->flags & IP6SKB_HOPBYHOP)) {
|
|
|
+ u8 *ptr = nh + sizeof(struct ipv6hdr);
|
|
|
put_cmsg(msg, SOL_IPV6, IPV6_2292HOPOPTS, (ptr[1]+1)<<3, ptr);
|
|
|
}
|
|
|
if (np->rxopt.bits.odstopts && opt->dst0) {
|