|
@@ -401,6 +401,21 @@ static inline void ipv6_addr_prefix(struct in6_addr *pfx,
|
|
|
pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b);
|
|
|
}
|
|
|
|
|
|
+static inline void ipv6_addr_prefix_copy(struct in6_addr *addr,
|
|
|
+ const struct in6_addr *pfx,
|
|
|
+ int plen)
|
|
|
+{
|
|
|
+ /* caller must guarantee 0 <= plen <= 128 */
|
|
|
+ int o = plen >> 3,
|
|
|
+ b = plen & 0x7;
|
|
|
+
|
|
|
+ memcpy(addr->s6_addr, pfx, o);
|
|
|
+ if (b != 0) {
|
|
|
+ addr->s6_addr[o] &= ~(0xff00 >> b);
|
|
|
+ addr->s6_addr[o] |= (pfx->s6_addr[o] & (0xff00 >> b));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static inline void __ipv6_addr_set_half(__be32 *addr,
|
|
|
__be32 wh, __be32 wl)
|
|
|
{
|