diff --git a/examples/ping.rs b/examples/ping.rs index 4788326..d67362a 100644 --- a/examples/ping.rs +++ b/examples/ping.rs @@ -35,7 +35,7 @@ macro_rules! send_icmp_ping { .send(icmp_repr.buffer_len(), $remote_addr) .unwrap(); - let mut icmp_packet = $packet_type::new(icmp_payload); + let mut icmp_packet = $packet_type::new_unchecked(icmp_payload); (icmp_repr, icmp_packet) }} } @@ -168,13 +168,14 @@ fn main() { match remote_addr { IpAddress::Ipv4(_) => { - let icmp_packet = Icmpv4Packet::new(&payload); - let icmp_repr = Icmpv4Repr::parse(&icmp_packet, &device_caps.checksum).unwrap(); + let icmp_packet = Icmpv4Packet::new_checked(&payload).unwrap(); + let icmp_repr = + Icmpv4Repr::parse(&icmp_packet, &device_caps.checksum).unwrap(); get_icmp_pong!(Icmpv4Repr, icmp_repr, payload, waiting_queue, remote_addr, timestamp, received); } 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, &icmp_packet, &device_caps.checksum).unwrap(); get_icmp_pong!(Icmpv6Repr, icmp_repr, payload, diff --git a/src/iface/ethernet.rs b/src/iface/ethernet.rs index a9fa30d..60d3156 100644 --- a/src/iface/ethernet.rs +++ b/src/iface/ethernet.rs @@ -1076,7 +1076,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> { frame.set_dst_addr(dst_hardware_addr); 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); }) }, @@ -1084,7 +1084,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> { Packet::Icmpv4((ipv4_repr, icmpv4_repr)) => { self.dispatch_ip(tx_token, timestamp, IpRepr::Ipv4(ipv4_repr), |_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")] @@ -1092,7 +1092,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> { self.dispatch_ip(tx_token, timestamp, IpRepr::Ipv6(ipv6_repr), |ip_repr, payload| { 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")] @@ -1104,7 +1104,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> { #[cfg(feature = "socket-udp")] Packet::Udp((ip_repr, udp_repr)) => { 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(), &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(), &checksum_caps); }) @@ -1148,7 +1148,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> { let tx_len = EthernetFrame::<&[u8]>::buffer_len(buffer_len); tx_token.consume(timestamp, tx_len, |tx_buffer| { 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); f(frame); @@ -1254,7 +1254,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> { frame.set_dst_addr(EthernetAddress::BROADCAST); 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) @@ -1282,7 +1282,7 @@ impl<'b, 'c, 'e> InterfaceInner<'b, 'c, 'e> { self.dispatch_ip(tx_token, timestamp, ip_repr, |ip_repr, payload| { 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) @@ -1419,12 +1419,12 @@ mod test { }); 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_src_addr(EthernetAddress([0x52, 0x54, 0x00, 0x00, 0x00, 0x00])); frame.set_ethertype(EthernetProtocol::Ipv4); 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 @@ -1457,12 +1457,12 @@ mod test { // emit the above repr to a 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_src_addr(EthernetAddress([0x52, 0x54, 0x00, 0x00, 0x00, 0x00])); frame.set_ethertype(EthernetProtocol::Ipv4); 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 @@ -1508,8 +1508,8 @@ mod test { let mut udp_bytes_unicast = vec![0u8; 20]; let mut udp_bytes_broadcast = vec![0u8; 20]; - let mut packet_unicast = UdpPacket::new(&mut udp_bytes_unicast); - let mut packet_broadcast = UdpPacket::new(&mut udp_bytes_broadcast); + let mut packet_unicast = UdpPacket::new_unchecked(&mut udp_bytes_unicast); + let mut packet_broadcast = UdpPacket::new_unchecked(&mut udp_bytes_broadcast); let udp_repr = UdpRepr { src_port: 67, @@ -1596,7 +1596,7 @@ mod test { let udp_socket = UdpSocket::new(rx_buffer, tx_buffer); 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); @@ -1686,7 +1686,7 @@ mod test { payload: &[0x2a; MAX_PAYLOAD_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()); #[cfg(all(feature = "proto-ipv4", not(feature = "proto-ipv6")))] let ip_repr = Ipv4Repr { @@ -1767,12 +1767,12 @@ mod test { 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_src_addr(remote_hw_addr); 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); } @@ -1816,14 +1816,15 @@ mod test { 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_src_addr(remote_hw_addr); frame.set_ethertype(EthernetProtocol::Ipv6); { ip_repr.emit(frame.payload_mut(), &ChecksumCapabilities::default()); 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()); } @@ -1869,12 +1870,12 @@ mod test { 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_src_addr(remote_hw_addr); 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); } @@ -1916,7 +1917,7 @@ mod test { // Ensure the ident we bound to and the ident of the packet are the same. 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 }; echo_repr.emit(&mut packet, &ChecksumCapabilities::default()); let icmp_data = &packet.into_inner()[..]; @@ -1990,7 +1991,7 @@ mod test { }; 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); frame.set_dst_addr(EthernetAddress([0x52, 0x54, 0x00, 0x00, 0x00, 0x00])); frame.set_src_addr(remote_hw_addr); @@ -1998,21 +1999,22 @@ mod test { ip_repr.emit(frame.payload_mut(), &ChecksumCapabilities::default()); 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_header_len(0); 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); } { - 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); } } 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 { diff --git a/src/socket/icmp.rs b/src/socket/icmp.rs index 5db9ba9..d6a64ac 100644 --- a/src/socket/icmp.rs +++ b/src/socket/icmp.rs @@ -256,7 +256,7 @@ impl<'a, 'b> IcmpSocket<'a, 'b> { #[cfg(feature = "proto-ipv4")] (&Endpoint::Udp(endpoint), &IcmpRepr::Ipv4(Icmpv4Repr::DstUnreachable { data, .. })) 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) { Ok(repr) => endpoint.port == repr.src_port, Err(_) => false, @@ -265,7 +265,7 @@ impl<'a, 'b> IcmpSocket<'a, 'b> { #[cfg(feature = "proto-ipv6")] (&Endpoint::Udp(endpoint), &IcmpRepr::Ipv6(Icmpv6Repr::DstUnreachable { data, .. })) 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) { Ok(repr) => endpoint.port == repr.src_port, Err(_) => false, @@ -275,12 +275,16 @@ impl<'a, 'b> IcmpSocket<'a, 'b> { // Echo Request/Reply with the identifier field matching the endpoint // port. #[cfg(feature = "proto-ipv4")] - (&Endpoint::Ident(bound_ident), &IcmpRepr::Ipv4(Icmpv4Repr::EchoRequest { ident, .. })) | - (&Endpoint::Ident(bound_ident), &IcmpRepr::Ipv4(Icmpv4Repr::EchoReply { ident, .. })) => + (&Endpoint::Ident(bound_ident), + &IcmpRepr::Ipv4(Icmpv4Repr::EchoRequest { ident, .. })) | + (&Endpoint::Ident(bound_ident), + &IcmpRepr::Ipv4(Icmpv4Repr::EchoReply { ident, .. })) => ident == bound_ident, #[cfg(feature = "proto-ipv6")] - (&Endpoint::Ident(bound_ident), &IcmpRepr::Ipv6(Icmpv6Repr::EchoRequest { ident, .. })) | - (&Endpoint::Ident(bound_ident), &IcmpRepr::Ipv6(Icmpv6Repr::EchoReply { ident, .. })) => + (&Endpoint::Ident(bound_ident), + &IcmpRepr::Ipv6(Icmpv6Repr::EchoRequest { ident, .. })) | + (&Endpoint::Ident(bound_ident), + &IcmpRepr::Ipv6(Icmpv6Repr::EchoReply { ident, .. })) => ident == bound_ident, _ => false, } @@ -291,17 +295,21 @@ impl<'a, 'b> IcmpSocket<'a, 'b> { match icmp_repr { #[cfg(feature = "proto-ipv4")] &IcmpRepr::Ipv4(ref icmp_repr) => { - let packet_buf = self.rx_buffer.enqueue(icmp_repr.buffer_len(), ip_repr.src_addr())?; - icmp_repr.emit(&mut Icmpv4Packet::new(packet_buf), &ChecksumCapabilities::default()); + let packet_buf = self.rx_buffer.enqueue(icmp_repr.buffer_len(), + ip_repr.src_addr())?; + icmp_repr.emit(&mut Icmpv4Packet::new_unchecked(packet_buf), + &ChecksumCapabilities::default()); net_trace!("{}:{}: receiving {} octets", self.meta.handle, icmp_repr.buffer_len(), packet_buf.len()); }, #[cfg(feature = "proto-ipv6")] &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(), - &mut Icmpv6Packet::new(packet_buf), &ChecksumCapabilities::default()); + &mut Icmpv6Packet::new_unchecked(packet_buf), + &ChecksumCapabilities::default()); net_trace!("{}:{}: receiving {} octets", self.meta.handle, icmp_repr.buffer_len(), packet_buf.len()); @@ -321,7 +329,7 @@ impl<'a, 'b> IcmpSocket<'a, 'b> { match *remote_endpoint { #[cfg(feature = "proto-ipv4")] 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 ip_repr = IpRepr::Ipv4(Ipv4Repr { src_addr: Ipv4Address::default(), @@ -334,7 +342,7 @@ impl<'a, 'b> IcmpSocket<'a, 'b> { }, #[cfg(feature = "proto-ipv6")] IpAddress::Ipv6(ipv6_addr) => { - let packet = Icmpv6Packet::new(&*packet_buf); + let packet = Icmpv6Packet::new_unchecked(&*packet_buf); let src_addr = Ipv6Address::default(); let repr = Icmpv6Repr::parse(&src_addr.into(), &ipv6_addr.into(), &packet, &ChecksumCapabilities::ignored())?; let ip_repr = IpRepr::Ipv6(Ipv6Repr { @@ -443,7 +451,7 @@ mod test_ipv4 { assert!(socket.can_send()); 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); assert_eq!(socket.send_slice(&packet.into_inner()[..], REMOTE_IPV4.into()), Ok(())); @@ -473,7 +481,7 @@ mod test_ipv4 { let caps = DeviceCapabilities::default(); 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); s.set_hop_limit(Some(0x2a)); @@ -502,7 +510,7 @@ mod test_ipv4 { let caps = DeviceCapabilities::default(); 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); let data = &packet.into_inner()[..]; @@ -526,7 +534,7 @@ mod test_ipv4 { let caps = DeviceCapabilities::default(); 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 { ident: 0x4321, seq_no: 0x5678, @@ -547,7 +555,7 @@ mod test_ipv4 { let caps = DeviceCapabilities::default(); 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); let data = &packet.into_inner()[..]; @@ -581,7 +589,7 @@ mod test_ipv4 { assert!(socket.can_recv()); 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); assert_eq!(socket.recv(), Ok((&packet.into_inner()[..], REMOTE_IPV4.into()))); assert!(!socket.can_recv()); @@ -642,7 +650,7 @@ mod test_ipv6 { assert!(socket.can_send()); 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); assert_eq!(socket.send_slice(&packet.into_inner()[..], REMOTE_IPV6.into()), Ok(())); @@ -672,7 +680,7 @@ mod test_ipv6 { let caps = DeviceCapabilities::default(); 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); s.set_hop_limit(Some(0x2a)); @@ -701,7 +709,7 @@ mod test_ipv6 { let caps = DeviceCapabilities::default(); 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); let data = &packet.into_inner()[..]; @@ -725,7 +733,7 @@ mod test_ipv6 { let caps = DeviceCapabilities::default(); 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 { ident: 0x4321, seq_no: 0x5678, @@ -746,7 +754,7 @@ mod test_ipv6 { let caps = DeviceCapabilities::default(); 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); let data = &packet.into_inner()[..]; @@ -780,7 +788,7 @@ mod test_ipv6 { assert!(socket.can_recv()); 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); assert_eq!(socket.recv(), Ok((&packet.into_inner()[..], REMOTE_IPV6.into()))); assert!(!socket.can_recv()); diff --git a/src/socket/raw.rs b/src/socket/raw.rs index 6352c33..5f0583d 100644 --- a/src/socket/raw.rs +++ b/src/socket/raw.rs @@ -168,7 +168,7 @@ impl<'a, 'b> RawSocket<'a, 'b> { 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)?; Ok((IpRepr::Ipv4(ipv4_repr), packet.payload())) } @@ -176,7 +176,7 @@ impl<'a, 'b> RawSocket<'a, 'b> { IpVersion::Ipv6 => { let mut packet = Ipv6Packet::new_checked(buffer.as_mut())?; 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)?; 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 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.dispatch(&checksum_caps, |_| unreachable!()), Ok(())); 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.dispatch(&checksum_caps, |_| unreachable!()), @@ -411,14 +411,14 @@ mod test { let mut socket = ipv6_locals::socket(buffer(0), buffer(2)); 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.dispatch(&checksum_caps, |_| unreachable!()), Ok(())); 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.dispatch(&checksum_caps, |_| unreachable!()), @@ -434,7 +434,7 @@ mod test { assert!(!socket.can_recv()); 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!(socket.accepts(&ipv4_locals::HEADER_REPR)); diff --git a/src/socket/ref_.rs b/src/socket/ref_.rs index e7f34f3..486171c 100644 --- a/src/socket/ref_.rs +++ b/src/socket/ref_.rs @@ -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); /// be sure to call [new] afterwards. /// - /// [new]: #method.new + /// [new_unchecked]: #method.new_unchecked pub fn into_inner(mut ref_: Self) -> &'a mut T { ref_.consumed = true; ref_.socket diff --git a/src/wire/arp.rs b/src/wire/arp.rs index 26f6266..b6fc5ae 100644 --- a/src/wire/arp.rs +++ b/src/wire/arp.rs @@ -64,16 +64,16 @@ mod field { impl> Packet { /// Imbue a raw octet buffer with ARP packet structure. - pub fn new(buffer: T) -> Packet { + pub fn new_unchecked(buffer: T) -> Packet { 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 pub fn new_checked(buffer: T) -> Result> { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -385,7 +385,7 @@ mod test { #[test] 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.protocol_type(), Protocol::Ipv4); assert_eq!(packet.hardware_len(), 6); @@ -400,7 +400,7 @@ mod test { #[test] fn test_construct() { 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_protocol_type(Protocol::Ipv4); packet.set_hardware_len(6); @@ -429,7 +429,7 @@ mod test { #[test] fn test_parse() { - let packet = Packet::new(&PACKET_BYTES[..]); + let packet = Packet::new_unchecked(&PACKET_BYTES[..]); let repr = Repr::parse(&packet).unwrap(); assert_eq!(repr, packet_repr()); } @@ -437,7 +437,7 @@ mod test { #[test] fn test_emit() { 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); assert_eq!(&packet.into_inner()[..], &PACKET_BYTES[..]); } diff --git a/src/wire/dhcpv4.rs b/src/wire/dhcpv4.rs index b3ffc14..6b6c16c 100644 --- a/src/wire/dhcpv4.rs +++ b/src/wire/dhcpv4.rs @@ -280,16 +280,16 @@ mod field { impl> Packet { /// Imbue a raw octet buffer with DHCP packet structure. - pub fn new(buffer: T) -> Packet { + pub fn new_unchecked(buffer: T) -> Packet { 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 pub fn new_checked(buffer: T) -> Result> { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -792,7 +792,7 @@ mod test { #[test] 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.opcode(), OpCode::Request); assert_eq!(packet.hardware_type(), Hardware::Ethernet); @@ -834,7 +834,7 @@ mod test { #[test] fn test_construct_discover() { 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_sname_and_boot_file_to_zero(); packet.set_opcode(OpCode::Request); @@ -889,7 +889,7 @@ mod test { #[test] fn test_parse_discover() { - let packet = Packet::new(DISCOVER_BYTES); + let packet = Packet::new_unchecked(DISCOVER_BYTES); let repr = Repr::parse(&packet).unwrap(); assert_eq!(repr, discover_repr()); } @@ -898,7 +898,7 @@ mod test { fn test_emit_discover() { let repr = discover_repr(); 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(); let packet = &packet.into_inner()[..]; let packet_len = packet.len(); diff --git a/src/wire/ethernet.rs b/src/wire/ethernet.rs index 17bb78c..073aa68 100644 --- a/src/wire/ethernet.rs +++ b/src/wire/ethernet.rs @@ -93,16 +93,16 @@ mod field { impl> Frame { /// Imbue a raw octet buffer with Ethernet frame structure. - pub fn new(buffer: T) -> Frame { + pub fn new_unchecked(buffer: T) -> Frame { 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 pub fn new_checked(buffer: T) -> Result> { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -317,7 +317,7 @@ mod test_ipv4 { #[test] 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.src_addr(), Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16])); assert_eq!(frame.ethertype(), EtherType::Ipv4); @@ -327,7 +327,7 @@ mod test_ipv4 { #[test] fn test_construct() { 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_src_addr(Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16])); frame.set_ethertype(EtherType::Ipv4); @@ -361,7 +361,7 @@ mod test_ipv6 { #[test] 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.src_addr(), Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16])); assert_eq!(frame.ethertype(), EtherType::Ipv6); @@ -371,7 +371,7 @@ mod test_ipv6 { #[test] fn test_construct() { 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_src_addr(Address([0x11, 0x12, 0x13, 0x14, 0x15, 0x16])); frame.set_ethertype(EtherType::Ipv6); diff --git a/src/wire/icmpv4.rs b/src/wire/icmpv4.rs index c795e5f..1a2cb6c 100644 --- a/src/wire/icmpv4.rs +++ b/src/wire/icmpv4.rs @@ -188,16 +188,16 @@ mod field { impl> Packet { /// Imbue a raw octet buffer with ICMPv4 packet structure. - pub fn new(buffer: T) -> Packet { + pub fn new_unchecked(buffer: T) -> Packet { 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 pub fn new_checked(buffer: T) -> Result> { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -478,7 +478,7 @@ impl<'a> Repr<'a> { packet.set_msg_type(Message::DstUnreachable); 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); let payload = &mut ip_packet.into_inner()[header.buffer_len()..]; payload.copy_from_slice(&data[..]) @@ -566,7 +566,7 @@ mod test { #[test] 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_code(), 0); assert_eq!(packet.checksum(), 0x8efe); @@ -579,7 +579,7 @@ mod test { #[test] fn test_echo_construct() { 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_code(0); packet.set_echo_ident(0x1234); @@ -599,7 +599,7 @@ mod test { #[test] 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(); assert_eq!(repr, echo_packet_repr()); } @@ -608,7 +608,7 @@ mod test { fn test_echo_emit() { let repr = echo_packet_repr(); 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()); assert_eq!(&packet.into_inner()[..], &ECHO_PACKET_BYTES[..]); } diff --git a/src/wire/icmpv6.rs b/src/wire/icmpv6.rs index c429f2c..212da96 100644 --- a/src/wire/icmpv6.rs +++ b/src/wire/icmpv6.rs @@ -251,16 +251,16 @@ pub(super) mod field { impl> Packet { /// Imbue a raw octet buffer with ICMPv6 packet structure. - pub fn new(buffer: T) -> Packet { + pub fn new_unchecked(buffer: T) -> Packet { 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 pub fn new_checked(buffer: T) -> Result> { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -656,7 +656,7 @@ impl<'a> Repr<'a> { packet: &mut Packet<&mut T>, checksum_caps: &ChecksumCapabilities) where T: AsRef<[u8]> + AsMut<[u8]> + ?Sized { 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); let payload = &mut ip_packet.into_inner()[header.buffer_len()..]; payload.copy_from_slice(&data[..]); @@ -812,7 +812,7 @@ mod test { #[test] 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_code(), 0); assert_eq!(packet.checksum(), 0x19b3); @@ -826,7 +826,7 @@ mod test { #[test] fn test_echo_construct() { 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_code(0); packet.set_echo_ident(0x1234); @@ -838,7 +838,7 @@ mod test { #[test] 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, &packet, &ChecksumCapabilities::default()).unwrap(); assert_eq!(repr, echo_packet_repr()); @@ -848,7 +848,7 @@ mod test { fn test_echo_emit() { let repr = echo_packet_repr(); 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, &mut packet, &ChecksumCapabilities::default()); assert_eq!(&packet.into_inner()[..], &ECHO_PACKET_BYTES[..]); @@ -856,7 +856,7 @@ mod test { #[test] 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_code(), 0); assert_eq!(packet.checksum(), 0x0fc9); @@ -869,7 +869,7 @@ mod test { #[test] fn test_too_big_construct() { 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_code(0); packet.set_pkt_too_big_mtu(1500); @@ -880,7 +880,7 @@ mod test { #[test] 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, &packet, &ChecksumCapabilities::default()).unwrap(); assert_eq!(repr, too_big_packet_repr()); @@ -890,7 +890,7 @@ mod test { fn test_too_big_emit() { let repr = too_big_packet_repr(); 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, &mut packet, &ChecksumCapabilities::default()); assert_eq!(&packet.into_inner()[..], &PKT_TOO_BIG_BYTES[..]); diff --git a/src/wire/igmp.rs b/src/wire/igmp.rs index 7e99529..53c5d20 100644 --- a/src/wire/igmp.rs +++ b/src/wire/igmp.rs @@ -53,16 +53,16 @@ impl fmt::Display for Message { /// [RFC 2236]: https://tools.ietf.org/html/rfc2236 impl> Packet { /// Imbue a raw octet buffer with IGMPv2 packet structure. - pub fn new(buffer: T) -> Packet { + pub fn new_unchecked(buffer: T) -> Packet { 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 pub fn new_checked(buffer: T) -> Result> { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -379,7 +379,7 @@ mod test { #[test] 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.max_resp_code(), 0); assert_eq!(packet.checksum(), 0x269); @@ -390,7 +390,7 @@ mod test { #[test] 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.max_resp_code(), 0); assert_eq!(packet.checksum(), 0x08da); @@ -402,7 +402,7 @@ mod test { #[test] fn test_leave_construct() { 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_max_resp_code(0); packet.set_group_address(Ipv4Address::from_bytes(&[224, 0, 6, 150])); @@ -413,7 +413,7 @@ mod test { #[test] fn test_report_construct() { 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_max_resp_code(0); packet.set_group_address(Ipv4Address::from_bytes(&[225, 0, 0, 37])); diff --git a/src/wire/ip.rs b/src/wire/ip.rs index e62549b..20071e0 100644 --- a/src/wire/ip.rs +++ b/src/wire/ip.rs @@ -684,10 +684,10 @@ impl Repr { panic!("unspecified IP representation"), #[cfg(feature = "proto-ipv4")] &Repr::Ipv4(repr) => - repr.emit(&mut Ipv4Packet::new(buffer), &_checksum_caps), + repr.emit(&mut Ipv4Packet::new_unchecked(buffer), &_checksum_caps), #[cfg(feature = "proto-ipv6")] &Repr::Ipv6(repr) => - repr.emit(&mut Ipv6Packet::new(buffer)), + repr.emit(&mut Ipv6Packet::new_unchecked(buffer)), &Repr::__Nonexhaustive => unreachable!() } diff --git a/src/wire/ipv4.rs b/src/wire/ipv4.rs index 5bc42d3..6176af4 100644 --- a/src/wire/ipv4.rs +++ b/src/wire/ipv4.rs @@ -241,16 +241,16 @@ mod field { impl> Packet { /// Imbue a raw octet buffer with IPv4 packet structure. - pub fn new(buffer: T) -> Packet { + pub fn new_unchecked(buffer: T) -> Packet { 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 pub fn new_checked(buffer: T) -> Result> { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -704,7 +704,7 @@ mod test { #[test] fn test_deconstruct() { - let packet = Packet::new(&PACKET_BYTES[..]); + let packet = Packet::new_unchecked(&PACKET_BYTES[..]); assert_eq!(packet.version(), 4); assert_eq!(packet.header_len(), 20); assert_eq!(packet.dscp(), 0); @@ -726,7 +726,7 @@ mod test { #[test] fn test_construct() { 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_header_len(20); packet.clear_flags(); @@ -752,9 +752,9 @@ mod test { bytes.extend(&PACKET_BYTES[..]); bytes.push(0); - assert_eq!(Packet::new(&bytes).payload().len(), + assert_eq!(Packet::new_unchecked(&bytes).payload().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()); } @@ -762,7 +762,7 @@ mod test { fn test_total_len_overflow() { let mut bytes = vec![]; 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(), Error::Truncated); @@ -791,7 +791,7 @@ mod test { #[test] 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(); assert_eq!(repr, packet_repr()); } @@ -800,10 +800,10 @@ mod test { fn test_parse_bad_version() { let mut bytes = vec![0; 24]; 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.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)); } @@ -818,7 +818,7 @@ mod test { fn test_emit() { let repr = packet_repr(); 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()); packet.payload_mut().copy_from_slice(&REPR_PAYLOAD_BYTES); assert_eq!(&packet.into_inner()[..], &REPR_PACKET_BYTES[..]); diff --git a/src/wire/ipv6.rs b/src/wire/ipv6.rs index 3896a58..eed0de6 100644 --- a/src/wire/ipv6.rs +++ b/src/wire/ipv6.rs @@ -378,17 +378,17 @@ mod field { impl> Packet { /// Create a raw octet buffer with an IPv6 packet structure. #[inline] - pub fn new(buffer: T) -> Packet { + pub fn new_unchecked(buffer: T) -> Packet { 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 #[inline] pub fn new_checked(buffer: T) -> Result> { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -930,7 +930,7 @@ mod test { #[test] 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.version(), 6); assert_eq!(packet.traffic_class(), 0); @@ -950,7 +950,7 @@ mod test { #[test] fn test_packet_construction() { 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 // byte aligned. make sure the setters and getters // do not interfere with each other. @@ -989,9 +989,9 @@ mod test { bytes.extend(&REPR_PACKET_BYTES[..]); bytes.push(0); - assert_eq!(Packet::new(&bytes).payload().len(), + assert_eq!(Packet::new_unchecked(&bytes).payload().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()); } @@ -999,7 +999,7 @@ mod test { fn test_total_len_overflow() { let mut bytes = vec![]; 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(), Error::Truncated); @@ -1007,7 +1007,7 @@ mod test { #[test] 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(); assert_eq!(repr, packet_repr()); } @@ -1015,30 +1015,30 @@ mod test { #[test] fn test_repr_parse_bad_version() { 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_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)); } #[test] fn test_repr_parse_smaller_than_header() { 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_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)); } #[test] fn test_repr_parse_smaller_than_payload() { 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_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)); } @@ -1046,7 +1046,7 @@ mod test { fn test_basic_repr_emit() { let repr = packet_repr(); 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); packet.payload_mut().copy_from_slice(&REPR_PAYLOAD_BYTES); assert_eq!(&packet.into_inner()[..], &REPR_PACKET_BYTES[..]); diff --git a/src/wire/ipv6fragment.rs b/src/wire/ipv6fragment.rs index be3115f..b5b641f 100644 --- a/src/wire/ipv6fragment.rs +++ b/src/wire/ipv6fragment.rs @@ -35,16 +35,16 @@ mod field { impl> Header { /// Create a raw octet buffer with an IPv6 Fragment Header structure. - pub fn new(buffer: T) -> Header { + pub fn new_unchecked(buffer: T) -> Header { 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 pub fn new_checked(buffer: T) -> Result> { - let header = Self::new(buffer); + let header = Self::new_unchecked(buffer); header.check_len()?; Ok(header) } @@ -220,20 +220,22 @@ mod test { #[test] fn test_check_len() { // 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 - assert_eq!(Ok(()), Header::new(&BYTES_HEADER_MORE_FRAG).check_len()); + assert_eq!(Ok(()), + Header::new_unchecked(&BYTES_HEADER_MORE_FRAG).check_len()); } #[test] 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.frag_offset(), 0); assert_eq!(header.more_frags(), true); 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.frag_offset(), 320); assert_eq!(header.more_frags(), false); @@ -242,12 +244,12 @@ mod test { #[test] 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(); assert_eq!(repr, 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(); assert_eq!(repr, Repr{ next_header: Protocol::Tcp, frag_offset: 320, more_frags: false, ident: 67890 }); @@ -257,20 +259,20 @@ mod test { fn test_repr_emit() { let repr = Repr{ next_header: Protocol::Tcp, frag_offset: 0, more_frags: true, ident: 12345 }; let mut bytes = [0u8; 8]; - let mut header = Header::new(&mut bytes); + let mut header = Header::new_unchecked(&mut bytes); repr.emit(&mut header); 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 mut bytes = [0u8; 8]; - let mut header = Header::new(&mut bytes); + let mut header = Header::new_unchecked(&mut bytes); repr.emit(&mut header); assert_eq!(header.into_inner(), &BYTES_HEADER_LAST_FRAG[0..8]); } #[test] 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(); assert_eq!(repr.buffer_len(), BYTES_HEADER_MORE_FRAG.len()); } diff --git a/src/wire/ipv6hopbyhop.rs b/src/wire/ipv6hopbyhop.rs index f9bcd71..3eb115f 100644 --- a/src/wire/ipv6hopbyhop.rs +++ b/src/wire/ipv6hopbyhop.rs @@ -49,16 +49,16 @@ mod field { impl> Header { /// Create a raw octet buffer with an IPv6 Hop-by-Hop Options Header structure. - pub fn new(buffer: T) -> Header { + pub fn new_unchecked(buffer: T) -> Header { 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 pub fn new_checked(buffer: T) -> Result> { - let header = Self::new(buffer); + let header = Self::new_unchecked(buffer); header.check_len()?; Ok(header) } @@ -218,28 +218,34 @@ mod test { #[test] fn test_check_len() { // 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 - 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 - 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 - assert_eq!(Ok(()), Header::new(&REPR_PACKET_PAD4).check_len()); + assert_eq!(Ok(()), + Header::new_unchecked(&REPR_PACKET_PAD4).check_len()); // 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 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] 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.header_len(), 0); 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.header_len(), 1); assert_eq!(header.options(), &REPR_PACKET_PAD12[2..]); @@ -251,15 +257,19 @@ mod test { bytes.extend(&REPR_PACKET_PAD4[..]); bytes.push(0); - assert_eq!(Header::new(&bytes).options().len(), REPR_PACKET_PAD4[2..].len()); - assert_eq!(Header::new(&mut bytes).options_mut().len(), REPR_PACKET_PAD4[2..].len()); + assert_eq!(Header::new_unchecked(&bytes).options().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![]; bytes.extend(&REPR_PACKET_PAD12[..]); bytes.push(0); - assert_eq!(Header::new(&bytes).options().len(), REPR_PACKET_PAD12[2..].len()); - assert_eq!(Header::new(&mut bytes).options_mut().len(), REPR_PACKET_PAD12[2..].len()); + assert_eq!(Header::new_unchecked(&bytes).options().len(), + REPR_PACKET_PAD12[2..].len()); + assert_eq!(Header::new_unchecked(&mut bytes).options_mut().len(), + REPR_PACKET_PAD12[2..].len()); } #[test] @@ -267,51 +277,55 @@ mod test { let mut bytes = vec![]; bytes.extend(&REPR_PACKET_PAD4); 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); let mut bytes = vec![]; bytes.extend(&REPR_PACKET_PAD12); 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); } #[test] 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(); - 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(); - 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] fn test_repr_emit() { let repr = Repr{ next_header: Protocol::Tcp, length: 0, options: &REPR_PACKET_PAD4[2..] }; let mut bytes = [0u8; 8]; - let mut header = Header::new(&mut bytes); + let mut header = Header::new_unchecked(&mut bytes); repr.emit(&mut header); assert_eq!(header.into_inner(), &REPR_PACKET_PAD4[..]); let repr = Repr{ next_header: Protocol::Tcp, length: 1, options: &REPR_PACKET_PAD12[2..] }; let mut bytes = [0u8; 16]; - let mut header = Header::new(&mut bytes); + let mut header = Header::new_unchecked(&mut bytes); repr.emit(&mut header); assert_eq!(header.into_inner(), &REPR_PACKET_PAD12[..]); } #[test] 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(); 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(); assert_eq!(repr.buffer_len(), REPR_PACKET_PAD12.len()); } diff --git a/src/wire/ipv6option.rs b/src/wire/ipv6option.rs index 9c90efd..26ba587 100644 --- a/src/wire/ipv6option.rs +++ b/src/wire/ipv6option.rs @@ -87,16 +87,16 @@ mod field { impl> Ipv6Option { /// Create a raw octet buffer with an IPv6 Extension Header Option structure. - pub fn new(buffer: T) -> Ipv6Option { + pub fn new_unchecked(buffer: T) -> Ipv6Option { 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 pub fn new_checked(buffer: T) -> Result> { - let opt = Self::new(buffer); + let opt = Self::new_unchecked(buffer); opt.check_len()?; Ok(opt) } @@ -376,57 +376,64 @@ mod test { fn test_check_len() { let bytes = [0u8]; // 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 - 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 - 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 - 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 - assert_eq!(Err(Error::Truncated), Ipv6Option::new(&IPV6OPTION_BYTES_UNKNOWN[..4]).check_len()); - assert_eq!(Err(Error::Truncated), Ipv6Option::new(&IPV6OPTION_BYTES_UNKNOWN[..1]).check_len()); + assert_eq!(Err(Error::Truncated), + 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 - assert_eq!(Ok(()), Ipv6Option::new(&IPV6OPTION_BYTES_UNKNOWN).check_len()); + assert_eq!(Ok(()), + Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_UNKNOWN).check_len()); } #[test] #[should_panic(expected = "index out of bounds")] fn test_data_len() { - let opt = Ipv6Option::new(&IPV6OPTION_BYTES_PAD1); + let opt = Ipv6Option::new_unchecked(&IPV6OPTION_BYTES_PAD1); opt.data_len(); } #[test] fn test_option_deconstruct() { // 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); // two octets of padding 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.data_len(), 0); // 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.data_len(), 1); assert_eq!(opt.data(), &[0]); // extra bytes in buffer 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.data_len(), 7); assert_eq!(opt.data(), &[0, 0, 0, 0, 0, 0, 0]); // unrecognized option let bytes: [u8; 1] = [0xff]; - let opt = Ipv6Option::new(&bytes); + let opt = Ipv6Option::new_unchecked(&bytes); assert_eq!(opt.option_type(), Type::Unknown(255)); // unrecognized option without length and data @@ -436,42 +443,42 @@ mod test { #[test] fn test_option_parse() { // 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(); assert_eq!(pad1, Repr::Pad1); assert_eq!(pad1.buffer_len(), 1); // 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(); assert_eq!(padn, Repr::PadN(1)); assert_eq!(padn.buffer_len(), 3); // unrecognized option type 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(); - 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] fn test_option_emit() { let repr = Repr::Pad1; 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); assert_eq!(opt.into_inner(), &IPV6OPTION_BYTES_PAD1); let repr = Repr::PadN(1); 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); assert_eq!(opt.into_inner(), &IPV6OPTION_BYTES_PADN); let data = [0u8; 3]; 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 opt = Ipv6Option::new(&mut bytes); + let mut opt = Ipv6Option::new_unchecked(&mut bytes); repr.emit(&mut opt); assert_eq!(opt.into_inner(), &IPV6OPTION_BYTES_UNKNOWN); } diff --git a/src/wire/ipv6routing.rs b/src/wire/ipv6routing.rs index b64d21b..befbd2c 100644 --- a/src/wire/ipv6routing.rs +++ b/src/wire/ipv6routing.rs @@ -146,9 +146,9 @@ impl> Header { 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 pub fn new_checked(buffer: T) -> Result> { let header = Self::new(buffer); diff --git a/src/wire/mld.rs b/src/wire/mld.rs index b2d095c..9268293 100644 --- a/src/wire/mld.rs +++ b/src/wire/mld.rs @@ -172,16 +172,16 @@ pub struct AddressRecord> { impl> AddressRecord { /// 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 } } - /// 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 pub fn new_checked(buffer: T) -> Result { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -459,7 +459,7 @@ mod test { #[test] 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_code(), 0); assert_eq!(packet.checksum(), 0x7374); @@ -476,7 +476,7 @@ mod test { #[test] fn test_query_construct() { 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_code(0); packet.set_max_resp_code(0x0400); @@ -494,12 +494,12 @@ mod test { #[test] 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_code(), 0); assert_eq!(packet.checksum(), 0x7385); 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.aux_data_len(), 0x00); assert_eq!(addr_rcrd.num_srcs(), 0x01); @@ -511,13 +511,13 @@ mod test { #[test] fn test_record_construct() { 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_code(0); packet.clear_reserved(); 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_aux_data_len(0); addr_rcrd.set_num_srcs(1); @@ -532,7 +532,7 @@ mod test { #[test] 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(), &Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(), &packet, @@ -542,7 +542,7 @@ mod test { #[test] 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(), &Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(), &packet, @@ -553,7 +553,7 @@ mod test { #[test] fn test_query_repr_emit() { 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); repr.emit(&Ipv6Address::LINK_LOCAL_ALL_NODES.into(), &Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(), @@ -565,7 +565,7 @@ mod test { #[test] fn test_report_repr_emit() { 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); repr.emit(&Ipv6Address::LINK_LOCAL_ALL_NODES.into(), &Ipv6Address::LINK_LOCAL_ALL_ROUTERS.into(), diff --git a/src/wire/mod.rs b/src/wire/mod.rs index 523854b..05ab35a 100644 --- a/src/wire/mod.rs +++ b/src/wire/mod.rs @@ -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, 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 -`Packet::check_len`. +The `Packet::new_checked` method is a shorthand for a combination of `Packet::new_unchecked` +and `Packet::check_len`. When parsing untrusted input, it is *necessary* to use `Packet::new_checked()`; so long as the buffer is not modified, no accessor will fail. 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]; { // emission - let mut packet = Ipv4Packet::new(&mut buffer); + let mut packet = Ipv4Packet::new_unchecked(&mut buffer); repr.emit(&mut packet, &ChecksumCapabilities::default()); } { // parsing diff --git a/src/wire/ndisc.rs b/src/wire/ndisc.rs index c4dbb1e..4f3e5c4 100644 --- a/src/wire/ndisc.rs +++ b/src/wire/ndisc.rs @@ -305,7 +305,8 @@ impl<'a> Repr<'a> { if opt.data_len() < 6 { return Err(Error::Truncated) } 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 data = &opt.data()[offset + 8 + ip_repr.buffer_len()..]; redirected_hdr = Some(NdiscRedirectedHeader { @@ -375,7 +376,7 @@ impl<'a> Repr<'a> { packet.set_msg_code(0); packet.clear_reserved(); 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); } }, @@ -391,17 +392,20 @@ impl<'a> Repr<'a> { packet.set_retrans_time(retrans_time); let mut offset = 0; 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); offset += 8; } 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); offset += 8; } 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) } }, @@ -412,7 +416,8 @@ impl<'a> Repr<'a> { packet.clear_reserved(); packet.set_target_addr(target_addr); 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); } }, @@ -424,7 +429,8 @@ impl<'a> Repr<'a> { packet.set_neighbor_flags(flags); packet.set_target_addr(target_addr); 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); } }, @@ -437,14 +443,16 @@ impl<'a> Repr<'a> { packet.set_dest_addr(dest_addr); let offset = match 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); 8 }, None => 0, }; 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); } }, @@ -485,7 +493,7 @@ mod test { #[test] 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_code(), 0); assert_eq!(packet.current_hop_limit(), 64); @@ -499,7 +507,7 @@ mod test { #[test] fn test_router_advert_construct() { 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_code(0); packet.set_current_hop_limit(64); @@ -514,7 +522,7 @@ mod test { #[test] 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, &packet, &ChecksumCapabilities::default()).unwrap(), create_repr()); @@ -523,7 +531,7 @@ mod test { #[test] fn test_router_advert_repr_emit() { 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, &mut packet, &ChecksumCapabilities::default()); assert_eq!(&packet.into_inner()[..], &ROUTER_ADVERT_BYTES[..]); diff --git a/src/wire/ndiscoption.rs b/src/wire/ndiscoption.rs index b81489d..5de0773 100644 --- a/src/wire/ndiscoption.rs +++ b/src/wire/ndiscoption.rs @@ -145,16 +145,16 @@ mod field { /// Core getter methods relevant to any type of NDISC option. impl> NdiscOption { /// Create a raw octet buffer with an NDISC Option structure. - pub fn new(buffer: T) -> NdiscOption { + pub fn new_unchecked(buffer: T) -> NdiscOption { 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 pub fn new_checked(buffer: T) -> Result> { - let opt = Self::new(buffer); + let opt = Self::new_unchecked(buffer); opt.check_len()?; Ok(opt) } @@ -460,7 +460,7 @@ impl<'a> Repr<'a> { if opt.data_len() < 6 { Err(Error::Truncated) } 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)?; Ok(Repr::RedirectedHeader(RedirectedHeader { header: ip_repr, @@ -535,7 +535,8 @@ impl<'a> Repr<'a> { opt.clear_redirected_reserved(); opt.set_option_type(Type::RedirectedHeader); 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); let payload = &mut ip_packet.into_inner()[header.buffer_len()..]; payload.copy_from_slice(&data[..data_len]); @@ -625,7 +626,7 @@ mod test { #[test] 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.data_len(), 4); assert_eq!(opt.prefix_len(), 64); @@ -638,7 +639,7 @@ mod test { #[test] fn test_construct() { 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_data_len(4); opt.set_prefix_len(64); @@ -664,12 +665,12 @@ mod test { let mut bytes = [0x01, 0x01, 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))); } bytes[0] = 0x02; { - assert_eq!(Repr::parse(&NdiscOption::new(&bytes)), + assert_eq!(Repr::parse(&NdiscOption::new_unchecked(&bytes)), Ok(Repr::TargetLinkLayerAddr(addr))); } } @@ -683,7 +684,7 @@ mod test { preferred_lifetime: Duration::from_secs(1000), 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] @@ -696,7 +697,7 @@ mod test { preferred_lifetime: Duration::from_secs(1000), 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); assert_eq!(&opt.into_inner()[..], &PREFIX_OPT_BYTES[..]); } @@ -704,6 +705,6 @@ mod test { #[test] fn test_repr_parse_mtu() { 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))); } } diff --git a/src/wire/tcp.rs b/src/wire/tcp.rs index aa96bb0..6bacb9d 100644 --- a/src/wire/tcp.rs +++ b/src/wire/tcp.rs @@ -107,16 +107,16 @@ mod field { impl> Packet { /// Imbue a raw octet buffer with TCP packet structure. - pub fn new(buffer: T) -> Packet { + pub fn new_unchecked(buffer: T) -> Packet { 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 pub fn new_checked(buffer: T) -> Result> { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -927,7 +927,7 @@ mod test { #[test] #[cfg(feature = "proto-ipv4")] 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.dst_port(), 80); assert_eq!(packet.seq_number(), SeqNumber(0x01234567)); @@ -951,7 +951,7 @@ mod test { #[cfg(feature = "proto-ipv4")] fn test_construct() { 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_dst_port(80); packet.set_seq_number(SeqNumber(0x01234567)); @@ -976,14 +976,14 @@ mod test { #[test] #[cfg(feature = "proto-ipv4")] 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)); } #[test] fn test_impossible_len() { 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); assert_eq!(packet.check_len(), Err(Error::Malformed)); } @@ -1015,7 +1015,7 @@ mod test { #[test] #[cfg(feature = "proto-ipv4")] 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(); assert_eq!(repr, packet_repr()); } @@ -1025,7 +1025,7 @@ mod test { fn test_emit() { let repr = packet_repr(); 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()); assert_eq!(&packet.into_inner()[..], &SYN_PACKET_BYTES[..]); } diff --git a/src/wire/udp.rs b/src/wire/udp.rs index b162e31..2752d89 100644 --- a/src/wire/udp.rs +++ b/src/wire/udp.rs @@ -29,16 +29,16 @@ mod field { impl> Packet { /// Imbue a raw octet buffer with UDP packet structure. - pub fn new(buffer: T) -> Packet { + pub fn new_unchecked(buffer: T) -> Packet { 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 pub fn new_checked(buffer: T) -> Result> { - let packet = Self::new(buffer); + let packet = Self::new_unchecked(buffer); packet.check_len()?; Ok(packet) } @@ -310,7 +310,7 @@ mod test { #[test] #[cfg(feature = "proto-ipv4")] 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.dst_port(), 53); assert_eq!(packet.len(), 12); @@ -323,7 +323,7 @@ mod test { #[cfg(feature = "proto-ipv4")] fn test_construct() { 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_dst_port(53); packet.set_len(12); @@ -336,7 +336,7 @@ mod test { #[test] fn test_impossible_len() { 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); assert_eq!(packet.check_len(), Err(Error::Malformed)); } @@ -345,7 +345,7 @@ mod test { #[cfg(feature = "proto-ipv4")] fn test_zero_checksum() { 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_dst_port(31881); packet.set_len(8); @@ -365,8 +365,9 @@ mod test { #[test] #[cfg(feature = "proto-ipv4")] fn test_parse() { - let packet = Packet::new(&PACKET_BYTES[..]); - let repr = Repr::parse(&packet, &SRC_ADDR.into(), &DST_ADDR.into(), &ChecksumCapabilities::default()).unwrap(); + let packet = Packet::new_unchecked(&PACKET_BYTES[..]); + let repr = Repr::parse(&packet, &SRC_ADDR.into(), &DST_ADDR.into(), + &ChecksumCapabilities::default()).unwrap(); assert_eq!(repr, packet_repr()); } @@ -375,8 +376,9 @@ mod test { fn test_emit() { let repr = packet_repr(); let mut bytes = vec![0xa5; repr.buffer_len()]; - let mut packet = Packet::new(&mut bytes); - repr.emit(&mut packet, &SRC_ADDR.into(), &DST_ADDR.into(), &ChecksumCapabilities::default()); + let mut packet = Packet::new_unchecked(&mut bytes); + repr.emit(&mut packet, &SRC_ADDR.into(), &DST_ADDR.into(), + &ChecksumCapabilities::default()); assert_eq!(&packet.into_inner()[..], &PACKET_BYTES[..]); } }