diff options
author | Hannes Frederic Sowa <hannes@stressinduktion.org> | 2013-03-07 21:07:16 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-03-08 12:29:22 -0500 |
commit | b7ef213ef65256168df83ddfbb8131ed9adc10f9 (patch) | |
tree | c256358b03421731b7e1836948bedc0f3e4baf32 /include/net/ipv6.h | |
parent | 80580d4b20e13383009b4fb2043235a7d0a42589 (diff) |
ipv6: introdcue __ipv6_addr_needs_scope_id and ipv6_iface_scope_id helper functions
__ipv6_addr_needs_scope_id checks if an ipv6 address needs to supply
a 'sin6_scope_id != 0'. 'sin6_scope_id != 0' was enforced in case
of link-local addresses. To support interface-local multicast these
checks had to be enhanced and are now consolidated into these new helper
functions.
v2:
a) migrated to struct ipv6_addr_props
v3:
a) reverted changes for ipv6_addr_props
b) test for address type instead of comparing scope
v4:
a) unchanged
Suggested-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Cc: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Acked-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/ipv6.h')
-rw-r--r-- | include/net/ipv6.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 988c9f28f0fc..42ef6abf25c3 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -320,6 +320,18 @@ static inline int ipv6_addr_src_scope(const struct in6_addr *addr) | |||
320 | return __ipv6_addr_src_scope(__ipv6_addr_type(addr)); | 320 | return __ipv6_addr_src_scope(__ipv6_addr_type(addr)); |
321 | } | 321 | } |
322 | 322 | ||
323 | static inline bool __ipv6_addr_needs_scope_id(int type) | ||
324 | { | ||
325 | return type & IPV6_ADDR_LINKLOCAL || | ||
326 | (type & IPV6_ADDR_MULTICAST && | ||
327 | (type & (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL))); | ||
328 | } | ||
329 | |||
330 | static inline __u32 ipv6_iface_scope_id(const struct in6_addr *addr, int iface) | ||
331 | { | ||
332 | return __ipv6_addr_needs_scope_id(__ipv6_addr_type(addr)) ? iface : 0; | ||
333 | } | ||
334 | |||
323 | static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2) | 335 | static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2) |
324 | { | 336 | { |
325 | return memcmp(a1, a2, sizeof(struct in6_addr)); | 337 | return memcmp(a1, a2, sizeof(struct in6_addr)); |