X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip_packet.h;h=b0b5f41260cf6012e354e08335e09b6f2568cc93;hb=06111a837d77323d253ecfd26557775fa0b03ca8;hp=63a59f87668beff01850b6bdc195143fa08fe6c5;hpb=5b1379be3e25df096d97dcd217965169fc6bb1b2;p=vpp.git diff --git a/src/vnet/ip/ip_packet.h b/src/vnet/ip/ip_packet.h index 63a59f87668..b0b5f41260c 100644 --- a/src/vnet/ip/ip_packet.h +++ b/src/vnet/ip/ip_packet.h @@ -42,13 +42,14 @@ #include #include +#include typedef enum ip_protocol { #define ip_protocol(n,s) IP_PROTOCOL_##s = n, #include "protocols.def" #undef ip_protocol -} ip_protocol_t; +} __clib_packed ip_protocol_t; /* TCP/UDP ports. */ typedef enum @@ -118,9 +119,35 @@ typedef enum ip_dscp_t_ #undef _ } __clib_packed ip_dscp_t; -STATIC_ASSERT_SIZEOF (ip_dscp_t, 1); - extern u8 *format_ip_dscp (u8 * s, va_list * va); +unformat_function_t unformat_ip_dscp; + +/** + * IP DSCP bit shift + * The ECN occupies the 2 least significant bits of the TC field + */ +#define IP_PACKET_TC_FIELD_DSCP_BIT_SHIFT 2 +#define IP_PACKET_TC_FIELD_ECN_MASK 0x03 + +/** + * The set of RFC defined DSCP values. + */ +#define foreach_ip_ecn \ + _(0, NON_ECN) \ + _(1, ECT_0) \ + _(2, ECT_1) \ + _(3, CE) + +typedef enum ip_ecn_t_ +{ +#define _(n,f) IP_ECN_##f = n, + foreach_ip_ecn +#undef _ +} __clib_packed ip_ecn_t; + +STATIC_ASSERT_SIZEOF (ip_ecn_t, 1); + +extern u8 *format_ip_ecn (u8 * s, va_list * va); /* IP checksum support. */ @@ -151,10 +178,10 @@ ip_csum (void *data, u16 n_left) v1 = u16x16_byte_swap (v1); v2 = u16x16_byte_swap (v2); #endif - sum8 += u16x8_extend_to_u32x8 (u16x16_extract_lo (v1)); - sum8 += u16x8_extend_to_u32x8 (u16x16_extract_hi (v1)); - sum8 += u16x8_extend_to_u32x8 (u16x16_extract_lo (v2)); - sum8 += u16x8_extend_to_u32x8 (u16x16_extract_hi (v2)); + sum8 += u32x8_from_u16x8 (u16x16_extract_lo (v1)); + sum8 += u32x8_from_u16x8 (u16x16_extract_hi (v1)); + sum8 += u32x8_from_u16x8 (u16x16_extract_lo (v2)); + sum8 += u32x8_from_u16x8 (u16x16_extract_hi (v2)); n_left -= 32; data += 64; } @@ -165,9 +192,8 @@ ip_csum (void *data, u16 n_left) #ifdef CLIB_ARCH_IS_LITTLE_ENDIAN v1 = u16x16_byte_swap (v1); #endif - v1 = u16x16_byte_swap (u16x16_load_unaligned (data)); - sum8 += u16x8_extend_to_u32x8 (u16x16_extract_lo (v1)); - sum8 += u16x8_extend_to_u32x8 (u16x16_extract_hi (v1)); + sum8 += u32x8_from_u16x8 (u16x16_extract_lo (v1)); + sum8 += u32x8_from_u16x8 (u16x16_extract_hi (v1)); n_left -= 16; data += 32; } @@ -179,13 +205,13 @@ ip_csum (void *data, u16 n_left) v1 = u16x16_byte_swap (v1); #endif v1 = u16x16_mask_last (v1, 16 - n_left); - sum8 += u16x8_extend_to_u32x8 (u16x16_extract_lo (v1)); - sum8 += u16x8_extend_to_u32x8 (u16x16_extract_hi (v1)); + sum8 += u32x8_from_u16x8 (u16x16_extract_lo (v1)); + sum8 += u32x8_from_u16x8 (u16x16_extract_hi (v1)); } sum8 = u32x8_hadd (sum8, zero); sum4 = u32x8_extract_lo (sum8) + u32x8_extract_hi (sum8); - sum = sum4[0] + sum4[1]; + sum += sum4[0] + sum4[1]; #else /* scalar version */