X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbuffer.h;h=7dfc6b99baf1aedf0829217f146b75448449e14e;hb=a07bd708002a9c3d3c584f0d692deed1a758b517;hp=795bbd9610bc798f556112384873a38358c77a45;hpb=0f360dc3aa40d0654198bd3f3850bd31a0d78f7e;p=vpp.git diff --git a/src/vnet/buffer.h b/src/vnet/buffer.h index 795bbd9610b..7dfc6b99baf 100644 --- a/src/vnet/buffer.h +++ b/src/vnet/buffer.h @@ -42,36 +42,39 @@ #include -/* VLIB buffer flags for ip4/ip6 packets. Set by input interfaces for ip4/ip6 - tcp/udp packets with hardware computed checksums. */ -#define LOG2_IP_BUFFER_L4_CHECKSUM_COMPUTED LOG2_VLIB_BUFFER_FLAG_USER(1) -#define LOG2_IP_BUFFER_L4_CHECKSUM_CORRECT LOG2_VLIB_BUFFER_FLAG_USER(2) -#define IP_BUFFER_L4_CHECKSUM_COMPUTED (1 << LOG2_IP_BUFFER_L4_CHECKSUM_COMPUTED) -#define IP_BUFFER_L4_CHECKSUM_CORRECT (1 << LOG2_IP_BUFFER_L4_CHECKSUM_CORRECT) - -/* VLAN header flags. - * These bits are zeroed in vlib_buffer_init_for_free_list() - * meaning wherever the buffer comes from they have a reasonable - * value (eg, if ip4/ip6 generates the packet.) - */ -#define LOG2_ETH_BUFFER_VLAN_2_DEEP LOG2_VLIB_BUFFER_FLAG_USER(3) -#define LOG2_ETH_BUFFER_VLAN_1_DEEP LOG2_VLIB_BUFFER_FLAG_USER(4) -#define ETH_BUFFER_VLAN_2_DEEP (1 << LOG2_ETH_BUFFER_VLAN_2_DEEP) -#define ETH_BUFFER_VLAN_1_DEEP (1 << LOG2_ETH_BUFFER_VLAN_1_DEEP) -#define ETH_BUFFER_VLAN_BITS (ETH_BUFFER_VLAN_1_DEEP | \ - ETH_BUFFER_VLAN_2_DEEP) - -#define LOG2_BUFFER_HANDOFF_NEXT_VALID LOG2_VLIB_BUFFER_FLAG_USER(6) -#define BUFFER_HANDOFF_NEXT_VALID (1 << LOG2_BUFFER_HANDOFF_NEXT_VALID) +#define foreach_vnet_buffer_field \ + _( 1, L4_CHECKSUM_COMPUTED) \ + _( 2, L4_CHECKSUM_CORRECT) \ + _( 3, VLAN_2_DEEP) \ + _( 4, VLAN_1_DEEP) \ + _( 8, SPAN_CLONE) \ + _( 6, HANDOFF_NEXT_VALID) \ + _( 7, LOCALLY_ORIGINATED) \ + _( 8, IS_IP4) \ + _( 9, IS_IP6) \ + _(10, OFFLOAD_IP_CKSUM) \ + _(11, OFFLOAD_TCP_CKSUM) \ + _(12, OFFLOAD_UDP_CKSUM) + +#define VNET_BUFFER_FLAGS_VLAN_BITS \ + (VNET_BUFFER_F_VLAN_1_DEEP | VNET_BUFFER_F_VLAN_2_DEEP) + +enum +{ +#define _(bit, name) VNET_BUFFER_F_##name = (1 << LOG2_VLIB_BUFFER_FLAG_USER(bit)), + foreach_vnet_buffer_field +#undef _ +}; -#define LOG2_VNET_BUFFER_LOCALLY_ORIGINATED LOG2_VLIB_BUFFER_FLAG_USER(7) -#define VNET_BUFFER_LOCALLY_ORIGINATED (1 << LOG2_VNET_BUFFER_LOCALLY_ORIGINATED) +enum +{ +#define _(bit, name) VNET_BUFFER_F_LOG2_##name = LOG2_VLIB_BUFFER_FLAG_USER(bit), + foreach_vnet_buffer_field +#undef _ +}; -#define LOG2_VNET_BUFFER_SPAN_CLONE LOG2_VLIB_BUFFER_FLAG_USER(8) -#define VNET_BUFFER_SPAN_CLONE (1 << LOG2_VNET_BUFFER_SPAN_CLONE) #define foreach_buffer_opaque_union_subtype \ -_(ethernet) \ _(ip) \ _(swt) \ _(l2) \ @@ -100,16 +103,12 @@ _(tcp) typedef struct { u32 sw_if_index[VLIB_N_RX_TX]; + i16 l2_hdr_offset; + i16 l3_hdr_offset; + i16 l4_hdr_offset; union { - /* Ethernet. */ - struct - { - /* Saved value of current header by ethernet-input. */ - i32 start_of_ethernet_header; - } ethernet; - /* IP4/6 buffer opaque. */ struct { @@ -143,9 +142,6 @@ typedef struct u8 code; u32 data; } icmp; - - /* IP header offset from vlib_buffer.data - saved by ip*_local nodes */ - i32 start_of_ip_header; }; } ip; @@ -170,7 +166,7 @@ typedef struct } swt; /* l2 bridging path, only valid there */ - struct + struct opaque_l2 { u32 feature_bitmap; u16 bd_index; /* bridge-domain index */ @@ -195,8 +191,7 @@ typedef struct /* L2 classify */ struct { - u64 pad; /* paddind for l2 */ - u16 pad1; + struct opaque_l2 pad; union { u32 table_index; @@ -289,6 +284,12 @@ typedef struct u8 flags; } tcp; + /* SNAT */ + struct + { + u32 flags; + } snat; + u32 unused[6]; }; } vnet_buffer_opaque_t; @@ -297,14 +298,9 @@ typedef struct * The opaque field of the vlib_buffer_t is intepreted as a * vnet_buffer_opaque_t. Hence it should be big enough to accommodate one. */ -STATIC_ASSERT (sizeof (vnet_buffer_opaque_t) <= STRUCT_SIZE_OF (vlib_buffer_t, - opaque), +STATIC_ASSERT (sizeof (vnet_buffer_opaque_t) <= + STRUCT_SIZE_OF (vlib_buffer_t, opaque), "VNET buffer meta-data too large for vlib_buffer"); -STATIC_ASSERT (STRUCT_OFFSET_OF - (vnet_buffer_opaque_t, - l2_classify.table_index) >= - STRUCT_SIZE_OF (vnet_buffer_opaque_t, l2), - "l2_classify padding smaller than l2"); #define vnet_buffer(b) ((vnet_buffer_opaque_t *) (b)->opaque)