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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use std::fmt;
use std::str::FromStr;
use std::num::ParseIntError;
use producer::{DATABASE, Producer};
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub struct HwAddr {
value: [u8; 6]
}
impl HwAddr {
pub fn is_broadcast(&self) -> bool {
self.value == [0xff, 0xff, 0xff, 0xff, 0xff, 0xff]
}
pub fn producer(&self) -> Option<&Producer> {
DATABASE.get(&self.value[0 .. 3])
}
}
impl FromStr for HwAddr {
type Err = ParseIntError;
fn from_str(value: &str) -> Result<Self, Self::Err> {
let mut result = [0; 6];
for (i, byte) in value.split(":").enumerate() {
if i > 5 {
u8::from_str_radix("error", 10)?;
}
result[i] = u8::from_str_radix(byte, 16)?;
}
Ok(HwAddr {
value: result
})
}
}
impl From<u32> for HwAddr {
fn from(value: u32) -> HwAddr {
let mut value = value;
let mut result = [0u8; 6];
for i in 0 .. 6 {
result[i] = (value & 0xff) as u8;
value >>= 8;
}
HwAddr {
value: result
}
}
}
impl From<[u8; 6]> for HwAddr {
fn from(value: [u8; 6]) -> HwAddr {
HwAddr {
value: value
}
}
}
impl<'a> From<&'a [u8]> for HwAddr {
fn from(value: &'a [u8]) -> HwAddr {
HwAddr {
value: [value[0], value[1], value[2], value[3], value[4], value[5]]
}
}
}
impl fmt::Display for HwAddr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:X}:{:X}:{:X}:{:X}:{:X}:{:X}",
self.value[0], self.value[1], self.value[2],
self.value[3], self.value[4], self.value[5])
}
}