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
#![macro_use]
pub trait Packet {
fn packet(&self) -> &[u8];
fn payload(&self) -> &[u8];
}
pub trait MutablePacket : Packet {
fn packet_mut(&mut self) -> &mut [u8];
fn payload_mut(&mut self) -> &mut [u8];
fn clone_from<T: Packet>(&mut self, other: &T) {
use std::ptr;
assert!(self.packet().len() >= other.packet().len());
unsafe {
ptr::copy_nonoverlapping(other.packet().as_ptr(),
self.packet_mut().as_mut_ptr(),
other.packet().len());
}
}
}
pub trait FromPacket : Packet {
type T;
fn from_packet(&self) -> Self::T;
}
pub trait PacketSize : Packet {
fn packet_size(&self) -> usize;
}
pub trait PrimitiveValues {
type T;
fn to_primitive_values(&self) -> Self::T;
}
impl PrimitiveValues for ::std::net::Ipv4Addr {
type T = (u8, u8, u8, u8);
fn to_primitive_values(&self) -> (u8, u8, u8, u8) {
let octets = self.octets();
(octets[0], octets[1], octets[2], octets[3])
}
}
impl PrimitiveValues for ::std::net::Ipv6Addr {
type T = (u16, u16, u16, u16, u16, u16, u16, u16);
fn to_primitive_values(&self) -> (u16, u16, u16, u16, u16, u16, u16, u16) {
let segments = self.segments();
(segments[0],
segments[1],
segments[2],
segments[3],
segments[4],
segments[5],
segments[6],
segments[7])
}
}
pub mod ethernet;
pub mod gre;
pub mod ip;
pub mod ipv4;
pub mod ipv6;
pub mod udp;
pub mod tcp;
pub mod arp;
pub mod icmp;
pub mod vlan;