ipv6/addr: initialize iid part of an ipv6 address

This commit is contained in:
Cenk Gündoğan 2015-10-26 11:36:02 +01:00
parent 4002db15d6
commit c5acf0227d
2 changed files with 34 additions and 0 deletions

View File

@ -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 (::).
*

View File

@ -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);
}
/**
* @}
*/