cross_socket/packet/
gre.rs

1/// GRE packet format
2pub struct GrePacket {
3    pub checksum_present: u8,
4    pub routing_present: u8,
5    pub key_present: u8,
6    pub sequence_present: u8,
7    pub strict_source_route: u8,
8    pub recursion_control: u8,
9    pub zero_flags: u8,
10    pub version: u8,
11    pub protocol_type: u16,
12    pub checksum: Vec<u16>,
13    pub offset: Vec<u16>,
14    pub key: Vec<u16>,
15    pub sequence: Vec<u32>,
16    pub routing: Vec<u8>,
17    pub payload: Vec<u8>,
18}
19
20impl GrePacket {
21    pub fn gre_checksum_length(gre: &Self) -> usize {
22        (gre.checksum_present | gre.routing_present) as usize * 2
23    }
24    pub fn gre_offset_length(gre: &Self) -> usize {
25        (gre.checksum_present | gre.routing_present) as usize * 2
26    }
27    pub fn gre_key_length(gre: &Self) -> usize {
28        gre.key_present as usize * 4
29    }
30    pub fn gre_sequence_length(gre: &Self) -> usize {
31        gre.sequence_present as usize * 4
32    }
33    pub fn gre_routing_length(gre: &Self) -> usize {
34        if 0 == gre.routing_present {
35            0
36        } else {
37            panic!("Source routed GRE packets not supported")
38        }
39    }
40}