ipv6/addr: initialize iid part of an ipv6 address
This commit is contained in:
parent
4002db15d6
commit
c5acf0227d
@ -470,6 +470,17 @@ uint8_t ipv6_addr_match_prefix(const ipv6_addr_t *a, const ipv6_addr_t *b);
|
||||
*/
|
||||
void ipv6_addr_init_prefix(ipv6_addr_t *out, const ipv6_addr_t *prefix, uint8_t bits);
|
||||
|
||||
/**
|
||||
* @brief Sets the last @p bits of IPv6 address @p out to @p iid.
|
||||
* Leading bits of @p out stay untouched.
|
||||
*
|
||||
* @param[out] out IPv6 address to be set.
|
||||
* @param[in] iid buffer representing the iid.
|
||||
* @param[in] bits Bits to be copied from @p iid to @p out
|
||||
* (set to 128 when greater than 128).
|
||||
*/
|
||||
void ipv6_addr_init_iid(ipv6_addr_t *out, const uint8_t *iid, uint8_t bits);
|
||||
|
||||
/**
|
||||
* @brief Sets @p addr dynamically to the unspecified IPv6 address (::).
|
||||
*
|
||||
|
||||
@ -77,6 +77,29 @@ void ipv6_addr_init_prefix(ipv6_addr_t *out, const ipv6_addr_t *prefix,
|
||||
out->u8[bytes] |= (prefix->u8[bytes] & mask);
|
||||
}
|
||||
}
|
||||
|
||||
void ipv6_addr_init_iid(ipv6_addr_t *out, const uint8_t *iid, uint8_t bits)
|
||||
{
|
||||
uint8_t unaligned_bits, bytes, pos;
|
||||
|
||||
if (bits > 128) {
|
||||
bits = 128;
|
||||
}
|
||||
|
||||
unaligned_bits = bits % 8;
|
||||
bytes = bits / 8;
|
||||
pos = (IPV6_ADDR_BIT_LEN / 8) - bytes;
|
||||
|
||||
if (unaligned_bits) {
|
||||
uint8_t mask = 0xff << unaligned_bits;
|
||||
out->u8[pos - 1] &= mask;
|
||||
out->u8[pos - 1] |= (*iid & ~mask);
|
||||
iid++;
|
||||
}
|
||||
|
||||
memcpy(&(out->u8[pos]), iid, bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user