ipv6: Use container_of macro instead of magic number to get ipv6 header.
In ipv6_recv_error(), addr_offset points to daddr field of the ip header. To get ipv6 header, use container_of() macro instead of substracting magic number (24). Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
29166107fd
Коммит
6c40d100ce
|
@ -356,12 +356,11 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
|
|||
sin->sin6_port = serr->port;
|
||||
sin->sin6_scope_id = 0;
|
||||
if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
sin->sin6_addr =
|
||||
*(struct in6_addr *)(nh + serr->addr_offset);
|
||||
const struct ipv6hdr *ip6h = container_of((struct in6_addr *)(nh + serr->addr_offset),
|
||||
struct ipv6hdr, daddr);
|
||||
sin->sin6_addr = ip6h->daddr;
|
||||
if (np->sndflow)
|
||||
sin->sin6_flowinfo =
|
||||
(*(__be32 *)(nh + serr->addr_offset - 24) &
|
||||
IPV6_FLOWINFO_MASK);
|
||||
sin->sin6_flowinfo = *(__be32 *)ip6h & IPV6_FLOWINFO_MASK;
|
||||
if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL)
|
||||
sin->sin6_scope_id = IP6CB(skb)->iif;
|
||||
} else {
|
||||
|
|
Загрузка…
Ссылка в новой задаче