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
98
99
100
101
102
103
104
105
pub mod udp;
pub mod tcp;
use super::*;
use std::io;
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum TransportHeader {
Udp(udp::UdpHeader),
Tcp(tcp::TcpHeader)
}
impl TransportHeader {
pub fn udp(self) -> Option<udp::UdpHeader> {
use crate::TransportHeader::*;
match self {
Udp(value) => Some(value),
Tcp(_) => None
}
}
pub fn mut_udp(&mut self) -> Option<&mut udp::UdpHeader> {
use crate::TransportHeader::*;
match self {
Udp(ref mut value) => Some(value),
Tcp(_) => None
}
}
pub fn tcp(self) -> Option<tcp::TcpHeader> {
use crate::TransportHeader::*;
match self {
Udp(_) => None,
Tcp(value) => Some(value)
}
}
pub fn mut_tcp(&mut self) -> Option<&mut tcp::TcpHeader> {
use crate::TransportHeader::*;
match self {
Udp(_) => None,
Tcp(ref mut value) => Some(value)
}
}
pub fn header_len(&self) -> usize {
use crate::TransportHeader::*;
match self {
Udp(_) => udp::UdpHeader::SERIALIZED_SIZE,
Tcp(value) => usize::from(value.header_len())
}
}
pub fn update_checksum_ipv4(&mut self, ip_header: &Ipv4Header, payload: &[u8]) -> Result<(), ValueError> {
use crate::TransportHeader::*;
match self {
Udp(header) => {
header.checksum = header.calc_checksum_ipv4(ip_header, payload)?;
},
Tcp(header) => {
header.checksum = header.calc_checksum_ipv4(ip_header, payload)?;
}
}
Ok(())
}
pub fn update_checksum_ipv6(&mut self, ip_header: &Ipv6Header, payload: &[u8]) -> Result<(), ValueError> {
use crate::TransportHeader::*;
match self {
Udp(header) => {
header.checksum = header.calc_checksum_ipv6(ip_header, payload)?;
},
Tcp(header) => {
header.checksum = header.calc_checksum_ipv6(ip_header, payload)?;
}
}
Ok(())
}
pub fn write<T: io::Write + Sized>(&self, writer: &mut T) -> Result<(), WriteError> {
use crate::TransportHeader::*;
match self {
Udp(value) => value.write(writer),
Tcp(value) => value.write(writer).map_err(WriteError::from)
}
}
}