/* 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 _bindgen_ty_1 {
    /**< An internal counter value. */
    pub cnt: i16,
}
#[test]
fn bindgen_test_layout__bindgen_ty_1() {
    assert_eq!(::std::mem::size_of::<_bindgen_ty_1>() , 2usize , concat ! (
               "Size of: " , stringify ! ( _bindgen_ty_1 ) ));
    assert_eq! (::std::mem::align_of::<_bindgen_ty_1>() , 2usize , concat ! (
                "Alignment of " , stringify ! ( _bindgen_ty_1 ) ));
    assert_eq! (unsafe {
                & ( * ( 0 as * const _bindgen_ty_1 ) ) . cnt as * const _ as
                usize } , 0usize , concat ! (
                "Alignment of field: " , stringify ! ( _bindgen_ty_1 ) , "::"
                , stringify ! ( cnt ) ));
}
impl Clone for _bindgen_ty_1 {
    fn clone(&self) -> Self { *self }
}
pub type rte_atomic16_t = _bindgen_ty_1;
/**
 * 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 }
}
