#[doc(hidden)]
#[repr(C)]
pub struct NetlinkAttribute<V: Sized>
{
header: nlattr,
payload: NetlinkAttributePayload<V>,
}
impl<V> NetlinkAttributeOrFollowedByNetlinkAttribute for NetlinkAttribute<V>
{
}
impl<V: NetlinkAttributeOrFollowedByNetlinkAttribute> NetlinkAttribute<V>
{
#[inline(always)]
fn nested(netlink_attribute_type: impl NetlinkAttributeType, payload: V) -> Self
{
Self::new(netlink_attribute_type.to_u16() | nlattr::NLA_F_NESTED, payload)
}
}
impl<V: Sized> NetlinkAttribute<V>
{
#[inline(always)]
pub(crate) fn followed_by<Following: NetlinkAttributeOrFollowedByNetlinkAttribute>(self, following: Following) -> NetlinkAttributeFollowedByNetlinkAttribute<V, Following>
{
NetlinkAttributeFollowedByNetlinkAttribute
{
current: self,
following,
}
}
#[inline(always)]
pub(crate) fn followed_by_attribute<Following: Sized>(self, netlink_attribute_type: impl NetlinkAttributeType, payload: Following) -> NetlinkAttributeFollowedByNetlinkAttribute<V, NetlinkAttribute<Following>>
{
self.followed_by(attribute(netlink_attribute_type, payload))
}
#[inline(always)]
fn leaf(netlink_attribute_type: impl NetlinkAttributeType, payload: V) -> Self
{
Self::new(netlink_attribute_type.to_u16(), payload)
}
#[inline(always)]
fn leaf_network_byte_order(netlink_attribute_type: impl NetlinkAttributeType, payload: V) -> Self
{
Self::new(netlink_attribute_type.to_u16() | nlattr::NLA_F_NET_BYTEORDER, payload)
}
#[inline(always)]
fn new(netlink_attribute_type: u16, payload: V) -> Self
{
Self
{
header: nlattr
{
nla_type: netlink_attribute_type,
nla_len: nlattr::compute_nla_len::<V>(),
},
payload: NetlinkAttributePayload(payload),
}
}
}