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
use super::{Header, PacketData, Protocol, ParseError};
use crate::AsBeBytes;

#[derive(AddGetter, AddSetter)]
pub struct EthernetHeader {
    #[get]
    dst_mac: [u8; 6],

    #[get]
    src_mac: [u8; 6],

    #[get]
    #[set]
    eth_type: u16,

}

impl EthernetHeader {
    pub fn new(src_mac: [u8; 6], dst_mac: [u8; 6], eth_type: u16) -> Self {
        EthernetHeader {
            dst_mac: dst_mac,
            src_mac: src_mac,
            eth_type: eth_type,
        }
    }
}

impl Header for EthernetHeader {
    #[allow(unused_variables)]
    fn make(self) -> PacketData {
        let tyb = self.eth_type.split_to_bytes();
        let dst_mac: [u8; 6] = self.dst_mac.into();
        let src_mac: [u8; 6] = self.src_mac.into();
        vec![
            dst_mac[0],
            dst_mac[1],
            dst_mac[2],
            dst_mac[3],
            dst_mac[4],
            dst_mac[5],
            src_mac[0],
            src_mac[1],
            src_mac[2],
            src_mac[3],
            src_mac[4],
            src_mac[5],
            tyb[0],
            tyb[1],
        ]
    }

    fn parse(raw_data: &[u8]) -> Result<Box<Self>, ParseError> {
        if raw_data.len() < Self::get_min_length().into() {
            return Err(ParseError::InvalidLength);
        }
        Ok(Box::new(Self {
            dst_mac: [raw_data[0], raw_data[1], raw_data[2], raw_data[3], raw_data[4], raw_data[5]],
            src_mac: [raw_data[6], raw_data[7], raw_data[8], raw_data[9], raw_data[10], raw_data[11]],
            eth_type: ((raw_data[12] as u16) << 8) + raw_data[13] as u16,
        }))
    }

    fn get_proto(&self) -> Protocol {
        Protocol::ETH
    }

    fn get_length(&self) -> u8 {
        14
    }

    fn get_min_length() -> u8 {
        14
    }
}