1use std::io::{Read, Write};
16use std::net::Ipv4Addr;
17
18use crate::configuration::Configuration;
19use crate::error::*;
20
21pub trait Device: Read + Write {
23 type Queue: Read + Write;
24
25 fn configure(&mut self, config: &Configuration) -> Result<()> {
27 if let Some(ip) = config.address {
28 self.set_address(ip)?;
29 }
30
31 if let Some(ip) = config.destination {
32 self.set_destination(ip)?;
33 }
34
35 if let Some(ip) = config.broadcast {
36 self.set_broadcast(ip)?;
37 }
38
39 if let Some(ip) = config.netmask {
40 self.set_netmask(ip)?;
41 }
42
43 if let Some(mtu) = config.mtu {
44 self.set_mtu(mtu)?;
45 }
46
47 if let Some(enabled) = config.enabled {
48 self.enabled(enabled)?;
49 }
50
51 Ok(())
52 }
53
54 fn name(&self) -> &str;
56
57 fn set_name(&mut self, name: &str) -> Result<()>;
59
60 fn enabled(&mut self, value: bool) -> Result<()>;
62
63 fn address(&self) -> Result<Ipv4Addr>;
65
66 fn set_address(&mut self, value: Ipv4Addr) -> Result<()>;
68
69 fn destination(&self) -> Result<Ipv4Addr>;
71
72 fn set_destination(&mut self, value: Ipv4Addr) -> Result<()>;
74
75 fn broadcast(&self) -> Result<Ipv4Addr>;
77
78 fn set_broadcast(&mut self, value: Ipv4Addr) -> Result<()>;
80
81 fn netmask(&self) -> Result<Ipv4Addr>;
83
84 fn set_netmask(&mut self, value: Ipv4Addr) -> Result<()>;
86
87 fn mtu(&self) -> Result<i32>;
89
90 fn set_mtu(&mut self, value: i32) -> Result<()>;
92
93 fn queue_mut(&mut self, index: usize) -> Option<&mut Self::Queue>;
95
96 fn queue(&self, index: usize) -> Option<&Self::Queue>;
98
99 fn queues(self) -> Vec<Self::Queue>;
101}