|
FD.io VPP
v21.06-3-gbb25fbf28
Vector Packet Processing
|
Go to the documentation of this file.
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];
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);
171 if (
a->as_uword[
i] !=
b->as_uword[
i])
178 const ip6_address_t *
b,
179 const ip6_address_t *
mask)
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)
199 a->as_uword[
i] &=
mask->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;
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
316 #define IP6_PACKET_FL_MASK 0x000FFFFF
328 return (clib_net_to_host_u32 (
ip6->ip_version_traffic_class_and_flow_label)
335 return (clib_net_to_host_u32 (
ip6->ip_version_traffic_class_and_flow_label)
342 return (clib_net_to_host_u32 (
ip6->ip_version_traffic_class_and_flow_label)
350 clib_net_to_host_u32 (
ip6->ip_version_traffic_class_and_flow_label);
353 ip6->ip_version_traffic_class_and_flow_label = clib_host_to_net_u32 (
tmp);
360 clib_net_to_host_u32 (
ip6->ip_version_traffic_class_and_flow_label);
363 ip6->ip_version_traffic_class_and_flow_label = clib_host_to_net_u32 (
tmp);
370 clib_net_to_host_u32 (
ip6->ip_version_traffic_class_and_flow_label);
372 tmp |= ((0x3 & ecn) << 20);
373 ip6->ip_version_traffic_class_and_flow_label = clib_host_to_net_u32 (
tmp);
380 clib_net_to_host_u32 (
ip6->ip_version_traffic_class_and_flow_label);
381 return (
tmp & 0xfffff);
388 clib_net_to_host_u32 (
ip6->ip_version_traffic_class_and_flow_label);
390 tmp |= flow_label & 0x000fffff;
391 ip6->ip_version_traffic_class_and_flow_label = clib_host_to_net_u32 (
tmp);
397 return (
ip6->hop_limit);
409 return (
void *) (
i + 1);
415 dst->ip_version_traffic_class_and_flow_label =
416 src->ip_version_traffic_class_and_flow_label;
417 dst->payload_length =
src->payload_length;
418 dst->protocol =
src->protocol;
419 dst->hop_limit =
src->hop_limit;
421 dst->src_address.as_uword[0] =
src->src_address.as_uword[0];
422 dst->src_address.as_uword[1] =
src->src_address.as_uword[1];
423 dst->dst_address.as_uword[0] =
src->dst_address.as_uword[0];
424 dst->dst_address.as_uword[1] =
src->dst_address.as_uword[1];
431 ip6_address_t src0, dst0;
454 ip6_address_t src0, dst0, src1, dst1;
467 u16 src0, dst0, src1, dst1;
484 }) ip6_pad1_option_t;
492 }) ip6_padN_option_t;
497 #define IP6_MLDP_ALERT_TYPE 0x5
501 }) ip6_router_alert_option_t;
512 #define foreach_ext_hdr_type \
513 _(IP6_HOP_BY_HOP_OPTIONS) \
515 _(IPV6_FRAGMENTATION) \
518 _(IP6_DESTINATION_OPTIONS) \
526 #ifdef CLIB_HAVE_VEC128
527 static const u8x16 ext_hdr_types = {
528 #define _(x) IP_PROTOCOL_##x,
533 return !u8x16_is_all_zero (ext_hdr_types == u8x16_splat (nexthdr));
539 #define _(x) || (nexthdr == IP_PROTOCOL_##x)
545 #define ip6_ext_header_len(p) ((((ip6_ext_header_t *)(p))->n_data_u64s+1) << 3)
546 #define ip6_ext_authhdr_len(p) ((((ip6_ext_header_t *)(p))->n_data_u64s+2) << 2)
556 void *obj,
size_t len)
577 ip6_ext_header_t ** prev_ext_header)
579 ip6_ext_header_t *prev = NULL;
580 ip6_ext_header_t *result = NULL;
581 if ((ip6_header)->
protocol == header_type)
583 result = (
void *) (ip6_header + 1);
593 prev = (
void *) (ip6_header + 1);
594 while (
ip6_ext_hdr (prev->next_hdr) && prev->next_hdr != header_type)
604 if (prev && (prev->next_hdr == header_type))
616 *prev_ext_header = prev;
638 ip6_ext_header_t ** ext_hdr,
639 ip6_ext_header_t ** last_ext_hdr)
645 *last_ext_hdr = NULL;
649 ip6_ext_header_t *
h = (
void *) (ip6_header + 1);
657 if (ip6_header->
protocol == find_hdr)
663 if (
h->next_hdr == find_hdr)
688 }) ip6_hop_by_hop_ext_t;
695 u16 fragment_offset_and_more;
700 #define ip6_frag_hdr_offset(hdr) \
701 (clib_net_to_host_u16((hdr)->fragment_offset_and_more) >> 3)
703 #define ip6_frag_hdr_offset_bytes(hdr) \
704 (8 * ip6_frag_hdr_offset(hdr))
706 #define ip6_frag_hdr_more(hdr) \
707 (clib_net_to_host_u16((hdr)->fragment_offset_and_more) & 0x1)
709 #define ip6_frag_hdr_offset_and_more(offset, more) \
710 clib_host_to_net_u16(((offset) << 3) + !!(more))
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)
ip6_multicast_address_scope_t
static_always_inline u32 ip6_hop_limit_network_order(const ip6_header_t *ip6)
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)
enum ip_dscp_t_ ip_dscp_t
typedef CLIB_PACKED(struct { ip6_address_t ip6_addr;u32 fib_index;}) ip6_address_fib_t
static uword ip6_address_is_global_unicast(const ip6_address_t *a)
#define IP6_PACKET_DSCP_MASK
static_always_inline ip_dscp_t ip6_traffic_class_network_order(const ip6_header_t *ip6)
static_always_inline u32 ip6_flow_label_network_order(const ip6_header_t *ip6)
static u64 ip6_address_hash_to_u64(const ip6_address_t *a)
static void ip6_address_mask_from_width(ip6_address_t *a, u32 width)
struct _tcp_header tcp_header_t
static uword ip6_address_is_local_unicast(const ip6_address_t *a)
static ip_dscp_t ip6_traffic_class(const ip6_header_t *i)
#define ip6_ext_header_len(p)
epu8_epi32 epu16_epi32 u64x2
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
static_always_inline void ip6_set_dscp_network_order(ip6_header_t *ip6, ip_dscp_t dscp)
static uword ip6_address_is_loopback(const ip6_address_t *a)
static uword ip6_address_is_unspecified(const ip6_address_t *a)
static void * ip6_next_header(ip6_header_t *i)
#define foreach_ext_hdr_type
static_always_inline ip_dscp_t ip6_dscp_network_order(const ip6_header_t *ip6)
static uword ip6_address_is_equal_masked(const ip6_address_t *a, const ip6_address_t *b, const ip6_address_t *mask)
static uword ip6_address_is_multicast(const ip6_address_t *a)
#define foreach_ip6_multicast_address_scope
static void ip6_set_solicited_node_multicast_address(ip6_address_t *a, u32 id)
static int vlib_object_within_buffer_data(vlib_main_t *vm, vlib_buffer_t *b, void *obj, size_t len)
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)
#define static_always_inline
sll srl srl sll sra u16x4 i
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)
manual_print typedef address
static void ip6_address_copy(ip6_address_t *dst, const ip6_address_t *src)
static_always_inline void ip6_set_flow_label_network_order(ip6_header_t *ip6, u32 flow_label)
#define IP6_PACKET_ECN_MASK
#define IP6_PACKET_TC_MASK
static void ip6_set_reserved_multicast_address(ip6_address_t *a, ip6_multicast_address_scope_t scope, u16 id)
static void ip6_address_mask(ip6_address_t *a, const ip6_address_t *mask)
static u32 ip6_address_hash_to_u32(const ip6_address_t *a)
static_always_inline void ip6_set_traffic_class_network_order(ip6_header_t *ip6, ip_dscp_t dscp)
static_always_inline u32 vlib_buffer_get_default_data_size(vlib_main_t *vm)
static u8 ip6_ext_hdr(u8 nexthdr)
vl_api_ip_proto_t protocol
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_always_inline void ip6_set_ecn_network_order(ip6_header_t *ip6, ip_ecn_t ecn)
static void ip6_addr_fib_init(ip6_address_fib_t *addr_fib, const ip6_address_t *address, u32 fib_index)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
ip6_multicast_link_local_group_id_t
static_always_inline ip_ecn_t ip6_ecn_network_order(const ip6_header_t *ip6)
STATIC_ASSERT_SIZEOF(ip6_address_t, 16)
static uword ip6_is_solicited_node_multicast_address(const ip6_address_t *a)
static void ip6_copy_header(ip6_header_t *dst, const ip6_header_t *src)
static uword ip6_address_is_zero(const ip6_address_t *a)
#define foreach_ip6_multicast_link_local_group_id
static void * ip6_ext_next_header(ip6_ext_header_t *ext_hdr)
static_always_inline void ip6_set_hop_limit_network_order(ip6_header_t *ip6, u8 hop_limit)
vl_api_fib_path_type_t type
VLIB buffer representation.