netsim_embed_core/
packet.rs1use libpacket::ip::IpNextHeaderProtocols;
2use libpacket::ipv4::{self, Ipv4Packet, MutableIpv4Packet};
3use libpacket::tcp::{self, MutableTcpPacket, TcpPacket};
4use libpacket::udp::{self, MutableUdpPacket, UdpPacket};
5use libpacket::{MutablePacket, Packet as _};
6use std::net::SocketAddrV4;
7
8#[derive(Clone, Copy, Debug)]
9pub enum Protocol {
10 Udp,
11 Tcp,
12}
13
14#[derive(Debug)]
15pub struct Packet<'a> {
16 protocol: Protocol,
17 bytes: &'a mut [u8],
18}
19
20impl<'a> Packet<'a> {
21 pub fn new(bytes: &'a mut [u8]) -> Option<Self> {
22 let packet = Ipv4Packet::new(bytes)?;
23 let protocol = match packet.get_next_level_protocol() {
24 IpNextHeaderProtocols::Udp => {
25 UdpPacket::new(packet.payload())?;
26 Protocol::Udp
27 }
28 IpNextHeaderProtocols::Tcp => {
29 TcpPacket::new(packet.payload())?;
30 Protocol::Tcp
31 }
32 _ => return None,
33 };
34 Some(Self { protocol, bytes })
35 }
36
37 pub fn get_source(&self) -> SocketAddrV4 {
38 let packet = Ipv4Packet::new(self.bytes).unwrap();
39 let ip = packet.get_source();
40 let port = match self.protocol {
41 Protocol::Udp => UdpPacket::new(packet.payload()).unwrap().get_source(),
42 Protocol::Tcp => TcpPacket::new(packet.payload()).unwrap().get_source(),
43 };
44 SocketAddrV4::new(ip, port)
45 }
46
47 pub fn get_destination(&self) -> SocketAddrV4 {
48 let packet = Ipv4Packet::new(self.bytes).unwrap();
49 let ip = packet.get_destination();
50 let port = match self.protocol {
51 Protocol::Udp => UdpPacket::new(packet.payload()).unwrap().get_destination(),
52 Protocol::Tcp => TcpPacket::new(packet.payload()).unwrap().get_destination(),
53 };
54 SocketAddrV4::new(ip, port)
55 }
56
57 pub fn get_ttl(&self) -> u8 {
58 Ipv4Packet::new(self.bytes).unwrap().get_ttl()
59 }
60
61 pub fn protocol(&self) -> Protocol {
62 self.protocol
63 }
64
65 pub fn set_source(&mut self, addr: SocketAddrV4) {
66 let mut packet = MutableIpv4Packet::new(self.bytes).unwrap();
67 packet.set_source(*addr.ip());
68 match self.protocol {
69 Protocol::Udp => {
70 let mut udp = MutableUdpPacket::new(packet.payload_mut()).unwrap();
71 udp.set_source(addr.port());
72 }
73 Protocol::Tcp => {
74 let mut tcp = MutableTcpPacket::new(packet.payload_mut()).unwrap();
75 tcp.set_source(addr.port());
76 }
77 }
78 }
79
80 pub fn set_destination(&mut self, addr: SocketAddrV4) {
81 let mut packet = MutableIpv4Packet::new(self.bytes).unwrap();
82 packet.set_destination(*addr.ip());
83 match self.protocol {
84 Protocol::Udp => {
85 let mut udp = MutableUdpPacket::new(packet.payload_mut()).unwrap();
86 udp.set_destination(addr.port());
87 }
88 Protocol::Tcp => {
89 let mut tcp = MutableTcpPacket::new(packet.payload_mut()).unwrap();
90 tcp.set_destination(addr.port());
91 }
92 }
93 }
94
95 pub fn set_ttl(&mut self, ttl: u8) {
96 MutableIpv4Packet::new(self.bytes).unwrap().set_ttl(ttl)
97 }
98
99 pub fn set_checksum(&mut self) {
100 let mut packet = MutableIpv4Packet::new(self.bytes).unwrap();
101 let source = packet.get_source();
102 let dest = packet.get_destination();
103 packet.set_checksum(ipv4::checksum(&packet.to_immutable()));
104 match self.protocol {
105 Protocol::Udp => {
106 let mut udp = MutableUdpPacket::new(packet.payload_mut()).unwrap();
107 udp.set_checksum(udp::ipv4_checksum(&udp.to_immutable(), &source, &dest));
108 }
109 Protocol::Tcp => {
110 let mut tcp = MutableTcpPacket::new(packet.payload_mut()).unwrap();
111 tcp.set_checksum(tcp::ipv4_checksum(&tcp.to_immutable(), &source, &dest));
112 }
113 }
114 }
115}