40 #ifndef included_ip6_packet_h 41 #define included_ip6_packet_h 55 __clib_packed ip6_address_t;
68 ip6_address_t ip6_addr;
78 addr_fib->fib_index = fib_index;
90 #define foreach_ip6_multicast_address_scope \ 93 _ (admin_local, 0x4) \ 95 _ (organization_local, 0x8) \ 98 #define foreach_ip6_multicast_link_local_group_id \ 100 _ (all_routers, 0x2) \ 101 _ (rip_routers, 0x9) \ 102 _ (eigrp_routers, 0xa) \ 103 _ (pim_routers, 0xd) \ 104 _ (mldv2_routers, 0x16) 108 #define _(f,n) IP6_MULTICAST_SCOPE_##f = n, 115 #define _(f,n) IP6_MULTICAST_GROUP_ID_##f = n, 123 return a->as_u8[0] == 0xff;
129 dst->as_u64[0] = src->as_u64[0];
130 dst->as_u64[1] = src->as_u64[1];
135 ip6_multicast_address_scope_t
scope,
138 a->as_u64[0] = a->as_u64[1] = 0;
139 a->as_u16[0] = clib_host_to_net_u16 (0xff00 | scope);
140 a->as_u16[7] = clib_host_to_net_u16 (
id);
147 a->as_u64[0] = a->as_u64[1] = 0;
148 a->as_u16[0] = clib_host_to_net_u16 (0xff02);
152 a->as_u32[3] = clib_host_to_net_u32 (
id);
158 ethernet_address[0] = 0x33;
159 ethernet_address[1] = 0x33;
160 ethernet_address[2] = ((group_id >> 24) & 0xff);
161 ethernet_address[3] = ((group_id >> 16) & 0xff);
162 ethernet_address[4] = ((group_id >> 8) & 0xff);
163 ethernet_address[5] = ((group_id >> 0) & 0xff);
170 for (i = 0; i <
ARRAY_LEN (a->as_uword); i++)
171 if (a->as_uword[i] != b->as_uword[i])
178 const ip6_address_t *
b,
179 const ip6_address_t *
mask)
182 for (i = 0; i <
ARRAY_LEN (a->as_uword); i++)
184 uword a_masked, b_masked;
185 a_masked = a->as_uword[
i] & mask->as_uword[
i];
186 b_masked = b->as_uword[
i] & mask->as_uword[
i];
188 if (a_masked != b_masked)
198 for (i = 0; i <
ARRAY_LEN (a->as_uword); i++)
199 a->as_uword[i] &= mask->as_uword[i];
206 for (i = 0; i <
ARRAY_LEN (a->as_uword); i++)
213 int i, byte, bit, bitnum;
216 for (i = 0; i < width; i++)
218 bitnum = (7 - (i & 7));
221 a->as_u8[byte] |= bit;
229 for (i = 0; i <
ARRAY_LEN (a->as_uword); i++)
230 if (a->as_uword[i] != 0)
246 return (a->as_u64[0] == 0 &&
248 a->as_u16[6] == 0 && a->as_u8[14] == 0 && a->as_u8[15] == 1);
255 return a->as_u8[0] == 0xfe && (a->as_u8[1] & 0xc0) == 0x80;
262 return (a->as_u8[0] & 0xfe) == 0xfc;
269 return (a->as_u8[0] & 0xe0) == 0x20;
276 return (a->as_u32[0] == clib_host_to_net_u32 (0xff020000)
278 && a->as_u32[2] == clib_host_to_net_u32 (1)
279 && a->as_u8[12] == 0xff);
285 return (a->as_u32[0] ^ a->as_u32[1] ^ a->as_u32[2] ^ a->as_u32[3]);
291 return (a->as_u64[0] ^ a->as_u64[1]);
313 #define IP6_PACKET_TC_MASK 0x0FF00000 314 #define IP6_PACKET_DSCP_MASK 0x0FC00000 315 #define IP6_PACKET_ECN_MASK 0x00300000 378 return (
void *) (i + 1);
400 ip6_address_t src0, dst0;
423 ip6_address_t src0, dst0, src1, dst1;
436 u16 src0, dst0, src1, dst1;
453 }) ip6_pad1_option_t;
461 }) ip6_padN_option_t;
466 #define IP6_MLDP_ALERT_TYPE 0x5 470 }) ip6_router_alert_option_t;
481 #define foreach_ext_hdr_type \ 482 _(IP6_HOP_BY_HOP_OPTIONS) \ 484 _(IPV6_FRAGMENTATION) \ 487 _(IP6_DESTINATION_OPTIONS) \ 495 #ifdef CLIB_HAVE_VEC128 496 static const u8x16 ext_hdr_types = {
497 #define _(x) IP_PROTOCOL_##x, 502 return !u8x16_is_all_zero (ext_hdr_types == u8x16_splat (nexthdr));
508 #define _(x) || (nexthdr == IP_PROTOCOL_##x) 514 #define ip6_ext_header_len(p) ((((ip6_ext_header_t *)(p))->n_data_u64s+1) << 3) 515 #define ip6_ext_authhdr_len(p) ((((ip6_ext_header_t *)(p))->n_data_u64s+2) << 2) 525 void *obj,
size_t len)
546 ip6_ext_header_t ** prev_ext_header)
548 ip6_ext_header_t *prev = NULL;
549 ip6_ext_header_t *result = NULL;
550 if ((ip6_header)->
protocol == header_type)
552 result = (
void *) (ip6_header + 1);
562 prev = (
void *) (ip6_header + 1);
563 while (
ip6_ext_hdr (prev->next_hdr) && prev->next_hdr != header_type)
573 if (prev && (prev->next_hdr == header_type))
585 *prev_ext_header = prev;
607 ip6_ext_header_t ** ext_hdr,
608 ip6_ext_header_t ** last_ext_hdr)
614 *last_ext_hdr = NULL;
618 ip6_ext_header_t *
h = (
void *) (ip6_header + 1);
626 if (ip6_header->
protocol == find_hdr)
632 if (h->next_hdr == find_hdr)
657 }) ip6_hop_by_hop_ext_t;
664 u16 fragment_offset_and_more;
669 #define ip6_frag_hdr_offset(hdr) \ 670 (clib_net_to_host_u16((hdr)->fragment_offset_and_more) >> 3) 672 #define ip6_frag_hdr_offset_bytes(hdr) \ 673 (8 * ip6_frag_hdr_offset(hdr)) 675 #define ip6_frag_hdr_more(hdr) \ 676 (clib_net_to_host_u16((hdr)->fragment_offset_and_more) & 0x1) 678 #define ip6_frag_hdr_offset_and_more(offset, more) \ 679 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
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
vl_api_ip_proto_t protocol
#define IP6_PACKET_DSCP_MASK
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_always_inline ip_ecn_t ip6_ecn_network_order(const ip6_header_t *ip6)
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)
static int ip6_walk_ext_hdr(vlib_main_t *vm, vlib_buffer_t *b, const ip6_header_t *ip6_header, u8 find_hdr, u32 *length, ip6_ext_header_t **ext_hdr, ip6_ext_header_t **last_ext_hdr)
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)
epu8_epi32 epu16_epi32 u64x2
vl_api_fib_path_type_t type
#define foreach_ext_hdr_type
static uword ip6_address_is_equal_masked(const ip6_address_t *a, const ip6_address_t *b, const ip6_address_t *mask)
static_always_inline void ip6_set_dscp_network_order(ip6_header_t *ip6, ip_dscp_t dscp)
#define ip6_ext_header_len(p)
#define IP6_PACKET_TC_MASK
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)
sll srl srl sll sra u16x4 i
static_always_inline ip_dscp_t ip6_dscp_network_order(const ip6_header_t *ip6)
static_always_inline void ip6_set_ecn_network_order(ip6_header_t *ip6, ip_ecn_t ecn)
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)
manual_print typedef address
enum ip_dscp_t_ ip_dscp_t
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 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 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)
#define IP6_PACKET_ECN_MASK
static void ip6_set_reserved_multicast_address(ip6_address_t *a, ip6_multicast_address_scope_t scope, u16 id)
STATIC_ASSERT_SIZEOF(ip6_address_t, 16)