#define VNET_BUFFER_SPAN_CLONE (1 << LOG2_VNET_BUFFER_SPAN_CLONE)
#define foreach_buffer_opaque_union_subtype \
-_(ethernet) \
_(ip) \
_(swt) \
_(l2) \
_(ipsec) \
_(map) \
_(map_t) \
-_(ip_frag)
+_(ip_frag) \
+_(tcp)
/*
* vnet stack buffer opaque array overlay structure.
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
{
/* Rewrite length */
u32 save_rewrite_length;
+
+ /* MFIB RPF ID */
+ u32 rpf_id;
};
/* ICMP */
u8 code;
u32 data;
} icmp;
-
- /* IP header offset from vlib_buffer.data - saved by ip*_local nodes */
- i32 start_of_ip_header;
};
} ip;
} swt;
/* l2 bridging path, only valid there */
- struct
+ struct opaque_l2
{
u32 feature_bitmap;
- u16 bd_index; // bridge-domain index
- u8 l2_len; // ethernet header length
- u8 shg; // split-horizon group
+ u16 bd_index; /* bridge-domain index */
+ u8 l2_len; /* ethernet header length */
+ u8 shg; /* split-horizon group */
+ u16 l2fib_sn; /* l2fib bd/int seq_num */
} l2;
/* l2tpv3 softwire encap, only valid there */
/* L2 classify */
struct
{
- u64 pad;
- u32 table_index;
- u32 opaque_index;
+ struct opaque_l2 pad;
+ union
+ {
+ u32 table_index;
+ u32 opaque_index;
+ };
u64 hash;
} l2_classify;
u32 seq_number;
u32 seq_end;
u32 ack_number;
+ u16 hdr_offset; /**< offset relative to ip hdr */
+ u16 data_offset; /**< offset relative to ip hdr */
+ u16 data_len; /**< data len */
u8 flags;
} tcp;
* 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");
#define vnet_buffer(b) ((vnet_buffer_opaque_t *) (b)->opaque)