40 #ifndef included_ip_packet_h 41 #define included_ip_packet_h 48 #define ip_protocol(n,s) IP_PROTOCOL_##s = n, 56 #define ip_port(s,n) IP_PORT_##s = n, 69 #define foreach_ip_builtin_multicast_group \ 70 _ (1, all_hosts_on_subnet) \ 71 _ (2, all_routers_on_subnet) \ 73 _ (5, ospf_all_routers) \ 74 _ (6, ospf_designated_routers) \ 82 #define _(n,f) IP_MULTICAST_GROUP_##f = n, 91 #define foreach_ip_dscp \ 116 #define _(n,f) IP_DSCP_##f = n, 131 #ifdef CLIB_HAVE_VEC256 139 sum = (n_left & 1) ? ((
u8 *)
data)[n_left - 1] << 8 : 0;
144 #ifdef CLIB_HAVE_VEC256 147 v1 = u16x16_load_unaligned (data);
148 v2 = u16x16_load_unaligned (data + 32);
150 #ifdef CLIB_ARCH_IS_LITTLE_ENDIAN 154 sum8 += u16x8_extend_to_u32x8 (u16x16_extract_lo (v1));
155 sum8 += u16x8_extend_to_u32x8 (u16x16_extract_hi (v1));
156 sum8 += u16x8_extend_to_u32x8 (u16x16_extract_lo (v2));
157 sum8 += u16x8_extend_to_u32x8 (u16x16_extract_hi (v2));
164 v1 = u16x16_load_unaligned (data);
165 #ifdef CLIB_ARCH_IS_LITTLE_ENDIAN 169 sum8 += u16x8_extend_to_u32x8 (u16x16_extract_lo (v1));
170 sum8 += u16x8_extend_to_u32x8 (u16x16_extract_hi (v1));
177 v1 = u16x16_load_unaligned (data);
178 #ifdef CLIB_ARCH_IS_LITTLE_ENDIAN 182 sum8 += u16x8_extend_to_u32x8 (u16x16_extract_lo (v1));
183 sum8 += u16x8_extend_to_u32x8 (u16x16_extract_hi (v1));
187 sum4 = u32x8_extract_lo (sum8) + u32x8_extract_hi (sum8);
188 sum = sum4[0] + sum4[1];
194 sum += clib_net_to_host_u16 (*((
u16 *) data + 0));
195 sum += clib_net_to_host_u16 (*((
u16 *) data + 1));
196 sum += clib_net_to_host_u16 (*((
u16 *) data + 2));
197 sum += clib_net_to_host_u16 (*((
u16 *) data + 3));
198 sum += clib_net_to_host_u16 (*((
u16 *) data + 4));
199 sum += clib_net_to_host_u16 (*((
u16 *) data + 5));
200 sum += clib_net_to_host_u16 (*((
u16 *) data + 6));
201 sum += clib_net_to_host_u16 (*((
u16 *) data + 7));
207 sum += clib_net_to_host_u16 (*(
u16 *) data);
213 sum = (sum & 0xffff) + (sum >> 16);
214 sum = (sum & 0xffff) + (sum >> 16);
240 ASSERT ((t - c == 0) || (t - c == ~0));
254 u32 field_byte_offset,
u32 field_n_bytes)
258 if ((field_n_bytes % 2)
269 #define ip_csum_update(sum,old,new,type,field) \ 270 ip_csum_update_inline ((sum), (old), (new), \ 271 STRUCT_OFFSET_OF (type, field), \ 272 STRUCT_SIZE_OF (type, field)) 280 c = (c & 0xffff) + (c >> 16);
283 c = (c & 0xffff) + (c >> 16);
284 c = (c & 0xffff) + (c >> 16);
#define CLIB_ARCH_IS_LITTLE_ENDIAN
u8 * format_ip_dscp(u8 *s, va_list *va)
static ip_csum_t ip_csum_with_carry(ip_csum_t sum, ip_csum_t x)
static_always_inline u16x16 u16x16_mask_last(u16x16 v, u8 n_last)
static u16 ip_csum_and_memcpy_fold(ip_csum_t sum, void *dst)
#define static_always_inline
static ip_csum_t ip_csum_update_inline(ip_csum_t sum, ip_csum_t old, ip_csum_t new, u32 field_byte_offset, u32 field_n_bytes)
static const __m128i zero
enum ip_protocol ip_protocol_t
static_always_inline u16x16 u16x16_byte_swap(u16x16 v)
static_always_inline u16 ip_csum(void *data, u16 n_left)
static_always_inline u32x8 u32x8_hadd(u32x8 v1, u32x8 v2)
enum ip_dscp_t_ ip_dscp_t
static ip_csum_t ip_csum_sub_even(ip_csum_t c, ip_csum_t x)
STATIC_ASSERT_SIZEOF(ip_dscp_t, 1)
ip_csum_t(* vnet_incremental_checksum_fp)(ip_csum_t, void *, uword)
#define foreach_ip_builtin_multicast_group
#define foreach_ip_dscp
The set of RFC defined DSCP values.
static ip_csum_t ip_incremental_checksum(ip_csum_t sum, void *_data, uword n_bytes)
static u16 ip_csum_fold(ip_csum_t c)
static ip_csum_t ip_csum_add_even(ip_csum_t c, ip_csum_t x)