X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Fbuffer.h;h=898c94ee7b9ba2b05242089ea0cd3b786b12c035;hb=3a2a1c47bc1f319d1f46abd2a364b3cf82404405;hp=f6c0023222e7f5bacd39c66c19382b7d0fc04ea5;hpb=cda948225887b2f53032ffb321f2d922b9836bd2;p=vpp.git diff --git a/vnet/vnet/buffer.h b/vnet/vnet/buffer.h index f6c0023222e..898c94ee7b9 100644 --- a/vnet/vnet/buffer.h +++ b/vnet/vnet/buffer.h @@ -49,29 +49,47 @@ #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) -#define LOG2_HGSHM_BUFFER_USER_INDEX_VALID LOG2_VLIB_BUFFER_FLAG_USER(3) -#define VNET_HGSHM_BUFFER_USER_INDEX_VALID (1 << LOG2_HGSHM_BUFFER_USER_INDEX_VALID) +/* 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_VNET_BUFFER_RTE_MBUF_VALID LOG2_VLIB_BUFFER_FLAG_USER(5) +#define VNET_BUFFER_RTE_MBUF_VALID (1 << LOG2_VNET_BUFFER_RTE_MBUF_VALID) + +#define LOG2_BUFFER_HANDOFF_NEXT_VALID LOG2_VLIB_BUFFER_FLAG_USER(6) +#define BUFFER_HANDOFF_NEXT_VALID (1 << LOG2_BUFFER_HANDOFF_NEXT_VALID) + +#define LOG2_VNET_BUFFER_LOCALLY_ORIGINATED LOG2_VLIB_BUFFER_FLAG_USER(7) +#define VNET_BUFFER_LOCALLY_ORIGINATED (1 << LOG2_VNET_BUFFER_LOCALLY_ORIGINATED) + +#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) \ _(mcast) \ -_(lb) \ -_(dlb) \ _(swt) \ _(l2) \ _(l2t) \ -_(hgshm) \ _(gre) \ _(l2_classify) \ -_(io_handoff) \ +_(handoff) \ _(policer) \ -_(output_features) \ +_(ipsec) \ _(map) \ _(map_t) \ _(ip_frag) -/* +/* * vnet stack buffer opaque array overlay structure. * The vnet_buffer_opaque_t *must* be the same size as the * vlib_buffer_t "opaque" structure member, 32 bytes. @@ -82,47 +100,45 @@ _(ip_frag) * of the union, and will announce any deviations in an * impossible-to-miss manner. */ -typedef struct { +typedef struct +{ u32 sw_if_index[VLIB_N_RX_TX]; - union { + union + { /* Ethernet. */ - struct { + struct + { /* Saved value of current header by ethernet-input. */ i32 start_of_ethernet_header; } ethernet; /* IP4/6 buffer opaque. */ - struct { + struct + { /* Adjacency from destination IP address lookup [VLIB_TX]. - Adjacency from source IP address lookup [VLIB_RX]. - This gets set to ~0 until source lookup is performed. */ + Adjacency from source IP address lookup [VLIB_RX]. + This gets set to ~0 until source lookup is performed. */ u32 adj_index[VLIB_N_RX_TX]; - union { - struct { - /* Current configuration index. */ - u32 current_config_index; - + union + { + struct + { /* Flow hash value for this packet computed from IP src/dst address protocol and ports. */ u32 flow_hash; - /* next protocol */ - u32 save_protocol; - }; - - /* Alternate used for local TCP packets. */ - struct { - u32 listener_index; - - u32 established_connection_index; + /* next protocol */ + u32 save_protocol; - u32 mini_connection_index; - } tcp; + /* Rewrite length */ + u32 save_rewrite_length; + }; /* ICMP */ - struct { + struct + { u8 type; u8 code; u32 data; @@ -130,184 +146,232 @@ typedef struct { }; } ip; + /* + * MPLS: + * data copied from the MPLS header that was popped from the packet + * during the look-up. + */ + struct + { + u8 ttl; + u8 exp; + u8 first; + } mpls; + /* Multicast replication */ - struct { - u32 pad[3]; + struct + { + u32 pad[3]; u32 mcast_group_index; u32 mcast_current_index; u32 original_free_list_index; } mcast; - /* ipv6 shallow-pkt-inspection load-balancer, only valid there */ - struct { - u8 lb_disable; - u8 user_to_network; - u8 was_injected; - u32 bucket_id; - } lb; - /* ipv4 DPI load-balancer, only valid there */ - struct { - u8 lb_disable; - u8 user_to_network; - u32 session_index; - } dlb; - /* ip4-in-ip6 softwire termination, only valid there */ - struct { + struct + { u8 swt_disable; u32 mapping_index; } swt; /* l2 bridging path, only valid there */ - struct { + struct + { 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 } l2; /* l2tpv3 softwire encap, only valid there */ - struct { - u32 pad[4]; /* do not overlay w/ ip.adj_index[0,1] */ + struct + { + u32 pad[4]; /* do not overlay w/ ip.adj_index[0,1] */ u8 next_index; u32 session_index; } l2t; - /* hgshm, valid if packet sent through iface */ - struct { - u32 pad[8 -VLIB_N_RX_TX -1]; /* to end of opaque */ - u32 user_index; /* client id borrowing buffer */ - } hgshm; - - struct { + struct + { u32 src, dst; } gre; /* L2 classify */ - struct { + struct + { u64 pad; - u32 opaque_index; u32 table_index; + u32 opaque_index; u64 hash; } l2_classify; /* IO - worker thread handoff */ - struct { + struct + { u32 next_index; - } io_handoff; + } handoff; /* vnet policer */ - struct { - u32 pad[8 -VLIB_N_RX_TX -1]; /* to end of opaque */ + struct + { + u32 pad[8 - VLIB_N_RX_TX - 1]; /* to end of opaque */ u32 index; } policer; /* interface output features */ - struct { - u32 ipsec_spd_index; - u32 ipsec_sad_index; - u32 unused[3]; - u32 bitmap; - } output_features; + struct + { + u32 flags; + u32 sad_index; + } ipsec; /* vcgn udp inside input, only valid there */ - struct { + struct + { /* This part forms context of the packet. The structure should be - * exactly same as spp_ctx_t. Also this should be the first + * exactly same as spp_ctx_t. Also this should be the first * element of this vcgn_uii structure. */ /****** BEGIN spp_ctx_t section ***********************/ - union { /* Roddick specific */ - u32 roddick_info; - struct _tx_pkt_info { /* Used by PI to PI communication for TX */ - u32 uidb_index:16; /* uidb_index to transmit */ - u32 packet_type:2; /* 1-IPv4, 2-Ipv6, - 0,3 - Unused */ - u32 ipv4_defrag:1; /* 0 - Normal, 1 - update first - * segment size - * (set by 6rd defrag node) - */ - - u32 dst_ip_port_idx:4;/* Index to dst_ip_port_table */ - u32 from_node:4; - u32 calc_chksum:1; - u32 reserved:4; - } tx; - struct _rx_pkt_info { /* Used by PD / PI communication */ - u32 uidb_index:16; /* uidb_index received in packet */ - u32 packet_type:2; /* 1-IPv4, 2-Ipv6, - 0,3 - Unused */ - u32 icmp_type:1; /* 0-ICMP query type, 1-ICMP error type */ - u32 protocol_type:2; /* 1-TCP, 2-UDP, 3-ICMP, 0 - Unused */ - u32 ipv4_defrag:1; /* 0 - Normal, 1 - update first - * segment size - * (set by 6rd defrag node) - */ - - u32 direction:1; /* 0-Outside, 1-Inside */ - u32 frag:1; /*IP fragment-1, Otherwise-0*/ - u32 option:1; /* 0-No IP option (v4) present, non-fragHdr - * option hdr present (v6) - */ - u32 df_bit:1; /* IPv4 DF bit copied here */ - u32 reserved1:6; - } rx; + union + { /* Roddick specific */ + u32 roddick_info; + struct _tx_pkt_info + { /* Used by PI to PI communication for TX */ + u32 uidb_index:16; /* uidb_index to transmit */ + u32 packet_type:2; /* 1-IPv4, 2-Ipv6, - 0,3 - Unused */ + u32 ipv4_defrag:1; /* 0 - Normal, 1 - update first + * segment size + * (set by 6rd defrag node) + */ + + u32 dst_ip_port_idx:4; /* Index to dst_ip_port_table */ + u32 from_node:4; + u32 calc_chksum:1; + u32 reserved:4; + } tx; + struct _rx_pkt_info + { /* Used by PD / PI communication */ + u32 uidb_index:16; /* uidb_index received in packet */ + u32 packet_type:2; /* 1-IPv4, 2-Ipv6, - 0,3 - Unused */ + u32 icmp_type:1; /* 0-ICMP query type, 1-ICMP error type */ + u32 protocol_type:2; /* 1-TCP, 2-UDP, 3-ICMP, 0 - Unused */ + u32 ipv4_defrag:1; /* 0 - Normal, 1 - update first + * segment size + * (set by 6rd defrag node) + */ + + u32 direction:1; /* 0-Outside, 1-Inside */ + u32 frag:1; /*IP fragment-1, Otherwise-0 */ + u32 option:1; /* 0-No IP option (v4) present, non-fragHdr + * option hdr present (v6) + */ + u32 df_bit:1; /* IPv4 DF bit copied here */ + u32 reserved1:6; + } rx; } ru; /****** END spp_ctx_t section ***********************/ - union { - struct { - u32 ipv4; - u16 port; - u16 vrf; //bit0-13:i/f, bit14-15:protocol - } k; + union + { + struct + { + u32 ipv4; + u16 port; + u16 vrf; //bit0-13:i/f, bit14-15:protocol + } k; - u64 key64; + u64 key64; } key; u32 bucket; - u16 ovrf; /* Exit interface */ + u16 ovrf; /* Exit interface */ u8 frag_pkt; u8 vcgn_unused1; } vcgn_uii; /* MAP */ - struct { + struct + { u16 mtu; } map; /* MAP-T */ - struct { + struct + { u32 map_domain_index; - struct { - u32 saddr, daddr; - u16 frag_offset; //Fragmentation header offset - u16 l4_offset; //L4 header overall offset - u8 l4_protocol; //The final protocol number - } v6; //Used by ip6_map_t only - u16 checksum_offset; //L4 checksum overall offset - u16 mtu; //Exit MTU + struct + { + u32 saddr, daddr; + u16 frag_offset; //Fragmentation header offset + u16 l4_offset; //L4 header overall offset + u8 l4_protocol; //The final protocol number + } v6; //Used by ip6_map_t only + u16 checksum_offset; //L4 checksum overall offset + u16 mtu; //Exit MTU } map_t; /* IP Fragmentation */ - struct { + struct + { u16 header_offset; u16 mtu; u8 next_index; - u8 flags; //See ip_frag.h + u8 flags; //See ip_frag.h } ip_frag; + /* COP - configurable junk filter(s) */ + struct + { + /* Current configuration index. */ + u32 current_config_index; + } cop; + + /* LISP */ + struct + { + /* overlay address family */ + u16 overlay_afi; + } lisp; + + /* Driver rx feature */ + struct + { + u32 saved_next_index; /**< saved by drivers for short-cut */ + u16 buffer_advance; + } device_input_feat; + u32 unused[6]; }; } vnet_buffer_opaque_t; +/* + * 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), + "VNET buffer meta-data too large for vlib_buffer"); + #define vnet_buffer(b) ((vnet_buffer_opaque_t *) (b)->opaque) /* Full cache line (64 bytes) of additional space */ -typedef struct { - union { +typedef struct +{ + union + { }; } vnet_buffer_opaque2_t; #endif /* included_vnet_buffer_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */