net: Add utility to verify given addr based on ll

Utility verifies given address is based on link layer address
or not.

Change-Id: I2b89e498fa2481051ec9a47ada8b4a5e8e38ad7a
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
This commit is contained in:
Ravi kumar Veeramally 2016-06-23 16:06:23 +03:00 committed by Jukka Rissanen
parent a4cb318333
commit 3fdaf518da

View File

@ -542,6 +542,47 @@ static inline void net_ipv6_addr_create_iid(struct in6_addr *addr,
}
}
/**
* @brief Check if given address is based on link layer address
*
* @return True if it is, False otherwise
*/
static inline bool net_ipv6_addr_based_on_ll(const struct in6_addr *addr,
const struct net_linkaddr *lladdr)
{
switch (lladdr->len) {
case 2:
if (!memcmp(&addr->s6_addr[14], lladdr->addr, lladdr->len) &&
(addr->s6_addr[8] ^ 0x02) == lladdr->addr[0] &&
addr->s6_addr[11] == 0xff &&
addr->s6_addr[12] == 0xfe) {
return true;
}
break;
case 6:
if (!memcmp(&addr->s6_addr[9], &lladdr->addr[1], 2) &&
!memcmp(&addr->s6_addr[13], &lladdr->addr[3], 3) &&
addr->s6_addr[11] == 0xff &&
addr->s6_addr[12] == 0xfe &&
(addr->s6_addr[8] ^ 0x02) == lladdr->addr[0]) {
return true;
}
break;
case 8:
if (!memcmp(&addr->s6_addr[9], &lladdr->addr[1],
lladdr->len - 1) &&
(addr->s6_addr[8] ^ 0x02) == lladdr->addr[0]) {
return true;
}
break;
}
return false;
}
#ifdef __cplusplus
}
#endif