xenet_packet_builder/
ipv6.rs1use std::net::Ipv6Addr;
2use xenet_packet::ip::IpNextLevelProtocol;
3use xenet_packet::ipv6::MutableIpv6Packet;
4use xenet_packet::ipv6::IPV6_HEADER_LEN;
5use xenet_packet::Packet;
6
7pub(crate) fn build_ipv6_packet(
8 ipv6_packet: &mut MutableIpv6Packet,
9 src_ip: Ipv6Addr,
10 dst_ip: Ipv6Addr,
11 next_protocol: IpNextLevelProtocol,
12) {
13 ipv6_packet.set_source(src_ip);
14 ipv6_packet.set_destination(dst_ip);
15 ipv6_packet.set_version(6);
16 ipv6_packet.set_hop_limit(64);
17 match next_protocol {
18 IpNextLevelProtocol::Tcp => {
19 ipv6_packet.set_next_header(IpNextLevelProtocol::Tcp);
20 ipv6_packet.set_payload_length(32);
21 }
22 IpNextLevelProtocol::Udp => {
23 ipv6_packet.set_next_header(IpNextLevelProtocol::Udp);
24 ipv6_packet.set_payload_length(8);
25 }
26 IpNextLevelProtocol::Icmpv6 => {
27 ipv6_packet.set_next_header(IpNextLevelProtocol::Icmpv6);
28 ipv6_packet.set_payload_length(8);
29 }
30 _ => {}
31 }
32}
33
34#[derive(Clone, Debug)]
36pub struct Ipv6PacketBuilder {
37 pub src_ip: Ipv6Addr,
39 pub dst_ip: Ipv6Addr,
41 pub next_protocol: IpNextLevelProtocol,
43 pub payload_length: Option<u16>,
45 pub hop_limit: Option<u8>,
47}
48
49impl Ipv6PacketBuilder {
50 pub fn new(src_ip: Ipv6Addr, dst_ip: Ipv6Addr, next_protocol: IpNextLevelProtocol) -> Self {
52 Ipv6PacketBuilder {
53 src_ip,
54 dst_ip,
55 next_protocol,
56 payload_length: None,
57 hop_limit: None,
58 }
59 }
60 pub fn build(&self) -> Vec<u8> {
62 let mut buffer: Vec<u8> = vec![0; IPV6_HEADER_LEN];
63 let mut ipv6_packet = MutableIpv6Packet::new(&mut buffer).unwrap();
64 ipv6_packet.set_source(self.src_ip);
65 ipv6_packet.set_destination(self.dst_ip);
66 ipv6_packet.set_version(6);
67 if let Some(hop_limit) = self.hop_limit {
68 ipv6_packet.set_hop_limit(hop_limit);
69 } else {
70 ipv6_packet.set_hop_limit(64);
71 }
72 match self.next_protocol {
73 IpNextLevelProtocol::Tcp => {
74 ipv6_packet.set_next_header(IpNextLevelProtocol::Tcp);
75 ipv6_packet.set_payload_length(32);
76 }
77 IpNextLevelProtocol::Udp => {
78 ipv6_packet.set_next_header(IpNextLevelProtocol::Udp);
79 ipv6_packet.set_payload_length(8);
80 }
81 IpNextLevelProtocol::Icmpv6 => {
82 ipv6_packet.set_next_header(IpNextLevelProtocol::Icmpv6);
83 ipv6_packet.set_payload_length(8);
84 }
85 _ => {}
86 }
87 if let Some(payload_length) = self.payload_length {
88 ipv6_packet.set_payload_length(payload_length);
89 }
90 ipv6_packet.packet().to_vec()
91 }
92}