1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Copyright (C) 2018 - Will Glozer. All rights reserved.

use std::convert::TryFrom;
use crate::{MacAddress, Message};
use crate::api::IFLA;
use crate::err::Invalid;
use crate::ffi::*;

#[derive(Default, Debug)]
pub struct Link {
    pub index: u32,
    pub name:  String,
    pub flags: u32,
    pub mac:   MacAddress,
    pub mtu:   u32,
}

pub fn link(msg: &Message<ifinfomsg>) -> Result<Link, Invalid> {
    let mut link = Link::default();

    link.index = msg.ifi_index as u32;
    link.flags = msg.ifi_flags as u32;

    for attr in msg.attrs() {
        match attr? {
            IFLA::Address(octets) => link.mac  = MacAddress::try_from(octets)?,
            IFLA::IFName(name)    => link.name = name.to_string(),
            IFLA::MTU(mtu)        => link.mtu  = mtu,
            _                     => (),
        }
    }

    Ok(link)
}