/* 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 RTE_CACHE_LINE_MIN_SIZE: ::std::os::raw::c_uint = 64;
pub const RTE_CACHE_LINE_SIZE: ::std::os::raw::c_uint = 64;
pub type phys_addr_t = u64;
pub type MARKER = [*mut ::std::os::raw::c_void; 0usize];
pub type MARKER8 = [u8; 0usize];
pub type MARKER64 = [u64; 0usize];
/**
 * The atomic counter structure.
 */
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_atomic16_t {
    /**< An internal counter value. */
    pub cnt: i16,
}
#[test]
fn bindgen_test_layout_rte_atomic16_t() {
    assert_eq!(::std::mem::size_of::<rte_atomic16_t>() , 2usize , concat ! (
               "Size of: " , stringify ! ( rte_atomic16_t ) ));
    assert_eq! (::std::mem::align_of::<rte_atomic16_t>() , 2usize , concat ! (
                "Alignment of " , stringify ! ( rte_atomic16_t ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_atomic16_t ) ) . cnt as * const _ as
                usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_atomic16_t ) , "::"
                , stringify ! ( cnt ) ));
}
impl Clone for rte_atomic16_t {
    fn clone(&self) -> Self { *self }
}
/**
 * The generic rte_mbuf, containing a packet mbuf.
 */
