pnetlink 0.0.3

Netlink library in pure rust
use pnet_macros_support::types::*;
use pnet::packet::PrimitiveValues;

#[packet]
pub struct Netlink {
    length: u32he,
    kind: u16he, // NOOP | ERROR | DONE | OVERRUN
    #[construct_with(u16he)] flags: NetlinkMsgFlags,
    seq: u32he,
    pid: u32he,
    #[payload]
    #[length_fn = "payload_length"]
    payload: Vec<u8>,
}

#[packet]
pub struct NetlinkError {
    error: u32he, // must be i32he
    #[payload] payload: Vec<u8>,
}

impl PrimitiveValues for NetlinkMsgFlags {
    type T = (u16,);
    fn to_primitive_values(&self) -> (u16,) {
        (self.bits(),)
    }
}

fn payload_length(pkt: &NetlinkPacket) -> usize {
    pkt.get_length() as usize - 16
}