xenet_packet_builder/
builder.rs1use xenet_packet::ethernet::ETHERNET_HEADER_LEN;
2use xenet_packet::ipv4::IPV4_HEADER_LEN;
3use xenet_packet::ipv6::IPV6_HEADER_LEN;
4
5use crate::arp::ArpPacketBuilder;
6use crate::ethernet::EthernetPacketBuilder;
7use crate::icmp::IcmpPacketBuilder;
8use crate::icmpv6::Icmpv6PacketBuilder;
9use crate::ipv4::Ipv4PacketBuilder;
10use crate::ipv6::Ipv6PacketBuilder;
11use crate::ndp::NdpPacketBuilder;
12use crate::tcp::TcpPacketBuilder;
13use crate::udp::UdpPacketBuilder;
14
15#[derive(Clone, Debug)]
17pub struct PacketBuilder {
18 packet: Vec<u8>,
19}
20
21impl PacketBuilder {
22 pub fn new() -> Self {
24 PacketBuilder { packet: Vec::new() }
25 }
26 pub fn packet(&self) -> Vec<u8> {
28 self.packet.clone()
29 }
30 pub fn ip_packet(&self) -> Vec<u8> {
32 if self.packet.len() < ETHERNET_HEADER_LEN {
33 return Vec::new();
34 }
35 self.packet[ETHERNET_HEADER_LEN..].to_vec()
36 }
37 pub fn set_ethernet(&mut self, packet_builder: EthernetPacketBuilder) {
39 if self.packet.len() < ETHERNET_HEADER_LEN {
40 self.packet.resize(ETHERNET_HEADER_LEN, 0);
41 }
42 self.packet[0..ETHERNET_HEADER_LEN].copy_from_slice(&packet_builder.build());
43 }
44 pub fn set_arp(&mut self, packet_builder: ArpPacketBuilder) {
46 let arp_packet = packet_builder.build();
47 if self.packet.len() < ETHERNET_HEADER_LEN + arp_packet.len() {
48 self.packet
49 .resize(ETHERNET_HEADER_LEN + arp_packet.len(), 0);
50 }
51 self.packet[ETHERNET_HEADER_LEN..ETHERNET_HEADER_LEN + arp_packet.len()]
52 .copy_from_slice(&arp_packet);
53 }
54 pub fn set_ipv4(&mut self, packet_builder: Ipv4PacketBuilder) {
56 let ipv4_packet = packet_builder.build();
57 if self.packet.len() < ETHERNET_HEADER_LEN + ipv4_packet.len() {
58 self.packet
59 .resize(ETHERNET_HEADER_LEN + ipv4_packet.len(), 0);
60 }
61 self.packet[ETHERNET_HEADER_LEN..ETHERNET_HEADER_LEN + ipv4_packet.len()]
62 .copy_from_slice(&ipv4_packet);
63 }
64 pub fn set_ipv6(&mut self, packet_builder: Ipv6PacketBuilder) {
66 let ipv6_packet = packet_builder.build();
67 if self.packet.len() < ETHERNET_HEADER_LEN + ipv6_packet.len() {
68 self.packet
69 .resize(ETHERNET_HEADER_LEN + ipv6_packet.len(), 0);
70 }
71 self.packet[ETHERNET_HEADER_LEN..ETHERNET_HEADER_LEN + ipv6_packet.len()]
72 .copy_from_slice(&ipv6_packet);
73 }
74 pub fn set_icmp(&mut self, packet_builder: IcmpPacketBuilder) {
76 let icmp_packet = packet_builder.build();
77 if self.packet.len() < ETHERNET_HEADER_LEN + IPV4_HEADER_LEN + icmp_packet.len() {
78 self.packet
79 .resize(ETHERNET_HEADER_LEN + IPV4_HEADER_LEN + icmp_packet.len(), 0);
80 }
81 self.packet[ETHERNET_HEADER_LEN + IPV4_HEADER_LEN
82 ..ETHERNET_HEADER_LEN + IPV4_HEADER_LEN + icmp_packet.len()]
83 .copy_from_slice(&icmp_packet);
84 }
85 pub fn set_icmpv6(&mut self, packet_builder: Icmpv6PacketBuilder) {
87 let icmpv6_packet = packet_builder.build();
88 if self.packet.len() < ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + icmpv6_packet.len() {
89 self.packet.resize(
90 ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + icmpv6_packet.len(),
91 0,
92 );
93 }
94 self.packet[ETHERNET_HEADER_LEN + IPV6_HEADER_LEN
95 ..ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + icmpv6_packet.len()]
96 .copy_from_slice(&icmpv6_packet);
97 }
98 pub fn set_ndp(&mut self, packet_builder: NdpPacketBuilder) {
100 let ndp_packet = packet_builder.build();
101 if self.packet.len() < ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + ndp_packet.len() {
102 self.packet
103 .resize(ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + ndp_packet.len(), 0);
104 }
105 self.packet[ETHERNET_HEADER_LEN + IPV6_HEADER_LEN
106 ..ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + ndp_packet.len()]
107 .copy_from_slice(&ndp_packet);
108 }
109 pub fn set_tcp(&mut self, packet_builder: TcpPacketBuilder) {
111 let tcp_packet = packet_builder.build();
112 if packet_builder.dst_ip.is_ipv4() {
113 if self.packet.len() < ETHERNET_HEADER_LEN + IPV4_HEADER_LEN + tcp_packet.len() {
114 self.packet
115 .resize(ETHERNET_HEADER_LEN + IPV4_HEADER_LEN + tcp_packet.len(), 0);
116 }
117 self.packet[ETHERNET_HEADER_LEN + IPV4_HEADER_LEN
118 ..ETHERNET_HEADER_LEN + IPV4_HEADER_LEN + tcp_packet.len()]
119 .copy_from_slice(&tcp_packet);
120 } else if packet_builder.dst_ip.is_ipv6() {
121 if self.packet.len() < ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + tcp_packet.len() {
122 self.packet
123 .resize(ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + tcp_packet.len(), 0);
124 }
125 self.packet[ETHERNET_HEADER_LEN + IPV6_HEADER_LEN
126 ..ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + tcp_packet.len()]
127 .copy_from_slice(&tcp_packet);
128 }
129 }
130 pub fn set_udp(&mut self, packet_builder: UdpPacketBuilder) {
132 let udp_packet = packet_builder.build();
133 if packet_builder.dst_ip.is_ipv4() {
134 if self.packet.len() < ETHERNET_HEADER_LEN + IPV4_HEADER_LEN + udp_packet.len() {
135 self.packet
136 .resize(ETHERNET_HEADER_LEN + IPV4_HEADER_LEN + udp_packet.len(), 0);
137 }
138 self.packet[ETHERNET_HEADER_LEN + IPV4_HEADER_LEN
139 ..ETHERNET_HEADER_LEN + IPV4_HEADER_LEN + udp_packet.len()]
140 .copy_from_slice(&udp_packet);
141 } else if packet_builder.dst_ip.is_ipv6() {
142 if self.packet.len() < ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + udp_packet.len() {
143 self.packet
144 .resize(ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + udp_packet.len(), 0);
145 }
146 self.packet[ETHERNET_HEADER_LEN + IPV6_HEADER_LEN
147 ..ETHERNET_HEADER_LEN + IPV6_HEADER_LEN + udp_packet.len()]
148 .copy_from_slice(&udp_packet);
149 }
150 }
151}