1use std::io::{Read, Write, Seek};
2use libc;
3
4use errors::Result;
5use core::{Sendable, Attribute, parse_attributes,
6 MessageFlags, NativeRead, NativeWrite, ConvertFrom};
7
8extended_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}