Rename `new` method on Packet types to `new_checked`.
Fixes #195. Closes: #254 Approved by: dlrobertson
This commit is contained in:
parent
8a214f3850
commit
5bcb358eb5
|
@ -35,7 +35,7 @@ macro_rules! send_icmp_ping {
|
||||||
.send(icmp_repr.buffer_len(), $remote_addr)
|
.send(icmp_repr.buffer_len(), $remote_addr)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let mut icmp_packet = $packet_type::new(icmp_payload);
|
let mut icmp_packet = $packet_type::new_unchecked(icmp_payload);
|
||||||
(icmp_repr, icmp_packet)
|
(icmp_repr, icmp_packet)
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
@ -168,13 +168,14 @@ fn main() {
|
||||||
|
|
||||||
match remote_addr {
|
match remote_addr {
|
||||||
IpAddress::Ipv4(_) => {
|
IpAddress::Ipv4(_) => {
|
||||||
let icmp_packet = Icmpv4Packet::new(&payload);
|
let icmp_packet = Icmpv4Packet::new_checked(&payload).unwrap();
|
||||||
let icmp_repr = Icmpv4Repr::parse(&icmp_packet, &device_caps.checksum).unwrap();
|
let icmp_repr =
|
||||||
|
Icmpv4Repr::parse(&icmp_packet, &device_caps.checksum).unwrap();
|
||||||
get_icmp_pong!(Icmpv4Repr, icmp_repr, payload,
|
get_icmp_pong!(Icmpv4Repr, icmp_repr, payload,
|
||||||
waiting_queue, remote_addr, timestamp, received);
|
waiting_queue, remote_addr, timestamp, received);
|
||||||
}
|
}
|
||||||
IpAddress::Ipv6(_) => {
|
IpAddress::Ipv6(_) => {
|
||||||
let icmp_packet = Icmpv6Packet::new(&payload);
|
let icmp_packet = Icmpv6Packet::new_checked(&payload).unwrap();
|
||||||
let icmp_repr = Icmpv6Repr::parse(&remote_addr, &src_ipv6,
|
let icmp_repr = Icmpv6Repr::parse(&remote_addr, &src_ipv6,
|
||||||
&icmp_packet, &device_caps.checksum).unwrap();
|
&icmp_packet, &device_caps.checksum).unwrap();
|
||||||
get_icmp_pong!(Icmpv6Repr, icmp_repr, payload,
|
get_icmp_pong!(Icmpv6Repr, icmp_repr, payload,
|
||||||
|
|
|
@ -1076,7 +1076,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> {
|
||||||
frame.set_dst_addr(dst_hardware_addr);
|
frame.set_dst_addr(dst_hardware_addr);
|
||||||
frame.set_ethertype(EthernetProtocol::Arp);
|
frame.set_ethertype(EthernetProtocol::Arp);
|
||||||
|
|
||||||
let mut packet = ArpPacket::new(frame.payload_mut());
|
let mut packet = ArpPacket::new_unchecked(frame.payload_mut());
|
||||||
arp_repr.emit(&mut packet);
|
arp_repr.emit(&mut packet);
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -1084,7 +1084,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> {
|
||||||
Packet::Icmpv4((ipv4_repr, icmpv4_repr)) => {
|
Packet::Icmpv4((ipv4_repr, icmpv4_repr)) => {
|
||||||
self.dispatch_ip(tx_token, timestamp, IpRepr::Ipv4(ipv4_repr),
|
self.dispatch_ip(tx_token, timestamp, IpRepr::Ipv4(ipv4_repr),
|
||||||
|_ip_repr, payload| {
|
|_ip_repr, payload| {
|
||||||
icmpv4_repr.emit(&mut Icmpv4Packet::new(payload), &checksum_caps);
|
icmpv4_repr.emit(&mut Icmpv4Packet::new_unchecked(payload), &checksum_caps);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
#[cfg(feature = "proto-ipv6")]
|
#[cfg(feature = "proto-ipv6")]
|
||||||
|
@ -1092,7 +1092,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> {
|
||||||
self.dispatch_ip(tx_token, timestamp, IpRepr::Ipv6(ipv6_repr),
|
self.dispatch_ip(tx_token, timestamp, IpRepr::Ipv6(ipv6_repr),
|
||||||
|ip_repr, payload| {
|
|ip_repr, payload| {
|
||||||
icmpv6_repr.emit(&ip_repr.src_addr(), &ip_repr.dst_addr(),
|
icmpv6_repr.emit(&ip_repr.src_addr(), &ip_repr.dst_addr(),
|
||||||
&mut Icmpv6Packet::new(payload), &checksum_caps);
|
&mut Icmpv6Packet::new_unchecked(payload), &checksum_caps);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
#[cfg(feature = "socket-raw")]
|
#[cfg(feature = "socket-raw")]
|
||||||
|
@ -1104,7 +1104,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> {
|
||||||
#[cfg(feature = "socket-udp")]
|
#[cfg(feature = "socket-udp")]
|
||||||
Packet::Udp((ip_repr, udp_repr)) => {
|
Packet::Udp((ip_repr, udp_repr)) => {
|
||||||
self.dispatch_ip(tx_token, timestamp, ip_repr, |ip_repr, payload| {
|
self.dispatch_ip(tx_token, timestamp, ip_repr, |ip_repr, payload| {
|
||||||
udp_repr.emit(&mut UdpPacket::new(payload),
|
udp_repr.emit(&mut UdpPacket::new_unchecked(payload),
|
||||||
&ip_repr.src_addr(), &ip_repr.dst_addr(),
|
&ip_repr.src_addr(), &ip_repr.dst_addr(),
|
||||||
&checksum_caps);
|
&checksum_caps);
|
||||||
})
|
})
|
||||||
|
@ -1132,7 +1132,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tcp_repr.emit(&mut TcpPacket::new(payload),
|
tcp_repr.emit(&mut TcpPacket::new_unchecked(payload),
|
||||||
&ip_repr.src_addr(), &ip_repr.dst_addr(),
|
&ip_repr.src_addr(), &ip_repr.dst_addr(),
|
||||||
&checksum_caps);
|
&checksum_caps);
|
||||||
})
|
})
|
||||||
|
@ -1148,7 +1148,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> {
|
||||||
let tx_len = EthernetFrame::<&[u8]>::buffer_len(buffer_len);
|
let tx_len = EthernetFrame::<&[u8]>::buffer_len(buffer_len);
|
||||||
tx_token.consume(timestamp, tx_len, |tx_buffer| {
|
tx_token.consume(timestamp, tx_len, |tx_buffer| {
|
||||||
debug_assert!(tx_buffer.as_ref().len() == tx_len);
|
debug_assert!(tx_buffer.as_ref().len() == tx_len);
|
||||||
let mut frame = EthernetFrame::new(tx_buffer.as_mut());
|
let mut frame = EthernetFrame::new_unchecked(tx_buffer.as_mut());
|
||||||
frame.set_src_addr(self.ethernet_addr);
|
frame.set_src_addr(self.ethernet_addr);
|
||||||
|
|
||||||
f(frame);
|
f(frame);
|
||||||
|
@ -1254,7 +1254,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> {
|
||||||
frame.set_dst_addr(EthernetAddress::BROADCAST);
|
frame.set_dst_addr(EthernetAddress::BROADCAST);
|
||||||
frame.set_ethertype(EthernetProtocol::Arp);
|
frame.set_ethertype(EthernetProtocol::Arp);
|
||||||
|
|
||||||
arp_repr.emit(&mut ArpPacket::new(frame.payload_mut()))
|
arp_repr.emit(&mut ArpPacket::new_unchecked(frame.payload_mut()))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Err(Error::Unaddressable)
|
Err(Error::Unaddressable)
|
||||||
|
@ -1282,7 +1282,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> {
|
||||||
|
|
||||||
self.dispatch_ip(tx_token, timestamp, ip_repr, |ip_repr, payload| {
|
self.dispatch_ip(tx_token, timestamp, ip_repr, |ip_repr, payload| {
|
||||||
solicit.emit(&ip_repr.src_addr(), &ip_repr.dst_addr(),
|
solicit.emit(&ip_repr.src_addr(), &ip_repr.dst_addr(),
|
||||||
&mut Icmpv6Packet::new(payload), &checksum_caps);
|
&mut Icmpv6Packet::new_unchecked(payload), &checksum_caps);
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Err(Error::Unaddressable)
|
Err(Error::Unaddressable)
|
||||||
|
@ -1419,12 +1419,12 @@ mod test {
|
||||||
});
|
});
|
||||||
|
|
||||||
let frame = {
|
let frame = {
|
||||||
let mut frame = EthernetFrame::new(&mut eth_bytes);
|
let mut frame = EthernetFrame::new_unchecked(&mut eth_bytes);
|
||||||
frame.set_dst_addr(EthernetAddress::BROADCAST);
|
frame.set_dst_addr(EthernetAddress::BROADCAST);
|
||||||
frame.set_src_addr(EthernetAddress([0x52, 0x54, 0x00, 0x00, 0x00, 0x00]));
|
frame.set_src_addr(EthernetAddress([0x52, 0x54, 0x00, 0x00, 0x00, 0x00]));
|
||||||
frame.set_ethertype(EthernetProtocol::Ipv4);
|
frame.set_ethertype(EthernetProtocol::Ipv4);
|
||||||
repr.emit(frame.payload_mut(), &ChecksumCapabilities::default());
|
repr.emit(frame.payload_mut(), &ChecksumCapabilities::default());
|
||||||
EthernetFrame::new(&*frame.into_inner())
|
EthernetFrame::new_unchecked(&*frame.into_inner())
|
||||||
};
|
};
|
||||||
|
|
||||||
// Ensure that the unknown protocol frame does not trigger an
|
// Ensure that the unknown protocol frame does not trigger an
|
||||||
|
@ -1457,12 +1457,12 @@ mod test {
|
||||||
|
|
||||||
// emit the above repr to a frame
|
// emit the above repr to a frame
|
||||||
let frame = {
|
let frame = {
|
||||||
let mut frame = EthernetFrame::new(&mut eth_bytes);
|
let mut frame = EthernetFrame::new_unchecked(&mut eth_bytes);
|
||||||
frame.set_dst_addr(EthernetAddress([0x00, 0x00, 0x00, 0x00, 0x00, 0x00]));
|
frame.set_dst_addr(EthernetAddress([0x00, 0x00, 0x00, 0x00, 0x00, 0x00]));
|
||||||
frame.set_src_addr(EthernetAddress([0x52, 0x54, 0x00, 0x00, 0x00, 0x00]));
|
frame.set_src_addr(EthernetAddress([0x52, 0x54, 0x00, 0x00, 0x00, 0x00]));
|
||||||
frame.set_ethertype(EthernetProtocol::Ipv4);
|
frame.set_ethertype(EthernetProtocol::Ipv4);
|
||||||
repr.emit(frame.payload_mut(), &ChecksumCapabilities::default());
|
repr.emit(frame.payload_mut(), &ChecksumCapabilities::default());
|
||||||
EthernetFrame::new(&*frame.into_inner())
|
EthernetFrame::new_unchecked(&*frame.into_inner())
|
||||||
};
|
};
|
||||||
|
|
||||||
// The expected Destination Unreachable response due to the
|
// The expected Destination Unreachable response due to the
|
||||||
|
@ -1508,8 +1508,8 @@ mod test {
|
||||||
|
|
||||||
let mut udp_bytes_unicast = vec![0u8; 20];
|
let mut udp_bytes_unicast = vec![0u8; 20];
|
||||||
let mut udp_bytes_broadcast = vec![0u8; 20];
|
let mut udp_bytes_broadcast = vec![0u8; 20];
|
||||||
let mut packet_unicast = UdpPacket::new(&mut udp_bytes_unicast);
|
let mut packet_unicast = UdpPacket::new_unchecked(&mut udp_bytes_unicast);
|
||||||
let mut packet_broadcast = UdpPacket::new(&mut udp_bytes_broadcast);
|
let mut packet_broadcast = UdpPacket::new_unchecked(&mut udp_bytes_broadcast);
|
||||||
|
|
||||||
let udp_repr = UdpRepr {
|
let udp_repr = UdpRepr {
|
||||||
src_port: 67,
|
src_port: 67,
|
||||||
|
@ -1596,7 +1596,7 @@ mod test {
|
||||||
let udp_socket = UdpSocket::new(rx_buffer, tx_buffer);
|
let udp_socket = UdpSocket::new(rx_buffer, tx_buffer);
|
||||||
|
|
||||||
let mut udp_bytes = vec![0u8; 13];
|
let mut udp_bytes = vec![0u8; 13];
|
||||||
let mut packet = UdpPacket::new(&mut udp_bytes);
|
let mut packet = UdpPacket::new_unchecked(&mut udp_bytes);
|
||||||
|
|
||||||
let socket_handle = socket_set.add(udp_socket);
|
let socket_handle = socket_set.add(udp_socket);
|
||||||
|
|
||||||
|
@ -1686,7 +1686,7 @@ mod test {
|
||||||
payload: &[0x2a; MAX_PAYLOAD_LEN]
|
payload: &[0x2a; MAX_PAYLOAD_LEN]
|
||||||
};
|
};
|
||||||
let mut bytes = vec![0xff; udp_repr.buffer_len()];
|
let mut bytes = vec![0xff; udp_repr.buffer_len()];
|
||||||
let mut packet = UdpPacket::new(&mut bytes[..]);
|
let mut packet = UdpPacket::new_unchecked(&mut bytes[..]);
|
||||||
udp_repr.emit(&mut packet, &src_addr.into(), &dst_addr.into(), &ChecksumCapabilities::default());
|
udp_repr.emit(&mut packet, &src_addr.into(), &dst_addr.into(), &ChecksumCapabilities::default());
|
||||||
#[cfg(all(feature = "proto-ipv4", not(feature = "proto-ipv6")))]
|
#[cfg(all(feature = "proto-ipv4", not(feature = "proto-ipv6")))]
|
||||||
let ip_repr = Ipv4Repr {
|
let ip_repr = Ipv4Repr {
|
||||||
|
@ -1767,12 +1767,12 @@ mod test {
|
||||||
target_protocol_addr: local_ip_addr,
|
target_protocol_addr: local_ip_addr,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut frame = EthernetFrame::new(&mut eth_bytes);
|
let mut frame = EthernetFrame::new_unchecked(&mut eth_bytes);
|
||||||
frame.set_dst_addr(EthernetAddress::BROADCAST);
|
frame.set_dst_addr(EthernetAddress::BROADCAST);
|
||||||
frame.set_src_addr(remote_hw_addr);
|
frame.set_src_addr(remote_hw_addr);
|
||||||
frame.set_ethertype(EthernetProtocol::Arp);
|
frame.set_ethertype(EthernetProtocol::Arp);
|
||||||
{
|
{
|
||||||
let mut packet = ArpPacket::new(frame.payload_mut());
|
let mut packet = ArpPacket::new_unchecked(frame.payload_mut());
|
||||||
repr.emit(&mut packet);
|
repr.emit(&mut packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1816,14 +1816,15 @@ mod test {
|
||||||
payload_len: solicit.buffer_len()
|
payload_len: solicit.buffer_len()
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut frame = EthernetFrame::new(&mut eth_bytes);
|
let mut frame = EthernetFrame::new_unchecked(&mut eth_bytes);
|
||||||
frame.set_dst_addr(EthernetAddress([0x33, 0x33, 0x00, 0x00, 0x00, 0x00]));
|
frame.set_dst_addr(EthernetAddress([0x33, 0x33, 0x00, 0x00, 0x00, 0x00]));
|
||||||
frame.set_src_addr(remote_hw_addr);
|
frame.set_src_addr(remote_hw_addr);
|
||||||
frame.set_ethertype(EthernetProtocol::Ipv6);
|
frame.set_ethertype(EthernetProtocol::Ipv6);
|
||||||
{
|
{
|
||||||
ip_repr.emit(frame.payload_mut(), &ChecksumCapabilities::default());
|
ip_repr.emit(frame.payload_mut(), &ChecksumCapabilities::default());
|
||||||
solicit.emit(&remote_ip_addr.into(), &local_ip_addr.solicited_node().into(),
|
solicit.emit(&remote_ip_addr.into(), &local_ip_addr.solicited_node().into(),
|
||||||
&mut Icmpv6Packet::new(&mut frame.payload_mut()[ip_repr.buffer_len()..]),
|
&mut Icmpv6Packet::new_unchecked(
|
||||||
|
&mut frame.payload_mut()[ip_repr.buffer_len()..]),
|
||||||
&ChecksumCapabilities::default());
|
&ChecksumCapabilities::default());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1869,12 +1870,12 @@ mod test {
|
||||||
target_protocol_addr: Ipv4Address([0x7f, 0x00, 0x00, 0x03]),
|
target_protocol_addr: Ipv4Address([0x7f, 0x00, 0x00, 0x03]),
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut frame = EthernetFrame::new(&mut eth_bytes);
|
let mut frame = EthernetFrame::new_unchecked(&mut eth_bytes);
|
||||||
frame.set_dst_addr(EthernetAddress::BROADCAST);
|
frame.set_dst_addr(EthernetAddress::BROADCAST);
|
||||||
frame.set_src_addr(remote_hw_addr);
|
frame.set_src_addr(remote_hw_addr);
|
||||||
frame.set_ethertype(EthernetProtocol::Arp);
|
frame.set_ethertype(EthernetProtocol::Arp);
|
||||||
{
|
{
|
||||||
let mut packet = ArpPacket::new(frame.payload_mut());
|
let mut packet = ArpPacket::new_unchecked(frame.payload_mut());
|
||||||
repr.emit(&mut packet);
|
repr.emit(&mut packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1916,7 +1917,7 @@ mod test {
|
||||||
|
|
||||||
// Ensure the ident we bound to and the ident of the packet are the same.
|
// Ensure the ident we bound to and the ident of the packet are the same.
|
||||||
let mut bytes = [0xff; 24];
|
let mut bytes = [0xff; 24];
|
||||||
let mut packet = Icmpv4Packet::new(&mut bytes);
|
let mut packet = Icmpv4Packet::new_unchecked(&mut bytes);
|
||||||
let echo_repr = Icmpv4Repr::EchoRequest{ ident, seq_no, data: echo_data };
|
let echo_repr = Icmpv4Repr::EchoRequest{ ident, seq_no, data: echo_data };
|
||||||
echo_repr.emit(&mut packet, &ChecksumCapabilities::default());
|
echo_repr.emit(&mut packet, &ChecksumCapabilities::default());
|
||||||
let icmp_data = &packet.into_inner()[..];
|
let icmp_data = &packet.into_inner()[..];
|
||||||
|
@ -1990,7 +1991,7 @@ mod test {
|
||||||
};
|
};
|
||||||
|
|
||||||
let frame = {
|
let frame = {
|
||||||
let mut frame = EthernetFrame::new(&mut eth_bytes);
|
let mut frame = EthernetFrame::new_unchecked(&mut eth_bytes);
|
||||||
let ip_repr = IpRepr::Ipv6(ipv6_repr);
|
let ip_repr = IpRepr::Ipv6(ipv6_repr);
|
||||||
frame.set_dst_addr(EthernetAddress([0x52, 0x54, 0x00, 0x00, 0x00, 0x00]));
|
frame.set_dst_addr(EthernetAddress([0x52, 0x54, 0x00, 0x00, 0x00, 0x00]));
|
||||||
frame.set_src_addr(remote_hw_addr);
|
frame.set_src_addr(remote_hw_addr);
|
||||||
|
@ -1998,21 +1999,22 @@ mod test {
|
||||||
ip_repr.emit(frame.payload_mut(), &ChecksumCapabilities::default());
|
ip_repr.emit(frame.payload_mut(), &ChecksumCapabilities::default());
|
||||||
let mut offset = ipv6_repr.buffer_len();
|
let mut offset = ipv6_repr.buffer_len();
|
||||||
{
|
{
|
||||||
let mut hbh_pkt = Ipv6HopByHopHeader::new(&mut frame.payload_mut()[offset..]);
|
let mut hbh_pkt =
|
||||||
|
Ipv6HopByHopHeader::new_unchecked(&mut frame.payload_mut()[offset..]);
|
||||||
hbh_pkt.set_next_header(IpProtocol::Unknown(0x0c));
|
hbh_pkt.set_next_header(IpProtocol::Unknown(0x0c));
|
||||||
hbh_pkt.set_header_len(0);
|
hbh_pkt.set_header_len(0);
|
||||||
offset += 8;
|
offset += 8;
|
||||||
{
|
{
|
||||||
let mut pad_pkt = Ipv6Option::new(&mut hbh_pkt.options_mut()[..]);
|
let mut pad_pkt = Ipv6Option::new_unchecked(&mut hbh_pkt.options_mut()[..]);
|
||||||
Ipv6OptionRepr::PadN(3).emit(&mut pad_pkt);
|
Ipv6OptionRepr::PadN(3).emit(&mut pad_pkt);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
let mut pad_pkt = Ipv6Option::new(&mut hbh_pkt.options_mut()[5..]);
|
let mut pad_pkt = Ipv6Option::new_unchecked(&mut hbh_pkt.options_mut()[5..]);
|
||||||
Ipv6OptionRepr::Pad1.emit(&mut pad_pkt);
|
Ipv6OptionRepr::Pad1.emit(&mut pad_pkt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
frame.payload_mut()[offset..].copy_from_slice(&payload);
|
frame.payload_mut()[offset..].copy_from_slice(&payload);
|
||||||
EthernetFrame::new(&*frame.into_inner())
|
EthernetFrame::new_unchecked(&*frame.into_inner())
|
||||||
};
|
};
|
||||||
|
|
||||||
let reply_icmp_repr = Icmpv6Repr::ParamProblem {
|
let reply_icmp_repr = Icmpv6Repr::ParamProblem {
|
||||||
|
|
|
@ -256,7 +256,7 @@ impl<'a, 'b> IcmpSocket<'a, 'b> {
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
(&Endpoint::Udp(endpoint), &IcmpRepr::Ipv4(Icmpv4Repr::DstUnreachable { data, .. }))
|
(&Endpoint::Udp(endpoint), &IcmpRepr::Ipv4(Icmpv4Repr::DstUnreachable { data, .. }))
|
||||||
if endpoint.addr.is_unspecified() || endpoint.addr == ip_repr.dst_addr() => {
|
if endpoint.addr.is_unspecified() || endpoint.addr == ip_repr.dst_addr() => {
|
||||||
let packet = UdpPacket::new(data);
|
let packet = UdpPacket::new_unchecked(data);
|
||||||
match UdpRepr::parse(&packet, &ip_repr.src_addr(), &ip_repr.dst_addr(), cksum) {
|
match UdpRepr::parse(&packet, &ip_repr.src_addr(), &ip_repr.dst_addr(), cksum) {
|
||||||
Ok(repr) => endpoint.port == repr.src_port,
|
Ok(repr) => endpoint.port == repr.src_port,
|
||||||
Err(_) => false,
|
Err(_) => false,
|
||||||
|
@ -265,7 +265,7 @@ impl<'a, 'b> IcmpSocket<'a, 'b> {
|
||||||
#[cfg(feature = "proto-ipv6")]
|
#[cfg(feature = "proto-ipv6")]
|
||||||
(&Endpoint::Udp(endpoint), &IcmpRepr::Ipv6(Icmpv6Repr::DstUnreachable { data, .. }))
|
(&Endpoint::Udp(endpoint), &IcmpRepr::Ipv6(Icmpv6Repr::DstUnreachable { data, .. }))
|
||||||
if endpoint.addr.is_unspecified() || endpoint.addr == ip_repr.dst_addr() => {
|
if endpoint.addr.is_unspecified() || endpoint.addr == ip_repr.dst_addr() => {
|
||||||
let packet = UdpPacket::new(data);
|
let packet = UdpPacket::new_unchecked(data);
|
||||||
match UdpRepr::parse(&packet, &ip_repr.src_addr(), &ip_repr.dst_addr(), cksum) {
|
match UdpRepr::parse(&packet, &ip_repr.src_addr(), &ip_repr.dst_addr(), cksum) {
|
||||||
Ok(repr) => endpoint.port == repr.src_port,
|
Ok(repr) => endpoint.port == repr.src_port,
|
||||||
Err(_) => false,
|
Err(_) => false,
|
||||||
|
@ -275,12 +275,16 @@ impl<'a, 'b> IcmpSocket<'a, 'b> {
|
||||||
// Echo Request/Reply with the identifier field matching the endpoint
|
// Echo Request/Reply with the identifier field matching the endpoint
|
||||||
// port.
|
// port.
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
(&Endpoint::Ident(bound_ident), &IcmpRepr::Ipv4(Icmpv4Repr::EchoRequest { ident, .. })) |
|
(&Endpoint::Ident(bound_ident),
|
||||||
(&Endpoint::Ident(bound_ident), &IcmpRepr::Ipv4(Icmpv4Repr::EchoReply { ident, .. })) =>
|
&IcmpRepr::Ipv4(Icmpv4Repr::EchoRequest { ident, .. })) |
|
||||||
|
(&Endpoint::Ident(bound_ident),
|
||||||
|
&IcmpRepr::Ipv4(Icmpv4Repr::EchoReply { ident, .. })) =>
|
||||||
ident == bound_ident,
|
ident == bound_ident,
|
||||||
#[cfg(feature = "proto-ipv6")]
|
#[cfg(feature = "proto-ipv6")]
|
||||||
(&Endpoint::Ident(bound_ident), &IcmpRepr::Ipv6(Icmpv6Repr::EchoRequest { ident, .. })) |
|
(&Endpoint::Ident(bound_ident),
|
||||||
(&Endpoint::Ident(bound_ident), &IcmpRepr::Ipv6(Icmpv6Repr::EchoReply { ident, .. })) =>
|
&IcmpRepr::Ipv6(Icmpv6Repr::EchoRequest { ident, .. })) |
|
||||||
|
(&Endpoint::Ident(bound_ident),
|
||||||
|
&IcmpRepr::Ipv6(Icmpv6Repr::EchoReply { ident, .. })) =>
|
||||||
ident == bound_ident,
|
ident == bound_ident,
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
|
@ -291,17 +295,21 @@ impl<'a, 'b> IcmpSocket<'a, 'b> {
|
||||||
match icmp_repr {
|
match icmp_repr {
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
&IcmpRepr::Ipv4(ref icmp_repr) => {
|
&IcmpRepr::Ipv4(ref icmp_repr) => {
|
||||||
let packet_buf = self.rx_buffer.enqueue(icmp_repr.buffer_len(), ip_repr.src_addr())?;
|
let packet_buf = self.rx_buffer.enqueue(icmp_repr.buffer_len(),
|
||||||
icmp_repr.emit(&mut Icmpv4Packet::new(packet_buf), &ChecksumCapabilities::default());
|
ip_repr.src_addr())?;
|
||||||
|
icmp_repr.emit(&mut Icmpv4Packet::new_unchecked(packet_buf),
|
||||||
|
&ChecksumCapabilities::default());
|
||||||
|
|
||||||
net_trace!("{}:{}: receiving {} octets",
|
net_trace!("{}:{}: receiving {} octets",
|
||||||
self.meta.handle, icmp_repr.buffer_len(), packet_buf.len());
|
self.meta.handle, icmp_repr.buffer_len(), packet_buf.len());
|
||||||
},
|
},
|
||||||
#[cfg(feature = "proto-ipv6")]
|
#[cfg(feature = "proto-ipv6")]
|
||||||
&IcmpRepr::Ipv6(ref icmp_repr) => {
|
&IcmpRepr::Ipv6(ref icmp_repr) => {
|
||||||
let packet_buf = self.rx_buffer.enqueue(icmp_repr.buffer_len(), ip_repr.src_addr())?;
|
let packet_buf = self.rx_buffer.enqueue(icmp_repr.buffer_len(),
|
||||||
|
ip_repr.src_addr())?;
|
||||||
icmp_repr.emit(&ip_repr.src_addr(), &ip_repr.dst_addr(),
|
icmp_repr.emit(&ip_repr.src_addr(), &ip_repr.dst_addr(),
|
||||||
&mut Icmpv6Packet::new(packet_buf), &ChecksumCapabilities::default());
|
&mut Icmpv6Packet::new_unchecked(packet_buf),
|
||||||
|
&ChecksumCapabilities::default());
|
||||||
|
|
||||||
net_trace!("{}:{}: receiving {} octets",
|
net_trace!("{}:{}: receiving {} octets",
|
||||||
self.meta.handle, icmp_repr.buffer_len(), packet_buf.len());
|
self.meta.handle, icmp_repr.buffer_len(), packet_buf.len());
|
||||||
|
@ -321,7 +329,7 @@ impl<'a, 'b> IcmpSocket<'a, 'b> {
|
||||||
match *remote_endpoint {
|
match *remote_endpoint {
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
IpAddress::Ipv4(ipv4_addr) => {
|
IpAddress::Ipv4(ipv4_addr) => {
|
||||||
let packet = Icmpv4Packet::new(&*packet_buf);
|
let packet = Icmpv4Packet::new_unchecked(&*packet_buf);
|
||||||
let repr = Icmpv4Repr::parse(&packet, &ChecksumCapabilities::ignored())?;
|
let repr = Icmpv4Repr::parse(&packet, &ChecksumCapabilities::ignored())?;
|
||||||
let ip_repr = IpRepr::Ipv4(Ipv4Repr {
|
let ip_repr = IpRepr::Ipv4(Ipv4Repr {
|
||||||
src_addr: Ipv4Address::default(),
|
src_addr: Ipv4Address::default(),
|
||||||
|
@ -334,7 +342,7 @@ impl<'a, 'b> IcmpSocket<'a, 'b> {
|
||||||
},
|
},
|
||||||
#[cfg(feature = "proto-ipv6")]
|
#[cfg(feature = "proto-ipv6")]
|
||||||
IpAddress::Ipv6(ipv6_addr) => {
|
IpAddress::Ipv6(ipv6_addr) => {
|
||||||
let packet = Icmpv6Packet::new(&*packet_buf);
|
let packet = Icmpv6Packet::new_unchecked(&*packet_buf);
|
||||||
let src_addr = Ipv6Address::default();
|
let src_addr = Ipv6Address::default();
|
||||||
let repr = Icmpv6Repr::parse(&src_addr.into(), &ipv6_addr.into(), &packet, &ChecksumCapabilities::ignored())?;
|
let repr = Icmpv6Repr::parse(&src_addr.into(), &ipv6_addr.into(), &packet, &ChecksumCapabilities::ignored())?;
|
||||||
let ip_repr = IpRepr::Ipv6(Ipv6Repr {
|
let ip_repr = IpRepr::Ipv6(Ipv6Repr {
|
||||||
|
@ -443,7 +451,7 @@ mod test_ipv4 {
|
||||||
assert!(socket.can_send());
|
assert!(socket.can_send());
|
||||||
|
|
||||||
let mut bytes = [0xff; 24];
|
let mut bytes = [0xff; 24];
|
||||||
let mut packet = Icmpv4Packet::new(&mut bytes);
|
let mut packet = Icmpv4Packet::new_unchecked(&mut bytes);
|
||||||
ECHOV4_REPR.emit(&mut packet, &caps.checksum);
|
ECHOV4_REPR.emit(&mut packet, &caps.checksum);
|
||||||
|
|
||||||
assert_eq!(socket.send_slice(&packet.into_inner()[..], REMOTE_IPV4.into()), Ok(()));
|
assert_eq!(socket.send_slice(&packet.into_inner()[..], REMOTE_IPV4.into()), Ok(()));
|
||||||
|
@ -473,7 +481,7 @@ mod test_ipv4 {
|
||||||
let caps = DeviceCapabilities::default();
|
let caps = DeviceCapabilities::default();
|
||||||
|
|
||||||
let mut bytes = [0xff; 24];
|
let mut bytes = [0xff; 24];
|
||||||
let mut packet = Icmpv4Packet::new(&mut bytes);
|
let mut packet = Icmpv4Packet::new_unchecked(&mut bytes);
|
||||||
ECHOV4_REPR.emit(&mut packet, &caps.checksum);
|
ECHOV4_REPR.emit(&mut packet, &caps.checksum);
|
||||||
|
|
||||||
s.set_hop_limit(Some(0x2a));
|
s.set_hop_limit(Some(0x2a));
|
||||||
|
@ -502,7 +510,7 @@ mod test_ipv4 {
|
||||||
let caps = DeviceCapabilities::default();
|
let caps = DeviceCapabilities::default();
|
||||||
|
|
||||||
let mut bytes = [0xff; 24];
|
let mut bytes = [0xff; 24];
|
||||||
let mut packet = Icmpv4Packet::new(&mut bytes);
|
let mut packet = Icmpv4Packet::new_unchecked(&mut bytes);
|
||||||
ECHOV4_REPR.emit(&mut packet, &caps.checksum);
|
ECHOV4_REPR.emit(&mut packet, &caps.checksum);
|
||||||
let data = &packet.into_inner()[..];
|
let data = &packet.into_inner()[..];
|
||||||
|
|
||||||
|
@ -526,7 +534,7 @@ mod test_ipv4 {
|
||||||
|
|
||||||
let caps = DeviceCapabilities::default();
|
let caps = DeviceCapabilities::default();
|
||||||
let mut bytes = [0xff; 20];
|
let mut bytes = [0xff; 20];
|
||||||
let mut packet = Icmpv4Packet::new(&mut bytes);
|
let mut packet = Icmpv4Packet::new_unchecked(&mut bytes);
|
||||||
let icmp_repr = Icmpv4Repr::EchoRequest {
|
let icmp_repr = Icmpv4Repr::EchoRequest {
|
||||||
ident: 0x4321,
|
ident: 0x4321,
|
||||||
seq_no: 0x5678,
|
seq_no: 0x5678,
|
||||||
|
@ -547,7 +555,7 @@ mod test_ipv4 {
|
||||||
let caps = DeviceCapabilities::default();
|
let caps = DeviceCapabilities::default();
|
||||||
|
|
||||||
let mut bytes = [0xff; 18];
|
let mut bytes = [0xff; 18];
|
||||||
let mut packet = UdpPacket::new(&mut bytes);
|
let mut packet = UdpPacket::new_unchecked(&mut bytes);
|
||||||
UDP_REPR.emit(&mut packet, &REMOTE_IPV4.into(), &LOCAL_IPV4.into(), &caps.checksum);
|
UDP_REPR.emit(&mut packet, &REMOTE_IPV4.into(), &LOCAL_IPV4.into(), &caps.checksum);
|
||||||
|
|
||||||
let data = &packet.into_inner()[..];
|
let data = &packet.into_inner()[..];
|
||||||
|
@ -581,7 +589,7 @@ mod test_ipv4 {
|
||||||
assert!(socket.can_recv());
|
assert!(socket.can_recv());
|
||||||
|
|
||||||
let mut bytes = [0x00; 46];
|
let mut bytes = [0x00; 46];
|
||||||
let mut packet = Icmpv4Packet::new(&mut bytes[..]);
|
let mut packet = Icmpv4Packet::new_unchecked(&mut bytes[..]);
|
||||||
icmp_repr.emit(&mut packet, &caps.checksum);
|
icmp_repr.emit(&mut packet, &caps.checksum);
|
||||||
assert_eq!(socket.recv(), Ok((&packet.into_inner()[..], REMOTE_IPV4.into())));
|
assert_eq!(socket.recv(), Ok((&packet.into_inner()[..], REMOTE_IPV4.into())));
|
||||||
assert!(!socket.can_recv());
|
assert!(!socket.can_recv());
|
||||||
|
@ -642,7 +650,7 @@ mod test_ipv6 {
|
||||||
assert!(socket.can_send());
|
assert!(socket.can_send());
|
||||||
|
|
||||||
let mut bytes = vec![0xff; 24];
|
let mut bytes = vec![0xff; 24];
|
||||||
let mut packet = Icmpv6Packet::new(&mut bytes);
|
let mut packet = Icmpv6Packet::new_unchecked(&mut bytes);
|
||||||
ECHOV6_REPR.emit(&LOCAL_IPV6.into(), &REMOTE_IPV6.into(), &mut packet, &caps.checksum);
|
ECHOV6_REPR.emit(&LOCAL_IPV6.into(), &REMOTE_IPV6.into(), &mut packet, &caps.checksum);
|
||||||
|
|
||||||
assert_eq!(socket.send_slice(&packet.into_inner()[..], REMOTE_IPV6.into()), Ok(()));
|
assert_eq!(socket.send_slice(&packet.into_inner()[..], REMOTE_IPV6.into()), Ok(()));
|
||||||
|
@ -672,7 +680,7 @@ mod test_ipv6 {
|
||||||
let caps = DeviceCapabilities::default();
|
let caps = DeviceCapabilities::default();
|
||||||
|
|
||||||
let mut bytes = vec![0xff; 24];
|
let mut bytes = vec![0xff; 24];
|
||||||
let mut packet = Icmpv6Packet::new(&mut bytes);
|
let mut packet = Icmpv6Packet::new_unchecked(&mut bytes);
|
||||||
ECHOV6_REPR.emit(&LOCAL_IPV6.into(), &REMOTE_IPV6.into(), &mut packet, &caps.checksum);
|
ECHOV6_REPR.emit(&LOCAL_IPV6.into(), &REMOTE_IPV6.into(), &mut packet, &caps.checksum);
|
||||||
|
|
||||||
s.set_hop_limit(Some(0x2a));
|
s.set_hop_limit(Some(0x2a));
|
||||||
|
@ -701,7 +709,7 @@ mod test_ipv6 {
|
||||||
let caps = DeviceCapabilities::default();
|
let caps = DeviceCapabilities::default();
|
||||||
|
|
||||||
let mut bytes = [0xff; 24];
|
let mut bytes = [0xff; 24];
|
||||||
let mut packet = Icmpv6Packet::new(&mut bytes);
|
let mut packet = Icmpv6Packet::new_unchecked(&mut bytes);
|
||||||
ECHOV6_REPR.emit(&LOCAL_IPV6.into(), &REMOTE_IPV6.into(), &mut packet, &caps.checksum);
|
ECHOV6_REPR.emit(&LOCAL_IPV6.into(), &REMOTE_IPV6.into(), &mut packet, &caps.checksum);
|
||||||
let data = &packet.into_inner()[..];
|
let data = &packet.into_inner()[..];
|
||||||
|
|
||||||
|
@ -725,7 +733,7 @@ mod test_ipv6 {
|
||||||
|
|
||||||
let caps = DeviceCapabilities::default();
|
let caps = DeviceCapabilities::default();
|
||||||
let mut bytes = [0xff; 20];
|
let mut bytes = [0xff; 20];
|
||||||
let mut packet = Icmpv6Packet::new(&mut bytes);
|
let mut packet = Icmpv6Packet::new_unchecked(&mut bytes);
|
||||||
let icmp_repr = Icmpv6Repr::EchoRequest {
|
let icmp_repr = Icmpv6Repr::EchoRequest {
|
||||||
ident: 0x4321,
|
ident: 0x4321,
|
||||||
seq_no: 0x5678,
|
seq_no: 0x5678,
|
||||||
|
@ -746,7 +754,7 @@ mod test_ipv6 {
|
||||||
let caps = DeviceCapabilities::default();
|
let caps = DeviceCapabilities::default();
|
||||||
|
|
||||||
let mut bytes = [0xff; 18];
|
let mut bytes = [0xff; 18];
|
||||||
let mut packet = UdpPacket::new(&mut bytes);
|
let mut packet = UdpPacket::new_unchecked(&mut bytes);
|
||||||
UDP_REPR.emit(&mut packet, &REMOTE_IPV6.into(), &LOCAL_IPV6.into(), &caps.checksum);
|
UDP_REPR.emit(&mut packet, &REMOTE_IPV6.into(), &LOCAL_IPV6.into(), &caps.checksum);
|
||||||
|
|
||||||
let data = &packet.into_inner()[..];
|
let data = &packet.into_inner()[..];
|
||||||
|
@ -780,7 +788,7 @@ mod test_ipv6 {
|
||||||
assert!(socket.can_recv());
|
assert!(socket.can_recv());
|
||||||
|
|
||||||
let mut bytes = [0x00; 66];
|
let mut bytes = [0x00; 66];
|
||||||
let mut packet = Icmpv6Packet::new(&mut bytes[..]);
|
let mut packet = Icmpv6Packet::new_unchecked(&mut bytes[..]);
|
||||||
icmp_repr.emit(&LOCAL_IPV6.into(), &REMOTE_IPV6.into(), &mut packet, &caps.checksum);
|
icmp_repr.emit(&LOCAL_IPV6.into(), &REMOTE_IPV6.into(), &mut packet, &caps.checksum);
|
||||||
assert_eq!(socket.recv(), Ok((&packet.into_inner()[..], REMOTE_IPV6.into())));
|
assert_eq!(socket.recv(), Ok((&packet.into_inner()[..], REMOTE_IPV6.into())));
|
||||||
assert!(!socket.can_recv());
|
assert!(!socket.can_recv());
|
||||||
|
|
|
@ -168,7 +168,7 @@ impl<'a, 'b> RawSocket<'a, 'b> {
|
||||||
packet.set_checksum(0);
|
packet.set_checksum(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
let packet = Ipv4Packet::new(&*packet.into_inner());
|
let packet = Ipv4Packet::new_unchecked(&*packet.into_inner());
|
||||||
let ipv4_repr = Ipv4Repr::parse(&packet, checksum_caps)?;
|
let ipv4_repr = Ipv4Repr::parse(&packet, checksum_caps)?;
|
||||||
Ok((IpRepr::Ipv4(ipv4_repr), packet.payload()))
|
Ok((IpRepr::Ipv4(ipv4_repr), packet.payload()))
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ impl<'a, 'b> RawSocket<'a, 'b> {
|
||||||
IpVersion::Ipv6 => {
|
IpVersion::Ipv6 => {
|
||||||
let mut packet = Ipv6Packet::new_checked(buffer.as_mut())?;
|
let mut packet = Ipv6Packet::new_checked(buffer.as_mut())?;
|
||||||
if packet.next_header() != protocol { return Err(Error::Unaddressable) }
|
if packet.next_header() != protocol { return Err(Error::Unaddressable) }
|
||||||
let packet = Ipv6Packet::new(&*packet.into_inner());
|
let packet = Ipv6Packet::new_unchecked(&*packet.into_inner());
|
||||||
let ipv6_repr = Ipv6Repr::parse(&packet)?;
|
let ipv6_repr = Ipv6Repr::parse(&packet)?;
|
||||||
Ok((IpRepr::Ipv6(ipv6_repr), packet.payload()))
|
Ok((IpRepr::Ipv6(ipv6_repr), packet.payload()))
|
||||||
}
|
}
|
||||||
|
@ -393,14 +393,14 @@ mod test {
|
||||||
let mut socket = ipv4_locals::socket(buffer(0), buffer(2));
|
let mut socket = ipv4_locals::socket(buffer(0), buffer(2));
|
||||||
|
|
||||||
let mut wrong_version = ipv4_locals::PACKET_BYTES.clone();
|
let mut wrong_version = ipv4_locals::PACKET_BYTES.clone();
|
||||||
Ipv4Packet::new(&mut wrong_version).set_version(6);
|
Ipv4Packet::new_unchecked(&mut wrong_version).set_version(6);
|
||||||
|
|
||||||
assert_eq!(socket.send_slice(&wrong_version[..]), Ok(()));
|
assert_eq!(socket.send_slice(&wrong_version[..]), Ok(()));
|
||||||
assert_eq!(socket.dispatch(&checksum_caps, |_| unreachable!()),
|
assert_eq!(socket.dispatch(&checksum_caps, |_| unreachable!()),
|
||||||
Ok(()));
|
Ok(()));
|
||||||
|
|
||||||
let mut wrong_protocol = ipv4_locals::PACKET_BYTES.clone();
|
let mut wrong_protocol = ipv4_locals::PACKET_BYTES.clone();
|
||||||
Ipv4Packet::new(&mut wrong_protocol).set_protocol(IpProtocol::Tcp);
|
Ipv4Packet::new_unchecked(&mut wrong_protocol).set_protocol(IpProtocol::Tcp);
|
||||||
|
|
||||||
assert_eq!(socket.send_slice(&wrong_protocol[..]), Ok(()));
|
assert_eq!(socket.send_slice(&wrong_protocol[..]), Ok(()));
|
||||||
assert_eq!(socket.dispatch(&checksum_caps, |_| unreachable!()),
|
assert_eq!(socket.dispatch(&checksum_caps, |_| unreachable!()),
|
||||||
|
@ -411,14 +411,14 @@ mod test {
|
||||||
let mut socket = ipv6_locals::socket(buffer(0), buffer(2));
|
let mut socket = ipv6_locals::socket(buffer(0), buffer(2));
|
||||||
|
|
||||||
let mut wrong_version = ipv6_locals::PACKET_BYTES.clone();
|
let mut wrong_version = ipv6_locals::PACKET_BYTES.clone();
|
||||||
Ipv6Packet::new(&mut wrong_version[..]).set_version(4);
|
Ipv6Packet::new_unchecked(&mut wrong_version[..]).set_version(4);
|
||||||
|
|
||||||
assert_eq!(socket.send_slice(&wrong_version[..]), Ok(()));
|
assert_eq!(socket.send_slice(&wrong_version[..]), Ok(()));
|
||||||
assert_eq!(socket.dispatch(&checksum_caps, |_| unreachable!()),
|
assert_eq!(socket.dispatch(&checksum_caps, |_| unreachable!()),
|
||||||
Ok(()));
|
Ok(()));
|
||||||
|
|
||||||
let mut wrong_protocol = ipv6_locals::PACKET_BYTES.clone();
|
let mut wrong_protocol = ipv6_locals::PACKET_BYTES.clone();
|
||||||
Ipv6Packet::new(&mut wrong_protocol[..]).set_next_header(IpProtocol::Tcp);
|
Ipv6Packet::new_unchecked(&mut wrong_protocol[..]).set_next_header(IpProtocol::Tcp);
|
||||||
|
|
||||||
assert_eq!(socket.send_slice(&wrong_protocol[..]), Ok(()));
|
assert_eq!(socket.send_slice(&wrong_protocol[..]), Ok(()));
|
||||||
assert_eq!(socket.dispatch(&checksum_caps, |_| unreachable!()),
|
assert_eq!(socket.dispatch(&checksum_caps, |_| unreachable!()),
|
||||||
|
@ -434,7 +434,7 @@ mod test {
|
||||||
assert!(!socket.can_recv());
|
assert!(!socket.can_recv());
|
||||||
|
|
||||||
let mut cksumd_packet = ipv4_locals::PACKET_BYTES.clone();
|
let mut cksumd_packet = ipv4_locals::PACKET_BYTES.clone();
|
||||||
Ipv4Packet::new(&mut cksumd_packet).fill_checksum();
|
Ipv4Packet::new_unchecked(&mut cksumd_packet).fill_checksum();
|
||||||
|
|
||||||
assert_eq!(socket.recv(), Err(Error::Exhausted));
|
assert_eq!(socket.recv(), Err(Error::Exhausted));
|
||||||
assert!(socket.accepts(&ipv4_locals::HEADER_REPR));
|
assert!(socket.accepts(&ipv4_locals::HEADER_REPR));
|
||||||
|
|
|
@ -55,7 +55,7 @@ impl<'a, T: Session + 'a> Ref<'a, T> {
|
||||||
/// map a `&mut SocketRef<'a, XSocket>` to a `&'a mut XSocket` (note the lifetimes);
|
/// map a `&mut SocketRef<'a, XSocket>` to a `&'a mut XSocket` (note the lifetimes);
|
||||||
/// be sure to call [new] afterwards.
|
/// be sure to call [new] afterwards.
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
pub fn into_inner(mut ref_: Self) -> &'a mut T {
|
pub fn into_inner(mut ref_: Self) -> &'a mut T {
|
||||||
ref_.consumed = true;
|
ref_.consumed = true;
|
||||||
ref_.socket
|
ref_.socket
|
||||||
|
|
|
@ -64,16 +64,16 @@ mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Packet<T> {
|
impl<T: AsRef<[u8]>> Packet<T> {
|
||||||
/// Imbue a raw octet buffer with ARP packet structure.
|
/// Imbue a raw octet buffer with ARP packet structure.
|
||||||
pub fn new(buffer: T) -> Packet<T> {
|
pub fn new_unchecked(buffer: T) -> Packet<T> {
|
||||||
Packet { buffer }
|
Packet { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -385,7 +385,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_deconstruct() {
|
fn test_deconstruct() {
|
||||||
let packet = Packet::new(&PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.hardware_type(), Hardware::Ethernet);
|
assert_eq!(packet.hardware_type(), Hardware::Ethernet);
|
||||||
assert_eq!(packet.protocol_type(), Protocol::Ipv4);
|
assert_eq!(packet.protocol_type(), Protocol::Ipv4);
|
||||||
assert_eq!(packet.hardware_len(), 6);
|
assert_eq!(packet.hardware_len(), 6);
|
||||||
|
@ -400,7 +400,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_construct() {
|
fn test_construct() {
|
||||||
let mut bytes = vec![0xa5; 28];
|
let mut bytes = vec![0xa5; 28];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_hardware_type(Hardware::Ethernet);
|
packet.set_hardware_type(Hardware::Ethernet);
|
||||||
packet.set_protocol_type(Protocol::Ipv4);
|
packet.set_protocol_type(Protocol::Ipv4);
|
||||||
packet.set_hardware_len(6);
|
packet.set_hardware_len(6);
|
||||||
|
@ -429,7 +429,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse() {
|
fn test_parse() {
|
||||||
let packet = Packet::new(&PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&PACKET_BYTES[..]);
|
||||||
let repr = Repr::parse(&packet).unwrap();
|
let repr = Repr::parse(&packet).unwrap();
|
||||||
assert_eq!(repr, packet_repr());
|
assert_eq!(repr, packet_repr());
|
||||||
}
|
}
|
||||||
|
@ -437,7 +437,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_emit() {
|
fn test_emit() {
|
||||||
let mut bytes = vec![0xa5; 28];
|
let mut bytes = vec![0xa5; 28];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet_repr().emit(&mut packet);
|
packet_repr().emit(&mut packet);
|
||||||
assert_eq!(&packet.into_inner()[..], &PACKET_BYTES[..]);
|
assert_eq!(&packet.into_inner()[..], &PACKET_BYTES[..]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -280,16 +280,16 @@ mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Packet<T> {
|
impl<T: AsRef<[u8]>> Packet<T> {
|
||||||
/// Imbue a raw octet buffer with DHCP packet structure.
|
/// Imbue a raw octet buffer with DHCP packet structure.
|
||||||
pub fn new(buffer: T) -> Packet<T> {
|
pub fn new_unchecked(buffer: T) -> Packet<T> {
|
||||||
Packet { buffer }
|
Packet { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -792,7 +792,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_deconstruct_discover() {
|
fn test_deconstruct_discover() {
|
||||||
let packet = Packet::new(DISCOVER_BYTES);
|
let packet = Packet::new_unchecked(DISCOVER_BYTES);
|
||||||
assert_eq!(packet.magic_number(), MAGIC_COOKIE);
|
assert_eq!(packet.magic_number(), MAGIC_COOKIE);
|
||||||
assert_eq!(packet.opcode(), OpCode::Request);
|
assert_eq!(packet.opcode(), OpCode::Request);
|
||||||
assert_eq!(packet.hardware_type(), Hardware::Ethernet);
|
assert_eq!(packet.hardware_type(), Hardware::Ethernet);
|
||||||
|
@ -834,7 +834,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_construct_discover() {
|
fn test_construct_discover() {
|
||||||
let mut bytes = vec![0xa5; 272];
|
let mut bytes = vec![0xa5; 272];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_magic_number(MAGIC_COOKIE);
|
packet.set_magic_number(MAGIC_COOKIE);
|
||||||
packet.set_sname_and_boot_file_to_zero();
|
packet.set_sname_and_boot_file_to_zero();
|
||||||
packet.set_opcode(OpCode::Request);
|
packet.set_opcode(OpCode::Request);
|
||||||
|
@ -889,7 +889,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse_discover() {
|
fn test_parse_discover() {
|
||||||
let packet = Packet::new(DISCOVER_BYTES);
|
let packet = Packet::new_unchecked(DISCOVER_BYTES);
|
||||||
let repr = Repr::parse(&packet).unwrap();
|
let repr = Repr::parse(&packet).unwrap();
|
||||||
assert_eq!(repr, discover_repr());
|
assert_eq!(repr, discover_repr());
|
||||||
}
|
}
|
||||||
|
@ -898,7 +898,7 @@ mod test {
|
||||||
fn test_emit_discover() {
|
fn test_emit_discover() {
|
||||||
let repr = discover_repr();
|
let repr = discover_repr();
|
||||||
let mut bytes = vec![0xa5; repr.buffer_len()];
|
let mut bytes = vec![0xa5; repr.buffer_len()];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut packet).unwrap();
|
repr.emit(&mut packet).unwrap();
|
||||||
let packet = &packet.into_inner()[..];
|
let packet = &packet.into_inner()[..];
|
||||||
let packet_len = packet.len();
|
let packet_len = packet.len();
|
||||||
|
|
|
@ -93,16 +93,16 @@ mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Frame<T> {
|
impl<T: AsRef<[u8]>> Frame<T> {
|
||||||
/// Imbue a raw octet buffer with Ethernet frame structure.
|
/// Imbue a raw octet buffer with Ethernet frame structure.
|
||||||
pub fn new(buffer: T) -> Frame<T> {
|
pub fn new_unchecked(buffer: T) -> Frame<T> {
|
||||||
Frame { buffer }
|
Frame { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Frame<T>> {
|
pub fn new_checked(buffer: T) -> Result<Frame<T>> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -317,7 +317,7 @@ mod test_ipv4 {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_deconstruct() {
|
fn test_deconstruct() {
|
||||||
let frame = Frame::new(&FRAME_BYTES[..]);
|
let frame = Frame::new_unchecked(&FRAME_BYTES[..]);
|
||||||
assert_eq!(frame.dst_addr(), Address([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]));
|
assert_eq!(frame.dst_addr(), Address([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]));
|
||||||
assert_eq!(frame.src_addr(), Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16]));
|
assert_eq!(frame.src_addr(), Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16]));
|
||||||
assert_eq!(frame.ethertype(), EtherType::Ipv4);
|
assert_eq!(frame.ethertype(), EtherType::Ipv4);
|
||||||
|
@ -327,7 +327,7 @@ mod test_ipv4 {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_construct() {
|
fn test_construct() {
|
||||||
let mut bytes = vec![0xa5; 64];
|
let mut bytes = vec![0xa5; 64];
|
||||||
let mut frame = Frame::new(&mut bytes);
|
let mut frame = Frame::new_unchecked(&mut bytes);
|
||||||
frame.set_dst_addr(Address([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]));
|
frame.set_dst_addr(Address([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]));
|
||||||
frame.set_src_addr(Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16]));
|
frame.set_src_addr(Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16]));
|
||||||
frame.set_ethertype(EtherType::Ipv4);
|
frame.set_ethertype(EtherType::Ipv4);
|
||||||
|
@ -361,7 +361,7 @@ mod test_ipv6 {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_deconstruct() {
|
fn test_deconstruct() {
|
||||||
let frame = Frame::new(&FRAME_BYTES[..]);
|
let frame = Frame::new_unchecked(&FRAME_BYTES[..]);
|
||||||
assert_eq!(frame.dst_addr(), Address([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]));
|
assert_eq!(frame.dst_addr(), Address([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]));
|
||||||
assert_eq!(frame.src_addr(), Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16]));
|
assert_eq!(frame.src_addr(), Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16]));
|
||||||
assert_eq!(frame.ethertype(), EtherType::Ipv6);
|
assert_eq!(frame.ethertype(), EtherType::Ipv6);
|
||||||
|
@ -371,7 +371,7 @@ mod test_ipv6 {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_construct() {
|
fn test_construct() {
|
||||||
let mut bytes = vec![0xa5; 54];
|
let mut bytes = vec![0xa5; 54];
|
||||||
let mut frame = Frame::new(&mut bytes);
|
let mut frame = Frame::new_unchecked(&mut bytes);
|
||||||
frame.set_dst_addr(Address([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]));
|
frame.set_dst_addr(Address([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]));
|
||||||
frame.set_src_addr(Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16]));
|
frame.set_src_addr(Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16]));
|
||||||
frame.set_ethertype(EtherType::Ipv6);
|
frame.set_ethertype(EtherType::Ipv6);
|
||||||
|
|
|
@ -188,16 +188,16 @@ mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Packet<T> {
|
impl<T: AsRef<[u8]>> Packet<T> {
|
||||||
/// Imbue a raw octet buffer with ICMPv4 packet structure.
|
/// Imbue a raw octet buffer with ICMPv4 packet structure.
|
||||||
pub fn new(buffer: T) -> Packet<T> {
|
pub fn new_unchecked(buffer: T) -> Packet<T> {
|
||||||
Packet { buffer }
|
Packet { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -478,7 +478,7 @@ impl<'a> Repr<'a> {
|
||||||
packet.set_msg_type(Message::DstUnreachable);
|
packet.set_msg_type(Message::DstUnreachable);
|
||||||
packet.set_msg_code(reason.into());
|
packet.set_msg_code(reason.into());
|
||||||
|
|
||||||
let mut ip_packet = Ipv4Packet::new(packet.data_mut());
|
let mut ip_packet = Ipv4Packet::new_unchecked(packet.data_mut());
|
||||||
header.emit(&mut ip_packet, checksum_caps);
|
header.emit(&mut ip_packet, checksum_caps);
|
||||||
let payload = &mut ip_packet.into_inner()[header.buffer_len()..];
|
let payload = &mut ip_packet.into_inner()[header.buffer_len()..];
|
||||||
payload.copy_from_slice(&data[..])
|
payload.copy_from_slice(&data[..])
|
||||||
|
@ -566,7 +566,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_echo_deconstruct() {
|
fn test_echo_deconstruct() {
|
||||||
let packet = Packet::new(&ECHO_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&ECHO_PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.msg_type(), Message::EchoRequest);
|
assert_eq!(packet.msg_type(), Message::EchoRequest);
|
||||||
assert_eq!(packet.msg_code(), 0);
|
assert_eq!(packet.msg_code(), 0);
|
||||||
assert_eq!(packet.checksum(), 0x8efe);
|
assert_eq!(packet.checksum(), 0x8efe);
|
||||||
|
@ -579,7 +579,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_echo_construct() {
|
fn test_echo_construct() {
|
||||||
let mut bytes = vec![0xa5; 12];
|
let mut bytes = vec![0xa5; 12];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_msg_type(Message::EchoRequest);
|
packet.set_msg_type(Message::EchoRequest);
|
||||||
packet.set_msg_code(0);
|
packet.set_msg_code(0);
|
||||||
packet.set_echo_ident(0x1234);
|
packet.set_echo_ident(0x1234);
|
||||||
|
@ -599,7 +599,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_echo_parse() {
|
fn test_echo_parse() {
|
||||||
let packet = Packet::new(&ECHO_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&ECHO_PACKET_BYTES[..]);
|
||||||
let repr = Repr::parse(&packet, &ChecksumCapabilities::default()).unwrap();
|
let repr = Repr::parse(&packet, &ChecksumCapabilities::default()).unwrap();
|
||||||
assert_eq!(repr, echo_packet_repr());
|
assert_eq!(repr, echo_packet_repr());
|
||||||
}
|
}
|
||||||
|
@ -608,7 +608,7 @@ mod test {
|
||||||
fn test_echo_emit() {
|
fn test_echo_emit() {
|
||||||
let repr = echo_packet_repr();
|
let repr = echo_packet_repr();
|
||||||
let mut bytes = vec![0xa5; repr.buffer_len()];
|
let mut bytes = vec![0xa5; repr.buffer_len()];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut packet, &ChecksumCapabilities::default());
|
repr.emit(&mut packet, &ChecksumCapabilities::default());
|
||||||
assert_eq!(&packet.into_inner()[..], &ECHO_PACKET_BYTES[..]);
|
assert_eq!(&packet.into_inner()[..], &ECHO_PACKET_BYTES[..]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -251,16 +251,16 @@ pub(super) mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Packet<T> {
|
impl<T: AsRef<[u8]>> Packet<T> {
|
||||||
/// Imbue a raw octet buffer with ICMPv6 packet structure.
|
/// Imbue a raw octet buffer with ICMPv6 packet structure.
|
||||||
pub fn new(buffer: T) -> Packet<T> {
|
pub fn new_unchecked(buffer: T) -> Packet<T> {
|
||||||
Packet { buffer }
|
Packet { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -656,7 +656,7 @@ impl<'a> Repr<'a> {
|
||||||
packet: &mut Packet<&mut T>, checksum_caps: &ChecksumCapabilities)
|
packet: &mut Packet<&mut T>, checksum_caps: &ChecksumCapabilities)
|
||||||
where T: AsRef<[u8]> + AsMut<[u8]> + ?Sized {
|
where T: AsRef<[u8]> + AsMut<[u8]> + ?Sized {
|
||||||
fn emit_contained_packet(buffer: &mut [u8], header: Ipv6Repr, data: &[u8]) {
|
fn emit_contained_packet(buffer: &mut [u8], header: Ipv6Repr, data: &[u8]) {
|
||||||
let mut ip_packet = Ipv6Packet::new(buffer);
|
let mut ip_packet = Ipv6Packet::new_unchecked(buffer);
|
||||||
header.emit(&mut ip_packet);
|
header.emit(&mut ip_packet);
|
||||||
let payload = &mut ip_packet.into_inner()[header.buffer_len()..];
|
let payload = &mut ip_packet.into_inner()[header.buffer_len()..];
|
||||||
payload.copy_from_slice(&data[..]);
|
payload.copy_from_slice(&data[..]);
|
||||||
|
@ -812,7 +812,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_echo_deconstruct() {
|
fn test_echo_deconstruct() {
|
||||||
let packet = Packet::new(&ECHO_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&ECHO_PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.msg_type(), Message::EchoRequest);
|
assert_eq!(packet.msg_type(), Message::EchoRequest);
|
||||||
assert_eq!(packet.msg_code(), 0);
|
assert_eq!(packet.msg_code(), 0);
|
||||||
assert_eq!(packet.checksum(), 0x19b3);
|
assert_eq!(packet.checksum(), 0x19b3);
|
||||||
|
@ -826,7 +826,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_echo_construct() {
|
fn test_echo_construct() {
|
||||||
let mut bytes = vec![0xa5; 12];
|
let mut bytes = vec![0xa5; 12];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_msg_type(Message::EchoRequest);
|
packet.set_msg_type(Message::EchoRequest);
|
||||||
packet.set_msg_code(0);
|
packet.set_msg_code(0);
|
||||||
packet.set_echo_ident(0x1234);
|
packet.set_echo_ident(0x1234);
|
||||||
|
@ -838,7 +838,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_echo_repr_parse() {
|
fn test_echo_repr_parse() {
|
||||||
let packet = Packet::new(&ECHO_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&ECHO_PACKET_BYTES[..]);
|
||||||
let repr = Repr::parse(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
let repr = Repr::parse(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
||||||
&packet, &ChecksumCapabilities::default()).unwrap();
|
&packet, &ChecksumCapabilities::default()).unwrap();
|
||||||
assert_eq!(repr, echo_packet_repr());
|
assert_eq!(repr, echo_packet_repr());
|
||||||
|
@ -848,7 +848,7 @@ mod test {
|
||||||
fn test_echo_emit() {
|
fn test_echo_emit() {
|
||||||
let repr = echo_packet_repr();
|
let repr = echo_packet_repr();
|
||||||
let mut bytes = vec![0xa5; repr.buffer_len()];
|
let mut bytes = vec![0xa5; repr.buffer_len()];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
repr.emit(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
repr.emit(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
||||||
&mut packet, &ChecksumCapabilities::default());
|
&mut packet, &ChecksumCapabilities::default());
|
||||||
assert_eq!(&packet.into_inner()[..], &ECHO_PACKET_BYTES[..]);
|
assert_eq!(&packet.into_inner()[..], &ECHO_PACKET_BYTES[..]);
|
||||||
|
@ -856,7 +856,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_too_big_deconstruct() {
|
fn test_too_big_deconstruct() {
|
||||||
let packet = Packet::new(&PKT_TOO_BIG_BYTES[..]);
|
let packet = Packet::new_unchecked(&PKT_TOO_BIG_BYTES[..]);
|
||||||
assert_eq!(packet.msg_type(), Message::PktTooBig);
|
assert_eq!(packet.msg_type(), Message::PktTooBig);
|
||||||
assert_eq!(packet.msg_code(), 0);
|
assert_eq!(packet.msg_code(), 0);
|
||||||
assert_eq!(packet.checksum(), 0x0fc9);
|
assert_eq!(packet.checksum(), 0x0fc9);
|
||||||
|
@ -869,7 +869,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_too_big_construct() {
|
fn test_too_big_construct() {
|
||||||
let mut bytes = vec![0xa5; 60];
|
let mut bytes = vec![0xa5; 60];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_msg_type(Message::PktTooBig);
|
packet.set_msg_type(Message::PktTooBig);
|
||||||
packet.set_msg_code(0);
|
packet.set_msg_code(0);
|
||||||
packet.set_pkt_too_big_mtu(1500);
|
packet.set_pkt_too_big_mtu(1500);
|
||||||
|
@ -880,7 +880,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_too_big_repr_parse() {
|
fn test_too_big_repr_parse() {
|
||||||
let packet = Packet::new(&PKT_TOO_BIG_BYTES[..]);
|
let packet = Packet::new_unchecked(&PKT_TOO_BIG_BYTES[..]);
|
||||||
let repr = Repr::parse(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
let repr = Repr::parse(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
||||||
&packet, &ChecksumCapabilities::default()).unwrap();
|
&packet, &ChecksumCapabilities::default()).unwrap();
|
||||||
assert_eq!(repr, too_big_packet_repr());
|
assert_eq!(repr, too_big_packet_repr());
|
||||||
|
@ -890,7 +890,7 @@ mod test {
|
||||||
fn test_too_big_emit() {
|
fn test_too_big_emit() {
|
||||||
let repr = too_big_packet_repr();
|
let repr = too_big_packet_repr();
|
||||||
let mut bytes = vec![0xa5; repr.buffer_len()];
|
let mut bytes = vec![0xa5; repr.buffer_len()];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
repr.emit(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
repr.emit(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
||||||
&mut packet, &ChecksumCapabilities::default());
|
&mut packet, &ChecksumCapabilities::default());
|
||||||
assert_eq!(&packet.into_inner()[..], &PKT_TOO_BIG_BYTES[..]);
|
assert_eq!(&packet.into_inner()[..], &PKT_TOO_BIG_BYTES[..]);
|
||||||
|
|
|
@ -53,16 +53,16 @@ impl fmt::Display for Message {
|
||||||
/// [RFC 2236]: https://tools.ietf.org/html/rfc2236
|
/// [RFC 2236]: https://tools.ietf.org/html/rfc2236
|
||||||
impl<T: AsRef<[u8]>> Packet<T> {
|
impl<T: AsRef<[u8]>> Packet<T> {
|
||||||
/// Imbue a raw octet buffer with IGMPv2 packet structure.
|
/// Imbue a raw octet buffer with IGMPv2 packet structure.
|
||||||
pub fn new(buffer: T) -> Packet<T> {
|
pub fn new_unchecked(buffer: T) -> Packet<T> {
|
||||||
Packet { buffer }
|
Packet { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -379,7 +379,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_leave_group_deconstruct() {
|
fn test_leave_group_deconstruct() {
|
||||||
let packet = Packet::new(&LEAVE_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&LEAVE_PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.msg_type(), Message::LeaveGroup);
|
assert_eq!(packet.msg_type(), Message::LeaveGroup);
|
||||||
assert_eq!(packet.max_resp_code(), 0);
|
assert_eq!(packet.max_resp_code(), 0);
|
||||||
assert_eq!(packet.checksum(), 0x269);
|
assert_eq!(packet.checksum(), 0x269);
|
||||||
|
@ -390,7 +390,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_report_deconstruct() {
|
fn test_report_deconstruct() {
|
||||||
let packet = Packet::new(&REPORT_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&REPORT_PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.msg_type(), Message::MembershipReportV2);
|
assert_eq!(packet.msg_type(), Message::MembershipReportV2);
|
||||||
assert_eq!(packet.max_resp_code(), 0);
|
assert_eq!(packet.max_resp_code(), 0);
|
||||||
assert_eq!(packet.checksum(), 0x08da);
|
assert_eq!(packet.checksum(), 0x08da);
|
||||||
|
@ -402,7 +402,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_leave_construct() {
|
fn test_leave_construct() {
|
||||||
let mut bytes = vec![0xa5; 8];
|
let mut bytes = vec![0xa5; 8];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_msg_type(Message::LeaveGroup);
|
packet.set_msg_type(Message::LeaveGroup);
|
||||||
packet.set_max_resp_code(0);
|
packet.set_max_resp_code(0);
|
||||||
packet.set_group_address(Ipv4Address::from_bytes(&[224, 0, 6, 150]));
|
packet.set_group_address(Ipv4Address::from_bytes(&[224, 0, 6, 150]));
|
||||||
|
@ -413,7 +413,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_report_construct() {
|
fn test_report_construct() {
|
||||||
let mut bytes = vec![0xa5; 8];
|
let mut bytes = vec![0xa5; 8];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_msg_type(Message::MembershipReportV2);
|
packet.set_msg_type(Message::MembershipReportV2);
|
||||||
packet.set_max_resp_code(0);
|
packet.set_max_resp_code(0);
|
||||||
packet.set_group_address(Ipv4Address::from_bytes(&[225, 0, 0, 37]));
|
packet.set_group_address(Ipv4Address::from_bytes(&[225, 0, 0, 37]));
|
||||||
|
|
|
@ -684,10 +684,10 @@ impl Repr {
|
||||||
panic!("unspecified IP representation"),
|
panic!("unspecified IP representation"),
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
&Repr::Ipv4(repr) =>
|
&Repr::Ipv4(repr) =>
|
||||||
repr.emit(&mut Ipv4Packet::new(buffer), &_checksum_caps),
|
repr.emit(&mut Ipv4Packet::new_unchecked(buffer), &_checksum_caps),
|
||||||
#[cfg(feature = "proto-ipv6")]
|
#[cfg(feature = "proto-ipv6")]
|
||||||
&Repr::Ipv6(repr) =>
|
&Repr::Ipv6(repr) =>
|
||||||
repr.emit(&mut Ipv6Packet::new(buffer)),
|
repr.emit(&mut Ipv6Packet::new_unchecked(buffer)),
|
||||||
&Repr::__Nonexhaustive =>
|
&Repr::__Nonexhaustive =>
|
||||||
unreachable!()
|
unreachable!()
|
||||||
}
|
}
|
||||||
|
|
|
@ -241,16 +241,16 @@ mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Packet<T> {
|
impl<T: AsRef<[u8]>> Packet<T> {
|
||||||
/// Imbue a raw octet buffer with IPv4 packet structure.
|
/// Imbue a raw octet buffer with IPv4 packet structure.
|
||||||
pub fn new(buffer: T) -> Packet<T> {
|
pub fn new_unchecked(buffer: T) -> Packet<T> {
|
||||||
Packet { buffer }
|
Packet { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -704,7 +704,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_deconstruct() {
|
fn test_deconstruct() {
|
||||||
let packet = Packet::new(&PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.version(), 4);
|
assert_eq!(packet.version(), 4);
|
||||||
assert_eq!(packet.header_len(), 20);
|
assert_eq!(packet.header_len(), 20);
|
||||||
assert_eq!(packet.dscp(), 0);
|
assert_eq!(packet.dscp(), 0);
|
||||||
|
@ -726,7 +726,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_construct() {
|
fn test_construct() {
|
||||||
let mut bytes = vec![0xa5; 30];
|
let mut bytes = vec![0xa5; 30];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_version(4);
|
packet.set_version(4);
|
||||||
packet.set_header_len(20);
|
packet.set_header_len(20);
|
||||||
packet.clear_flags();
|
packet.clear_flags();
|
||||||
|
@ -752,9 +752,9 @@ mod test {
|
||||||
bytes.extend(&PACKET_BYTES[..]);
|
bytes.extend(&PACKET_BYTES[..]);
|
||||||
bytes.push(0);
|
bytes.push(0);
|
||||||
|
|
||||||
assert_eq!(Packet::new(&bytes).payload().len(),
|
assert_eq!(Packet::new_unchecked(&bytes).payload().len(),
|
||||||
PAYLOAD_BYTES.len());
|
PAYLOAD_BYTES.len());
|
||||||
assert_eq!(Packet::new(&mut bytes).payload_mut().len(),
|
assert_eq!(Packet::new_unchecked(&mut bytes).payload_mut().len(),
|
||||||
PAYLOAD_BYTES.len());
|
PAYLOAD_BYTES.len());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -762,7 +762,7 @@ mod test {
|
||||||
fn test_total_len_overflow() {
|
fn test_total_len_overflow() {
|
||||||
let mut bytes = vec![];
|
let mut bytes = vec![];
|
||||||
bytes.extend(&PACKET_BYTES[..]);
|
bytes.extend(&PACKET_BYTES[..]);
|
||||||
Packet::new(&mut bytes).set_total_len(128);
|
Packet::new_unchecked(&mut bytes).set_total_len(128);
|
||||||
|
|
||||||
assert_eq!(Packet::new_checked(&bytes).unwrap_err(),
|
assert_eq!(Packet::new_checked(&bytes).unwrap_err(),
|
||||||
Error::Truncated);
|
Error::Truncated);
|
||||||
|
@ -791,7 +791,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse() {
|
fn test_parse() {
|
||||||
let packet = Packet::new(&REPR_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&REPR_PACKET_BYTES[..]);
|
||||||
let repr = Repr::parse(&packet, &ChecksumCapabilities::default()).unwrap();
|
let repr = Repr::parse(&packet, &ChecksumCapabilities::default()).unwrap();
|
||||||
assert_eq!(repr, packet_repr());
|
assert_eq!(repr, packet_repr());
|
||||||
}
|
}
|
||||||
|
@ -800,10 +800,10 @@ mod test {
|
||||||
fn test_parse_bad_version() {
|
fn test_parse_bad_version() {
|
||||||
let mut bytes = vec![0; 24];
|
let mut bytes = vec![0; 24];
|
||||||
bytes.copy_from_slice(&REPR_PACKET_BYTES[..]);
|
bytes.copy_from_slice(&REPR_PACKET_BYTES[..]);
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_version(6);
|
packet.set_version(6);
|
||||||
packet.fill_checksum();
|
packet.fill_checksum();
|
||||||
let packet = Packet::new(&*packet.into_inner());
|
let packet = Packet::new_unchecked(&*packet.into_inner());
|
||||||
assert_eq!(Repr::parse(&packet, &ChecksumCapabilities::default()), Err(Error::Malformed));
|
assert_eq!(Repr::parse(&packet, &ChecksumCapabilities::default()), Err(Error::Malformed));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -818,7 +818,7 @@ mod test {
|
||||||
fn test_emit() {
|
fn test_emit() {
|
||||||
let repr = packet_repr();
|
let repr = packet_repr();
|
||||||
let mut bytes = vec![0xa5; repr.buffer_len() + REPR_PAYLOAD_BYTES.len()];
|
let mut bytes = vec![0xa5; repr.buffer_len() + REPR_PAYLOAD_BYTES.len()];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut packet, &ChecksumCapabilities::default());
|
repr.emit(&mut packet, &ChecksumCapabilities::default());
|
||||||
packet.payload_mut().copy_from_slice(&REPR_PAYLOAD_BYTES);
|
packet.payload_mut().copy_from_slice(&REPR_PAYLOAD_BYTES);
|
||||||
assert_eq!(&packet.into_inner()[..], &REPR_PACKET_BYTES[..]);
|
assert_eq!(&packet.into_inner()[..], &REPR_PACKET_BYTES[..]);
|
||||||
|
|
|
@ -378,17 +378,17 @@ mod field {
|
||||||
impl<T: AsRef<[u8]>> Packet<T> {
|
impl<T: AsRef<[u8]>> Packet<T> {
|
||||||
/// Create a raw octet buffer with an IPv6 packet structure.
|
/// Create a raw octet buffer with an IPv6 packet structure.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new(buffer: T) -> Packet<T> {
|
pub fn new_unchecked(buffer: T) -> Packet<T> {
|
||||||
Packet { buffer }
|
Packet { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -930,7 +930,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_packet_deconstruction() {
|
fn test_packet_deconstruction() {
|
||||||
let packet = Packet::new(&REPR_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&REPR_PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.check_len(), Ok(()));
|
assert_eq!(packet.check_len(), Ok(()));
|
||||||
assert_eq!(packet.version(), 6);
|
assert_eq!(packet.version(), 6);
|
||||||
assert_eq!(packet.traffic_class(), 0);
|
assert_eq!(packet.traffic_class(), 0);
|
||||||
|
@ -950,7 +950,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_packet_construction() {
|
fn test_packet_construction() {
|
||||||
let mut bytes = [0xff; 52];
|
let mut bytes = [0xff; 52];
|
||||||
let mut packet = Packet::new(&mut bytes[..]);
|
let mut packet = Packet::new_unchecked(&mut bytes[..]);
|
||||||
// Version, Traffic Class, and Flow Label are not
|
// Version, Traffic Class, and Flow Label are not
|
||||||
// byte aligned. make sure the setters and getters
|
// byte aligned. make sure the setters and getters
|
||||||
// do not interfere with each other.
|
// do not interfere with each other.
|
||||||
|
@ -989,9 +989,9 @@ mod test {
|
||||||
bytes.extend(&REPR_PACKET_BYTES[..]);
|
bytes.extend(&REPR_PACKET_BYTES[..]);
|
||||||
bytes.push(0);
|
bytes.push(0);
|
||||||
|
|
||||||
assert_eq!(Packet::new(&bytes).payload().len(),
|
assert_eq!(Packet::new_unchecked(&bytes).payload().len(),
|
||||||
REPR_PAYLOAD_BYTES.len());
|
REPR_PAYLOAD_BYTES.len());
|
||||||
assert_eq!(Packet::new(&mut bytes).payload_mut().len(),
|
assert_eq!(Packet::new_unchecked(&mut bytes).payload_mut().len(),
|
||||||
REPR_PAYLOAD_BYTES.len());
|
REPR_PAYLOAD_BYTES.len());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -999,7 +999,7 @@ mod test {
|
||||||
fn test_total_len_overflow() {
|
fn test_total_len_overflow() {
|
||||||
let mut bytes = vec![];
|
let mut bytes = vec![];
|
||||||
bytes.extend(&REPR_PACKET_BYTES[..]);
|
bytes.extend(&REPR_PACKET_BYTES[..]);
|
||||||
Packet::new(&mut bytes).set_payload_len(0x80);
|
Packet::new_unchecked(&mut bytes).set_payload_len(0x80);
|
||||||
|
|
||||||
assert_eq!(Packet::new_checked(&bytes).unwrap_err(),
|
assert_eq!(Packet::new_checked(&bytes).unwrap_err(),
|
||||||
Error::Truncated);
|
Error::Truncated);
|
||||||
|
@ -1007,7 +1007,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_repr_parse_valid() {
|
fn test_repr_parse_valid() {
|
||||||
let packet = Packet::new(&REPR_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&REPR_PACKET_BYTES[..]);
|
||||||
let repr = Repr::parse(&packet).unwrap();
|
let repr = Repr::parse(&packet).unwrap();
|
||||||
assert_eq!(repr, packet_repr());
|
assert_eq!(repr, packet_repr());
|
||||||
}
|
}
|
||||||
|
@ -1015,30 +1015,30 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_repr_parse_bad_version() {
|
fn test_repr_parse_bad_version() {
|
||||||
let mut bytes = vec![0; 40];
|
let mut bytes = vec![0; 40];
|
||||||
let mut packet = Packet::new(&mut bytes[..]);
|
let mut packet = Packet::new_unchecked(&mut bytes[..]);
|
||||||
packet.set_version(4);
|
packet.set_version(4);
|
||||||
packet.set_payload_len(0);
|
packet.set_payload_len(0);
|
||||||
let packet = Packet::new(&*packet.into_inner());
|
let packet = Packet::new_unchecked(&*packet.into_inner());
|
||||||
assert_eq!(Repr::parse(&packet), Err(Error::Malformed));
|
assert_eq!(Repr::parse(&packet), Err(Error::Malformed));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_repr_parse_smaller_than_header() {
|
fn test_repr_parse_smaller_than_header() {
|
||||||
let mut bytes = vec![0; 40];
|
let mut bytes = vec![0; 40];
|
||||||
let mut packet = Packet::new(&mut bytes[..]);
|
let mut packet = Packet::new_unchecked(&mut bytes[..]);
|
||||||
packet.set_version(6);
|
packet.set_version(6);
|
||||||
packet.set_payload_len(39);
|
packet.set_payload_len(39);
|
||||||
let packet = Packet::new(&*packet.into_inner());
|
let packet = Packet::new_unchecked(&*packet.into_inner());
|
||||||
assert_eq!(Repr::parse(&packet), Err(Error::Truncated));
|
assert_eq!(Repr::parse(&packet), Err(Error::Truncated));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_repr_parse_smaller_than_payload() {
|
fn test_repr_parse_smaller_than_payload() {
|
||||||
let mut bytes = vec![0; 40];
|
let mut bytes = vec![0; 40];
|
||||||
let mut packet = Packet::new(&mut bytes[..]);
|
let mut packet = Packet::new_unchecked(&mut bytes[..]);
|
||||||
packet.set_version(6);
|
packet.set_version(6);
|
||||||
packet.set_payload_len(1);
|
packet.set_payload_len(1);
|
||||||
let packet = Packet::new(&*packet.into_inner());
|
let packet = Packet::new_unchecked(&*packet.into_inner());
|
||||||
assert_eq!(Repr::parse(&packet), Err(Error::Truncated));
|
assert_eq!(Repr::parse(&packet), Err(Error::Truncated));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1046,7 +1046,7 @@ mod test {
|
||||||
fn test_basic_repr_emit() {
|
fn test_basic_repr_emit() {
|
||||||
let repr = packet_repr();
|
let repr = packet_repr();
|
||||||
let mut bytes = vec![0xff; repr.buffer_len() + REPR_PAYLOAD_BYTES.len()];
|
let mut bytes = vec![0xff; repr.buffer_len() + REPR_PAYLOAD_BYTES.len()];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut packet);
|
repr.emit(&mut packet);
|
||||||
packet.payload_mut().copy_from_slice(&REPR_PAYLOAD_BYTES);
|
packet.payload_mut().copy_from_slice(&REPR_PAYLOAD_BYTES);
|
||||||
assert_eq!(&packet.into_inner()[..], &REPR_PACKET_BYTES[..]);
|
assert_eq!(&packet.into_inner()[..], &REPR_PACKET_BYTES[..]);
|
||||||
|
|
|
@ -35,16 +35,16 @@ mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Header<T> {
|
impl<T: AsRef<[u8]>> Header<T> {
|
||||||
/// Create a raw octet buffer with an IPv6 Fragment Header structure.
|
/// Create a raw octet buffer with an IPv6 Fragment Header structure.
|
||||||
pub fn new(buffer: T) -> Header<T> {
|
pub fn new_unchecked(buffer: T) -> Header<T> {
|
||||||
Header { buffer }
|
Header { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Header<T>> {
|
pub fn new_checked(buffer: T) -> Result<Header<T>> {
|
||||||
let header = Self::new(buffer);
|
let header = Self::new_unchecked(buffer);
|
||||||
header.check_len()?;
|
header.check_len()?;
|
||||||
Ok(header)
|
Ok(header)
|
||||||
}
|
}
|
||||||
|
@ -220,20 +220,22 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_check_len() {
|
fn test_check_len() {
|
||||||
// less than 8 bytes
|
// less than 8 bytes
|
||||||
assert_eq!(Err(Error::Truncated), Header::new(&BYTES_HEADER_MORE_FRAG[..7]).check_len());
|
assert_eq!(Err(Error::Truncated),
|
||||||
|
Header::new_unchecked(&BYTES_HEADER_MORE_FRAG[..7]).check_len());
|
||||||
// valid
|
// valid
|
||||||
assert_eq!(Ok(()), Header::new(&BYTES_HEADER_MORE_FRAG).check_len());
|
assert_eq!(Ok(()),
|
||||||
|
Header::new_unchecked(&BYTES_HEADER_MORE_FRAG).check_len());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_header_deconstruct() {
|
fn test_header_deconstruct() {
|
||||||
let header = Header::new(&BYTES_HEADER_MORE_FRAG);
|
let header = Header::new_unchecked(&BYTES_HEADER_MORE_FRAG);
|
||||||
assert_eq!(header.next_header(), Protocol::Tcp);
|
assert_eq!(header.next_header(), Protocol::Tcp);
|
||||||
assert_eq!(header.frag_offset(), 0);
|
assert_eq!(header.frag_offset(), 0);
|
||||||
assert_eq!(header.more_frags(), true);
|
assert_eq!(header.more_frags(), true);
|
||||||
assert_eq!(header.ident(), 12345);
|
assert_eq!(header.ident(), 12345);
|
||||||
|
|
||||||
let header = Header::new(&BYTES_HEADER_LAST_FRAG);
|
let header = Header::new_unchecked(&BYTES_HEADER_LAST_FRAG);
|
||||||
assert_eq!(header.next_header(), Protocol::Tcp);
|
assert_eq!(header.next_header(), Protocol::Tcp);
|
||||||
assert_eq!(header.frag_offset(), 320);
|
assert_eq!(header.frag_offset(), 320);
|
||||||
assert_eq!(header.more_frags(), false);
|
assert_eq!(header.more_frags(), false);
|
||||||
|
@ -242,12 +244,12 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_repr_parse_valid() {
|
fn test_repr_parse_valid() {
|
||||||
let header = Header::new(&BYTES_HEADER_MORE_FRAG);
|
let header = Header::new_unchecked(&BYTES_HEADER_MORE_FRAG);
|
||||||
let repr = Repr::parse(&header).unwrap();
|
let repr = Repr::parse(&header).unwrap();
|
||||||
assert_eq!(repr,
|
assert_eq!(repr,
|
||||||
Repr{ next_header: Protocol::Tcp, frag_offset: 0, more_frags: true, ident: 12345 });
|
Repr{ next_header: Protocol::Tcp, frag_offset: 0, more_frags: true, ident: 12345 });
|
||||||
|
|
||||||
let header = Header::new(&BYTES_HEADER_LAST_FRAG);
|
let header = Header::new_unchecked(&BYTES_HEADER_LAST_FRAG);
|
||||||
let repr = Repr::parse(&header).unwrap();
|
let repr = Repr::parse(&header).unwrap();
|
||||||
assert_eq!(repr,
|
assert_eq!(repr,
|
||||||
Repr{ next_header: Protocol::Tcp, frag_offset: 320, more_frags: false, ident: 67890 });
|
Repr{ next_header: Protocol::Tcp, frag_offset: 320, more_frags: false, ident: 67890 });
|
||||||
|
@ -257,20 +259,20 @@ mod test {
|
||||||
fn test_repr_emit() {
|
fn test_repr_emit() {
|
||||||
let repr = Repr{ next_header: Protocol::Tcp, frag_offset: 0, more_frags: true, ident: 12345 };
|
let repr = Repr{ next_header: Protocol::Tcp, frag_offset: 0, more_frags: true, ident: 12345 };
|
||||||
let mut bytes = [0u8; 8];
|
let mut bytes = [0u8; 8];
|
||||||
let mut header = Header::new(&mut bytes);
|
let mut header = Header::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut header);
|
repr.emit(&mut header);
|
||||||
assert_eq!(header.into_inner(), &BYTES_HEADER_MORE_FRAG[0..8]);
|
assert_eq!(header.into_inner(), &BYTES_HEADER_MORE_FRAG[0..8]);
|
||||||
|
|
||||||
let repr = Repr{ next_header: Protocol::Tcp, frag_offset: 320, more_frags: false, ident: 67890 };
|
let repr = Repr{ next_header: Protocol::Tcp, frag_offset: 320, more_frags: false, ident: 67890 };
|
||||||
let mut bytes = [0u8; 8];
|
let mut bytes = [0u8; 8];
|
||||||
let mut header = Header::new(&mut bytes);
|
let mut header = Header::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut header);
|
repr.emit(&mut header);
|
||||||
assert_eq!(header.into_inner(), &BYTES_HEADER_LAST_FRAG[0..8]);
|
assert_eq!(header.into_inner(), &BYTES_HEADER_LAST_FRAG[0..8]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_buffer_len() {
|
fn test_buffer_len() {
|
||||||
let header = Header::new(&BYTES_HEADER_MORE_FRAG);
|
let header = Header::new_unchecked(&BYTES_HEADER_MORE_FRAG);
|
||||||
let repr = Repr::parse(&header).unwrap();
|
let repr = Repr::parse(&header).unwrap();
|
||||||
assert_eq!(repr.buffer_len(), BYTES_HEADER_MORE_FRAG.len());
|
assert_eq!(repr.buffer_len(), BYTES_HEADER_MORE_FRAG.len());
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,16 +49,16 @@ mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Header<T> {
|
impl<T: AsRef<[u8]>> Header<T> {
|
||||||
/// Create a raw octet buffer with an IPv6 Hop-by-Hop Options Header structure.
|
/// Create a raw octet buffer with an IPv6 Hop-by-Hop Options Header structure.
|
||||||
pub fn new(buffer: T) -> Header<T> {
|
pub fn new_unchecked(buffer: T) -> Header<T> {
|
||||||
Header { buffer }
|
Header { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Header<T>> {
|
pub fn new_checked(buffer: T) -> Result<Header<T>> {
|
||||||
let header = Self::new(buffer);
|
let header = Self::new_unchecked(buffer);
|
||||||
header.check_len()?;
|
header.check_len()?;
|
||||||
Ok(header)
|
Ok(header)
|
||||||
}
|
}
|
||||||
|
@ -218,28 +218,34 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_check_len() {
|
fn test_check_len() {
|
||||||
// zero byte buffer
|
// zero byte buffer
|
||||||
assert_eq!(Err(Error::Truncated), Header::new(&REPR_PACKET_PAD4[..0]).check_len());
|
assert_eq!(Err(Error::Truncated),
|
||||||
|
Header::new_unchecked(&REPR_PACKET_PAD4[..0]).check_len());
|
||||||
// no length field
|
// no length field
|
||||||
assert_eq!(Err(Error::Truncated), Header::new(&REPR_PACKET_PAD4[..1]).check_len());
|
assert_eq!(Err(Error::Truncated),
|
||||||
|
Header::new_unchecked(&REPR_PACKET_PAD4[..1]).check_len());
|
||||||
// less than 8 bytes
|
// less than 8 bytes
|
||||||
assert_eq!(Err(Error::Truncated), Header::new(&REPR_PACKET_PAD4[..7]).check_len());
|
assert_eq!(Err(Error::Truncated),
|
||||||
|
Header::new_unchecked(&REPR_PACKET_PAD4[..7]).check_len());
|
||||||
// valid
|
// valid
|
||||||
assert_eq!(Ok(()), Header::new(&REPR_PACKET_PAD4).check_len());
|
assert_eq!(Ok(()),
|
||||||
|
Header::new_unchecked(&REPR_PACKET_PAD4).check_len());
|
||||||
// valid
|
// valid
|
||||||
assert_eq!(Ok(()), Header::new(&REPR_PACKET_PAD12).check_len());
|
assert_eq!(Ok(()),
|
||||||
|
Header::new_unchecked(&REPR_PACKET_PAD12).check_len());
|
||||||
// length field value greater than number of bytes
|
// length field value greater than number of bytes
|
||||||
let header: [u8; 8] = [0x06, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0];
|
let header: [u8; 8] = [0x06, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0];
|
||||||
assert_eq!(Err(Error::Truncated), Header::new(&header).check_len());
|
assert_eq!(Err(Error::Truncated),
|
||||||
|
Header::new_unchecked(&header).check_len());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_header_deconstruct() {
|
fn test_header_deconstruct() {
|
||||||
let header = Header::new(&REPR_PACKET_PAD4);
|
let header = Header::new_unchecked(&REPR_PACKET_PAD4);
|
||||||
assert_eq!(header.next_header(), Protocol::Tcp);
|
assert_eq!(header.next_header(), Protocol::Tcp);
|
||||||
assert_eq!(header.header_len(), 0);
|
assert_eq!(header.header_len(), 0);
|
||||||
assert_eq!(header.options(), &REPR_PACKET_PAD4[2..]);
|
assert_eq!(header.options(), &REPR_PACKET_PAD4[2..]);
|
||||||
|
|
||||||
let header = Header::new(&REPR_PACKET_PAD12);
|
let header = Header::new_unchecked(&REPR_PACKET_PAD12);
|
||||||
assert_eq!(header.next_header(), Protocol::Tcp);
|
assert_eq!(header.next_header(), Protocol::Tcp);
|
||||||
assert_eq!(header.header_len(), 1);
|
assert_eq!(header.header_len(), 1);
|
||||||
assert_eq!(header.options(), &REPR_PACKET_PAD12[2..]);
|
assert_eq!(header.options(), &REPR_PACKET_PAD12[2..]);
|
||||||
|
@ -251,15 +257,19 @@ mod test {
|
||||||
bytes.extend(&REPR_PACKET_PAD4[..]);
|
bytes.extend(&REPR_PACKET_PAD4[..]);
|
||||||
bytes.push(0);
|
bytes.push(0);
|
||||||
|
|
||||||
assert_eq!(Header::new(&bytes).options().len(), REPR_PACKET_PAD4[2..].len());
|
assert_eq!(Header::new_unchecked(&bytes).options().len(),
|
||||||
assert_eq!(Header::new(&mut bytes).options_mut().len(), REPR_PACKET_PAD4[2..].len());
|
REPR_PACKET_PAD4[2..].len());
|
||||||
|
assert_eq!(Header::new_unchecked(&mut bytes).options_mut().len(),
|
||||||
|
REPR_PACKET_PAD4[2..].len());
|
||||||
|
|
||||||
let mut bytes = vec![];
|
let mut bytes = vec![];
|
||||||
bytes.extend(&REPR_PACKET_PAD12[..]);
|
bytes.extend(&REPR_PACKET_PAD12[..]);
|
||||||
bytes.push(0);
|
bytes.push(0);
|
||||||
|
|
||||||
assert_eq!(Header::new(&bytes).options().len(), REPR_PACKET_PAD12[2..].len());
|
assert_eq!(Header::new_unchecked(&bytes).options().len(),
|
||||||
assert_eq!(Header::new(&mut bytes).options_mut().len(), REPR_PACKET_PAD12[2..].len());
|
REPR_PACKET_PAD12[2..].len());
|
||||||
|
assert_eq!(Header::new_unchecked(&mut bytes).options_mut().len(),
|
||||||
|
REPR_PACKET_PAD12[2..].len());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -267,51 +277,55 @@ mod test {
|
||||||
let mut bytes = vec![];
|
let mut bytes = vec![];
|
||||||
bytes.extend(&REPR_PACKET_PAD4);
|
bytes.extend(&REPR_PACKET_PAD4);
|
||||||
let len = bytes.len() as u8;
|
let len = bytes.len() as u8;
|
||||||
Header::new(&mut bytes).set_header_len(len + 1);
|
Header::new_unchecked(&mut bytes).set_header_len(len + 1);
|
||||||
|
|
||||||
assert_eq!(Header::new_checked(&bytes).unwrap_err(), Error::Truncated);
|
assert_eq!(Header::new_checked(&bytes).unwrap_err(), Error::Truncated);
|
||||||
|
|
||||||
let mut bytes = vec![];
|
let mut bytes = vec![];
|
||||||
bytes.extend(&REPR_PACKET_PAD12);
|
bytes.extend(&REPR_PACKET_PAD12);
|
||||||
let len = bytes.len() as u8;
|
let len = bytes.len() as u8;
|
||||||
Header::new(&mut bytes).set_header_len(len + 1);
|
Header::new_unchecked(&mut bytes).set_header_len(len + 1);
|
||||||
|
|
||||||
assert_eq!(Header::new_checked(&bytes).unwrap_err(), Error::Truncated);
|
assert_eq!(Header::new_checked(&bytes).unwrap_err(), Error::Truncated);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_repr_parse_valid() {
|
fn test_repr_parse_valid() {
|
||||||
let header = Header::new(&REPR_PACKET_PAD4);
|
let header = Header::new_unchecked(&REPR_PACKET_PAD4);
|
||||||
let repr = Repr::parse(&header).unwrap();
|
let repr = Repr::parse(&header).unwrap();
|
||||||
assert_eq!(repr, Repr{ next_header: Protocol::Tcp, length: 0, options: &REPR_PACKET_PAD4[2..] });
|
assert_eq!(repr, Repr {
|
||||||
|
next_header: Protocol::Tcp, length: 0, options: &REPR_PACKET_PAD4[2..]
|
||||||
|
});
|
||||||
|
|
||||||
let header = Header::new(&REPR_PACKET_PAD12);
|
let header = Header::new_unchecked(&REPR_PACKET_PAD12);
|
||||||
let repr = Repr::parse(&header).unwrap();
|
let repr = Repr::parse(&header).unwrap();
|
||||||
assert_eq!(repr, Repr{ next_header: Protocol::Tcp, length: 1, options: &REPR_PACKET_PAD12[2..] });
|
assert_eq!(repr, Repr {
|
||||||
|
next_header: Protocol::Tcp, length: 1, options: &REPR_PACKET_PAD12[2..]
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_repr_emit() {
|
fn test_repr_emit() {
|
||||||
let repr = Repr{ next_header: Protocol::Tcp, length: 0, options: &REPR_PACKET_PAD4[2..] };
|
let repr = Repr{ next_header: Protocol::Tcp, length: 0, options: &REPR_PACKET_PAD4[2..] };
|
||||||
let mut bytes = [0u8; 8];
|
let mut bytes = [0u8; 8];
|
||||||
let mut header = Header::new(&mut bytes);
|
let mut header = Header::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut header);
|
repr.emit(&mut header);
|
||||||
assert_eq!(header.into_inner(), &REPR_PACKET_PAD4[..]);
|
assert_eq!(header.into_inner(), &REPR_PACKET_PAD4[..]);
|
||||||
|
|
||||||
let repr = Repr{ next_header: Protocol::Tcp, length: 1, options: &REPR_PACKET_PAD12[2..] };
|
let repr = Repr{ next_header: Protocol::Tcp, length: 1, options: &REPR_PACKET_PAD12[2..] };
|
||||||
let mut bytes = [0u8; 16];
|
let mut bytes = [0u8; 16];
|
||||||
let mut header = Header::new(&mut bytes);
|
let mut header = Header::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut header);
|
repr.emit(&mut header);
|
||||||
assert_eq!(header.into_inner(), &REPR_PACKET_PAD12[..]);
|
assert_eq!(header.into_inner(), &REPR_PACKET_PAD12[..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_buffer_len() {
|
fn test_buffer_len() {
|
||||||
let header = Header::new(&REPR_PACKET_PAD4);
|
let header = Header::new_unchecked(&REPR_PACKET_PAD4);
|
||||||
let repr = Repr::parse(&header).unwrap();
|
let repr = Repr::parse(&header).unwrap();
|
||||||
assert_eq!(repr.buffer_len(), REPR_PACKET_PAD4.len());
|
assert_eq!(repr.buffer_len(), REPR_PACKET_PAD4.len());
|
||||||
|
|
||||||
let header = Header::new(&REPR_PACKET_PAD12);
|
let header = Header::new_unchecked(&REPR_PACKET_PAD12);
|
||||||
let repr = Repr::parse(&header).unwrap();
|
let repr = Repr::parse(&header).unwrap();
|
||||||
assert_eq!(repr.buffer_len(), REPR_PACKET_PAD12.len());
|
assert_eq!(repr.buffer_len(), REPR_PACKET_PAD12.len());
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,16 +87,16 @@ mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Ipv6Option<T> {
|
impl<T: AsRef<[u8]>> Ipv6Option<T> {
|
||||||
/// Create a raw octet buffer with an IPv6 Extension Header Option structure.
|
/// Create a raw octet buffer with an IPv6 Extension Header Option structure.
|
||||||
pub fn new(buffer: T) -> Ipv6Option<T> {
|
pub fn new_unchecked(buffer: T) -> Ipv6Option<T> {
|
||||||
Ipv6Option { buffer }
|
Ipv6Option { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Ipv6Option<T>> {
|
pub fn new_checked(buffer: T) -> Result<Ipv6Option<T>> {
|
||||||
let opt = Self::new(buffer);
|
let opt = Self::new_unchecked(buffer);
|
||||||
opt.check_len()?;
|
opt.check_len()?;
|
||||||
Ok(opt)
|
Ok(opt)
|
||||||
}
|
}
|
||||||
|
@ -376,57 +376,64 @@ mod test {
|
||||||
fn test_check_len() {
|
fn test_check_len() {
|
||||||
let bytes = [0u8];
|
let bytes = [0u8];
|
||||||
// zero byte buffer
|
// zero byte buffer
|
||||||
assert_eq!(Err(Error::Truncated), Ipv6Option::new(&bytes[..0]).check_len());
|
assert_eq!(Err(Error::Truncated),
|
||||||
|
Ipv6Option::new_unchecked(&bytes[..0]).check_len());
|
||||||
// pad1
|
// pad1
|
||||||
assert_eq!(Ok(()), Ipv6Option::new(&IPV6OPTION_BYTES_PAD1).check_len());
|
assert_eq!(Ok(()),
|
||||||
|
Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_PAD1).check_len());
|
||||||
|
|
||||||
// padn with truncated data
|
// padn with truncated data
|
||||||
assert_eq!(Err(Error::Truncated), Ipv6Option::new(&IPV6OPTION_BYTES_PADN[..2]).check_len());
|
assert_eq!(Err(Error::Truncated),
|
||||||
|
Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_PADN[..2]).check_len());
|
||||||
// padn
|
// padn
|
||||||
assert_eq!(Ok(()), Ipv6Option::new(&IPV6OPTION_BYTES_PADN).check_len());
|
assert_eq!(Ok(()),
|
||||||
|
Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_PADN).check_len());
|
||||||
|
|
||||||
// unknown option type with truncated data
|
// unknown option type with truncated data
|
||||||
assert_eq!(Err(Error::Truncated), Ipv6Option::new(&IPV6OPTION_BYTES_UNKNOWN[..4]).check_len());
|
assert_eq!(Err(Error::Truncated),
|
||||||
assert_eq!(Err(Error::Truncated), Ipv6Option::new(&IPV6OPTION_BYTES_UNKNOWN[..1]).check_len());
|
Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_UNKNOWN[..4]).check_len());
|
||||||
|
assert_eq!(Err(Error::Truncated),
|
||||||
|
Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_UNKNOWN[..1]).check_len());
|
||||||
// unknown type
|
// unknown type
|
||||||
assert_eq!(Ok(()), Ipv6Option::new(&IPV6OPTION_BYTES_UNKNOWN).check_len());
|
assert_eq!(Ok(()),
|
||||||
|
Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_UNKNOWN).check_len());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "index out of bounds")]
|
#[should_panic(expected = "index out of bounds")]
|
||||||
fn test_data_len() {
|
fn test_data_len() {
|
||||||
let opt = Ipv6Option::new(&IPV6OPTION_BYTES_PAD1);
|
let opt = Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_PAD1);
|
||||||
opt.data_len();
|
opt.data_len();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_option_deconstruct() {
|
fn test_option_deconstruct() {
|
||||||
// one octet of padding
|
// one octet of padding
|
||||||
let opt = Ipv6Option::new(&IPV6OPTION_BYTES_PAD1);
|
let opt = Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_PAD1);
|
||||||
assert_eq!(opt.option_type(), Type::Pad1);
|
assert_eq!(opt.option_type(), Type::Pad1);
|
||||||
|
|
||||||
// two octets of padding
|
// two octets of padding
|
||||||
let bytes: [u8; 2] = [0x1, 0x0];
|
let bytes: [u8; 2] = [0x1, 0x0];
|
||||||
let opt = Ipv6Option::new(&bytes);
|
let opt = Ipv6Option::new_unchecked(&bytes);
|
||||||
assert_eq!(opt.option_type(), Type::PadN);
|
assert_eq!(opt.option_type(), Type::PadN);
|
||||||
assert_eq!(opt.data_len(), 0);
|
assert_eq!(opt.data_len(), 0);
|
||||||
|
|
||||||
// three octets of padding
|
// three octets of padding
|
||||||
let opt = Ipv6Option::new(&IPV6OPTION_BYTES_PADN);
|
let opt = Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_PADN);
|
||||||
assert_eq!(opt.option_type(), Type::PadN);
|
assert_eq!(opt.option_type(), Type::PadN);
|
||||||
assert_eq!(opt.data_len(), 1);
|
assert_eq!(opt.data_len(), 1);
|
||||||
assert_eq!(opt.data(), &[0]);
|
assert_eq!(opt.data(), &[0]);
|
||||||
|
|
||||||
// extra bytes in buffer
|
// extra bytes in buffer
|
||||||
let bytes: [u8; 10] = [0x1, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff];
|
let bytes: [u8; 10] = [0x1, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff];
|
||||||
let opt = Ipv6Option::new(&bytes);
|
let opt = Ipv6Option::new_unchecked(&bytes);
|
||||||
assert_eq!(opt.option_type(), Type::PadN);
|
assert_eq!(opt.option_type(), Type::PadN);
|
||||||
assert_eq!(opt.data_len(), 7);
|
assert_eq!(opt.data_len(), 7);
|
||||||
assert_eq!(opt.data(), &[0, 0, 0, 0, 0, 0, 0]);
|
assert_eq!(opt.data(), &[0, 0, 0, 0, 0, 0, 0]);
|
||||||
|
|
||||||
// unrecognized option
|
// unrecognized option
|
||||||
let bytes: [u8; 1] = [0xff];
|
let bytes: [u8; 1] = [0xff];
|
||||||
let opt = Ipv6Option::new(&bytes);
|
let opt = Ipv6Option::new_unchecked(&bytes);
|
||||||
assert_eq!(opt.option_type(), Type::Unknown(255));
|
assert_eq!(opt.option_type(), Type::Unknown(255));
|
||||||
|
|
||||||
// unrecognized option without length and data
|
// unrecognized option without length and data
|
||||||
|
@ -436,42 +443,42 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_option_parse() {
|
fn test_option_parse() {
|
||||||
// one octet of padding
|
// one octet of padding
|
||||||
let opt = Ipv6Option::new(&IPV6OPTION_BYTES_PAD1);
|
let opt = Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_PAD1);
|
||||||
let pad1 = Repr::parse(&opt).unwrap();
|
let pad1 = Repr::parse(&opt).unwrap();
|
||||||
assert_eq!(pad1, Repr::Pad1);
|
assert_eq!(pad1, Repr::Pad1);
|
||||||
assert_eq!(pad1.buffer_len(), 1);
|
assert_eq!(pad1.buffer_len(), 1);
|
||||||
|
|
||||||
// two or more octets of padding
|
// two or more octets of padding
|
||||||
let opt = Ipv6Option::new(&IPV6OPTION_BYTES_PADN);
|
let opt = Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_PADN);
|
||||||
let padn = Repr::parse(&opt).unwrap();
|
let padn = Repr::parse(&opt).unwrap();
|
||||||
assert_eq!(padn, Repr::PadN(1));
|
assert_eq!(padn, Repr::PadN(1));
|
||||||
assert_eq!(padn.buffer_len(), 3);
|
assert_eq!(padn.buffer_len(), 3);
|
||||||
|
|
||||||
// unrecognized option type
|
// unrecognized option type
|
||||||
let data = [0u8; 3];
|
let data = [0u8; 3];
|
||||||
let opt = Ipv6Option::new(&IPV6OPTION_BYTES_UNKNOWN);
|
let opt = Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_UNKNOWN);
|
||||||
let unknown = Repr::parse(&opt).unwrap();
|
let unknown = Repr::parse(&opt).unwrap();
|
||||||
assert_eq!(unknown, Repr::Unknown { type_: Type::Unknown(255), length: 3, data: &data});
|
assert_eq!(unknown, Repr::Unknown { type_: Type::Unknown(255), length: 3, data: &data });
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_option_emit() {
|
fn test_option_emit() {
|
||||||
let repr = Repr::Pad1;
|
let repr = Repr::Pad1;
|
||||||
let mut bytes = [255u8; 1]; // don't assume bytes are initialized to zero
|
let mut bytes = [255u8; 1]; // don't assume bytes are initialized to zero
|
||||||
let mut opt = Ipv6Option::new(&mut bytes);
|
let mut opt = Ipv6Option::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut opt);
|
repr.emit(&mut opt);
|
||||||
assert_eq!(opt.into_inner(), &IPV6OPTION_BYTES_PAD1);
|
assert_eq!(opt.into_inner(), &IPV6OPTION_BYTES_PAD1);
|
||||||
|
|
||||||
let repr = Repr::PadN(1);
|
let repr = Repr::PadN(1);
|
||||||
let mut bytes = [255u8; 3]; // don't assume bytes are initialized to zero
|
let mut bytes = [255u8; 3]; // don't assume bytes are initialized to zero
|
||||||
let mut opt = Ipv6Option::new(&mut bytes);
|
let mut opt = Ipv6Option::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut opt);
|
repr.emit(&mut opt);
|
||||||
assert_eq!(opt.into_inner(), &IPV6OPTION_BYTES_PADN);
|
assert_eq!(opt.into_inner(), &IPV6OPTION_BYTES_PADN);
|
||||||
|
|
||||||
let data = [0u8; 3];
|
let data = [0u8; 3];
|
||||||
let repr = Repr::Unknown { type_: Type::Unknown(255), length: 3, data: &data };
|
let repr = Repr::Unknown { type_: Type::Unknown(255), length: 3, data: &data };
|
||||||
let mut bytes = [254u8; 5]; // don't assume bytes are initialized to zero
|
let mut bytes = [254u8; 5]; // don't assume bytes are initialized to zero
|
||||||
let mut opt = Ipv6Option::new(&mut bytes);
|
let mut opt = Ipv6Option::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut opt);
|
repr.emit(&mut opt);
|
||||||
assert_eq!(opt.into_inner(), &IPV6OPTION_BYTES_UNKNOWN);
|
assert_eq!(opt.into_inner(), &IPV6OPTION_BYTES_UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,9 +146,9 @@ impl<T: AsRef<[u8]>> Header<T> {
|
||||||
Header { buffer }
|
Header { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Header<T>> {
|
pub fn new_checked(buffer: T) -> Result<Header<T>> {
|
||||||
let header = Self::new(buffer);
|
let header = Self::new(buffer);
|
||||||
|
|
|
@ -172,16 +172,16 @@ pub struct AddressRecord<T: AsRef<[u8]>> {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> AddressRecord<T> {
|
impl<T: AsRef<[u8]>> AddressRecord<T> {
|
||||||
/// Imbue a raw octet buffer with a Address Record structure.
|
/// Imbue a raw octet buffer with a Address Record structure.
|
||||||
pub fn new(buffer: T) -> Self {
|
pub fn new_unchecked(buffer: T) -> Self {
|
||||||
Self { buffer }
|
Self { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Self> {
|
pub fn new_checked(buffer: T) -> Result<Self> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -459,7 +459,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_query_deconstruct() {
|
fn test_query_deconstruct() {
|
||||||
let packet = Packet::new(&QUERY_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&QUERY_PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.msg_type(), Message::MldQuery);
|
assert_eq!(packet.msg_type(), Message::MldQuery);
|
||||||
assert_eq!(packet.msg_code(), 0);
|
assert_eq!(packet.msg_code(), 0);
|
||||||
assert_eq!(packet.checksum(), 0x7374);
|
assert_eq!(packet.checksum(), 0x7374);
|
||||||
|
@ -476,7 +476,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_query_construct() {
|
fn test_query_construct() {
|
||||||
let mut bytes = vec![0xff; 44];
|
let mut bytes = vec![0xff; 44];
|
||||||
let mut packet = Packet::new(&mut bytes[..]);
|
let mut packet = Packet::new_unchecked(&mut bytes[..]);
|
||||||
packet.set_msg_type(Message::MldQuery);
|
packet.set_msg_type(Message::MldQuery);
|
||||||
packet.set_msg_code(0);
|
packet.set_msg_code(0);
|
||||||
packet.set_max_resp_code(0x0400);
|
packet.set_max_resp_code(0x0400);
|
||||||
|
@ -494,12 +494,12 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_record_deconstruct() {
|
fn test_record_deconstruct() {
|
||||||
let packet = Packet::new(&REPORT_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&REPORT_PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.msg_type(), Message::MldReport);
|
assert_eq!(packet.msg_type(), Message::MldReport);
|
||||||
assert_eq!(packet.msg_code(), 0);
|
assert_eq!(packet.msg_code(), 0);
|
||||||
assert_eq!(packet.checksum(), 0x7385);
|
assert_eq!(packet.checksum(), 0x7385);
|
||||||
assert_eq!(packet.nr_mcast_addr_rcrds(), 0x01);
|
assert_eq!(packet.nr_mcast_addr_rcrds(), 0x01);
|
||||||
let addr_rcrd = AddressRecord::new(packet.payload());
|
let addr_rcrd = AddressRecord::new_unchecked(packet.payload());
|
||||||
assert_eq!(addr_rcrd.record_type(), RecordType::ModeIsInclude);
|
assert_eq!(addr_rcrd.record_type(), RecordType::ModeIsInclude);
|
||||||
assert_eq!(addr_rcrd.aux_data_len(), 0x00);
|
assert_eq!(addr_rcrd.aux_data_len(), 0x00);
|
||||||
assert_eq!(addr_rcrd.num_srcs(), 0x01);
|
assert_eq!(addr_rcrd.num_srcs(), 0x01);
|
||||||
|
@ -511,13 +511,13 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_record_construct() {
|
fn test_record_construct() {
|
||||||
let mut bytes = vec![0xff; 44];
|
let mut bytes = vec![0xff; 44];
|
||||||
let mut packet = Packet::new(&mut bytes[..]);
|
let mut packet = Packet::new_unchecked(&mut bytes[..]);
|
||||||
packet.set_msg_type(Message::MldReport);
|
packet.set_msg_type(Message::MldReport);
|
||||||
packet.set_msg_code(0);
|
packet.set_msg_code(0);
|
||||||
packet.clear_reserved();
|
packet.clear_reserved();
|
||||||
packet.set_nr_mcast_addr_rcrds(1);
|
packet.set_nr_mcast_addr_rcrds(1);
|
||||||
{
|
{
|
||||||
let mut addr_rcrd = AddressRecord::new(packet.payload_mut());
|
let mut addr_rcrd = AddressRecord::new_unchecked(packet.payload_mut());
|
||||||
addr_rcrd.set_record_type(RecordType::ModeIsInclude);
|
addr_rcrd.set_record_type(RecordType::ModeIsInclude);
|
||||||
addr_rcrd.set_aux_data_len(0);
|
addr_rcrd.set_aux_data_len(0);
|
||||||
addr_rcrd.set_num_srcs(1);
|
addr_rcrd.set_num_srcs(1);
|
||||||
|
@ -532,7 +532,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_query_repr_parse() {
|
fn test_query_repr_parse() {
|
||||||
let packet = Packet::new(&QUERY_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&QUERY_PACKET_BYTES[..]);
|
||||||
let repr = Icmpv6Repr::parse(&Ipv6Address::LINK_LOCAL_ALL_NODES.into(),
|
let repr = Icmpv6Repr::parse(&Ipv6Address::LINK_LOCAL_ALL_NODES.into(),
|
||||||
&Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(),
|
&Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(),
|
||||||
&packet,
|
&packet,
|
||||||
|
@ -542,7 +542,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_report_repr_parse() {
|
fn test_report_repr_parse() {
|
||||||
let packet = Packet::new(&REPORT_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&REPORT_PACKET_BYTES[..]);
|
||||||
let repr = Icmpv6Repr::parse(&Ipv6Address::LINK_LOCAL_ALL_NODES.into(),
|
let repr = Icmpv6Repr::parse(&Ipv6Address::LINK_LOCAL_ALL_NODES.into(),
|
||||||
&Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(),
|
&Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(),
|
||||||
&packet,
|
&packet,
|
||||||
|
@ -553,7 +553,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_query_repr_emit() {
|
fn test_query_repr_emit() {
|
||||||
let mut bytes = [0x2a; 44];
|
let mut bytes = [0x2a; 44];
|
||||||
let mut packet = Packet::new(&mut bytes[..]);
|
let mut packet = Packet::new_unchecked(&mut bytes[..]);
|
||||||
let repr = create_repr(Message::MldQuery);
|
let repr = create_repr(Message::MldQuery);
|
||||||
repr.emit(&Ipv6Address::LINK_LOCAL_ALL_NODES.into(),
|
repr.emit(&Ipv6Address::LINK_LOCAL_ALL_NODES.into(),
|
||||||
&Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(),
|
&Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(),
|
||||||
|
@ -565,7 +565,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_report_repr_emit() {
|
fn test_report_repr_emit() {
|
||||||
let mut bytes = [0x2a; 44];
|
let mut bytes = [0x2a; 44];
|
||||||
let mut packet = Packet::new(&mut bytes[..]);
|
let mut packet = Packet::new_unchecked(&mut bytes[..]);
|
||||||
let repr = create_repr(Message::MldReport);
|
let repr = create_repr(Message::MldReport);
|
||||||
repr.emit(&Ipv6Address::LINK_LOCAL_ALL_NODES.into(),
|
repr.emit(&Ipv6Address::LINK_LOCAL_ALL_NODES.into(),
|
||||||
&Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(),
|
&Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(),
|
||||||
|
|
|
@ -23,8 +23,8 @@ returned `Ok(())`, then no accessor or setter method will panic; however, the gu
|
||||||
provided by `Packet::check_len()` may no longer hold after changing certain fields,
|
provided by `Packet::check_len()` may no longer hold after changing certain fields,
|
||||||
which are listed in the documentation for the specific packet.
|
which are listed in the documentation for the specific packet.
|
||||||
|
|
||||||
The `Packet::new_checked` method is a shorthand for a combination of `Packet::new` and
|
The `Packet::new_checked` method is a shorthand for a combination of `Packet::new_unchecked`
|
||||||
`Packet::check_len`.
|
and `Packet::check_len`.
|
||||||
When parsing untrusted input, it is *necessary* to use `Packet::new_checked()`;
|
When parsing untrusted input, it is *necessary* to use `Packet::new_checked()`;
|
||||||
so long as the buffer is not modified, no accessor will fail.
|
so long as the buffer is not modified, no accessor will fail.
|
||||||
When emitting output, though, it is *incorrect* to use `Packet::new_checked()`;
|
When emitting output, though, it is *incorrect* to use `Packet::new_checked()`;
|
||||||
|
@ -56,7 +56,7 @@ let repr = Ipv4Repr {
|
||||||
};
|
};
|
||||||
let mut buffer = vec![0; repr.buffer_len() + repr.payload_len];
|
let mut buffer = vec![0; repr.buffer_len() + repr.payload_len];
|
||||||
{ // emission
|
{ // emission
|
||||||
let mut packet = Ipv4Packet::new(&mut buffer);
|
let mut packet = Ipv4Packet::new_unchecked(&mut buffer);
|
||||||
repr.emit(&mut packet, &ChecksumCapabilities::default());
|
repr.emit(&mut packet, &ChecksumCapabilities::default());
|
||||||
}
|
}
|
||||||
{ // parsing
|
{ // parsing
|
||||||
|
|
|
@ -305,7 +305,8 @@ impl<'a> Repr<'a> {
|
||||||
if opt.data_len() < 6 {
|
if opt.data_len() < 6 {
|
||||||
return Err(Error::Truncated)
|
return Err(Error::Truncated)
|
||||||
} else {
|
} else {
|
||||||
let ip_packet = Ipv6Packet::new(&opt.data()[offset + 8..]);
|
let ip_packet =
|
||||||
|
Ipv6Packet::new_unchecked(&opt.data()[offset + 8..]);
|
||||||
let ip_repr = Ipv6Repr::parse(&ip_packet)?;
|
let ip_repr = Ipv6Repr::parse(&ip_packet)?;
|
||||||
let data = &opt.data()[offset + 8 + ip_repr.buffer_len()..];
|
let data = &opt.data()[offset + 8 + ip_repr.buffer_len()..];
|
||||||
redirected_hdr = Some(NdiscRedirectedHeader {
|
redirected_hdr = Some(NdiscRedirectedHeader {
|
||||||
|
@ -375,7 +376,7 @@ impl<'a> Repr<'a> {
|
||||||
packet.set_msg_code(0);
|
packet.set_msg_code(0);
|
||||||
packet.clear_reserved();
|
packet.clear_reserved();
|
||||||
if let Some(lladdr) = lladdr {
|
if let Some(lladdr) = lladdr {
|
||||||
let mut opt_pkt = NdiscOption::new(packet.payload_mut());
|
let mut opt_pkt = NdiscOption::new_unchecked(packet.payload_mut());
|
||||||
NdiscOptionRepr::SourceLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
NdiscOptionRepr::SourceLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -391,17 +392,20 @@ impl<'a> Repr<'a> {
|
||||||
packet.set_retrans_time(retrans_time);
|
packet.set_retrans_time(retrans_time);
|
||||||
let mut offset = 0;
|
let mut offset = 0;
|
||||||
if let Some(lladdr) = lladdr {
|
if let Some(lladdr) = lladdr {
|
||||||
let mut opt_pkt = NdiscOption::new(packet.payload_mut());
|
let mut opt_pkt =
|
||||||
|
NdiscOption::new_unchecked(packet.payload_mut());
|
||||||
NdiscOptionRepr::SourceLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
NdiscOptionRepr::SourceLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
||||||
offset += 8;
|
offset += 8;
|
||||||
}
|
}
|
||||||
if let Some(mtu) = mtu {
|
if let Some(mtu) = mtu {
|
||||||
let mut opt_pkt = NdiscOption::new(&mut packet.payload_mut()[offset..]);
|
let mut opt_pkt =
|
||||||
|
NdiscOption::new_unchecked(&mut packet.payload_mut()[offset..]);
|
||||||
NdiscOptionRepr::Mtu(mtu).emit(&mut opt_pkt);
|
NdiscOptionRepr::Mtu(mtu).emit(&mut opt_pkt);
|
||||||
offset += 8;
|
offset += 8;
|
||||||
}
|
}
|
||||||
if let Some(prefix_info) = prefix_info {
|
if let Some(prefix_info) = prefix_info {
|
||||||
let mut opt_pkt = NdiscOption::new(&mut packet.payload_mut()[offset..]);
|
let mut opt_pkt =
|
||||||
|
NdiscOption::new_unchecked(&mut packet.payload_mut()[offset..]);
|
||||||
NdiscOptionRepr::PrefixInformation(prefix_info).emit(&mut opt_pkt)
|
NdiscOptionRepr::PrefixInformation(prefix_info).emit(&mut opt_pkt)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -412,7 +416,8 @@ impl<'a> Repr<'a> {
|
||||||
packet.clear_reserved();
|
packet.clear_reserved();
|
||||||
packet.set_target_addr(target_addr);
|
packet.set_target_addr(target_addr);
|
||||||
if let Some(lladdr) = lladdr {
|
if let Some(lladdr) = lladdr {
|
||||||
let mut opt_pkt = NdiscOption::new(packet.payload_mut());
|
let mut opt_pkt =
|
||||||
|
NdiscOption::new_unchecked(packet.payload_mut());
|
||||||
NdiscOptionRepr::SourceLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
NdiscOptionRepr::SourceLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -424,7 +429,8 @@ impl<'a> Repr<'a> {
|
||||||
packet.set_neighbor_flags(flags);
|
packet.set_neighbor_flags(flags);
|
||||||
packet.set_target_addr(target_addr);
|
packet.set_target_addr(target_addr);
|
||||||
if let Some(lladdr) = lladdr {
|
if let Some(lladdr) = lladdr {
|
||||||
let mut opt_pkt = NdiscOption::new(packet.payload_mut());
|
let mut opt_pkt =
|
||||||
|
NdiscOption::new_unchecked(packet.payload_mut());
|
||||||
NdiscOptionRepr::TargetLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
NdiscOptionRepr::TargetLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -437,14 +443,16 @@ impl<'a> Repr<'a> {
|
||||||
packet.set_dest_addr(dest_addr);
|
packet.set_dest_addr(dest_addr);
|
||||||
let offset = match lladdr {
|
let offset = match lladdr {
|
||||||
Some(lladdr) => {
|
Some(lladdr) => {
|
||||||
let mut opt_pkt = NdiscOption::new(packet.payload_mut());
|
let mut opt_pkt =
|
||||||
|
NdiscOption::new_unchecked(packet.payload_mut());
|
||||||
NdiscOptionRepr::TargetLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
NdiscOptionRepr::TargetLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
||||||
8
|
8
|
||||||
},
|
},
|
||||||
None => 0,
|
None => 0,
|
||||||
};
|
};
|
||||||
if let Some(redirected_hdr) = redirected_hdr {
|
if let Some(redirected_hdr) = redirected_hdr {
|
||||||
let mut opt_pkt = NdiscOption::new(&mut packet.payload_mut()[offset..]);
|
let mut opt_pkt =
|
||||||
|
NdiscOption::new_unchecked(&mut packet.payload_mut()[offset..]);
|
||||||
NdiscOptionRepr::RedirectedHeader(redirected_hdr).emit(&mut opt_pkt);
|
NdiscOptionRepr::RedirectedHeader(redirected_hdr).emit(&mut opt_pkt);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -485,7 +493,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_router_advert_deconstruct() {
|
fn test_router_advert_deconstruct() {
|
||||||
let packet = Packet::new(&ROUTER_ADVERT_BYTES[..]);
|
let packet = Packet::new_unchecked(&ROUTER_ADVERT_BYTES[..]);
|
||||||
assert_eq!(packet.msg_type(), Message::RouterAdvert);
|
assert_eq!(packet.msg_type(), Message::RouterAdvert);
|
||||||
assert_eq!(packet.msg_code(), 0);
|
assert_eq!(packet.msg_code(), 0);
|
||||||
assert_eq!(packet.current_hop_limit(), 64);
|
assert_eq!(packet.current_hop_limit(), 64);
|
||||||
|
@ -499,7 +507,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_router_advert_construct() {
|
fn test_router_advert_construct() {
|
||||||
let mut bytes = vec![0x0; 24];
|
let mut bytes = vec![0x0; 24];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_msg_type(Message::RouterAdvert);
|
packet.set_msg_type(Message::RouterAdvert);
|
||||||
packet.set_msg_code(0);
|
packet.set_msg_code(0);
|
||||||
packet.set_current_hop_limit(64);
|
packet.set_current_hop_limit(64);
|
||||||
|
@ -514,7 +522,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_router_advert_repr_parse() {
|
fn test_router_advert_repr_parse() {
|
||||||
let packet = Packet::new(&ROUTER_ADVERT_BYTES[..]);
|
let packet = Packet::new_unchecked(&ROUTER_ADVERT_BYTES[..]);
|
||||||
assert_eq!(Icmpv6Repr::parse(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
assert_eq!(Icmpv6Repr::parse(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
||||||
&packet, &ChecksumCapabilities::default()).unwrap(),
|
&packet, &ChecksumCapabilities::default()).unwrap(),
|
||||||
create_repr());
|
create_repr());
|
||||||
|
@ -523,7 +531,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_router_advert_repr_emit() {
|
fn test_router_advert_repr_emit() {
|
||||||
let mut bytes = vec![0x2a; 24];
|
let mut bytes = vec![0x2a; 24];
|
||||||
let mut packet = Packet::new(&mut bytes[..]);
|
let mut packet = Packet::new_unchecked(&mut bytes[..]);
|
||||||
create_repr().emit(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
create_repr().emit(&MOCK_IP_ADDR_1, &MOCK_IP_ADDR_2,
|
||||||
&mut packet, &ChecksumCapabilities::default());
|
&mut packet, &ChecksumCapabilities::default());
|
||||||
assert_eq!(&packet.into_inner()[..], &ROUTER_ADVERT_BYTES[..]);
|
assert_eq!(&packet.into_inner()[..], &ROUTER_ADVERT_BYTES[..]);
|
||||||
|
|
|
@ -145,16 +145,16 @@ mod field {
|
||||||
/// Core getter methods relevant to any type of NDISC option.
|
/// Core getter methods relevant to any type of NDISC option.
|
||||||
impl<T: AsRef<[u8]>> NdiscOption<T> {
|
impl<T: AsRef<[u8]>> NdiscOption<T> {
|
||||||
/// Create a raw octet buffer with an NDISC Option structure.
|
/// Create a raw octet buffer with an NDISC Option structure.
|
||||||
pub fn new(buffer: T) -> NdiscOption<T> {
|
pub fn new_unchecked(buffer: T) -> NdiscOption<T> {
|
||||||
NdiscOption { buffer }
|
NdiscOption { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<NdiscOption<T>> {
|
pub fn new_checked(buffer: T) -> Result<NdiscOption<T>> {
|
||||||
let opt = Self::new(buffer);
|
let opt = Self::new_unchecked(buffer);
|
||||||
opt.check_len()?;
|
opt.check_len()?;
|
||||||
Ok(opt)
|
Ok(opt)
|
||||||
}
|
}
|
||||||
|
@ -460,7 +460,7 @@ impl<'a> Repr<'a> {
|
||||||
if opt.data_len() < 6 {
|
if opt.data_len() < 6 {
|
||||||
Err(Error::Truncated)
|
Err(Error::Truncated)
|
||||||
} else {
|
} else {
|
||||||
let ip_packet = Ipv6Packet::new(&opt.data()[field::IP_DATA..]);
|
let ip_packet = Ipv6Packet::new_unchecked(&opt.data()[field::IP_DATA..]);
|
||||||
let ip_repr = Ipv6Repr::parse(&ip_packet)?;
|
let ip_repr = Ipv6Repr::parse(&ip_packet)?;
|
||||||
Ok(Repr::RedirectedHeader(RedirectedHeader {
|
Ok(Repr::RedirectedHeader(RedirectedHeader {
|
||||||
header: ip_repr,
|
header: ip_repr,
|
||||||
|
@ -535,7 +535,8 @@ impl<'a> Repr<'a> {
|
||||||
opt.clear_redirected_reserved();
|
opt.clear_redirected_reserved();
|
||||||
opt.set_option_type(Type::RedirectedHeader);
|
opt.set_option_type(Type::RedirectedHeader);
|
||||||
opt.set_data_len((header.buffer_len() + 1 + data_len) as u8);
|
opt.set_data_len((header.buffer_len() + 1 + data_len) as u8);
|
||||||
let mut ip_packet = Ipv6Packet::new(&mut opt.data_mut()[field::IP_DATA..]);
|
let mut ip_packet =
|
||||||
|
Ipv6Packet::new_unchecked(&mut opt.data_mut()[field::IP_DATA..]);
|
||||||
header.emit(&mut ip_packet);
|
header.emit(&mut ip_packet);
|
||||||
let payload = &mut ip_packet.into_inner()[header.buffer_len()..];
|
let payload = &mut ip_packet.into_inner()[header.buffer_len()..];
|
||||||
payload.copy_from_slice(&data[..data_len]);
|
payload.copy_from_slice(&data[..data_len]);
|
||||||
|
@ -625,7 +626,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_deconstruct() {
|
fn test_deconstruct() {
|
||||||
let opt = NdiscOption::new(&PREFIX_OPT_BYTES[..]);
|
let opt = NdiscOption::new_unchecked(&PREFIX_OPT_BYTES[..]);
|
||||||
assert_eq!(opt.option_type(), Type::PrefixInformation);
|
assert_eq!(opt.option_type(), Type::PrefixInformation);
|
||||||
assert_eq!(opt.data_len(), 4);
|
assert_eq!(opt.data_len(), 4);
|
||||||
assert_eq!(opt.prefix_len(), 64);
|
assert_eq!(opt.prefix_len(), 64);
|
||||||
|
@ -638,7 +639,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_construct() {
|
fn test_construct() {
|
||||||
let mut bytes = [0x00; 32];
|
let mut bytes = [0x00; 32];
|
||||||
let mut opt = NdiscOption::new(&mut bytes[..]);
|
let mut opt = NdiscOption::new_unchecked(&mut bytes[..]);
|
||||||
opt.set_option_type(Type::PrefixInformation);
|
opt.set_option_type(Type::PrefixInformation);
|
||||||
opt.set_data_len(4);
|
opt.set_data_len(4);
|
||||||
opt.set_prefix_len(64);
|
opt.set_prefix_len(64);
|
||||||
|
@ -664,12 +665,12 @@ mod test {
|
||||||
let mut bytes = [0x01, 0x01, 0x54, 0x52, 0x00, 0x12, 0x23, 0x34];
|
let mut bytes = [0x01, 0x01, 0x54, 0x52, 0x00, 0x12, 0x23, 0x34];
|
||||||
let addr = EthernetAddress([0x54, 0x52, 0x00, 0x12, 0x23, 0x34]);
|
let addr = EthernetAddress([0x54, 0x52, 0x00, 0x12, 0x23, 0x34]);
|
||||||
{
|
{
|
||||||
assert_eq!(Repr::parse(&NdiscOption::new(&bytes)),
|
assert_eq!(Repr::parse(&NdiscOption::new_unchecked(&bytes)),
|
||||||
Ok(Repr::SourceLinkLayerAddr(addr)));
|
Ok(Repr::SourceLinkLayerAddr(addr)));
|
||||||
}
|
}
|
||||||
bytes[0] = 0x02;
|
bytes[0] = 0x02;
|
||||||
{
|
{
|
||||||
assert_eq!(Repr::parse(&NdiscOption::new(&bytes)),
|
assert_eq!(Repr::parse(&NdiscOption::new_unchecked(&bytes)),
|
||||||
Ok(Repr::TargetLinkLayerAddr(addr)));
|
Ok(Repr::TargetLinkLayerAddr(addr)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -683,7 +684,7 @@ mod test {
|
||||||
preferred_lifetime: Duration::from_secs(1000),
|
preferred_lifetime: Duration::from_secs(1000),
|
||||||
prefix: Ipv6Address::new(0xfe80, 0, 0, 0, 0, 0, 0, 1)
|
prefix: Ipv6Address::new(0xfe80, 0, 0, 0, 0, 0, 0, 1)
|
||||||
});
|
});
|
||||||
assert_eq!(Repr::parse(&NdiscOption::new(&PREFIX_OPT_BYTES)), Ok(repr));
|
assert_eq!(Repr::parse(&NdiscOption::new_unchecked(&PREFIX_OPT_BYTES)), Ok(repr));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -696,7 +697,7 @@ mod test {
|
||||||
preferred_lifetime: Duration::from_secs(1000),
|
preferred_lifetime: Duration::from_secs(1000),
|
||||||
prefix: Ipv6Address::new(0xfe80, 0, 0, 0, 0, 0, 0, 1)
|
prefix: Ipv6Address::new(0xfe80, 0, 0, 0, 0, 0, 0, 1)
|
||||||
});
|
});
|
||||||
let mut opt = NdiscOption::new(&mut bytes);
|
let mut opt = NdiscOption::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut opt);
|
repr.emit(&mut opt);
|
||||||
assert_eq!(&opt.into_inner()[..], &PREFIX_OPT_BYTES[..]);
|
assert_eq!(&opt.into_inner()[..], &PREFIX_OPT_BYTES[..]);
|
||||||
}
|
}
|
||||||
|
@ -704,6 +705,6 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_repr_parse_mtu() {
|
fn test_repr_parse_mtu() {
|
||||||
let bytes = [0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0xdc];
|
let bytes = [0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0xdc];
|
||||||
assert_eq!(Repr::parse(&NdiscOption::new(&bytes)), Ok(Repr::Mtu(1500)));
|
assert_eq!(Repr::parse(&NdiscOption::new_unchecked(&bytes)), Ok(Repr::Mtu(1500)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,16 +107,16 @@ mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Packet<T> {
|
impl<T: AsRef<[u8]>> Packet<T> {
|
||||||
/// Imbue a raw octet buffer with TCP packet structure.
|
/// Imbue a raw octet buffer with TCP packet structure.
|
||||||
pub fn new(buffer: T) -> Packet<T> {
|
pub fn new_unchecked(buffer: T) -> Packet<T> {
|
||||||
Packet { buffer }
|
Packet { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -927,7 +927,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
fn test_deconstruct() {
|
fn test_deconstruct() {
|
||||||
let packet = Packet::new(&PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.src_port(), 48896);
|
assert_eq!(packet.src_port(), 48896);
|
||||||
assert_eq!(packet.dst_port(), 80);
|
assert_eq!(packet.dst_port(), 80);
|
||||||
assert_eq!(packet.seq_number(), SeqNumber(0x01234567));
|
assert_eq!(packet.seq_number(), SeqNumber(0x01234567));
|
||||||
|
@ -951,7 +951,7 @@ mod test {
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
fn test_construct() {
|
fn test_construct() {
|
||||||
let mut bytes = vec![0xa5; PACKET_BYTES.len()];
|
let mut bytes = vec![0xa5; PACKET_BYTES.len()];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_src_port(48896);
|
packet.set_src_port(48896);
|
||||||
packet.set_dst_port(80);
|
packet.set_dst_port(80);
|
||||||
packet.set_seq_number(SeqNumber(0x01234567));
|
packet.set_seq_number(SeqNumber(0x01234567));
|
||||||
|
@ -976,14 +976,14 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
fn test_truncated() {
|
fn test_truncated() {
|
||||||
let packet = Packet::new(&PACKET_BYTES[..23]);
|
let packet = Packet::new_unchecked(&PACKET_BYTES[..23]);
|
||||||
assert_eq!(packet.check_len(), Err(Error::Truncated));
|
assert_eq!(packet.check_len(), Err(Error::Truncated));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_impossible_len() {
|
fn test_impossible_len() {
|
||||||
let mut bytes = vec![0; 20];
|
let mut bytes = vec![0; 20];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_header_len(10);
|
packet.set_header_len(10);
|
||||||
assert_eq!(packet.check_len(), Err(Error::Malformed));
|
assert_eq!(packet.check_len(), Err(Error::Malformed));
|
||||||
}
|
}
|
||||||
|
@ -1015,7 +1015,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
fn test_parse() {
|
fn test_parse() {
|
||||||
let packet = Packet::new(&SYN_PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&SYN_PACKET_BYTES[..]);
|
||||||
let repr = Repr::parse(&packet, &SRC_ADDR.into(), &DST_ADDR.into(), &ChecksumCapabilities::default()).unwrap();
|
let repr = Repr::parse(&packet, &SRC_ADDR.into(), &DST_ADDR.into(), &ChecksumCapabilities::default()).unwrap();
|
||||||
assert_eq!(repr, packet_repr());
|
assert_eq!(repr, packet_repr());
|
||||||
}
|
}
|
||||||
|
@ -1025,7 +1025,7 @@ mod test {
|
||||||
fn test_emit() {
|
fn test_emit() {
|
||||||
let repr = packet_repr();
|
let repr = packet_repr();
|
||||||
let mut bytes = vec![0xa5; repr.buffer_len()];
|
let mut bytes = vec![0xa5; repr.buffer_len()];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut packet, &SRC_ADDR.into(), &DST_ADDR.into(), &ChecksumCapabilities::default());
|
repr.emit(&mut packet, &SRC_ADDR.into(), &DST_ADDR.into(), &ChecksumCapabilities::default());
|
||||||
assert_eq!(&packet.into_inner()[..], &SYN_PACKET_BYTES[..]);
|
assert_eq!(&packet.into_inner()[..], &SYN_PACKET_BYTES[..]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,16 +29,16 @@ mod field {
|
||||||
|
|
||||||
impl<T: AsRef<[u8]>> Packet<T> {
|
impl<T: AsRef<[u8]>> Packet<T> {
|
||||||
/// Imbue a raw octet buffer with UDP packet structure.
|
/// Imbue a raw octet buffer with UDP packet structure.
|
||||||
pub fn new(buffer: T) -> Packet<T> {
|
pub fn new_unchecked(buffer: T) -> Packet<T> {
|
||||||
Packet { buffer }
|
Packet { buffer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shorthand for a combination of [new] and [check_len].
|
/// Shorthand for a combination of [new_unchecked] and [check_len].
|
||||||
///
|
///
|
||||||
/// [new]: #method.new
|
/// [new_unchecked]: #method.new_unchecked
|
||||||
/// [check_len]: #method.check_len
|
/// [check_len]: #method.check_len
|
||||||
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
pub fn new_checked(buffer: T) -> Result<Packet<T>> {
|
||||||
let packet = Self::new(buffer);
|
let packet = Self::new_unchecked(buffer);
|
||||||
packet.check_len()?;
|
packet.check_len()?;
|
||||||
Ok(packet)
|
Ok(packet)
|
||||||
}
|
}
|
||||||
|
@ -310,7 +310,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
fn test_deconstruct() {
|
fn test_deconstruct() {
|
||||||
let packet = Packet::new(&PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&PACKET_BYTES[..]);
|
||||||
assert_eq!(packet.src_port(), 48896);
|
assert_eq!(packet.src_port(), 48896);
|
||||||
assert_eq!(packet.dst_port(), 53);
|
assert_eq!(packet.dst_port(), 53);
|
||||||
assert_eq!(packet.len(), 12);
|
assert_eq!(packet.len(), 12);
|
||||||
|
@ -323,7 +323,7 @@ mod test {
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
fn test_construct() {
|
fn test_construct() {
|
||||||
let mut bytes = vec![0xa5; 12];
|
let mut bytes = vec![0xa5; 12];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_src_port(48896);
|
packet.set_src_port(48896);
|
||||||
packet.set_dst_port(53);
|
packet.set_dst_port(53);
|
||||||
packet.set_len(12);
|
packet.set_len(12);
|
||||||
|
@ -336,7 +336,7 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_impossible_len() {
|
fn test_impossible_len() {
|
||||||
let mut bytes = vec![0; 12];
|
let mut bytes = vec![0; 12];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_len(4);
|
packet.set_len(4);
|
||||||
assert_eq!(packet.check_len(), Err(Error::Malformed));
|
assert_eq!(packet.check_len(), Err(Error::Malformed));
|
||||||
}
|
}
|
||||||
|
@ -345,7 +345,7 @@ mod test {
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
fn test_zero_checksum() {
|
fn test_zero_checksum() {
|
||||||
let mut bytes = vec![0; 8];
|
let mut bytes = vec![0; 8];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
packet.set_src_port(1);
|
packet.set_src_port(1);
|
||||||
packet.set_dst_port(31881);
|
packet.set_dst_port(31881);
|
||||||
packet.set_len(8);
|
packet.set_len(8);
|
||||||
|
@ -365,8 +365,9 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "proto-ipv4")]
|
#[cfg(feature = "proto-ipv4")]
|
||||||
fn test_parse() {
|
fn test_parse() {
|
||||||
let packet = Packet::new(&PACKET_BYTES[..]);
|
let packet = Packet::new_unchecked(&PACKET_BYTES[..]);
|
||||||
let repr = Repr::parse(&packet, &SRC_ADDR.into(), &DST_ADDR.into(), &ChecksumCapabilities::default()).unwrap();
|
let repr = Repr::parse(&packet, &SRC_ADDR.into(), &DST_ADDR.into(),
|
||||||
|
&ChecksumCapabilities::default()).unwrap();
|
||||||
assert_eq!(repr, packet_repr());
|
assert_eq!(repr, packet_repr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,8 +376,9 @@ mod test {
|
||||||
fn test_emit() {
|
fn test_emit() {
|
||||||
let repr = packet_repr();
|
let repr = packet_repr();
|
||||||
let mut bytes = vec![0xa5; repr.buffer_len()];
|
let mut bytes = vec![0xa5; repr.buffer_len()];
|
||||||
let mut packet = Packet::new(&mut bytes);
|
let mut packet = Packet::new_unchecked(&mut bytes);
|
||||||
repr.emit(&mut packet, &SRC_ADDR.into(), &DST_ADDR.into(), &ChecksumCapabilities::default());
|
repr.emit(&mut packet, &SRC_ADDR.into(), &DST_ADDR.into(),
|
||||||
|
&ChecksumCapabilities::default());
|
||||||
assert_eq!(&packet.into_inner()[..], &PACKET_BYTES[..]);
|
assert_eq!(&packet.into_inner()[..], &PACKET_BYTES[..]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue