netlink_rust/
route.rs

1use std::io::{Read, Write, Seek};
2use libc;
3
4use errors::Result;
5use core::{Sendable, Attribute, parse_attributes,
6    MessageFlags, NativeRead, NativeWrite, ConvertFrom};
7
8/// Family Id?!?
9/// From Linux kernel header
10extended_enum!(FamilyId, u16,
11    NewLink => 16,
12    DeleteLink => 17,
13    GetLink => 18,
14    SetLink => 19,
15);
16
17extended_enum_default!(AddressFamilyAttribute, u16,
18    Unspecified => 0,
19    Address => 1,
20    Broadcast => 2,
21    InterfaceName => 3,
22    MTU => 4,
23    Link => 5,
24    QDisc => 6,
25    Stats => 7,
26    Cost => 8,
27    Priority => 9,
28    Master => 10,
29    WirelessExtension => 11,
30    ProtocolInformation => 12,
31    TransmitQueueLength => 13,
32    Map => 14,
33    Weight => 15,
34    OperationState => 16,
35    LinkMode => 17,
36    LinkInfo => 18,
37    NetworkNameSpacePid => 19,
38    InterfaceAlias => 20,
39    NumberVf => 21,
40    VfInfoList => 22,
41    Stats64 => 23,
42    VfPorts => 24,
43    PortSelf => 25,
44    AfSpecification => 26,
45    Group => 27,
46    NetworkNameSpaceFileDescriptor => 28,
47    ExtendedMask => 29,
48    PromiscuityCount => 30,
49    TransmitQueueCount => 31,
50    ReceiveQueueCount => 32,
51    Carrier => 33,
52    PhysPortId => 34,
53    CarrierChanges => 35,
54    PhysSwitchId => 36,
55    LinkNetworkNameSpaceId => 37,
56    PhysPortName => 38,
57    ProtocolDown => 39,
58    GsoMaximumSegs => 40,
59    GsoMaximumSize => 41,
60    Padding => 42,
61    Xdp => 43,
62    Event => 44,
63    NewNetworkNameSpaceId => 45,
64    InterfaceNetworkNameSpaceId => 46,
65);
66
67pub struct Message {
68    pub family: u16,
69    pub attributes: Vec<Attribute>,
70}
71
72impl Message {
73    pub fn new<F: Into<u16>>(family: F) -> Message {
74        return Message { family: family.into(), attributes: vec!(), };
75    }
76}
77
78impl Sendable for Message {
79    fn write<W: Write>(&self, writer: &mut W) -> Result<()> {
80        let kind: u8 = libc::AF_PACKET as u8;
81        kind.write(writer)?;
82        for attr in self.attributes.iter() {
83            attr.write(writer)?;
84        }
85        Ok(())
86    }
87    fn message_type(&self) -> u16 { self.family }
88
89    fn query_flags(&self) -> MessageFlags {
90        MessageFlags::REQUEST | MessageFlags::DUMP
91    }
92}
93
94pub struct InterfaceInformationMessage {
95    pub family: u8,
96    pub kind: u16,
97    pub index: i32,
98    pub flags: u32,
99    pub change: u32,
100    pub attributes: Vec<Attribute>,
101}
102
103impl InterfaceInformationMessage {
104    pub fn parse<R: Read + Seek>(reader: &mut R) -> Result<InterfaceInformationMessage> {
105        let family = u8::read(reader)?;
106        let _ = u8::read(reader)?;
107        let kind = u16::read(reader)?;
108        let index = i32::read(reader)?;
109        let flags = u32::read(reader)?;
110        let change = u32::read(reader)?;
111        let attributes = parse_attributes(reader);
112        Ok(InterfaceInformationMessage {
113            family: family,
114            kind: kind,
115            index: index,
116            flags: flags,
117            change: change,
118            attributes: attributes,
119            })
120    }
121}