-int
-ip_address_cmp (const ip_address_t * ip1, const ip_address_t * ip2)
-{
- int res = 0;
- if (ip_addr_version (ip1) != ip_addr_version (ip2))
- return -1;
- res =
- memcmp (&ip_addr_addr (ip1), &ip_addr_addr (ip2), ip_address_size (ip1));
-
- if (res < 0)
- res = 2;
- else if (res > 0)
- res = 1;
-
- return res;
-}
-
-void
-ip_address_copy (ip_address_t * dst, const ip_address_t * src)
-{
- if (IP4 == ip_addr_version (src))
- {
- /* don't copy any garbe from the union */
- memset (dst, 0, sizeof (*dst));
- dst->ip.v4 = src->ip.v4;
- dst->version = IP4;
- }
- else
- {
- clib_memcpy (dst, src, sizeof (ip_address_t));
- }
-}
-
-void
-ip_address_copy_addr (void *dst, const ip_address_t * src)
-{
- clib_memcpy (dst, src, ip_address_size (src));
-}
-
-void
-ip_address_set (ip_address_t * dst, const void *src, u8 version)
-{
- clib_memcpy (dst, src, ip_version_to_size (version));
- ip_addr_version (dst) = version;
-}
-
-void
-ip_address_to_46 (const ip_address_t * addr,
- ip46_address_t * a, fib_protocol_t * proto)
-{
- *proto = (IP4 == ip_addr_version (addr) ?
- FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6);
- switch (*proto)
- {
- case FIB_PROTOCOL_IP4:
- ip46_address_set_ip4 (a, &addr->ip.v4);
- break;
- case FIB_PROTOCOL_IP6:
- a->ip6 = addr->ip.v6;
- break;
- default:
- ASSERT (0);
- break;
- }
-}
-
-static void
-ip_prefix_normalize_ip4 (ip4_address_t * ip4, u8 preflen)
-{
- u32 mask = ~0;
-
- ASSERT (ip4);
-
- if (32 <= preflen)
- {
- return;
- }
-
- mask = pow2_mask (preflen) << (32 - preflen);
- mask = clib_host_to_net_u32 (mask);
- ip4->data_u32 &= mask;
-}
-
-static void
-ip_prefix_normalize_ip6 (ip6_address_t * ip6, u8 preflen)
-{
- u8 mask_6[16];
- u32 *m;
- u8 j, i0, i1;
-
- ASSERT (ip6);
-
- memset (mask_6, 0, sizeof (mask_6));
-
- if (128 <= preflen)
- {
- return;
- }
-
- i1 = preflen % 32;
- i0 = preflen / 32;
- m = (u32 *) & mask_6[0];
-
- for (j = 0; j < i0; j++)
- {
- m[j] = ~0;
- }
-
- if (i1)
- {
- m[i0] = clib_host_to_net_u32 (pow2_mask (i1) << (32 - i1));
- }
-
- for (j = 0; j < sizeof (mask_6); j++)
- {
- ip6->as_u8[j] &= mask_6[j];
- }
-}
-
-void
-ip_prefix_normalize (ip_prefix_t * a)
-{
- u8 preflen = ip_prefix_len (a);
-
- switch (ip_prefix_version (a))
- {
- case IP4:
- ip_prefix_normalize_ip4 (&ip_prefix_v4 (a), preflen);
- break;
-
- case IP6:
- ip_prefix_normalize_ip6 (&ip_prefix_v6 (a), preflen);
- break;
-
- default:
- ASSERT (0);
- }
-}
-