xenet_packet_builder/
builder.rs

1use 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/// Packet builder for building full packet.
16#[derive(Clone, Debug)]
17pub struct PacketBuilder {
18    packet: Vec<u8>,
19}
20
21impl PacketBuilder {
22    /// Constructs a new PacketBuilder.
23    pub fn new() -> Self {
24        PacketBuilder { packet: Vec::new() }
25    }
26    /// Return packet bytes.
27    pub fn packet(&self) -> Vec<u8> {
28        self.packet.clone()
29    }
30    /// Retern IP packet bytes (without ethernet header).
31    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    /// Set ethernet header.
38    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    /// Set arp header.
45    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    /// Set IPv4 header.
55    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    /// Set IPv6 header.
65    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    /// Set ICMP header.
75    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    /// Set ICMPv6 header.
86    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    /// Set NDP header.
99    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    /// Set TCP header and payload.
110    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    /// Set UDP header and payload.
131    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}