#[repr(C)]
#[derive(Debug, Copy)]
pub struct rte_mbuf {
    pub cacheline0: MARKER,
    /**< Virtual address of segment buffer. */
    pub buf_addr: *mut ::std::os::raw::c_void,
    /**< Physical address of segment buffer. */
    pub buf_physaddr: phys_addr_t,
    /**< Length of segment buffer. */
    pub buf_len: u16,
    pub rearm_data: MARKER8,
    pub data_off: u16,
    pub __bindgen_anon_1: rte_mbuf__bindgen_ty_1,
    /**< Number of segments. */
    pub nb_segs: u8,
    /**< Input port. */
    pub port: u8,
    /**< Offload features. */
    pub ol_flags: u64,
    pub rx_descriptor_fields1: MARKER,
    pub __bindgen_anon_2: rte_mbuf__bindgen_ty_2,
    /**< Total pkt len: sum of all segments. */
    pub pkt_len: u32,
    /**< Amount of data in segment buffer. */
    pub data_len: u16,
    /** VLAN TCI (CPU order), valid if PKT_RX_VLAN_STRIPPED is set. */
    pub vlan_tci: u16,
    /**< hash information */
    pub hash: rte_mbuf__bindgen_ty_3,
    /**< Sequence number. See also rte_reorder_insert() */
    pub seqn: u32,
    /** Outer VLAN TCI (CPU order), valid if PKT_RX_QINQ_STRIPPED is set. */
    pub vlan_tci_outer: u16,
    pub cacheline1: MARKER,
    pub __bindgen_anon_3: rte_mbuf__bindgen_ty_4,
    /**< Pool from which mbuf was allocated. */
    pub pool: *mut rte_mempool,
    /**< Next segment of scattered packet. */
    pub next: *mut rte_mbuf,
    pub __bindgen_anon_4: rte_mbuf__bindgen_ty_5,
    /** Size of the application private data. In case of an indirect
	 * mbuf, it stores the direct mbuf private data size. */
    pub priv_size: u16,
    /** Timesync flags for use with IEEE1588. */
    pub timesync: u16,
    pub __bindgen_padding_0: [u32; 7usize],
}
/**
	 * 16-bit Reference counter.
	 * It should only be accessed using the following functions:
	 * rte_mbuf_refcnt_update(), rte_mbuf_refcnt_read(), and
	 * rte_mbuf_refcnt_set(). The functionality of these functions (atomic,
	 * or non-atomic) is controlled by the CONFIG_RTE_MBUF_REFCNT_ATOMIC
	 * config option.
	 */
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_1 {
    /**< Atomically accessed refcnt */
    pub refcnt_atomic: __BindgenUnionField<rte_atomic16_t>,
    /**< Non-atomically accessed refcnt */
    pub refcnt: __BindgenUnionField<u16>,
    pub bindgen_union_field: u16,
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_1() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_1>() , 2usize ,
               concat ! ( "Size of: " , stringify ! ( rte_mbuf__bindgen_ty_1 )
               ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_1>() , 2usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_mbuf__bindgen_ty_1 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_1 ) ) .
                refcnt_atomic as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_1
                ) , "::" , stringify ! ( refcnt_atomic ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_1 ) ) . refcnt as *
                const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_1
                ) , "::" , stringify ! ( refcnt ) ));
}
impl Clone for rte_mbuf__bindgen_ty_1 {
    fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_2 {
    /**< L2/L3/L4 and tunnel information. */
    pub packet_type: __BindgenUnionField<u32>,
    pub __bindgen_anon_1: __BindgenUnionField<rte_mbuf__bindgen_ty_2__bindgen_ty_1>,
    pub bindgen_union_field: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_2__bindgen_ty_1 {
    pub _bitfield_1: u32,
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_2__bindgen_ty_1() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_2__bindgen_ty_1>() ,
               4usize , concat ! (
               "Size of: " , stringify ! (
               rte_mbuf__bindgen_ty_2__bindgen_ty_1 ) ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_2__bindgen_ty_1>()
                , 4usize , concat ! (
                "Alignment of " , stringify ! (
                rte_mbuf__bindgen_ty_2__bindgen_ty_1 ) ));
}
impl Clone for rte_mbuf__bindgen_ty_2__bindgen_ty_1 {
    fn clone(&self) -> Self { *self }
}
impl rte_mbuf__bindgen_ty_2__bindgen_ty_1 {
    #[inline]
    pub fn l2_type(&self) -> u32 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 & (15usize as u32)) >>
                                       0u32) as u32)
        }
    }
    #[inline]
    pub fn set_l2_type(&mut self, val: u32) {
        self._bitfield_1 &= !(15usize as u32);
        self._bitfield_1 |= ((val as u32 as u32) << 0u32) & (15usize as u32);
    }
    #[inline]
    pub fn l3_type(&self) -> u32 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 & (240usize as u32)) >>
                                       4u32) as u32)
        }
    }
    #[inline]
    pub fn set_l3_type(&mut self, val: u32) {
        self._bitfield_1 &= !(240usize as u32);
        self._bitfield_1 |= ((val as u32 as u32) << 4u32) & (240usize as u32);
    }
    #[inline]
    pub fn l4_type(&self) -> u32 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 & (3840usize as u32)) >>
                                       8u32) as u32)
        }
    }
    #[inline]
    pub fn set_l4_type(&mut self, val: u32) {
        self._bitfield_1 &= !(3840usize as u32);
        self._bitfield_1 |=
            ((val as u32 as u32) << 8u32) & (3840usize as u32);
    }
    #[inline]
    pub fn tun_type(&self) -> u32 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 & (61440usize as u32)) >>
                                       12u32) as u32)
        }
    }
    #[inline]
    pub fn set_tun_type(&mut self, val: u32) {
        self._bitfield_1 &= !(61440usize as u32);
        self._bitfield_1 |=
            ((val as u32 as u32) << 12u32) & (61440usize as u32);
    }
    #[inline]
    pub fn inner_l2_type(&self) -> u32 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 & (983040usize as u32))
                                       >> 16u32) as u32)
        }
    }
    #[inline]
    pub fn set_inner_l2_type(&mut self, val: u32) {
        self._bitfield_1 &= !(983040usize as u32);
        self._bitfield_1 |=
            ((val as u32 as u32) << 16u32) & (983040usize as u32);
    }
    #[inline]
    pub fn inner_l3_type(&self) -> u32 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 & (15728640usize as u32))
                                       >> 20u32) as u32)
        }
    }
    #[inline]
    pub fn set_inner_l3_type(&mut self, val: u32) {
        self._bitfield_1 &= !(15728640usize as u32);
        self._bitfield_1 |=
            ((val as u32 as u32) << 20u32) & (15728640usize as u32);
    }
    #[inline]
    pub fn inner_l4_type(&self) -> u32 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 &
                                        (251658240usize as u32)) >> 24u32) as
                                      u32)
        }
    }
    #[inline]
    pub fn set_inner_l4_type(&mut self, val: u32) {
        self._bitfield_1 &= !(251658240usize as u32);
        self._bitfield_1 |=
            ((val as u32 as u32) << 24u32) & (251658240usize as u32);
    }
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_2() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_2>() , 4usize ,
               concat ! ( "Size of: " , stringify ! ( rte_mbuf__bindgen_ty_2 )
               ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_2>() , 4usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_mbuf__bindgen_ty_2 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_2 ) ) . packet_type
                as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_2
                ) , "::" , stringify ! ( packet_type ) ));
}
impl Clone for rte_mbuf__bindgen_ty_2 {
    fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_3 {
    /**< RSS hash result if RSS enabled */
    pub rss: __BindgenUnionField<u32>,
    /**< Filter identifier if FDIR enabled */
    pub fdir: __BindgenUnionField<rte_mbuf__bindgen_ty_3__bindgen_ty_1>,
    /**< Hierarchical scheduler */
    pub sched: __BindgenUnionField<rte_mbuf__bindgen_ty_3__bindgen_ty_2>,
    /**< User defined tags. See rte_distributor_process() */
    pub usr: __BindgenUnionField<u32>,
    pub bindgen_union_field: [u32; 2usize],
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_1 {
    pub __bindgen_anon_1: rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1,
    pub hi: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 {
    pub __bindgen_anon_1: __BindgenUnionField<rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1>,
    pub lo: __BindgenUnionField<u32>,
    pub bindgen_union_field: u32,
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 {
    pub hash: u16,
    pub id: u16,
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1>()
               , 4usize , concat ! (
               "Size of: " , stringify ! (
               rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1
               ) ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1>()
                , 2usize , concat ! (
                "Alignment of " , stringify ! (
                rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1
                ) ));
    assert_eq! (unsafe {
                & (
                * (
                0 as * const
                rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1
                ) ) . hash as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1
                ) , "::" , stringify ! ( hash ) ));
    assert_eq! (unsafe {
                & (
                * (
                0 as * const
                rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1
                ) ) . id as * const _ as usize } , 2usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1
                ) , "::" , stringify ! ( id ) ));
}
impl Clone for
 rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 {
    fn clone(&self) -> Self { *self }
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1>()
               , 4usize , concat ! (
               "Size of: " , stringify ! (
               rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 ) ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1>()
                , 4usize , concat ! (
                "Alignment of " , stringify ! (
                rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 ) ));
    assert_eq! (unsafe {
                & (
                * (
                0 as * const
                rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 ) ) . lo as
                * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 ) , "::" ,
                stringify ! ( lo ) ));
}
impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_1__bindgen_ty_1 {
    fn clone(&self) -> Self { *self }
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_1() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_3__bindgen_ty_1>() ,
               8usize , concat ! (
               "Size of: " , stringify ! (
               rte_mbuf__bindgen_ty_3__bindgen_ty_1 ) ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_3__bindgen_ty_1>()
                , 4usize , concat ! (
                "Alignment of " , stringify ! (
                rte_mbuf__bindgen_ty_3__bindgen_ty_1 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_1 ) )
                . hi as * const _ as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_mbuf__bindgen_ty_3__bindgen_ty_1 ) , "::" , stringify ! (
                hi ) ));
}
impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_1 {
    fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_3__bindgen_ty_2 {
    pub lo: u32,
    pub hi: u32,
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_3__bindgen_ty_2() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_3__bindgen_ty_2>() ,
               8usize , concat ! (
               "Size of: " , stringify ! (
               rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_3__bindgen_ty_2>()
                , 4usize , concat ! (
                "Alignment of " , stringify ! (
                rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) )
                . lo as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) , "::" , stringify ! (
                lo ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) )
                . hi as * const _ as usize } , 4usize , concat ! (
                "Alignment of field: " , stringify ! (
                rte_mbuf__bindgen_ty_3__bindgen_ty_2 ) , "::" , stringify ! (
                hi ) ));
}
impl Clone for rte_mbuf__bindgen_ty_3__bindgen_ty_2 {
    fn clone(&self) -> Self { *self }
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_3() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_3>() , 8usize ,
               concat ! ( "Size of: " , stringify ! ( rte_mbuf__bindgen_ty_3 )
               ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_3>() , 4usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_mbuf__bindgen_ty_3 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . rss as *
                const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_3
                ) , "::" , stringify ! ( rss ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . fdir as *
                const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_3
                ) , "::" , stringify ! ( fdir ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . sched as *
                const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_3
                ) , "::" , stringify ! ( sched ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_3 ) ) . usr as *
                const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_3
                ) , "::" , stringify ! ( usr ) ));
}
impl Clone for rte_mbuf__bindgen_ty_3 {
    fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_4 {
    /**< Can be used for external metadata */
    pub userdata: __BindgenUnionField<*mut ::std::os::raw::c_void>,
    /**< Allow 8-byte userdata on 32-bit */
    pub udata64: __BindgenUnionField<u64>,
    pub bindgen_union_field: u64,
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_4() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_4>() , 8usize ,
               concat ! ( "Size of: " , stringify ! ( rte_mbuf__bindgen_ty_4 )
               ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_4>() , 8usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_mbuf__bindgen_ty_4 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_4 ) ) . userdata as
                * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_4
                ) , "::" , stringify ! ( userdata ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_4 ) ) . udata64 as *
                const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_4
                ) , "::" , stringify ! ( udata64 ) ));
}
impl Clone for rte_mbuf__bindgen_ty_4 {
    fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_5 {
    /**< combined for easy fetch */
    pub tx_offload: __BindgenUnionField<u64>,
    pub __bindgen_anon_1: __BindgenUnionField<rte_mbuf__bindgen_ty_5__bindgen_ty_1>,
    pub bindgen_union_field: u64,
}
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mbuf__bindgen_ty_5__bindgen_ty_1 {
    pub _bitfield_1: u64,
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_5__bindgen_ty_1() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_5__bindgen_ty_1>() ,
               8usize , concat ! (
               "Size of: " , stringify ! (
               rte_mbuf__bindgen_ty_5__bindgen_ty_1 ) ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_5__bindgen_ty_1>()
                , 8usize , concat ! (
                "Alignment of " , stringify ! (
                rte_mbuf__bindgen_ty_5__bindgen_ty_1 ) ));
}
impl Clone for rte_mbuf__bindgen_ty_5__bindgen_ty_1 {
    fn clone(&self) -> Self { *self }
}
impl rte_mbuf__bindgen_ty_5__bindgen_ty_1 {
    #[inline]
    pub fn l2_len(&self) -> u64 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 & (127usize as u64)) >>
                                       0u32) as u64)
        }
    }
    #[inline]
    pub fn set_l2_len(&mut self, val: u64) {
        self._bitfield_1 &= !(127usize as u64);
        self._bitfield_1 |= ((val as u64 as u64) << 0u32) & (127usize as u64);
    }
    #[inline]
    pub fn l3_len(&self) -> u64 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 & (65408usize as u64)) >>
                                       7u32) as u64)
        }
    }
    #[inline]
    pub fn set_l3_len(&mut self, val: u64) {
        self._bitfield_1 &= !(65408usize as u64);
        self._bitfield_1 |=
            ((val as u64 as u64) << 7u32) & (65408usize as u64);
    }
    #[inline]
    pub fn l4_len(&self) -> u64 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 & (16711680usize as u64))
                                       >> 16u32) as u64)
        }
    }
    #[inline]
    pub fn set_l4_len(&mut self, val: u64) {
        self._bitfield_1 &= !(16711680usize as u64);
        self._bitfield_1 |=
            ((val as u64 as u64) << 16u32) & (16711680usize as u64);
    }
    #[inline]
    pub fn tso_segsz(&self) -> u64 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 &
                                        (1099494850560usize as u64)) >> 24u32)
                                      as u64)
        }
    }
    #[inline]
    pub fn set_tso_segsz(&mut self, val: u64) {
        self._bitfield_1 &= !(1099494850560usize as u64);
        self._bitfield_1 |=
            ((val as u64 as u64) << 24u32) & (1099494850560usize as u64);
    }
    #[inline]
    pub fn outer_l3_len(&self) -> u64 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 &
                                        (561850441793536usize as u64)) >>
                                       40u32) as u64)
        }
    }
    #[inline]
    pub fn set_outer_l3_len(&mut self, val: u64) {
        self._bitfield_1 &= !(561850441793536usize as u64);
        self._bitfield_1 |=
            ((val as u64 as u64) << 40u32) & (561850441793536usize as u64);
    }
    #[inline]
    pub fn outer_l2_len(&self) -> u64 {
        unsafe {
            ::std::mem::transmute(((self._bitfield_1 &
                                        (71494644084506624usize as u64)) >>
                                       49u32) as u64)
        }
    }
    #[inline]
    pub fn set_outer_l2_len(&mut self, val: u64) {
        self._bitfield_1 &= !(71494644084506624usize as u64);
        self._bitfield_1 |=
            ((val as u64 as u64) << 49u32) & (71494644084506624usize as u64);
    }
}
#[test]
fn bindgen_test_layout_rte_mbuf__bindgen_ty_5() {
    assert_eq!(::std::mem::size_of::<rte_mbuf__bindgen_ty_5>() , 8usize ,
               concat ! ( "Size of: " , stringify ! ( rte_mbuf__bindgen_ty_5 )
               ));
    assert_eq! (::std::mem::align_of::<rte_mbuf__bindgen_ty_5>() , 8usize ,
                concat ! (
                "Alignment of " , stringify ! ( rte_mbuf__bindgen_ty_5 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf__bindgen_ty_5 ) ) . tx_offload
                as * const _ as usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf__bindgen_ty_5
                ) , "::" , stringify ! ( tx_offload ) ));
}
impl Clone for rte_mbuf__bindgen_ty_5 {
    fn clone(&self) -> Self { *self }
}
#[test]
fn bindgen_test_layout_rte_mbuf() {
    assert_eq!(::std::mem::size_of::<rte_mbuf>() , 128usize , concat ! (
               "Size of: " , stringify ! ( rte_mbuf ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . cacheline0 as * const _ as
                usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( cacheline0 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . buf_addr as * const _ as
                usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( buf_addr ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . buf_physaddr as * const _
                as usize } , 8usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( buf_physaddr ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . buf_len as * const _ as
                usize } , 16usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( buf_len ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . rearm_data as * const _ as
                usize } , 18usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( rearm_data ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . data_off as * const _ as
                usize } , 18usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( data_off ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . nb_segs as * const _ as
                usize } , 22usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( nb_segs ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . port as * const _ as usize
                } , 23usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( port ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . ol_flags as * const _ as
                usize } , 24usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( ol_flags ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . rx_descriptor_fields1 as *
                const _ as usize } , 32usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( rx_descriptor_fields1 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . pkt_len as * const _ as
                usize } , 36usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( pkt_len ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . data_len as * const _ as
                usize } , 40usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( data_len ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . vlan_tci as * const _ as
                usize } , 42usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( vlan_tci ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . hash as * const _ as usize
                } , 44usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( hash ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . seqn as * const _ as usize
                } , 52usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( seqn ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . vlan_tci_outer as * const
                _ as usize } , 56usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( vlan_tci_outer ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . cacheline1 as * const _ as
                usize } , 64usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( cacheline1 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . pool as * const _ as usize
                } , 72usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( pool ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . next as * const _ as usize
                } , 80usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( next ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . priv_size as * const _ as
                usize } , 96usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( priv_size ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const rte_mbuf ) ) . timesync as * const _ as
                usize } , 98usize , concat ! (
                "Alignment of field: " , stringify ! ( rte_mbuf ) , "::" ,
                stringify ! ( timesync ) ));
}
impl Clone for rte_mbuf {
    fn clone(&self) -> Self { *self }
}
impl Default for rte_mbuf {
    fn default() -> Self { unsafe { ::std::mem::zeroed() } }
}
/**< Pool from which mbuf was allocated. */
#[repr(C)]
#[derive(Debug, Default, Copy)]
pub struct rte_mempool {
    pub _address: u8,
}
impl Clone for rte_mempool {
    fn clone(&self) -> Self { *self }
}
