};
/* Rewrite length */
- u32 save_rewrite_length;
+ u8 save_rewrite_length;
/* MFIB RPF ID */
u32 rpf_id;
/* reassembly */
union
{
- /* in/out variables */
+ /* group input/output to simplify the code, this way
+ * we can handoff while keeping input variables intact */
struct
{
- u32 next_index; /* index of next node - ignored if "feature" node */
- u16 estimated_mtu; /* estimated MTU calculated during reassembly */
- u16 owner_thread_index;
+ /* input variables */
+ struct
+ {
+ u32 next_index; /* index of next node - used by custom apps */
+ u32 error_next_index; /* index of next node if error - used by custom apps */
+ };
+ /* handoff variables */
+ struct
+ {
+ u16 owner_thread_index;
+ };
+ };
+ /* output variables */
+ struct
+ {
+ union
+ {
+ /* shallow virtual reassembly output variables */
+ struct
+ {
+ u16 l4_src_port; /* tcp/udp/icmp src port */
+ u16 l4_dst_port; /* tcp/udp/icmp dst port */
+ u32 tcp_ack_number;
+ u8 save_rewrite_length;
+ u8 ip_proto; /* protocol in ip header */
+ u8 icmp_type_or_tcp_flags;
+ u8 is_non_first_fragment;
+ u32 tcp_seq_number;
+ };
+ /* full reassembly output variables */
+ struct
+ {
+ u16 estimated_mtu; /* estimated MTU calculated during reassembly */
+ };
+ };
};
/* internal variables used during reassembly */
struct
u16 range_last;
u32 next_range_bi;
u16 ip6_frag_hdr_offset;
- u16 owner_feature_thread_index;
};
} reass;
};
-
} ip;
/*
u8 ttl;
u8 exp;
u8 first;
+ u8 pyld_proto:3; /* dpo_proto_t */
+ u8 rsvd:5;
/* Rewrite length */
- u32 save_rewrite_length;
+ u8 save_rewrite_length;
+ /* Save the mpls header length including all label stack */
+ u8 mpls_hdr_length;
/*
* BIER - the number of bytes in the header.
* the len field in the header is not authoritative. It's the
{
u32 feature_bitmap;
u16 bd_index; /* bridge-domain index */
+ u16 l2fib_sn; /* l2fib bd/int seq_num */
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;
/* interface output features */
struct
{
- u32 flags;
u32 sad_index;
+ u32 protect_index;
} ipsec;
/* MAP */
struct
{
u32 connection_index;
- u32 seq_number;
+ union
+ {
+ u32 seq_number;
+ u32 next_node_opaque;
+ };
u32 seq_end;
u32 ack_number;
u16 hdr_offset; /**< offset relative to ip hdr */
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
{
};
} vnet_buffer_opaque_t;
+#define VNET_REWRITE_TOTAL_BYTES (VLIB_BUFFER_PRE_DATA_SIZE)
+
+STATIC_ASSERT (STRUCT_SIZE_OF (vnet_buffer_opaque_t, ip.save_rewrite_length)
+ == STRUCT_SIZE_OF (vnet_buffer_opaque_t,
+ ip.reass.save_rewrite_length)
+ && STRUCT_SIZE_OF (vnet_buffer_opaque_t,
+ ip.reass.save_rewrite_length) ==
+ STRUCT_SIZE_OF (vnet_buffer_opaque_t, mpls.save_rewrite_length)
+ && STRUCT_SIZE_OF (vnet_buffer_opaque_t,
+ mpls.save_rewrite_length) == 1
+ && VNET_REWRITE_TOTAL_BYTES < UINT8_MAX,
+ "save_rewrite_length member must be able to hold the max value of rewrite length");
+
+STATIC_ASSERT (STRUCT_OFFSET_OF (vnet_buffer_opaque_t, ip.save_rewrite_length)
+ == STRUCT_OFFSET_OF (vnet_buffer_opaque_t,
+ ip.reass.save_rewrite_length)
+ && STRUCT_OFFSET_OF (vnet_buffer_opaque_t,
+ mpls.save_rewrite_length) ==
+ STRUCT_OFFSET_OF (vnet_buffer_opaque_t,
+ ip.reass.save_rewrite_length),
+ "save_rewrite_length must be aligned so that reass doesn't overwrite it");
+
/*
* The opaque field of the vlib_buffer_t is interpreted as a
* vnet_buffer_opaque_t. Hence it should be big enough to accommodate one.
/* size of L4 prototol header */
u16 gso_l4_hdr_sz;
- /* The union below has a u64 alignment, so this space is unused */
- u32 __unused2[1];
+ struct
+ {
+ u16 unused;
+ u16 thread_next;
+ u32 arc_next;
+ u32 ed_out2in_nat_session_index;
+ } nat;
union
{
STRUCT_SIZE_OF (vlib_buffer_t, opaque2),
"VNET buffer opaque2 meta-data too large for vlib_buffer");
-#define gso_mtu_sz(b) (vnet_buffer2(b)->gso_size + vnet_buffer2(b)->gso_l4_hdr_sz + vnet_buffer(b)->l4_hdr_offset)
+#define gso_mtu_sz(b) (vnet_buffer2(b)->gso_size + \
+ vnet_buffer2(b)->gso_l4_hdr_sz + \
+ vnet_buffer(b)->l4_hdr_offset - \
+ vnet_buffer (b)->l3_hdr_offset)
format_function_t format_vnet_buffer;