1use crate::datalink;
2use crate::packet;
3use crate::packet::{ethernet, ip};
4use pnet::packet::Packet;
5use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
6
7#[derive(Clone, Debug)]
9pub struct PacketBuilder {
10 packet: Vec<u8>,
11}
12
13impl PacketBuilder {
14 pub fn new() -> Self {
16 PacketBuilder { packet: Vec::new() }
17 }
18 pub fn packet(&self) -> Vec<u8> {
20 self.packet.clone()
21 }
22 pub fn ip_packet(&self) -> Vec<u8> {
24 if self.packet.len() < packet::ethernet::ETHERNET_HEADER_LEN {
25 return Vec::new();
26 }
27 self.packet[packet::ethernet::ETHERNET_HEADER_LEN..].to_vec()
28 }
29 pub fn set_ethernet(&mut self, packet_builder: packet::ethernet::EthernetPacketBuilder) {
31 if self.packet.len() < packet::ethernet::ETHERNET_HEADER_LEN {
32 self.packet.resize(packet::ethernet::ETHERNET_HEADER_LEN, 0);
33 }
34 self.packet[0..packet::ethernet::ETHERNET_HEADER_LEN]
35 .copy_from_slice(&packet_builder.build());
36 }
37 pub fn set_arp(&mut self, packet_builder: packet::arp::ArpPacketBuilder) {
39 let arp_packet = packet_builder.build();
40 if self.packet.len() < packet::ethernet::ETHERNET_HEADER_LEN + arp_packet.len() {
41 self.packet
42 .resize(packet::ethernet::ETHERNET_HEADER_LEN + arp_packet.len(), 0);
43 }
44 self.packet[packet::ethernet::ETHERNET_HEADER_LEN
45 ..packet::ethernet::ETHERNET_HEADER_LEN + arp_packet.len()]
46 .copy_from_slice(&arp_packet);
47 }
48 pub fn set_ipv4(&mut self, packet_builder: packet::ipv4::Ipv4PacketBuilder) {
50 let ipv4_packet = packet_builder.build();
51 if self.packet.len() < packet::ethernet::ETHERNET_HEADER_LEN + ipv4_packet.len() {
52 self.packet
53 .resize(packet::ethernet::ETHERNET_HEADER_LEN + ipv4_packet.len(), 0);
54 }
55 self.packet[packet::ethernet::ETHERNET_HEADER_LEN
56 ..packet::ethernet::ETHERNET_HEADER_LEN + ipv4_packet.len()]
57 .copy_from_slice(&ipv4_packet);
58 }
59 pub fn set_ipv6(&mut self, packet_builder: packet::ipv6::Ipv6PacketBuilder) {
61 let ipv6_packet = packet_builder.build();
62 if self.packet.len() < packet::ethernet::ETHERNET_HEADER_LEN + ipv6_packet.len() {
63 self.packet
64 .resize(packet::ethernet::ETHERNET_HEADER_LEN + ipv6_packet.len(), 0);
65 }
66 self.packet[packet::ethernet::ETHERNET_HEADER_LEN
67 ..packet::ethernet::ETHERNET_HEADER_LEN + ipv6_packet.len()]
68 .copy_from_slice(&ipv6_packet);
69 }
70 pub fn set_icmp(&mut self, packet_builder: packet::icmp::IcmpPacketBuilder) {
72 let icmp_packet = packet_builder.build();
73 if self.packet.len()
74 < packet::ethernet::ETHERNET_HEADER_LEN
75 + packet::ipv4::IPV4_HEADER_LEN
76 + icmp_packet.len()
77 {
78 self.packet.resize(
79 packet::ethernet::ETHERNET_HEADER_LEN
80 + packet::ipv4::IPV4_HEADER_LEN
81 + icmp_packet.len(),
82 0,
83 );
84 }
85 self.packet[packet::ethernet::ETHERNET_HEADER_LEN + packet::ipv4::IPV4_HEADER_LEN
86 ..packet::ethernet::ETHERNET_HEADER_LEN
87 + packet::ipv4::IPV4_HEADER_LEN
88 + icmp_packet.len()]
89 .copy_from_slice(&icmp_packet);
90 }
91 pub fn set_icmpv6(&mut self, packet_builder: packet::icmpv6::Icmpv6PacketBuilder) {
93 let icmpv6_packet = packet_builder.build();
94 if self.packet.len()
95 < packet::ethernet::ETHERNET_HEADER_LEN
96 + packet::ipv6::IPV6_HEADER_LEN
97 + icmpv6_packet.len()
98 {
99 self.packet.resize(
100 packet::ethernet::ETHERNET_HEADER_LEN
101 + packet::ipv6::IPV6_HEADER_LEN
102 + icmpv6_packet.len(),
103 0,
104 );
105 }
106 self.packet[packet::ethernet::ETHERNET_HEADER_LEN + packet::ipv6::IPV6_HEADER_LEN
107 ..packet::ethernet::ETHERNET_HEADER_LEN
108 + packet::ipv6::IPV6_HEADER_LEN
109 + icmpv6_packet.len()]
110 .copy_from_slice(&icmpv6_packet);
111 }
112 pub fn set_tcp(&mut self, packet_builder: packet::tcp::TcpPacketBuilder) {
114 let tcp_packet = packet_builder.build();
115 if packet_builder.dst_ip.is_ipv4() {
116 if self.packet.len()
117 < packet::ethernet::ETHERNET_HEADER_LEN
118 + packet::ipv4::IPV4_HEADER_LEN
119 + tcp_packet.len()
120 {
121 self.packet.resize(
122 packet::ethernet::ETHERNET_HEADER_LEN
123 + packet::ipv4::IPV4_HEADER_LEN
124 + tcp_packet.len(),
125 0,
126 );
127 }
128 self.packet[packet::ethernet::ETHERNET_HEADER_LEN + packet::ipv4::IPV4_HEADER_LEN
129 ..packet::ethernet::ETHERNET_HEADER_LEN
130 + packet::ipv4::IPV4_HEADER_LEN
131 + tcp_packet.len()]
132 .copy_from_slice(&tcp_packet);
133 } else if packet_builder.dst_ip.is_ipv6() {
134 if self.packet.len()
135 < packet::ethernet::ETHERNET_HEADER_LEN
136 + packet::ipv6::IPV6_HEADER_LEN
137 + tcp_packet.len()
138 {
139 self.packet.resize(
140 packet::ethernet::ETHERNET_HEADER_LEN
141 + packet::ipv6::IPV6_HEADER_LEN
142 + tcp_packet.len(),
143 0,
144 );
145 }
146 self.packet[packet::ethernet::ETHERNET_HEADER_LEN + packet::ipv6::IPV6_HEADER_LEN
147 ..packet::ethernet::ETHERNET_HEADER_LEN
148 + packet::ipv6::IPV6_HEADER_LEN
149 + tcp_packet.len()]
150 .copy_from_slice(&tcp_packet);
151 }
152 }
153 pub fn set_udp(&mut self, packet_builder: packet::udp::UdpPacketBuilder) {
155 let udp_packet = packet_builder.build();
156 if packet_builder.dst_ip.is_ipv4() {
157 if self.packet.len()
158 < packet::ethernet::ETHERNET_HEADER_LEN
159 + packet::ipv4::IPV4_HEADER_LEN
160 + udp_packet.len()
161 {
162 self.packet.resize(
163 packet::ethernet::ETHERNET_HEADER_LEN
164 + packet::ipv4::IPV4_HEADER_LEN
165 + udp_packet.len(),
166 0,
167 );
168 }
169 self.packet[packet::ethernet::ETHERNET_HEADER_LEN + packet::ipv4::IPV4_HEADER_LEN
170 ..packet::ethernet::ETHERNET_HEADER_LEN
171 + packet::ipv4::IPV4_HEADER_LEN
172 + udp_packet.len()]
173 .copy_from_slice(&udp_packet);
174 } else if packet_builder.dst_ip.is_ipv6() {
175 if self.packet.len()
176 < packet::ethernet::ETHERNET_HEADER_LEN
177 + packet::ipv6::IPV6_HEADER_LEN
178 + udp_packet.len()
179 {
180 self.packet.resize(
181 packet::ethernet::ETHERNET_HEADER_LEN
182 + packet::ipv6::IPV6_HEADER_LEN
183 + udp_packet.len(),
184 0,
185 );
186 }
187 self.packet[packet::ethernet::ETHERNET_HEADER_LEN + packet::ipv6::IPV6_HEADER_LEN
188 ..packet::ethernet::ETHERNET_HEADER_LEN
189 + packet::ipv6::IPV6_HEADER_LEN
190 + udp_packet.len()]
191 .copy_from_slice(&udp_packet);
192 }
193 }
194}
195
196#[derive(Clone, Debug)]
199pub struct PacketBuildOption {
200 pub src_mac: datalink::MacAddr,
201 pub dst_mac: datalink::MacAddr,
202 pub ether_type: ethernet::EtherType,
203 pub src_ip: IpAddr,
204 pub dst_ip: IpAddr,
205 pub src_port: Option<u16>,
206 pub dst_port: Option<u16>,
207 pub ip_protocol: Option<ip::IpNextLevelProtocol>,
208 pub payload: Vec<u8>,
209 pub use_tun: bool,
210}
211
212impl PacketBuildOption {
213 pub fn new() -> Self {
215 PacketBuildOption {
216 src_mac: datalink::MacAddr::zero(),
217 dst_mac: datalink::MacAddr::zero(),
218 ether_type: ethernet::EtherType::Ipv4,
219 src_ip: IpAddr::V4(std::net::Ipv4Addr::new(0, 0, 0, 0)),
220 dst_ip: IpAddr::V4(std::net::Ipv4Addr::new(0, 0, 0, 0)),
221 src_port: None,
222 dst_port: None,
223 ip_protocol: None,
224 payload: Vec::new(),
225 use_tun: false,
226 }
227 }
228}
229
230pub fn build_full_arp_packet(packet_builder: PacketBuildOption) -> Vec<u8> {
232 let src_ip: Ipv4Addr = match packet_builder.src_ip {
233 IpAddr::V4(ipv4_addr) => ipv4_addr,
234 _ => return Vec::new(),
235 };
236 let dst_ip: Ipv4Addr = match packet_builder.dst_ip {
237 IpAddr::V4(ipv4_addr) => ipv4_addr,
238 _ => return Vec::new(),
239 };
240 let mut ethernet_buffer =
241 [0u8; packet::ethernet::ETHERNET_HEADER_LEN + packet::arp::ARP_HEADER_LEN];
242 let mut ethernet_packet: pnet::packet::ethernet::MutableEthernetPacket =
243 pnet::packet::ethernet::MutableEthernetPacket::new(&mut ethernet_buffer).unwrap();
244 packet::ethernet::build_ethernet_arp_packet(
245 &mut ethernet_packet,
246 packet_builder.src_mac.clone(),
247 );
248 let mut arp_buffer = [0u8; packet::arp::ARP_HEADER_LEN];
249 let mut arp_packet = pnet::packet::arp::MutableArpPacket::new(&mut arp_buffer).unwrap();
250 packet::arp::build_arp_packet(
251 &mut arp_packet,
252 packet_builder.src_mac,
253 packet_builder.dst_mac,
254 src_ip,
255 dst_ip,
256 );
257 ethernet_packet.set_payload(arp_packet.packet());
258 ethernet_packet.packet().to_vec()
259}
260
261pub fn build_full_icmp_packet(packet_builder: PacketBuildOption) -> Vec<u8> {
263 let src_ip: Ipv4Addr = match packet_builder.src_ip {
264 IpAddr::V4(ipv4_addr) => ipv4_addr,
265 _ => return Vec::new(),
266 };
267 let dst_ip: Ipv4Addr = match packet_builder.dst_ip {
268 IpAddr::V4(ipv4_addr) => ipv4_addr,
269 _ => return Vec::new(),
270 };
271 let mut ethernet_buffer = [0u8; packet::ethernet::ETHERNET_HEADER_LEN
272 + packet::ipv4::IPV4_HEADER_LEN
273 + packet::icmp::ICMPV4_HEADER_LEN];
274 let mut ethernet_packet: pnet::packet::ethernet::MutableEthernetPacket =
275 pnet::packet::ethernet::MutableEthernetPacket::new(&mut ethernet_buffer).unwrap();
276 packet::ethernet::build_ethernet_packet(
277 &mut ethernet_packet,
278 packet_builder.src_mac.clone(),
279 packet_builder.dst_mac.clone(),
280 packet_builder.ether_type,
281 );
282 let mut ipv4_buffer = [0u8; packet::ipv4::IPV4_HEADER_LEN + packet::icmp::ICMPV4_HEADER_LEN];
283 let mut ipv4_packet = pnet::packet::ipv4::MutableIpv4Packet::new(&mut ipv4_buffer).unwrap();
284 packet::ipv4::build_ipv4_packet(
285 &mut ipv4_packet,
286 src_ip,
287 dst_ip,
288 packet_builder.ip_protocol.unwrap(),
289 );
290 let mut icmp_buffer = [0u8; packet::icmp::ICMPV4_HEADER_LEN];
291 let mut icmp_packet =
292 pnet::packet::icmp::echo_request::MutableEchoRequestPacket::new(&mut icmp_buffer).unwrap();
293 packet::icmp::build_icmp_echo_packet(&mut icmp_packet);
294 ipv4_packet.set_payload(icmp_packet.packet());
295 ethernet_packet.set_payload(ipv4_packet.packet());
296 if packet_builder.use_tun {
297 ethernet_packet.packet()[packet::ethernet::ETHERNET_HEADER_LEN..].to_vec()
298 }else {
299 ethernet_packet.packet().to_vec()
300 }
301}
302
303pub fn build_icmp_packet() -> Vec<u8> {
305 let mut icmp_buffer = [0u8; packet::icmp::ICMPV4_HEADER_LEN];
306 let mut icmp_packet =
307 pnet::packet::icmp::echo_request::MutableEchoRequestPacket::new(&mut icmp_buffer).unwrap();
308 packet::icmp::build_icmp_echo_packet(&mut icmp_packet);
309 icmp_packet.packet().to_vec()
310}
311
312pub fn build_full_icmpv6_packet(packet_builder: PacketBuildOption) -> Vec<u8> {
314 let src_ip: Ipv6Addr = match packet_builder.src_ip {
315 IpAddr::V6(ipv6_addr) => ipv6_addr,
316 _ => return Vec::new(),
317 };
318 let dst_ip: Ipv6Addr = match packet_builder.dst_ip {
319 IpAddr::V6(ipv6_addr) => ipv6_addr,
320 _ => return Vec::new(),
321 };
322 let mut ethernet_buffer = [0u8; packet::ethernet::ETHERNET_HEADER_LEN
323 + packet::ipv6::IPV6_HEADER_LEN
324 + packet::icmpv6::ICMPV6_HEADER_LEN];
325 let mut ethernet_packet: pnet::packet::ethernet::MutableEthernetPacket =
326 pnet::packet::ethernet::MutableEthernetPacket::new(&mut ethernet_buffer).unwrap();
327 packet::ethernet::build_ethernet_packet(
328 &mut ethernet_packet,
329 packet_builder.src_mac.clone(),
330 packet_builder.dst_mac.clone(),
331 packet_builder.ether_type,
332 );
333 let mut ipv6_buffer = [0u8; packet::ipv6::IPV6_HEADER_LEN + packet::icmpv6::ICMPV6_HEADER_LEN];
334 let mut ipv6_packet = pnet::packet::ipv6::MutableIpv6Packet::new(&mut ipv6_buffer).unwrap();
335 packet::ipv6::build_ipv6_packet(
336 &mut ipv6_packet,
337 src_ip,
338 dst_ip,
339 packet_builder.ip_protocol.unwrap(),
340 );
341 let mut icmpv6_buffer = [0u8; packet::icmpv6::ICMPV6_HEADER_LEN];
342 let mut icmpv6_packet =
343 pnet::packet::icmpv6::echo_request::MutableEchoRequestPacket::new(&mut icmpv6_buffer)
344 .unwrap();
345 packet::icmpv6::build_icmpv6_echo_packet(&mut icmpv6_packet, src_ip, dst_ip);
346 ipv6_packet.set_payload(icmpv6_packet.packet());
347 ethernet_packet.set_payload(ipv6_packet.packet());
348 if packet_builder.use_tun {
349 ethernet_packet.packet()[packet::ethernet::ETHERNET_HEADER_LEN..].to_vec()
350 }else {
351 ethernet_packet.packet().to_vec()
352 }
353}
354
355pub fn build_icmpv6_packet(packet_builder: PacketBuildOption) -> Vec<u8> {
357 let src_ip: Ipv6Addr = match packet_builder.src_ip {
358 IpAddr::V6(ipv6_addr) => ipv6_addr,
359 _ => return Vec::new(),
360 };
361 let dst_ip: Ipv6Addr = match packet_builder.dst_ip {
362 IpAddr::V6(ipv6_addr) => ipv6_addr,
363 _ => return Vec::new(),
364 };
365 let mut icmpv6_buffer = [0u8; packet::icmpv6::ICMPV6_HEADER_LEN];
366 let mut icmpv6_packet =
367 pnet::packet::icmpv6::echo_request::MutableEchoRequestPacket::new(&mut icmpv6_buffer)
368 .unwrap();
369 packet::icmpv6::build_icmpv6_echo_packet(&mut icmpv6_packet, src_ip, dst_ip);
370 icmpv6_packet.packet().to_vec()
371}
372
373pub fn build_full_tcp_syn_packet(packet_builder: PacketBuildOption) -> Vec<u8> {
375 match packet_builder.src_ip {
376 IpAddr::V4(src_ip) => match packet_builder.dst_ip {
377 IpAddr::V4(dst_ip) => {
378 let mut ethernet_buffer = [0u8; packet::ethernet::ETHERNET_HEADER_LEN
379 + packet::ipv4::IPV4_HEADER_LEN
380 + packet::tcp::TCP_HEADER_LEN
381 + packet::tcp::TCP_DEFAULT_OPTION_LEN];
382 let mut ethernet_packet: pnet::packet::ethernet::MutableEthernetPacket =
383 pnet::packet::ethernet::MutableEthernetPacket::new(&mut ethernet_buffer)
384 .unwrap();
385 packet::ethernet::build_ethernet_packet(
386 &mut ethernet_packet,
387 packet_builder.src_mac.clone(),
388 packet_builder.dst_mac.clone(),
389 packet_builder.ether_type,
390 );
391 let mut ipv4_buffer = [0u8; packet::ipv4::IPV4_HEADER_LEN
392 + packet::tcp::TCP_HEADER_LEN
393 + packet::tcp::TCP_DEFAULT_OPTION_LEN];
394 let mut ipv4_packet =
395 pnet::packet::ipv4::MutableIpv4Packet::new(&mut ipv4_buffer).unwrap();
396 packet::ipv4::build_ipv4_packet(
397 &mut ipv4_packet,
398 src_ip,
399 dst_ip,
400 packet_builder.ip_protocol.unwrap(),
401 );
402 let mut tcp_buffer =
403 [0u8; packet::tcp::TCP_HEADER_LEN + packet::tcp::TCP_DEFAULT_OPTION_LEN];
404 let mut tcp_packet =
405 pnet::packet::tcp::MutableTcpPacket::new(&mut tcp_buffer).unwrap();
406 packet::tcp::build_tcp_packet(
407 &mut tcp_packet,
408 packet_builder.src_ip,
409 packet_builder.src_port.unwrap(),
410 packet_builder.dst_ip,
411 packet_builder.dst_port.unwrap(),
412 );
413 ipv4_packet.set_payload(tcp_packet.packet());
414 ethernet_packet.set_payload(ipv4_packet.packet());
415 if packet_builder.use_tun {
416 ethernet_packet.packet()[packet::ethernet::ETHERNET_HEADER_LEN..].to_vec()
417 }else {
418 ethernet_packet.packet().to_vec()
419 }
420 }
421 IpAddr::V6(_) => return Vec::new(),
422 },
423 IpAddr::V6(src_ip) => match packet_builder.dst_ip {
424 IpAddr::V4(_) => return Vec::new(),
425 IpAddr::V6(dst_ip) => {
426 let mut ethernet_buffer = [0u8; packet::ethernet::ETHERNET_HEADER_LEN
427 + packet::ipv6::IPV6_HEADER_LEN
428 + packet::tcp::TCP_HEADER_LEN
429 + packet::tcp::TCP_DEFAULT_OPTION_LEN];
430 let mut ethernet_packet: pnet::packet::ethernet::MutableEthernetPacket =
431 pnet::packet::ethernet::MutableEthernetPacket::new(&mut ethernet_buffer)
432 .unwrap();
433 packet::ethernet::build_ethernet_packet(
434 &mut ethernet_packet,
435 packet_builder.src_mac.clone(),
436 packet_builder.dst_mac.clone(),
437 packet_builder.ether_type,
438 );
439 let mut ipv6_buffer = [0u8; packet::ipv6::IPV6_HEADER_LEN
440 + packet::tcp::TCP_HEADER_LEN
441 + packet::tcp::TCP_DEFAULT_OPTION_LEN];
442 let mut ipv6_packet =
443 pnet::packet::ipv6::MutableIpv6Packet::new(&mut ipv6_buffer).unwrap();
444 packet::ipv6::build_ipv6_packet(
445 &mut ipv6_packet,
446 src_ip,
447 dst_ip,
448 packet_builder.ip_protocol.unwrap(),
449 );
450 let mut tcp_buffer =
451 [0u8; packet::tcp::TCP_HEADER_LEN + packet::tcp::TCP_DEFAULT_OPTION_LEN];
452 let mut tcp_packet =
453 pnet::packet::tcp::MutableTcpPacket::new(&mut tcp_buffer).unwrap();
454 packet::tcp::build_tcp_packet(
455 &mut tcp_packet,
456 packet_builder.src_ip,
457 packet_builder.src_port.unwrap(),
458 packet_builder.dst_ip,
459 packet_builder.dst_port.unwrap(),
460 );
461 ipv6_packet.set_payload(tcp_packet.packet());
462 ethernet_packet.set_payload(ipv6_packet.packet());
463 if packet_builder.use_tun {
464 ethernet_packet.packet()[packet::ethernet::ETHERNET_HEADER_LEN..].to_vec()
465 }else {
466 ethernet_packet.packet().to_vec()
467 }
468 }
469 },
470 }
471}
472
473pub fn build_tcp_syn_packet(packet_builder: PacketBuildOption) -> Vec<u8> {
475 let mut tcp_buffer = [0u8; packet::tcp::TCP_HEADER_LEN + packet::tcp::TCP_DEFAULT_OPTION_LEN];
476 let mut tcp_packet = pnet::packet::tcp::MutableTcpPacket::new(&mut tcp_buffer).unwrap();
477 packet::tcp::build_tcp_packet(
478 &mut tcp_packet,
479 packet_builder.src_ip,
480 packet_builder.src_port.unwrap(),
481 packet_builder.dst_ip,
482 packet_builder.dst_port.unwrap(),
483 );
484 tcp_packet.packet().to_vec()
485}
486
487pub fn build_full_udp_packet(packet_builder: PacketBuildOption) -> Vec<u8> {
489 match packet_builder.src_ip {
490 IpAddr::V4(src_ip) => match packet_builder.dst_ip {
491 IpAddr::V4(dst_ip) => {
492 let mut ethernet_buffer = [0u8; packet::ethernet::ETHERNET_HEADER_LEN
493 + packet::ipv4::IPV4_HEADER_LEN
494 + packet::udp::UDP_HEADER_LEN];
495 let mut ethernet_packet: pnet::packet::ethernet::MutableEthernetPacket =
496 pnet::packet::ethernet::MutableEthernetPacket::new(&mut ethernet_buffer)
497 .unwrap();
498 packet::ethernet::build_ethernet_packet(
499 &mut ethernet_packet,
500 packet_builder.src_mac.clone(),
501 packet_builder.dst_mac.clone(),
502 packet_builder.ether_type,
503 );
504 let mut ipv4_buffer =
505 [0u8; packet::ipv4::IPV4_HEADER_LEN + packet::udp::UDP_HEADER_LEN];
506 let mut ipv4_packet =
507 pnet::packet::ipv4::MutableIpv4Packet::new(&mut ipv4_buffer).unwrap();
508 packet::ipv4::build_ipv4_packet(
509 &mut ipv4_packet,
510 src_ip,
511 dst_ip,
512 packet_builder.ip_protocol.unwrap(),
513 );
514 let mut udp_buffer = [0u8; packet::udp::UDP_HEADER_LEN];
515 let mut udp_packet =
516 pnet::packet::udp::MutableUdpPacket::new(&mut udp_buffer).unwrap();
517 packet::udp::build_udp_packet(
518 &mut udp_packet,
519 packet_builder.src_ip,
520 packet_builder.src_port.unwrap(),
521 packet_builder.dst_ip,
522 packet_builder.dst_port.unwrap(),
523 );
524 ipv4_packet.set_payload(udp_packet.packet());
525 ethernet_packet.set_payload(ipv4_packet.packet());
526 if packet_builder.use_tun {
527 ethernet_packet.packet()[packet::ethernet::ETHERNET_HEADER_LEN..].to_vec()
528 }else {
529 ethernet_packet.packet().to_vec()
530 }
531 }
532 IpAddr::V6(_) => return Vec::new(),
533 },
534 IpAddr::V6(src_ip) => match packet_builder.dst_ip {
535 IpAddr::V4(_) => return Vec::new(),
536 IpAddr::V6(dst_ip) => {
537 let mut ethernet_buffer = [0u8; packet::ethernet::ETHERNET_HEADER_LEN
538 + packet::ipv6::IPV6_HEADER_LEN
539 + packet::udp::UDP_HEADER_LEN];
540 let mut ethernet_packet: pnet::packet::ethernet::MutableEthernetPacket =
541 pnet::packet::ethernet::MutableEthernetPacket::new(&mut ethernet_buffer)
542 .unwrap();
543 packet::ethernet::build_ethernet_packet(
544 &mut ethernet_packet,
545 packet_builder.src_mac.clone(),
546 packet_builder.dst_mac.clone(),
547 packet_builder.ether_type,
548 );
549 let mut ipv6_buffer =
550 [0u8; packet::ipv6::IPV6_HEADER_LEN + packet::udp::UDP_HEADER_LEN];
551 let mut ipv6_packet =
552 pnet::packet::ipv6::MutableIpv6Packet::new(&mut ipv6_buffer).unwrap();
553 packet::ipv6::build_ipv6_packet(
554 &mut ipv6_packet,
555 src_ip,
556 dst_ip,
557 packet_builder.ip_protocol.unwrap(),
558 );
559 let mut udp_buffer = [0u8; packet::udp::UDP_HEADER_LEN];
560 let mut udp_packet =
561 pnet::packet::udp::MutableUdpPacket::new(&mut udp_buffer).unwrap();
562 packet::udp::build_udp_packet(
563 &mut udp_packet,
564 packet_builder.src_ip,
565 packet_builder.src_port.unwrap(),
566 packet_builder.dst_ip,
567 packet_builder.dst_port.unwrap(),
568 );
569 ipv6_packet.set_payload(udp_packet.packet());
570 ethernet_packet.set_payload(ipv6_packet.packet());
571 if packet_builder.use_tun {
572 ethernet_packet.packet()[packet::ethernet::ETHERNET_HEADER_LEN..].to_vec()
573 }else {
574 ethernet_packet.packet().to_vec()
575 }
576 }
577 },
578 }
579}
580
581pub fn build_udp_packet(packet_builder: PacketBuildOption) -> Vec<u8> {
583 let mut udp_buffer = [0u8; packet::udp::UDP_HEADER_LEN];
584 let mut udp_packet = pnet::packet::udp::MutableUdpPacket::new(&mut udp_buffer).unwrap();
585 packet::udp::build_udp_packet(
586 &mut udp_packet,
587 packet_builder.src_ip,
588 packet_builder.src_port.unwrap(),
589 packet_builder.dst_ip,
590 packet_builder.dst_port.unwrap(),
591 );
592 udp_packet.packet().to_vec()
593}