X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbuffer.h;h=86f75389d70b2e62778758b97c47f90f67d1215e;hb=25b049484fcf9161edb2c19250066b893c38c264;hp=52dada30ba8a9f6897e954c98cc0c3793b27dc81;hpb=213b5aae860c2a9d5de8d4d070d0d2091af699f5;p=vpp.git diff --git a/src/vnet/buffer.h b/src/vnet/buffer.h index 52dada30ba8..86f75389d70 100644 --- a/src/vnet/buffer.h +++ b/src/vnet/buffer.h @@ -42,33 +42,47 @@ #include -#define foreach_vnet_buffer_field \ - _( 1, L4_CHECKSUM_COMPUTED) \ - _( 2, L4_CHECKSUM_CORRECT) \ - _( 3, VLAN_2_DEEP) \ - _( 4, VLAN_1_DEEP) \ - _( 6, HANDOFF_NEXT_VALID) \ - _( 7, LOCALLY_ORIGINATED) \ - _( 8, SPAN_CLONE) +/** + * Flags that are set in the high order bits of ((vlib_buffer*)b)->flags + */ +#define foreach_vnet_buffer_flag \ + _( 1, L4_CHECKSUM_COMPUTED, "l4-cksum-computed") \ + _( 2, L4_CHECKSUM_CORRECT, "l4-cksum-correct") \ + _( 3, VLAN_2_DEEP, "vlan-2-deep") \ + _( 4, VLAN_1_DEEP, "vlan-1-deep") \ + _( 5, SPAN_CLONE, "span-clone") \ + _( 6, HANDOFF_NEXT_VALID, "handoff-next-valid") \ + _( 7, LOCALLY_ORIGINATED, "local") \ + _( 8, IS_IP4, "ip4") \ + _( 9, IS_IP6, "ip6") \ + _(10, OFFLOAD_IP_CKSUM, "offload-ip-cksum") \ + _(11, OFFLOAD_TCP_CKSUM, "offload-tcp-cksum") \ + _(12, OFFLOAD_UDP_CKSUM, "offload-udp-cksum") \ + _(13, IS_NATED, "nated") \ + _(14, L2_HDR_OFFSET_VALID, 0) \ + _(15, L3_HDR_OFFSET_VALID, 0) \ + _(16, L4_HDR_OFFSET_VALID, 0) \ + _(17, FLOW_REPORT, "flow-report") \ + _(18, IS_DVR, "dvr") \ + _(19, QOS_DATA_VALID, 0) #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 +#define _(bit, name, v) VNET_BUFFER_F_##name = (1 << LOG2_VLIB_BUFFER_FLAG_USER(bit)), + foreach_vnet_buffer_flag #undef _ }; enum { -#define _(bit, name) VNET_BUFFER_F_LOG2_##name = LOG2_VLIB_BUFFER_FLAG_USER(bit), - foreach_vnet_buffer_field +#define _(bit, name, v) VNET_BUFFER_F_LOG2_##name = LOG2_VLIB_BUFFER_FLAG_USER(bit), + foreach_vnet_buffer_flag #undef _ }; - #define foreach_buffer_opaque_union_subtype \ _(ip) \ _(swt) \ @@ -82,6 +96,7 @@ _(ipsec) \ _(map) \ _(map_t) \ _(ip_frag) \ +_(mpls) \ _(tcp) /* @@ -101,6 +116,7 @@ typedef struct i16 l2_hdr_offset; i16 l3_hdr_offset; i16 l4_hdr_offset; + u16 dont_waste_me; union { @@ -120,8 +136,14 @@ typedef struct protocol and ports. */ u32 flow_hash; - /* next protocol */ - u32 save_protocol; + union + { + /* next protocol */ + u32 save_protocol; + + /* Hint for transport protocols */ + u32 fib_index; + }; /* Rewrite length */ u32 save_rewrite_length; @@ -137,6 +159,27 @@ typedef struct u8 code; u32 data; } icmp; + + /* reassembly */ + union + { + /* in/out variables */ + struct + { + u32 next_index; /* index of next node - ignored if "feature" node */ + u16 estimated_mtu; /* estimated MTU calculated during reassembly */ + }; + /* internal variables used during reassembly */ + struct + { + u16 fragment_first; + u16 fragment_last; + u16 range_first; + u16 range_last; + u32 next_range_bi; + u16 ip6_frag_hdr_offset; + }; + } reass; }; } ip; @@ -148,9 +191,22 @@ typedef struct */ struct { + /* do not overlay w/ ip.adj_index[0,1] nor flow hash */ + u32 pad[VLIB_N_RX_TX + 1]; u8 ttl; u8 exp; u8 first; + /* Rewrite length */ + u32 save_rewrite_length; + /* + * BIER - the nubmer of bytes in the header. + * the len field inthe header is not authoritative. It's the + * value in the table that counts. + */ + struct + { + u8 n_bytes; + } bier; } mpls; /* ip4-in-ip6 softwire termination, only valid there */ @@ -168,6 +224,7 @@ typedef struct u8 l2_len; /* ethernet header length */ u8 shg; /* split-horizon group */ u16 l2fib_sn; /* l2fib bd/int seq_num */ + u8 bd_age; /* aging enabled */ } l2; /* l2tpv3 softwire encap, only valid there */ @@ -239,6 +296,7 @@ typedef struct /* IP Fragmentation */ struct { + u32 pad[2]; /* do not overlay w/ ip.adj_index[0,1] */ u16 header_offset; u16 mtu; u8 next_index; @@ -279,6 +337,26 @@ typedef struct u8 flags; } tcp; + /* SCTP */ + struct + { + u32 connection_index; + u16 sid; /**< Stream ID */ + u16 ssn; /**< Stream Sequence Number */ + u32 tsn; /**< Transmission Sequence Number */ + u16 hdr_offset; /**< offset relative to ip hdr */ + u16 data_offset; /**< offset relative to ip hdr */ + u16 data_len; /**< data len */ + u8 subconn_idx; /**< index of the sub_connection being used */ + u8 flags; + } sctp; + + /* SNAT */ + struct + { + u32 flags; + } snat; + u32 unused[6]; }; } vnet_buffer_opaque_t; @@ -296,12 +374,49 @@ STATIC_ASSERT (sizeof (vnet_buffer_opaque_t) <= /* Full cache line (64 bytes) of additional space */ typedef struct { + /** + * QoS marking data that needs to persist from the recording nodes + * (nominally in the ingress path) to the marking node (in the + * egress path) + */ + struct + { + u8 bits; + u8 source; + } qos; + + u8 __unused[2]; + + /* Group Based Policy */ + struct + { + u32 src_epg; + } gbp; + union { + struct + { +#if VLIB_BUFFER_TRACE_TRAJECTORY > 0 + /* buffer trajectory tracing */ + u16 *trajectory_trace; +#endif + }; + u32 unused[10]; }; } vnet_buffer_opaque2_t; +#define vnet_buffer2(b) ((vnet_buffer_opaque2_t *) (b)->opaque2) + +/* + * The opaque2 field of the vlib_buffer_t is intepreted as a + * vnet_buffer_opaque2_t. Hence it should be big enough to accommodate one. + */ +STATIC_ASSERT (sizeof (vnet_buffer_opaque2_t) <= + STRUCT_SIZE_OF (vlib_buffer_t, opaque2), + "VNET buffer opaque2 meta-data too large for vlib_buffer"); +format_function_t format_vnet_buffer; #endif /* included_vnet_buffer_h */