xenet_packet_builder/
icmpv6.rs

1use std::net::Ipv6Addr;
2use xenet_packet::icmpv6::echo_request::MutableEchoRequestPacket;
3use xenet_packet::icmpv6::Icmpv6Packet;
4use xenet_packet::icmpv6::Icmpv6Type;
5use xenet_packet::icmpv6::ICMPV6_HEADER_LEN;
6use xenet_packet::Packet;
7
8/// Build ICMPv6 packet.
9pub(crate) fn build_icmpv6_echo_packet(
10    icmp_packet: &mut MutableEchoRequestPacket,
11    src_ip: Ipv6Addr,
12    dst_ip: Ipv6Addr,
13) {
14    icmp_packet.set_icmpv6_type(Icmpv6Type::EchoRequest);
15    icmp_packet.set_identifier(rand::random::<u16>());
16    icmp_packet.set_sequence_number(rand::random::<u16>());
17    let icmpv6_packet = Icmpv6Packet::new(icmp_packet.packet()).unwrap();
18    let icmpv6_checksum = xenet_packet::icmpv6::checksum(&icmpv6_packet, &src_ip, &dst_ip);
19    //let icmp_check_sum = pnet::packet::util::checksum(&icmp_packet.packet(), 1);
20    icmp_packet.set_checksum(icmpv6_checksum);
21}
22
23/// ICMPv6 Packet Builder.
24#[derive(Clone, Debug)]
25pub struct Icmpv6PacketBuilder {
26    /// Source IPv6 address.
27    pub src_ip: Ipv6Addr,
28    /// Destination IPv6 address.
29    pub dst_ip: Ipv6Addr,
30    /// ICMPv6 type.
31    pub icmpv6_type: Icmpv6Type,
32    /// ICMPv6 sequence number.
33    pub sequence_number: Option<u16>,
34    /// ICMPv6 identifier.
35    pub identifier: Option<u16>,
36}
37
38impl Icmpv6PacketBuilder {
39    /// Constructs a new Icmpv6PacketBuilder.
40    pub fn new(src_ip: Ipv6Addr, dst_ip: Ipv6Addr) -> Icmpv6PacketBuilder {
41        Icmpv6PacketBuilder {
42            src_ip,
43            dst_ip,
44            icmpv6_type: Icmpv6Type::EchoRequest,
45            sequence_number: None,
46            identifier: None,
47        }
48    }
49    /// Build ICMPv6 packet and return bytes.
50    pub fn build(&self) -> Vec<u8> {
51        let buffer: &mut [u8] = &mut [0u8; ICMPV6_HEADER_LEN];
52        let mut icmp_packet = MutableEchoRequestPacket::new(buffer).unwrap();
53        icmp_packet.set_icmpv6_type(self.icmpv6_type);
54        icmp_packet.set_identifier(self.identifier.unwrap_or(rand::random::<u16>()));
55        icmp_packet.set_sequence_number(self.sequence_number.unwrap_or(rand::random::<u16>()));
56        let icmpv6_packet = Icmpv6Packet::new(icmp_packet.packet()).unwrap();
57        let icmpv6_checksum =
58            xenet_packet::icmpv6::checksum(&icmpv6_packet, &self.src_ip, &self.dst_ip);
59        icmp_packet.set_checksum(icmpv6_checksum);
60        icmp_packet.packet().to_vec()
61    }
62}