40 #ifndef included_ip6_packet_h 41 #define included_ip6_packet_h 65 ip6_address_t ip6_addr;
75 addr_fib->fib_index = fib_index;
87 #define foreach_ip6_multicast_address_scope \ 90 _ (admin_local, 0x4) \ 92 _ (organization_local, 0x8) \ 95 #define foreach_ip6_multicast_link_local_group_id \ 97 _ (all_routers, 0x2) \ 98 _ (rip_routers, 0x9) \ 99 _ (eigrp_routers, 0xa) \ 100 _ (pim_routers, 0xd) \ 101 _ (mldv2_routers, 0x16) 105 #define _(f,n) IP6_MULTICAST_SCOPE_##f = n, 112 #define _(f,n) IP6_MULTICAST_GROUP_ID_##f = n, 120 return a->
as_u8[0] == 0xff;
132 ip6_multicast_address_scope_t
scope,
136 a->
as_u16[0] = clib_host_to_net_u16 (0xff00 | scope);
137 a->
as_u16[7] = clib_host_to_net_u16 (
id);
145 a->
as_u16[0] = clib_host_to_net_u16 (0xff02);
149 a->
as_u32[3] = clib_host_to_net_u32 (
id);
155 ethernet_address[0] = 0x33;
156 ethernet_address[1] = 0x33;
157 ethernet_address[2] = ((group_id >> 24) & 0xff);
158 ethernet_address[3] = ((group_id >> 16) & 0xff);
159 ethernet_address[4] = ((group_id >> 8) & 0xff);
160 ethernet_address[5] = ((group_id >> 0) & 0xff);
175 const ip6_address_t * b,
176 const ip6_address_t * mask)
181 uword a_masked, b_masked;
185 if (a_masked != b_masked)
210 int i, byte, bit, bitnum;
213 for (i = 0; i < width; i++)
215 bitnum = (7 - (i & 7));
218 a->
as_u8[byte] |= bit;
243 return (a->
as_u64[0] == 0 &&
252 return a->
as_u8[0] == 0xfe && (a->
as_u8[1] & 0xc0) == 0x80;
259 return (a->
as_u8[0] & 0xfe) == 0xfc;
266 return (a->
as_u8[0] & 0xe0) == 0x20;
273 return (a->
as_u32[0] == clib_host_to_net_u32 (0xff020000)
275 && a->
as_u32[2] == clib_host_to_net_u32 (1)
276 && a->
as_u8[12] == 0xff);
370 return (
void *) (i + 1);
392 ip6_address_t src0, dst0;
415 ip6_address_t src0, dst0, src1, dst1;
428 u16 src0, dst0, src1, dst1;
445 }) ip6_pad1_option_t;
453 }) ip6_padN_option_t;
458 #define IP6_MLDP_ALERT_TYPE 0x5 462 }) ip6_router_alert_option_t;
473 #define foreach_ext_hdr_type \ 474 _(IP6_HOP_BY_HOP_OPTIONS) \ 476 _(IPV6_FRAGMENTATION) \ 479 _(IP6_DESTINATION_OPTIONS) \ 487 #ifdef CLIB_HAVE_VEC128 488 static const u8x16 ext_hdr_types = {
489 #define _(x) IP_PROTOCOL_##x, 494 return !u8x16_is_all_zero (ext_hdr_types == u8x16_splat (nexthdr));
500 #define _(x) || (nexthdr == IP_PROTOCOL_##x) 506 #define ip6_ext_header_len(p) ((((ip6_ext_header_t *)(p))->n_data_u64s+1) << 3) 507 #define ip6_ext_authhdr_len(p) ((((ip6_ext_header_t *)(p))->n_data_u64s+2) << 2) 517 void *obj,
size_t len)
538 ip6_ext_header_t ** prev_ext_header)
540 ip6_ext_header_t *prev =
NULL;
541 ip6_ext_header_t *result =
NULL;
542 if ((ip6_header)->
protocol == header_type)
544 result = (
void *) (ip6_header + 1);
554 prev = (
void *) (ip6_header + 1);
555 while (
ip6_ext_hdr (prev->next_hdr) && prev->next_hdr != header_type)
565 if (prev && (prev->next_hdr == header_type))
577 *prev_ext_header = prev;
599 ip6_ext_header_t ** ext_hdr,
600 ip6_ext_header_t ** last_ext_hdr)
606 *last_ext_hdr =
NULL;
610 ip6_ext_header_t *
h = (
void *) (ip6_header + 1);
618 if (ip6_header->
protocol == find_hdr)
624 if (h->next_hdr == find_hdr)
649 }) ip6_hop_by_hop_ext_t;
656 u16 fragment_offset_and_more;
661 #define ip6_frag_hdr_offset(hdr) \ 662 (clib_net_to_host_u16((hdr)->fragment_offset_and_more) >> 3) 664 #define ip6_frag_hdr_offset_bytes(hdr) \ 665 (8 * ip6_frag_hdr_offset(hdr)) 667 #define ip6_frag_hdr_more(hdr) \ 668 (clib_net_to_host_u16((hdr)->fragment_offset_and_more) & 0x1) 670 #define ip6_frag_hdr_offset_and_more(offset, more) \ 671 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
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)
uword as_uword[16/sizeof(uword)]
vl_api_ip_proto_t protocol
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 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)
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 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)
static void ip6_set_reserved_multicast_address(ip6_address_t *a, ip6_multicast_address_scope_t scope, u16 id)