/* automatically generated by rust-bindgen */


#![allow(non_snake_case)]


#[repr(C)]
pub struct __BindgenUnionField<T>(::std::marker::PhantomData<T>);
impl <T> __BindgenUnionField<T> {
    #[inline]
    pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) }
    #[inline]
    pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) }
    #[inline]
    pub unsafe fn as_mut(&mut self) -> &mut T { ::std::mem::transmute(self) }
}
impl <T> ::std::default::Default for __BindgenUnionField<T> {
    #[inline]
    fn default() -> Self { Self::new() }
}
impl <T> ::std::clone::Clone for __BindgenUnionField<T> {
    #[inline]
    fn clone(&self) -> Self { Self::new() }
}
impl <T> ::std::marker::Copy for __BindgenUnionField<T> { }
impl <T> ::std::fmt::Debug for __BindgenUnionField<T> {
    fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
        fmt.write_str("__BindgenUnionField")
    }
}
pub const ETH_MQ_RX_RSS_FLAG: ::std::os::raw::c_uint = 1;
pub const ETH_MQ_RX_DCB_FLAG: ::std::os::raw::c_uint = 2;
pub const ETH_MQ_RX_VMDQ_FLAG: ::std::os::raw::c_uint = 4;
pub const ETH_VMDQ_MAX_VLAN_FILTERS: ::std::os::raw::c_uint = 64;
pub const ETH_DCB_NUM_USER_PRIORITIES: ::std::os::raw::c_uint = 8;
pub const ETH_VMDQ_DCB_NUM_QUEUES: ::std::os::raw::c_uint = 128;
pub const ETH_DCB_NUM_QUEUES: ::std::os::raw::c_uint = 128;
pub const RTE_ETH_FDIR_MAX_FLEXLEN: ::std::os::raw::c_uint = 16;
pub const RTE_ETH_INSET_SIZE_MAX: ::std::os::raw::c_uint = 128;
pub const RTE_ETH_FLOW_UNKNOWN: ::std::os::raw::c_uint = 0;
pub const RTE_ETH_FLOW_RAW: ::std::os::raw::c_uint = 1;
pub const RTE_ETH_FLOW_IPV4: ::std::os::raw::c_uint = 2;
pub const RTE_ETH_FLOW_FRAG_IPV4: ::std::os::raw::c_uint = 3;
pub const RTE_ETH_FLOW_NONFRAG_IPV4_TCP: ::std::os::raw::c_uint = 4;
pub const RTE_ETH_FLOW_NONFRAG_IPV4_UDP: ::std::os::raw::c_uint = 5;
pub const RTE_ETH_FLOW_NONFRAG_IPV4_SCTP: ::std::os::raw::c_uint = 6;
pub const RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: ::std::os::raw::c_uint = 7;
pub const RTE_ETH_FLOW_IPV6: ::std::os::raw::c_uint = 8;
pub const RTE_ETH_FLOW_FRAG_IPV6: ::std::os::raw::c_uint = 9;
pub const RTE_ETH_FLOW_NONFRAG_IPV6_TCP: ::std::os::raw::c_uint = 10;
pub const RTE_ETH_FLOW_NONFRAG_IPV6_UDP: ::std::os::raw::c_uint = 11;
pub const RTE_ETH_FLOW_NONFRAG_IPV6_SCTP: ::std::os::raw::c_uint = 12;
pub const RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: ::std::os::raw::c_uint = 13;
pub const RTE_ETH_FLOW_L2_PAYLOAD: ::std::os::raw::c_uint = 14;
pub const RTE_ETH_FLOW_IPV6_EX: ::std::os::raw::c_uint = 15;
pub const RTE_ETH_FLOW_IPV6_TCP_EX: ::std::os::raw::c_uint = 16;
pub const RTE_ETH_FLOW_IPV6_UDP_EX: ::std::os::raw::c_uint = 17;
pub const RTE_ETH_FLOW_PORT: ::std::os::raw::c_uint = 18;
pub const RTE_ETH_FLOW_VXLAN: ::std::os::raw::c_uint = 19;
pub const RTE_ETH_FLOW_GENEVE: ::std::os::raw::c_uint = 20;
pub const RTE_ETH_FLOW_NVGRE: ::std::os::raw::c_uint = 21;
pub const RTE_ETH_FLOW_MAX: ::std::os::raw::c_uint = 22;
#[repr(u32)]
/**
 *  A set of values to identify what method is to be used to route
 *  packets to multiple queues.
 */
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rte_eth_rx_mq_mode {
    ETH_MQ_RX_NONE = 0,
    ETH_MQ_RX_RSS = 1,
    ETH_MQ_RX_DCB = 2,
    ETH_MQ_RX_DCB_RSS = 3,
    ETH_MQ_RX_VMDQ_ONLY = 4,
    ETH_MQ_RX_VMDQ_RSS = 5,
    ETH_MQ_RX_VMDQ_DCB = 6,
    ETH_MQ_RX_VMDQ_DCB_RSS = 7,
}
/**
 * A structure used to configure the RX features of an Ethernet port.
 */
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_eth_rxmode {
    /** The multi-queue packet distribution mode to be used, e.g. RSS. */
    pub mq_mode: rte_eth_rx_mq_mode,
    /**< Only used if jumbo_frame enabled. */
    pub max_rx_pkt_len: u32,
    /**< hdr buf size (header_split enabled).*/
    pub split_hdr_size: u16,
    pub _bitfield_1: [u8; 2usize],
}
#[test]
fn bindgen_test_layout_rte_eth_rxmode() {
    assert_eq!(::std::mem::size_of::<rte_eth_rxmode>() , 12usize , concat ! (
               "Size of: " , stringify ! ( rte_eth_rxmode ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_rxmode>() , 4usize , concat ! (
                "Alignment of " , stringify ! ( rte_eth_rxmode ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_rxmode ) ) . mq_mode as * const _
                as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_rxmode ) , "::"
                , stringify ! ( mq_mode ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_rxmode ) ) . max_rx_pkt_len as *
                const _ as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_rxmode ) , "::"
                , stringify ! ( max_rx_pkt_len ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_rxmode ) ) . split_hdr_size as *
                const _ as usize } , 8usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_rxmode ) , "::"
                , stringify ! ( split_hdr_size ) ));
}
impl Clone for rte_eth_rxmode {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_eth_rxmode {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
#[repr(u32)]
/**
 * A set of values to identify what method is to be used to transmit
 * packets using multi-TCs.
 */
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rte_eth_tx_mq_mode {
    ETH_MQ_TX_NONE = 0,
    ETH_MQ_TX_DCB = 1,
    ETH_MQ_TX_VMDQ_DCB = 2,
    ETH_MQ_TX_VMDQ_ONLY = 3,
}
/**
 * A structure used to configure the TX features of an Ethernet port.
 */
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_eth_txmode {
    /**< TX multi-queues mode. */
    pub mq_mode: rte_eth_tx_mq_mode,
    pub pvid: u16,
    pub _bitfield_1: u8,
    pub __bindgen_padding_0: u8,
}
#[test]
fn bindgen_test_layout_rte_eth_txmode() {
    assert_eq!(::std::mem::size_of::<rte_eth_txmode>() , 8usize , concat ! (
               "Size of: " , stringify ! ( rte_eth_txmode ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_txmode>() , 4usize , concat ! (
                "Alignment of " , stringify ! ( rte_eth_txmode ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_txmode ) ) . mq_mode as * const _
                as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_txmode ) , "::"
                , stringify ! ( mq_mode ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_txmode ) ) . pvid as * const _ as
                usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_txmode ) , "::"
                , stringify ! ( pvid ) ));
}
impl Clone for rte_eth_txmode {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_eth_txmode {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
/**
 * A structure used to configure the Receive Side Scaling (RSS) feature
 * of an Ethernet port.
 * If not NULL, the *rss_key* pointer of the *rss_conf* structure points
 * to an array holding the RSS key to use for hashing specific header
 * fields of received packets. The length of this array should be indicated
 * by *rss_key_len* below. Otherwise, a default random hash key is used by
 * the device driver.
 *
 * The *rss_key_len* field of the *rss_conf* structure indicates the length
 * in bytes of the array pointed by *rss_key*. To be compatible, this length
 * will be checked in i40e only. Others assume 40 bytes to be used as before.
 *
 * The *rss_hf* field of the *rss_conf* structure indicates the different
 * types of IPv4/IPv6 packets to which the RSS hashing must be applied.
 * Supplying an *rss_hf* equal to zero disables the RSS feature.
 */
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_eth_rss_conf {
    /**< If not NULL, 40-byte hash key. */
    pub rss_key: *mut u8,
    /**< hash key length in bytes. */
    pub rss_key_len: u8,
    /**< Hash functions to apply - see below. */
    pub rss_hf: u64,
}
#[test]
fn bindgen_test_layout_rte_eth_rss_conf() {
    assert_eq!(::std::mem::size_of::<rte_eth_rss_conf>() , 24usize , concat !
               ( "Size of: " , stringify ! ( rte_eth_rss_conf ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_rss_conf>() , 8usize , concat !
                ( "Alignment of " , stringify ! ( rte_eth_rss_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_rss_conf ) ) . rss_key as * const
                _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_rss_conf ) ,
                "::" , stringify ! ( rss_key ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_rss_conf ) ) . rss_key_len as *
                const _ as usize } , 8usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_rss_conf ) ,
                "::" , stringify ! ( rss_key_len ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_rss_conf ) ) . rss_hf as * const
                _ as usize } , 16usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_rss_conf ) ,
                "::" , stringify ! ( rss_hf ) ));
}
impl Clone for rte_eth_rss_conf {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_eth_rss_conf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
#[repr(u32)]
/**
 * This enum indicates the possible number of traffic classes
 * in DCB configratioins
 */
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rte_eth_nb_tcs { ETH_4_TCS = 4, ETH_8_TCS = 8, }
#[repr(u32)]
/**
 * This enum indicates the possible number of queue pools
 * in VMDQ configurations.
 */
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rte_eth_nb_pools {
    ETH_8_POOLS = 8,
    ETH_16_POOLS = 16,
    ETH_32_POOLS = 32,
    ETH_64_POOLS = 64,
}
/**
 * A structure used to configure the VMDQ+DCB feature
 * of an Ethernet port.
 *
 * Using this feature, packets are routed to a pool of queues, based
 * on the vlan id in the vlan tag, and then to a specific queue within
 * that pool, using the user priority vlan tag field.
 *
 * A default pool may be used, if desired, to route all traffic which
 * does not match the vlan filter rules.
 */
#[repr(C)]
pub struct rte_eth_vmdq_dcb_conf {
    /**< With DCB, 16 or 32 pools */
    pub nb_queue_pools: rte_eth_nb_pools,
    /**< If non-zero, use a default pool */
    pub enable_default_pool: u8,
    /**< The default pool, if applicable */
    pub default_pool: u8,
    /**< We can have up to 64 filters/mappings */
    pub nb_pool_maps: u8,
    /**< VMDq vlan pool maps. */
    pub pool_map: [rte_eth_vmdq_dcb_conf__bindgen_ty_1; 64usize],
    pub dcb_tc: [u8; 8usize],
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_eth_vmdq_dcb_conf__bindgen_ty_1 {
    /**< The vlan id of the received frame */
    pub vlan_id: u16,
    /**< Bitmask of pools for packet rx */
    pub pools: u64,
}
#[test]
fn bindgen_test_layout_rte_eth_vmdq_dcb_conf__bindgen_ty_1() {
    assert_eq!(::std::mem::size_of::<rte_eth_vmdq_dcb_conf__bindgen_ty_1>() ,
               16usize , concat ! (
               "Size of: " , stringify ! ( rte_eth_vmdq_dcb_conf__bindgen_ty_1
               ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_vmdq_dcb_conf__bindgen_ty_1>()
                , 8usize , concat ! (
                "Alignment of " , stringify ! (
                rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) ) .
                vlan_id as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) , "::" , stringify ! (
                vlan_id ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) ) .
                pools as * const _ as usize } , 8usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_vmdq_dcb_conf__bindgen_ty_1 ) , "::" , stringify ! (
                pools ) ));
}
impl Clone for rte_eth_vmdq_dcb_conf__bindgen_ty_1 {
    fn clone(&self) -> Self { *self }
}
#[test]
fn bindgen_test_layout_rte_eth_vmdq_dcb_conf() {
    assert_eq!(::std::mem::size_of::<rte_eth_vmdq_dcb_conf>() , 1040usize ,
               concat ! ( "Size of: " , stringify ! ( rte_eth_vmdq_dcb_conf )
               ));
    assert_eq! (::std::mem::align_of::<rte_eth_vmdq_dcb_conf>() , 8usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_eth_vmdq_dcb_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) .
                nb_queue_pools as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf )
                , "::" , stringify ! ( nb_queue_pools ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) .
                enable_default_pool as * const _ as usize } , 4usize , concat
                ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf )
                , "::" , stringify ! ( enable_default_pool ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . default_pool
                as * const _ as usize } , 5usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf )
                , "::" , stringify ! ( default_pool ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . nb_pool_maps
                as * const _ as usize } , 6usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf )
                , "::" , stringify ! ( nb_pool_maps ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . pool_map as *
                const _ as usize } , 8usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf )
                , "::" , stringify ! ( pool_map ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_dcb_conf ) ) . dcb_tc as *
                const _ as usize } , 1032usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_dcb_conf )
                , "::" , stringify ! ( dcb_tc ) ));
}
impl Default for rte_eth_vmdq_dcb_conf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_eth_dcb_rx_conf {
    /**< Possible DCB TCs, 4 or 8 TCs */
    pub nb_tcs: rte_eth_nb_tcs,
    /** Traffic class each UP mapped to. */
    pub dcb_tc: [u8; 8usize],
}
#[test]
fn bindgen_test_layout_rte_eth_dcb_rx_conf() {
    assert_eq!(::std::mem::size_of::<rte_eth_dcb_rx_conf>() , 12usize , concat
               ! ( "Size of: " , stringify ! ( rte_eth_dcb_rx_conf ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_dcb_rx_conf>() , 4usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_eth_dcb_rx_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_dcb_rx_conf ) ) . nb_tcs as *
                const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_dcb_rx_conf ) ,
                "::" , stringify ! ( nb_tcs ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_dcb_rx_conf ) ) . dcb_tc as *
                const _ as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_dcb_rx_conf ) ,
                "::" , stringify ! ( dcb_tc ) ));
}
impl Clone for rte_eth_dcb_rx_conf {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_eth_dcb_rx_conf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_eth_vmdq_dcb_tx_conf {
    /**< With DCB, 16 or 32 pools. */
    pub nb_queue_pools: rte_eth_nb_pools,
    /** Traffic class each UP mapped to. */
    pub dcb_tc: [u8; 8usize],
}
#[test]
fn bindgen_test_layout_rte_eth_vmdq_dcb_tx_conf() {
    assert_eq!(::std::mem::size_of::<rte_eth_vmdq_dcb_tx_conf>() , 12usize ,
               concat ! (
               "Size of: " , stringify ! ( rte_eth_vmdq_dcb_tx_conf ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_vmdq_dcb_tx_conf>() , 4usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_eth_vmdq_dcb_tx_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_dcb_tx_conf ) ) .
                nb_queue_pools as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_vmdq_dcb_tx_conf ) , "::" , stringify ! (
                nb_queue_pools ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_dcb_tx_conf ) ) . dcb_tc as
                * const _ as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_vmdq_dcb_tx_conf ) , "::" , stringify ! ( dcb_tc ) ));
}
impl Clone for rte_eth_vmdq_dcb_tx_conf {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_eth_vmdq_dcb_tx_conf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_eth_dcb_tx_conf {
    /**< Possible DCB TCs, 4 or 8 TCs. */
    pub nb_tcs: rte_eth_nb_tcs,
    /** Traffic class each UP mapped to. */
    pub dcb_tc: [u8; 8usize],
}
#[test]
fn bindgen_test_layout_rte_eth_dcb_tx_conf() {
    assert_eq!(::std::mem::size_of::<rte_eth_dcb_tx_conf>() , 12usize , concat
               ! ( "Size of: " , stringify ! ( rte_eth_dcb_tx_conf ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_dcb_tx_conf>() , 4usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_eth_dcb_tx_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_dcb_tx_conf ) ) . nb_tcs as *
                const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_dcb_tx_conf ) ,
                "::" , stringify ! ( nb_tcs ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_dcb_tx_conf ) ) . dcb_tc as *
                const _ as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_dcb_tx_conf ) ,
                "::" , stringify ! ( dcb_tc ) ));
}
impl Clone for rte_eth_dcb_tx_conf {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_eth_dcb_tx_conf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_eth_vmdq_tx_conf {
    /**< VMDq mode, 64 pools. */
    pub nb_queue_pools: rte_eth_nb_pools,
}
#[test]
fn bindgen_test_layout_rte_eth_vmdq_tx_conf() {
    assert_eq!(::std::mem::size_of::<rte_eth_vmdq_tx_conf>() , 4usize , concat
               ! ( "Size of: " , stringify ! ( rte_eth_vmdq_tx_conf ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_vmdq_tx_conf>() , 4usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_eth_vmdq_tx_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_tx_conf ) ) . nb_queue_pools
                as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_tx_conf )
                , "::" , stringify ! ( nb_queue_pools ) ));
}
impl Clone for rte_eth_vmdq_tx_conf {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_eth_vmdq_tx_conf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
#[repr(C)]
pub struct rte_eth_vmdq_rx_conf {
    /**< VMDq only mode, 8 or 64 pools */
    pub nb_queue_pools: rte_eth_nb_pools,
    /**< If non-zero, use a default pool */
    pub enable_default_pool: u8,
    /**< The default pool, if applicable */
    pub default_pool: u8,
    /**< Enable VT loop back */
    pub enable_loop_back: u8,
    /**< We can have up to 64 filters/mappings */
    pub nb_pool_maps: u8,
    /**< Flags from ETH_VMDQ_ACCEPT_* */
    pub rx_mode: u32,
    /**< VMDq vlan pool maps. */
    pub pool_map: [rte_eth_vmdq_rx_conf__bindgen_ty_1; 64usize],
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_eth_vmdq_rx_conf__bindgen_ty_1 {
    /**< The vlan id of the received frame */
    pub vlan_id: u16,
    /**< Bitmask of pools for packet rx */
    pub pools: u64,
}
#[test]
fn bindgen_test_layout_rte_eth_vmdq_rx_conf__bindgen_ty_1() {
    assert_eq!(::std::mem::size_of::<rte_eth_vmdq_rx_conf__bindgen_ty_1>() ,
               16usize , concat ! (
               "Size of: " , stringify ! ( rte_eth_vmdq_rx_conf__bindgen_ty_1
               ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_vmdq_rx_conf__bindgen_ty_1>() ,
                8usize , concat ! (
                "Alignment of " , stringify ! (
                rte_eth_vmdq_rx_conf__bindgen_ty_1 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_rx_conf__bindgen_ty_1 ) ) .
                vlan_id as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_vmdq_rx_conf__bindgen_ty_1 ) , "::" , stringify ! (
                vlan_id ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_rx_conf__bindgen_ty_1 ) ) .
                pools as * const _ as usize } , 8usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_vmdq_rx_conf__bindgen_ty_1 ) , "::" , stringify ! (
                pools ) ));
}
impl Clone for rte_eth_vmdq_rx_conf__bindgen_ty_1 {
    fn clone(&self) -> Self { *self }
}
#[test]
fn bindgen_test_layout_rte_eth_vmdq_rx_conf() {
    assert_eq!(::std::mem::size_of::<rte_eth_vmdq_rx_conf>() , 1040usize ,
               concat ! ( "Size of: " , stringify ! ( rte_eth_vmdq_rx_conf )
               ));
    assert_eq! (::std::mem::align_of::<rte_eth_vmdq_rx_conf>() , 8usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_eth_vmdq_rx_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . nb_queue_pools
                as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf )
                , "::" , stringify ! ( nb_queue_pools ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) .
                enable_default_pool as * const _ as usize } , 4usize , concat
                ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf )
                , "::" , stringify ! ( enable_default_pool ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . default_pool
                as * const _ as usize } , 5usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf )
                , "::" , stringify ! ( default_pool ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) .
                enable_loop_back as * const _ as usize } , 6usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf )
                , "::" , stringify ! ( enable_loop_back ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . nb_pool_maps
                as * const _ as usize } , 7usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf )
                , "::" , stringify ! ( nb_pool_maps ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . rx_mode as *
                const _ as usize } , 8usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf )
                , "::" , stringify ! ( rx_mode ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_vmdq_rx_conf ) ) . pool_map as *
                const _ as usize } , 16usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_vmdq_rx_conf )
                , "::" , stringify ! ( pool_map ) ));
}
impl Default for rte_eth_vmdq_rx_conf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
#[repr(u32)]
/**
 *  Flow Director setting modes: none, signature or perfect.
 */
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rte_fdir_mode {
    RTE_FDIR_MODE_NONE = 0,
    RTE_FDIR_MODE_SIGNATURE = 1,
    RTE_FDIR_MODE_PERFECT = 2,
    RTE_FDIR_MODE_PERFECT_MAC_VLAN = 3,
    RTE_FDIR_MODE_PERFECT_TUNNEL = 4,
}
#[repr(u32)]
/**
 *  Memory space that can be configured to store Flow Director filters
 *  in the board memory.
 */
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rte_fdir_pballoc_type {
    RTE_FDIR_PBALLOC_64K = 0,
    RTE_FDIR_PBALLOC_128K = 1,
    RTE_FDIR_PBALLOC_256K = 2,
}
#[repr(u32)]
/**
 *  Select report mode of FDIR hash information in RX descriptors.
 */
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rte_fdir_status_mode {
    RTE_FDIR_NO_REPORT_STATUS = 0,
    RTE_FDIR_REPORT_STATUS = 1,
    RTE_FDIR_REPORT_STATUS_ALWAYS = 2,
}
/**
 * A structure used to define the input for IPV4 flow
 */
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_eth_ipv4_flow {
    /**< IPv4 source address in big endian. */
    pub src_ip: u32,
    /**< IPv4 destination address in big endian. */
    pub dst_ip: u32,
    /**< Type of service to match. */
    pub tos: u8,
    /**< Time to live to match. */
    pub ttl: u8,
    /**< Protocol, next header in big endian. */
    pub proto: u8,
}
#[test]
fn bindgen_test_layout_rte_eth_ipv4_flow() {
    assert_eq!(::std::mem::size_of::<rte_eth_ipv4_flow>() , 12usize , concat !
               ( "Size of: " , stringify ! ( rte_eth_ipv4_flow ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_ipv4_flow>() , 4usize , concat
                ! ( "Alignment of " , stringify ! ( rte_eth_ipv4_flow ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . src_ip as * const
                _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_ipv4_flow ) ,
                "::" , stringify ! ( src_ip ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . dst_ip as * const
                _ as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_ipv4_flow ) ,
                "::" , stringify ! ( dst_ip ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . tos as * const _
                as usize } , 8usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_ipv4_flow ) ,
                "::" , stringify ! ( tos ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . ttl as * const _
                as usize } , 9usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_ipv4_flow ) ,
                "::" , stringify ! ( ttl ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_ipv4_flow ) ) . proto as * const
                _ as usize } , 10usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_ipv4_flow ) ,
                "::" , stringify ! ( proto ) ));
}
impl Clone for rte_eth_ipv4_flow {
    fn clone(&self) -> Self { *self }
}
/**
 * A structure used to define the input for IPV6 flow
 */
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_eth_ipv6_flow {
    /**< IPv6 source address in big endian. */
    pub src_ip: [u32; 4usize],
    /**< IPv6 destination address in big endian. */
    pub dst_ip: [u32; 4usize],
    /**< Traffic class to match. */
    pub tc: u8,
    /**< Protocol, next header to match. */
    pub proto: u8,
    /**< Hop limits to match. */
    pub hop_limits: u8,
}
#[test]
fn bindgen_test_layout_rte_eth_ipv6_flow() {
    assert_eq!(::std::mem::size_of::<rte_eth_ipv6_flow>() , 36usize , concat !
               ( "Size of: " , stringify ! ( rte_eth_ipv6_flow ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_ipv6_flow>() , 4usize , concat
                ! ( "Alignment of " , stringify ! ( rte_eth_ipv6_flow ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . src_ip as * const
                _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_ipv6_flow ) ,
                "::" , stringify ! ( src_ip ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . dst_ip as * const
                _ as usize } , 16usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_ipv6_flow ) ,
                "::" , stringify ! ( dst_ip ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . tc as * const _
                as usize } , 32usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_ipv6_flow ) ,
                "::" , stringify ! ( tc ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . proto as * const
                _ as usize } , 33usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_ipv6_flow ) ,
                "::" , stringify ! ( proto ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_ipv6_flow ) ) . hop_limits as *
                const _ as usize } , 34usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_ipv6_flow ) ,
                "::" , stringify ! ( hop_limits ) ));
}
impl Clone for rte_eth_ipv6_flow {
    fn clone(&self) -> Self { *self }
}
/**
 *  A structure used to configure FDIR masks that are used by the device
 *  to match the various fields of RX packet headers.
 */
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_eth_fdir_masks {
    /**< Bit mask for vlan_tci in big endian */
    pub vlan_tci_mask: u16,
    /** Bit mask for ipv4 flow in big endian. */
    pub ipv4_mask: rte_eth_ipv4_flow,
    /** Bit maks for ipv6 flow in big endian. */
    pub ipv6_mask: rte_eth_ipv6_flow,
    /** Bit mask for L4 source port in big endian. */
    pub src_port_mask: u16,
    /** Bit mask for L4 destination port in big endian. */
    pub dst_port_mask: u16,
    /** 6 bit mask for proper 6 bytes of Mac address, bit 0 matches the
	    first byte on the wire */
    pub mac_addr_byte_mask: u8,
    /** Bit mask for tunnel ID in big endian. */
    pub tunnel_id_mask: u32,
    /**< 1 - Match tunnel type,
				       0 - Ignore tunnel type. */
    pub tunnel_type_mask: u8,
}
#[test]
fn bindgen_test_layout_rte_eth_fdir_masks() {
    assert_eq!(::std::mem::size_of::<rte_eth_fdir_masks>() , 68usize , concat
               ! ( "Size of: " , stringify ! ( rte_eth_fdir_masks ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_fdir_masks>() , 4usize , concat
                ! ( "Alignment of " , stringify ! ( rte_eth_fdir_masks ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_masks ) ) . vlan_tci_mask as
                * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) ,
                "::" , stringify ! ( vlan_tci_mask ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_masks ) ) . ipv4_mask as *
                const _ as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) ,
                "::" , stringify ! ( ipv4_mask ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_masks ) ) . ipv6_mask as *
                const _ as usize } , 16usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) ,
                "::" , stringify ! ( ipv6_mask ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_masks ) ) . src_port_mask as
                * const _ as usize } , 52usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) ,
                "::" , stringify ! ( src_port_mask ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_masks ) ) . dst_port_mask as
                * const _ as usize } , 54usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) ,
                "::" , stringify ! ( dst_port_mask ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_masks ) ) .
                mac_addr_byte_mask as * const _ as usize } , 56usize , concat
                ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) ,
                "::" , stringify ! ( mac_addr_byte_mask ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_masks ) ) . tunnel_id_mask
                as * const _ as usize } , 60usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) ,
                "::" , stringify ! ( tunnel_id_mask ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_masks ) ) . tunnel_type_mask
                as * const _ as usize } , 64usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_masks ) ,
                "::" , stringify ! ( tunnel_type_mask ) ));
}
impl Clone for rte_eth_fdir_masks {
    fn clone(&self) -> Self { *self }
}
#[repr(u32)]
/**
 * Payload type
 */
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum rte_eth_payload_type {
    RTE_ETH_PAYLOAD_UNKNOWN = 0,
    RTE_ETH_RAW_PAYLOAD = 1,
    RTE_ETH_L2_PAYLOAD = 2,
    RTE_ETH_L3_PAYLOAD = 3,
    RTE_ETH_L4_PAYLOAD = 4,
    RTE_ETH_PAYLOAD_MAX = 8,
}
/**
 * A structure used to select bytes extracted from the protocol layers to
 * flexible payload for filter
 */
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_eth_flex_payload_cfg {
    /**< Payload type */
    pub type_: rte_eth_payload_type,
    pub src_offset: [u16; 16usize],
}
#[test]
fn bindgen_test_layout_rte_eth_flex_payload_cfg() {
    assert_eq!(::std::mem::size_of::<rte_eth_flex_payload_cfg>() , 36usize ,
               concat ! (
               "Size of: " , stringify ! ( rte_eth_flex_payload_cfg ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_flex_payload_cfg>() , 4usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_eth_flex_payload_cfg ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_flex_payload_cfg ) ) . type_ as *
                const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_flex_payload_cfg ) , "::" , stringify ! ( type_ ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_flex_payload_cfg ) ) . src_offset
                as * const _ as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_flex_payload_cfg ) , "::" , stringify ! ( src_offset )
                ));
}
impl Clone for rte_eth_flex_payload_cfg {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_eth_flex_payload_cfg {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
/**
 * A structure used to define FDIR masks for flexible payload
 * for each flow type
 */
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_eth_fdir_flex_mask {
    pub flow_type: u16,
    pub mask: [u8; 16usize],
}
#[test]
fn bindgen_test_layout_rte_eth_fdir_flex_mask() {
    assert_eq!(::std::mem::size_of::<rte_eth_fdir_flex_mask>() , 18usize ,
               concat ! ( "Size of: " , stringify ! ( rte_eth_fdir_flex_mask )
               ));
    assert_eq! (::std::mem::align_of::<rte_eth_fdir_flex_mask>() , 2usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_eth_fdir_flex_mask ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_flex_mask ) ) . flow_type as
                * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_mask
                ) , "::" , stringify ! ( flow_type ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_flex_mask ) ) . mask as *
                const _ as usize } , 2usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_mask
                ) , "::" , stringify ! ( mask ) ));
}
impl Clone for rte_eth_fdir_flex_mask {
    fn clone(&self) -> Self { *self }
}
/**
 * A structure used to define all flexible payload related setting
 * include flex payload and flex mask
 */
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_eth_fdir_flex_conf {
    /**< The number of following payload cfg */
    pub nb_payloads: u16,
    /**< The number of following mask */
    pub nb_flexmasks: u16,
    pub flex_set: [rte_eth_flex_payload_cfg; 8usize],
    pub flex_mask: [rte_eth_fdir_flex_mask; 22usize],
}
#[test]
fn bindgen_test_layout_rte_eth_fdir_flex_conf() {
    assert_eq!(::std::mem::size_of::<rte_eth_fdir_flex_conf>() , 688usize ,
               concat ! ( "Size of: " , stringify ! ( rte_eth_fdir_flex_conf )
               ));
    assert_eq! (::std::mem::align_of::<rte_eth_fdir_flex_conf>() , 4usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_eth_fdir_flex_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . nb_payloads
                as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_conf
                ) , "::" , stringify ! ( nb_payloads ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . nb_flexmasks
                as * const _ as usize } , 2usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_conf
                ) , "::" , stringify ! ( nb_flexmasks ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . flex_set as
                * const _ as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_conf
                ) , "::" , stringify ! ( flex_set ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_fdir_flex_conf ) ) . flex_mask as
                * const _ as usize } , 292usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_fdir_flex_conf
                ) , "::" , stringify ! ( flex_mask ) ));
}
impl Clone for rte_eth_fdir_flex_conf {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_eth_fdir_flex_conf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
/**
 * A structure used to configure the Flow Director (FDIR) feature
 * of an Ethernet port.
 *
 * If mode is RTE_FDIR_DISABLE, the pballoc value is ignored.
 */
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_fdir_conf {
    /**< Flow Director mode. */
    pub mode: rte_fdir_mode,
    /**< Space for FDIR filters. */
    pub pballoc: rte_fdir_pballoc_type,
    /**< How to report FDIR hash. */
    pub status: rte_fdir_status_mode,
    /** RX queue of packets matching a "drop" filter in perfect mode. */
    pub drop_queue: u8,
    pub mask: rte_eth_fdir_masks,
    pub flex_conf: rte_eth_fdir_flex_conf,
}
#[test]
fn bindgen_test_layout_rte_fdir_conf() {
    assert_eq!(::std::mem::size_of::<rte_fdir_conf>() , 772usize , concat ! (
               "Size of: " , stringify ! ( rte_fdir_conf ) ));
    assert_eq! (::std::mem::align_of::<rte_fdir_conf>() , 4usize , concat ! (
                "Alignment of " , stringify ! ( rte_fdir_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_fdir_conf ) ) . mode as * const _ as
                usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::"
                , stringify ! ( mode ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_fdir_conf ) ) . pballoc as * const _
                as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::"
                , stringify ! ( pballoc ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_fdir_conf ) ) . status as * const _
                as usize } , 8usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::"
                , stringify ! ( status ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_fdir_conf ) ) . drop_queue as * const
                _ as usize } , 12usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::"
                , stringify ! ( drop_queue ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_fdir_conf ) ) . mask as * const _ as
                usize } , 16usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::"
                , stringify ! ( mask ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_fdir_conf ) ) . flex_conf as * const
                _ as usize } , 84usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_fdir_conf ) , "::"
                , stringify ! ( flex_conf ) ));
}
impl Clone for rte_fdir_conf {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_fdir_conf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
/**
 * A structure used to enable/disable specific device interrupts.
 */
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_intr_conf {
    /** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
    pub lsc: u16,
    /** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
    pub rxq: u16,
}
#[test]
fn bindgen_test_layout_rte_intr_conf() {
    assert_eq!(::std::mem::size_of::<rte_intr_conf>() , 4usize , concat ! (
               "Size of: " , stringify ! ( rte_intr_conf ) ));
    assert_eq! (::std::mem::align_of::<rte_intr_conf>() , 2usize , concat ! (
                "Alignment of " , stringify ! ( rte_intr_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_intr_conf ) ) . lsc as * const _ as
                usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_intr_conf ) , "::"
                , stringify ! ( lsc ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_intr_conf ) ) . rxq as * const _ as
                usize } , 2usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_intr_conf ) , "::"
                , stringify ! ( rxq ) ));
}
impl Clone for rte_intr_conf {
    fn clone(&self) -> Self { *self }
}
/**
 * A structure used to configure an Ethernet port.
 * Depending upon the RX multi-queue mode, extra advanced
 * configuration settings may be needed.
 */
#[repr(C)]
pub struct rte_eth_conf {
    /**< bitmap of ETH_LINK_SPEED_XXX of speeds to be
				used. ETH_LINK_SPEED_FIXED disables link
				autonegotiation, and a unique speed shall be
				set. Otherwise, the bitmap defines the set of
				speeds to be advertised. If the special value
				ETH_LINK_SPEED_AUTONEG (0) is used, all speeds
				supported are advertised. */
    pub link_speeds: u32,
    /**< Port RX configuration. */
    pub rxmode: rte_eth_rxmode,
    /**< Port TX configuration. */
    pub txmode: rte_eth_txmode,
    /**< Loopback operation mode. By default the value
			         is 0, meaning the loopback mode is disabled.
				 Read the datasheet of given ethernet controller
				 for details. The possible values of this field
				 are defined in implementation of each driver. */
    pub lpbk_mode: u32,
    /**< Port RX filtering configuration (union). */
    pub rx_adv_conf: rte_eth_conf__bindgen_ty_1,
    /**< Port TX DCB configuration (union). */
    pub tx_adv_conf: rte_eth_conf__bindgen_ty_2,
    /** Currently,Priority Flow Control(PFC) are supported,if DCB with PFC
	    is needed,and the variable must be set ETH_DCB_PFC_SUPPORT. */
    pub dcb_capability_en: u32,
    /**< FDIR configuration. */
    pub fdir_conf: rte_fdir_conf,
    /**< Interrupt mode configuration. */
    pub intr_conf: rte_intr_conf,
}
#[repr(C)]
pub struct rte_eth_conf__bindgen_ty_1 {
    /**< Port RSS configuration */
    pub rss_conf: rte_eth_rss_conf,
    pub vmdq_dcb_conf: rte_eth_vmdq_dcb_conf,
    pub dcb_rx_conf: rte_eth_dcb_rx_conf,
    pub vmdq_rx_conf: rte_eth_vmdq_rx_conf,
}
#[test]
fn bindgen_test_layout_rte_eth_conf__bindgen_ty_1() {
    assert_eq!(::std::mem::size_of::<rte_eth_conf__bindgen_ty_1>() , 2120usize
               , concat ! (
               "Size of: " , stringify ! ( rte_eth_conf__bindgen_ty_1 ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_conf__bindgen_ty_1>() , 8usize
                , concat ! (
                "Alignment of " , stringify ! ( rte_eth_conf__bindgen_ty_1 )
                ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) . rss_conf
                as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_conf__bindgen_ty_1 ) , "::" , stringify ! ( rss_conf )
                ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) .
                vmdq_dcb_conf as * const _ as usize } , 24usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_conf__bindgen_ty_1 ) , "::" , stringify ! (
                vmdq_dcb_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) .
                dcb_rx_conf as * const _ as usize } , 1064usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_conf__bindgen_ty_1 ) , "::" , stringify ! (
                dcb_rx_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf__bindgen_ty_1 ) ) .
                vmdq_rx_conf as * const _ as usize } , 1080usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_conf__bindgen_ty_1 ) , "::" , stringify ! (
                vmdq_rx_conf ) ));
}
impl Default for rte_eth_conf__bindgen_ty_1 {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_eth_conf__bindgen_ty_2 {
    pub vmdq_dcb_tx_conf: __BindgenUnionField<rte_eth_vmdq_dcb_tx_conf>,
    pub dcb_tx_conf: __BindgenUnionField<rte_eth_dcb_tx_conf>,
    pub vmdq_tx_conf: __BindgenUnionField<rte_eth_vmdq_tx_conf>,
    pub bindgen_union_field: [u32; 3usize],
}
#[test]
fn bindgen_test_layout_rte_eth_conf__bindgen_ty_2() {
    assert_eq!(::std::mem::size_of::<rte_eth_conf__bindgen_ty_2>() , 12usize ,
               concat ! (
               "Size of: " , stringify ! ( rte_eth_conf__bindgen_ty_2 ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_conf__bindgen_ty_2>() , 4usize
                , concat ! (
                "Alignment of " , stringify ! ( rte_eth_conf__bindgen_ty_2 )
                ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf__bindgen_ty_2 ) ) .
                vmdq_dcb_tx_conf as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_conf__bindgen_ty_2 ) , "::" , stringify ! (
                vmdq_dcb_tx_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf__bindgen_ty_2 ) ) .
                dcb_tx_conf as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_conf__bindgen_ty_2 ) , "::" , stringify ! (
                dcb_tx_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf__bindgen_ty_2 ) ) .
                vmdq_tx_conf as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_eth_conf__bindgen_ty_2 ) , "::" , stringify ! (
                vmdq_tx_conf ) ));
}
impl Clone for rte_eth_conf__bindgen_ty_2 {
    fn clone(&self) -> Self { *self }
}
#[test]
fn bindgen_test_layout_rte_eth_conf() {
    assert_eq!(::std::mem::size_of::<rte_eth_conf>() , 2944usize , concat ! (
               "Size of: " , stringify ! ( rte_eth_conf ) ));
    assert_eq! (::std::mem::align_of::<rte_eth_conf>() , 8usize , concat ! (
                "Alignment of " , stringify ! ( rte_eth_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf ) ) . link_speeds as * const
                _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" ,
                stringify ! ( link_speeds ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf ) ) . rxmode as * const _ as
                usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" ,
                stringify ! ( rxmode ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf ) ) . txmode as * const _ as
                usize } , 16usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" ,
                stringify ! ( txmode ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf ) ) . lpbk_mode as * const _
                as usize } , 24usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" ,
                stringify ! ( lpbk_mode ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf ) ) . rx_adv_conf as * const
                _ as usize } , 32usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" ,
                stringify ! ( rx_adv_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf ) ) . tx_adv_conf as * const
                _ as usize } , 2152usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" ,
                stringify ! ( tx_adv_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf ) ) . dcb_capability_en as *
                const _ as usize } , 2164usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" ,
                stringify ! ( dcb_capability_en ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf ) ) . fdir_conf as * const _
                as usize } , 2168usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" ,
                stringify ! ( fdir_conf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_eth_conf ) ) . intr_conf as * const _
                as usize } , 2940usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_eth_conf ) , "::" ,
                stringify ! ( intr_conf ) ));
}
impl Default for rte_eth_conf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
