1use std::io::{Read, Write};
16use std::net::Ipv4Addr;
17use std::os::fd::AsRawFd;
18
19use crate::configuration::Configuration;
20use crate::error::*;
21
22pub trait Device: Read + Write + AsRawFd {
24 type Queue: Read + Write;
25
26 fn configure(&mut self, config: &Configuration) -> Result<()> {
28 if let Some(ip) = config.address {
29 self.set_address(ip)?;
30 }
31
32 if let Some(ip) = config.destination {
33 self.set_destination(ip)?;
34 }
35
36 if let Some(ip) = config.broadcast {
37 self.set_broadcast(ip)?;
38 }
39
40 if let Some(ip) = config.netmask {
41 self.set_netmask(ip)?;
42 }
43
44 if let Some(mtu) = config.mtu {
45 self.set_mtu(mtu)?;
46 }
47
48 if let Some(enabled) = config.enabled {
49 self.enabled(enabled)?;
50 }
51
52 Ok(())
53 }
54
55 fn name(&self) -> &str;
57
58 fn set_name(&mut self, name: &str) -> Result<()>;
60
61 fn enabled(&mut self, value: bool) -> Result<()>;
63
64 fn address(&self) -> Result<Ipv4Addr>;
66
67 fn set_address(&mut self, value: Ipv4Addr) -> Result<()>;
69
70 fn destination(&self) -> Result<Ipv4Addr>;
72
73 fn set_destination(&mut self, value: Ipv4Addr) -> Result<()>;
75
76 fn broadcast(&self) -> Result<Ipv4Addr>;
78
79 fn set_broadcast(&mut self, value: Ipv4Addr) -> Result<()>;
81
82 fn netmask(&self) -> Result<Ipv4Addr>;
84
85 fn set_netmask(&mut self, value: Ipv4Addr) -> Result<()>;
87
88 fn mtu(&self) -> Result<i32>;
90
91 fn set_mtu(&mut self, value: i32) -> Result<()>;
93
94 fn queue(&mut self, index: usize) -> Option<&mut Self::Queue>;
96}