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