40 #ifndef included_ip6_packet_h 41 #define included_ip6_packet_h 65 ip6_address_t ip6_addr;
88 #define ip46_address_is_ip4(ip46) (((ip46)->pad[0] | (ip46)->pad[1] | (ip46)->pad[2]) == 0) 89 #define ip46_address_mask_ip4(ip46) ((ip46)->pad[0] = (ip46)->pad[1] = (ip46)->pad[2] = 0) 90 #define ip46_address_set_ip4(ip46, ip) (ip46_address_mask_ip4(ip46), (ip46)->ip4 = (ip)[0]) 91 #define ip46_address_reset(ip46) ((ip46)->as_u64[0] = (ip46)->as_u64[1] = 0) 92 #define ip46_address_cmp(ip46_1, ip46_2) (memcmp(ip46_1, ip46_2, sizeof(*ip46_1))) 93 #define ip46_address_is_zero(ip46) (((ip46)->as_u64[0] == 0) && ((ip46)->as_u64[1] == 0)) 94 #define ip46_address_is_equal(a1, a2) (((a1)->as_u64[0] == (a2)->as_u64[0]) \ 95 && ((a1)->as_u64[1] == (a2)->as_u64[1])) 96 #define ip46_address_initializer {{{ 0 }}} 102 return (ip46->ip4.as_u32 == ip4->
as_u32);
107 const ip6_address_t * ip6)
109 return ((ip46->ip6.as_u64[0] == ip6->
as_u64[0]) &&
110 (ip46->ip6.as_u64[1] == ip6->
as_u64[1]));
116 dst->as_u64[0] = src->as_u64[0];
117 dst->as_u64[1] = src->as_u64[1];
123 dst->as_u64[0] = src->
as_u64[0];
124 dst->as_u64[1] = src->
as_u64[1];
132 ip.ip6 = *((ip6_address_t *) buf);
144 addr_fib->fib_index = fib_index;
156 #define foreach_ip6_multicast_address_scope \ 158 _ (link_local, 0x2) \ 159 _ (admin_local, 0x4) \ 160 _ (site_local, 0x5) \ 161 _ (organization_local, 0x8) \ 164 #define foreach_ip6_multicast_link_local_group_id \ 166 _ (all_routers, 0x2) \ 167 _ (rip_routers, 0x9) \ 168 _ (eigrp_routers, 0xa) \ 169 _ (pim_routers, 0xd) \ 170 _ (mldv2_routers, 0x16) 174 #define _(f,n) IP6_MULTICAST_SCOPE_##f = n, 181 #define _(f,n) IP6_MULTICAST_GROUP_ID_##f = n, 189 return a->
as_u8[0] == 0xff;
208 ip6_multicast_address_scope_t
scope,
212 a->
as_u16[0] = clib_host_to_net_u16 (0xff00 | scope);
213 a->
as_u16[7] = clib_host_to_net_u16 (
id);
221 a->
as_u16[0] = clib_host_to_net_u16 (0xff02);
225 a->
as_u32[3] = clib_host_to_net_u32 (
id);
231 ethernet_address[0] = 0x33;
232 ethernet_address[1] = 0x33;
233 ethernet_address[2] = ((group_id >> 24) & 0xff);
234 ethernet_address[3] = ((group_id >> 16) & 0xff);
235 ethernet_address[4] = ((group_id >> 8) & 0xff);
236 ethernet_address[5] = ((group_id >> 0) & 0xff);
251 const ip6_address_t * b,
252 const ip6_address_t * mask)
257 uword a_masked, b_masked;
261 if (a_masked != b_masked)
286 int i, byte, bit, bitnum;
289 for (i = 0; i < width; i++)
291 bitnum = (7 - (i & 7));
294 a->
as_u8[byte] |= bit;
319 return (a->
as_u64[0] == 0 &&
328 return a->
as_u8[0] == 0xfe && (a->
as_u8[1] & 0xc0) == 0x80;
335 return (a->
as_u8[0] & 0xfe) == 0xfc;
342 return (a->
as_u8[0] & 0xe0) == 0x20;
349 return (a->
as_u32[0] == clib_host_to_net_u32 (0xff020000)
351 && a->
as_u32[2] == clib_host_to_net_u32 (1)
352 && a->
as_u8[12] == 0xff);
412 return (
void *) (i + 1);
434 ip6_address_t src0, dst0;
457 ip6_address_t src0, dst0, src1, dst1;
470 u16 src0, dst0, src1, dst1;
487 }) ip6_pad1_option_t;
495 }) ip6_padN_option_t;
500 #define IP6_MLDP_ALERT_TYPE 0x5 504 }) ip6_router_alert_option_t;
515 #define foreach_ext_hdr_type \ 516 _(IP6_HOP_BY_HOP_OPTIONS) \ 518 _(IPV6_FRAGMENTATION) \ 521 _(IP6_DESTINATION_OPTIONS) \ 529 #ifdef CLIB_HAVE_VEC128 530 static const u8x16 ext_hdr_types = {
531 #define _(x) IP_PROTOCOL_##x, 536 return !u8x16_is_all_zero (ext_hdr_types == u8x16_splat (nexthdr));
542 #define _(x) || (nexthdr == IP_PROTOCOL_##x) 548 #define ip6_ext_header_len(p) ((((ip6_ext_header_t *)(p))->n_data_u64s+1) << 3) 549 #define ip6_ext_authhdr_len(p) ((((ip6_ext_header_t *)(p))->n_data_u64s+2) << 2) 559 void *obj,
size_t len)
580 ip6_ext_header_t ** prev_ext_header)
582 ip6_ext_header_t *prev = NULL;
583 ip6_ext_header_t *result = NULL;
584 if ((ip6_header)->
protocol == header_type)
586 result = (
void *) (ip6_header + 1);
596 prev = (
void *) (ip6_header + 1);
597 while (
ip6_ext_hdr (prev->next_hdr) && prev->next_hdr != header_type)
607 if (prev && (prev->next_hdr == header_type))
619 *prev_ext_header = prev;
630 }) ip6_hop_by_hop_ext_t;
637 u16 fragment_offset_and_more;
642 #define ip6_frag_hdr_offset(hdr) \ 643 (clib_net_to_host_u16((hdr)->fragment_offset_and_more) >> 3) 645 #define ip6_frag_hdr_offset_bytes(hdr) \ 646 (8 * ip6_frag_hdr_offset(hdr)) 648 #define ip6_frag_hdr_more(hdr) \ 649 (clib_net_to_host_u16((hdr)->fragment_offset_and_more) & 0x1) 651 #define ip6_frag_hdr_offset_and_more(offset, more) \ 652 clib_host_to_net_u16(((offset) << 3) + !!(more)) static ip_dscp_t ip6_traffic_class(const ip6_header_t *i)
typedef CLIB_PACKED(struct { ip6_address_t ip6_addr;u32 fib_index;}) ip6_address_fib_t
#define foreach_ip6_multicast_link_local_group_id
u8 pad[3]
log2 (size of the packing page block)
static_always_inline void ip6_set_traffic_class_network_order(ip6_header_t *ip6, ip_dscp_t dscp)
static int vlib_object_within_buffer_data(vlib_main_t *vm, vlib_buffer_t *b, void *obj, size_t len)
ip6_multicast_address_scope_t
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
static void ip6_copy_header(ip6_header_t *dst, const ip6_header_t *src)
static_always_inline ip_dscp_t ip6_traffic_class_network_order(const ip6_header_t *ip6)
static void * ip6_ext_next_header(ip6_ext_header_t *ext_hdr)
static uword ip6_address_is_local_unicast(const ip6_address_t *a)
static uword ip4_address_is_multicast(const ip4_address_t *a)
static void ip6_address_mask(ip6_address_t *a, const ip6_address_t *mask)
struct _tcp_header tcp_header_t
static u32 ip6_address_hash_to_u32(const ip6_address_t *a)
uword as_uword[16/sizeof(uword)]
static uword ip46_address_is_multicast(const ip46_address_t *a)
static u64 ip6_address_hash_to_u64(const ip6_address_t *a)
#define static_always_inline
#define foreach_ip6_multicast_address_scope
static void * ip6_ext_header_find(vlib_main_t *vm, vlib_buffer_t *b, ip6_header_t *ip6_header, u8 header_type, ip6_ext_header_t **prev_ext_header)
vl_api_fib_path_type_t type
#define foreach_ext_hdr_type
static_always_inline int ip46_address_is_equal_v6(const ip46_address_t *ip46, const ip6_address_t *ip6)
vl_api_ip_proto_t protocol
static uword ip6_address_is_equal_masked(const ip6_address_t *a, const ip6_address_t *b, const ip6_address_t *mask)
#define ip6_ext_header_len(p)
#define ip46_address_is_ip4(ip46)
static_always_inline u32 vlib_buffer_get_default_data_size(vlib_main_t *vm)
static void ip6_tcp_reply_x2(ip6_header_t *ip0, ip6_header_t *ip1, tcp_header_t *tcp0, tcp_header_t *tcp1)
static void ip6_address_set_zero(ip6_address_t *a)
static uword ip6_address_is_zero(const ip6_address_t *a)
static_always_inline void ip46_address_copy(ip46_address_t *dst, const ip46_address_t *src)
static uword ip6_address_is_loopback(const ip6_address_t *a)
static void * ip6_next_header(ip6_header_t *i)
static u8 ip6_ext_hdr(u8 nexthdr)
static ip46_address_t to_ip46(u32 is_ipv6, u8 *buf)
enum ip_dscp_t_ ip_dscp_t
#define ip46_address_set_ip4(ip46, ip)
static void ip6_addr_fib_init(ip6_address_fib_t *addr_fib, const ip6_address_t *address, u32 fib_index)
ip6_multicast_link_local_group_id_t
static uword ip6_address_is_link_local_unicast(const ip6_address_t *a)
static uword ip6_address_is_equal(const ip6_address_t *a, const ip6_address_t *b)
static_always_inline void ip46_address_set_ip6(ip46_address_t *dst, const ip6_address_t *src)
static uword ip6_address_is_multicast(const ip6_address_t *a)
static uword ip6_address_is_global_unicast(const ip6_address_t *a)
static void ip6_set_solicited_node_multicast_address(ip6_address_t *a, u32 id)
VLIB buffer representation.
static void ip6_address_copy(ip6_address_t *dst, const ip6_address_t *src)
static void ip6_address_mask_from_width(ip6_address_t *a, u32 width)
static uword ip6_address_is_unspecified(const ip6_address_t *a)
static_always_inline int ip46_address_is_equal_v4(const ip46_address_t *ip46, const ip4_address_t *ip4)
static void ip6_tcp_reply_x1(ip6_header_t *ip0, tcp_header_t *tcp0)
static void ip6_multicast_ethernet_address(u8 *ethernet_address, u32 group_id)
static uword ip6_is_solicited_node_multicast_address(const ip6_address_t *a)
static void ip6_set_reserved_multicast_address(ip6_address_t *a, ip6_multicast_address_scope_t scope, u16 id)