xenet_packet_builder/
ipv6.rs

1use 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/// IPv6 Packet Builder.
35#[derive(Clone, Debug)]
36pub struct Ipv6PacketBuilder {
37    /// Source IPv6 address.
38    pub src_ip: Ipv6Addr,
39    /// Destination IPv6 address.
40    pub dst_ip: Ipv6Addr,
41    /// Next level protocol.
42    pub next_protocol: IpNextLevelProtocol,
43    /// Payload Length.
44    pub payload_length: Option<u16>,
45    /// Hop Limit.
46    pub hop_limit: Option<u8>,
47}
48
49impl Ipv6PacketBuilder {
50    /// Constructs a new Ipv6PacketBuilder.
51    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    /// Buid IPv6 packet and return bytes.
61    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}