|
@@ -320,6 +320,18 @@ static inline int ipv6_addr_src_scope(const struct in6_addr *addr)
|
|
|
return __ipv6_addr_src_scope(__ipv6_addr_type(addr));
|
|
|
}
|
|
|
|
|
|
+static inline bool __ipv6_addr_needs_scope_id(int type)
|
|
|
+{
|
|
|
+ return type & IPV6_ADDR_LINKLOCAL ||
|
|
|
+ (type & IPV6_ADDR_MULTICAST &&
|
|
|
+ (type & (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)));
|
|
|
+}
|
|
|
+
|
|
|
+static inline __u32 ipv6_iface_scope_id(const struct in6_addr *addr, int iface)
|
|
|
+{
|
|
|
+ return __ipv6_addr_needs_scope_id(__ipv6_addr_type(addr)) ? iface : 0;
|
|
|
+}
|
|
|
+
|
|
|
static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2)
|
|
|
{
|
|
|
return memcmp(a1, a2, sizeof(struct in6_addr));
|