From 2f5665ff185287408129851d9c9642501a931c18 Mon Sep 17 00:00:00 2001 From: Felix Lelchuk Date: Thu, 28 Apr 2022 23:13:59 +0200 Subject: [PATCH] std feature to enable #[no_std] use Adds a dependency on no_std_net for no_std addresses --- Cargo.toml | 32 ++++++++++++++++++++++++++----- pnet_base/Cargo.toml | 5 +++++ pnet_base/src/lib.rs | 4 ++++ pnet_base/src/macaddr.rs | 11 +++++++---- pnet_datalink/Cargo.toml | 4 +++- pnet_macros/src/decorator.rs | 20 +++++++++---------- pnet_macros/src/lib.rs | 4 ++-- pnet_macros/src/util.rs | 2 +- pnet_macros_support/Cargo.toml | 4 ++++ pnet_macros_support/src/lib.rs | 1 + pnet_macros_support/src/packet.rs | 15 +++++++++------ pnet_packet/Cargo.toml | 6 +++++- pnet_packet/src/arp.rs | 4 +++- pnet_packet/src/ethernet.rs | 4 +++- pnet_packet/src/gre.rs | 2 ++ pnet_packet/src/icmp.rs | 15 +++++++++++++++ pnet_packet/src/icmpv6.rs | 16 ++++++++++++++-- pnet_packet/src/ip.rs | 2 +- pnet_packet/src/ipv4.rs | 4 +++- pnet_packet/src/ipv6.rs | 4 +++- pnet_packet/src/lib.rs | 6 ++++++ pnet_packet/src/sll.rs | 2 ++ pnet_packet/src/tcp.rs | 6 ++++-- pnet_packet/src/udp.rs | 4 +++- pnet_packet/src/usbpcap.rs | 5 ++++- pnet_packet/src/util.rs | 10 +++++----- pnet_packet/src/vlan.rs | 3 +++ pnet_transport/Cargo.toml | 6 +++++- src/lib.rs | 32 +++++++++++++++++++------------ src/pnettest.rs | 2 +- src/util.rs | 2 +- 31 files changed, 176 insertions(+), 61 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e4c44f4f..c7a5b219 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,16 +18,38 @@ netmap = ["pnet_datalink/netmap_sys", "pnet_datalink/netmap"] pcap = ["pnet_datalink/pcap"] appveyor = [] travis = [] -serde = ["pnet_base/serde", "pnet_datalink/serde"] +serde = ["pnet_base/serde", "pnet_datalink?/serde"] +std = ["pnet_base/std", "pnet_sys", "pnet_datalink", "pnet_transport", "ipnetwork"] +default = ["std"] [dependencies] -ipnetwork = "0.19.0" +ipnetwork = { version = "0.19.0", optional = true } pnet_base = { path = "pnet_base", version = "0.29.0" } -pnet_sys = { path = "pnet_sys", version = "0.29.0" } -pnet_datalink = { path = "pnet_datalink", version = "0.29.0" } -pnet_transport = { path = "pnet_transport", version = "0.29.0" } +pnet_sys = { path = "pnet_sys", version = "0.29.0", optional = true } +pnet_datalink = { path = "pnet_datalink", version = "0.29.0", optional = true } +pnet_transport = { path = "pnet_transport", version = "0.29.0", optional = true } pnet_packet = { path = "pnet_packet", version = "0.29.0" } [dev-dependencies] time = "0.3.5" + +[[example]] +name = "arp_packet" +required-features = ["std"] + +[[example]] +name = "fanout" +required-features = ["std"] + +[[example]] +name = "list_interfaces" +required-features = ["std"] + +[[example]] +name = "packetdump" +required-features = ["std"] + +[[example]] +name = "transport_echo_server" +required-features = ["std"] diff --git a/pnet_base/Cargo.toml b/pnet_base/Cargo.toml index dcb5414d..25347860 100644 --- a/pnet_base/Cargo.toml +++ b/pnet_base/Cargo.toml @@ -12,11 +12,16 @@ categories = ["network-programming"] edition = "2021" [dependencies] +no-std-net = { version = "0.6.0", default-features = false } serde = { version = "1.0.126", optional = true, default-features = false } [dev-dependencies] serde_test = "1.0.126" +[features] +std = ["no-std-net/std"] +default = ["std"] + [package.metadata.docs.rs] # Enable the serde feature when generating docs on docs.rs, so the traits are visible features = ["serde"] diff --git a/pnet_base/src/lib.rs b/pnet_base/src/lib.rs index 43aed8a2..31bfdc3d 100644 --- a/pnet_base/src/lib.rs +++ b/pnet_base/src/lib.rs @@ -6,8 +6,12 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#![cfg_attr(all(not(test), not(feature = "std")), no_std)] + #[cfg(feature = "serde")] extern crate serde; mod macaddr; pub use crate::macaddr::*; + +pub use no_std_net as core_net; diff --git a/pnet_base/src/macaddr.rs b/pnet_base/src/macaddr.rs index 3977c784..1fd6fcef 100644 --- a/pnet_base/src/macaddr.rs +++ b/pnet_base/src/macaddr.rs @@ -6,9 +6,11 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#[cfg(feature = "std")] use std::error::Error; -use std::fmt; -use std::str::FromStr; + +use core::fmt; +use core::str::FromStr; #[cfg(feature = "serde")] use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; @@ -114,7 +116,7 @@ impl Serialize for MacAddr { /// prefers. fn serialize(&self, serializer: S) -> Result { if serializer.is_human_readable() { - serializer.serialize_str(&format!("{}", self)) + serializer.collect_str(self) } else { serializer.serialize_bytes(&[self.0, self.1, self.2, self.3, self.4, self.5]) } @@ -134,7 +136,7 @@ impl<'de> Deserialize<'de> for MacAddr { type Value = MacAddr; fn visit_str(self, value: &str) -> Result { - value.parse().map_err(|err| E::custom(&format!("{}", err))) + value.parse().map_err(|err| E::custom(err)) } fn visit_bytes(self, v: &[u8]) -> Result { @@ -179,6 +181,7 @@ pub enum ParseMacAddrErr { InvalidComponent, } +#[cfg(feature = "std")] impl Error for ParseMacAddrErr {} impl ParseMacAddrErr { diff --git a/pnet_datalink/Cargo.toml b/pnet_datalink/Cargo.toml index 0e8ed95c..f3557b36 100644 --- a/pnet_datalink/Cargo.toml +++ b/pnet_datalink/Cargo.toml @@ -13,11 +13,13 @@ edition = "2021" [features] netmap = [] +std = ["pnet_base/std"] +default = ["std"] [dependencies] libc = "0.2.97" ipnetwork = "0.18.0" -pnet_base = { path = "../pnet_base", version = "0.29.0" } +pnet_base = { path = "../pnet_base", version = "0.29.0", default-features = false } pnet_sys = { path = "../pnet_sys", version = "0.29.0" } pcap = { version = "0.8.1", optional = true } diff --git a/pnet_macros/src/decorator.rs b/pnet_macros/src/decorator.rs index 5e3cf057..b8984b69 100644 --- a/pnet_macros/src/decorator.rs +++ b/pnet_macros/src/decorator.rs @@ -15,7 +15,7 @@ use crate::util::{ use proc_macro2::{Group, Span}; use quote::{quote, ToTokens}; use regex::Regex; -use std::iter::FromIterator; +use core::iter::FromIterator; use syn::{spanned::Spanned, Error}; #[derive(Debug, PartialEq, Eq)] @@ -721,7 +721,7 @@ fn generate_packet_trait_impls( if !payload_bounds.upper.is_empty() { pre = pre + &format!( - "let end = ::std::cmp::min({}, _self.packet.len());", + "let end = ::core::cmp::min({}, _self.packet.len());", payload_bounds.upper )[..]; end = "end".to_owned(); @@ -778,7 +778,7 @@ fn generate_iterables(packet: &Packet) -> Result Option<{name}Packet<'a>> {{ use pnet_macros_support::packet::PacketSize; - use std::cmp::min; + use core::cmp::min; if self.buf.len() > 0 {{ if let Some(ret) = {name}Packet::new(self.buf) {{ let start = min(ret.packet_size(), self.buf.len()); @@ -853,9 +853,9 @@ fn generate_debug_impls(packet: &Packet) -> Result ::std::fmt::Debug for {packet}<'p> {{ + impl<'p> ::core::fmt::Debug for {packet}<'p> {{ #[cfg_attr(feature = \"clippy\", allow(used_underscore_binding))] - fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {{ + fn fmt(&self, fmt: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {{ let _self = self; write!(fmt, \"{packet} {{{{ {field_fmt_str} }}}}\" @@ -1012,7 +1012,7 @@ fn handle_vec_primitive( #[allow(trivial_numeric_casts, unused_parens, unused_braces)] #[cfg_attr(feature = \"clippy\", allow(used_underscore_binding))] pub fn get_{name}(&self) -> Vec<{inner_ty_str}> {{ - use std::cmp::min; + use core::cmp::min; let _self = self; let current_offset = {co}; let pkt_len = self.packet.len(); @@ -1126,7 +1126,7 @@ fn handle_vector_field( #[allow(trivial_numeric_casts)] #[cfg_attr(feature = \"clippy\", allow(used_underscore_binding))] pub fn get_{name}_raw(&self) -> &[u8] {{ - use std::cmp::min; + use core::cmp::min; let _self = self; let current_offset = {co}; let end = min(current_offset + {packet_length}, _self.packet.len()); @@ -1144,7 +1144,7 @@ fn handle_vector_field( #[allow(trivial_numeric_casts)] #[cfg_attr(feature = \"clippy\", allow(used_underscore_binding))] pub fn get_{name}_raw_mut(&mut self) -> &mut [u8] {{ - use std::cmp::min; + use core::cmp::min; let _self = self; let current_offset = {co}; let end = min(current_offset + {packet_length}, _self.packet.len()); @@ -1301,7 +1301,7 @@ fn handle_vector_field( #[cfg_attr(feature = \"clippy\", allow(used_underscore_binding))] pub fn get_{name}(&self) -> Vec<{inner_ty_str}> {{ use pnet_macros_support::packet::FromPacket; - use std::cmp::min; + use core::cmp::min; let _self = self; let current_offset = {co}; let end = min(current_offset + {packet_length}, _self.packet.len()); @@ -1317,7 +1317,7 @@ fn handle_vector_field( #[allow(trivial_numeric_casts)] #[cfg_attr(feature = \"clippy\", allow(used_underscore_binding))] pub fn get_{name}_iter(&self) -> {inner_ty_str}Iterable {{ - use std::cmp::min; + use core::cmp::min; let _self = self; let current_offset = {co}; let end = min(current_offset + {packet_length}, _self.packet.len()); diff --git a/pnet_macros/src/lib.rs b/pnet_macros/src/lib.rs index 4a1beedd..9875e23f 100644 --- a/pnet_macros/src/lib.rs +++ b/pnet_macros/src/lib.rs @@ -73,10 +73,10 @@ //! structures. These include: //! - `pnet::packet::Packet` (`ExamplePacket` and `MutableExamplePacket`) //! - `pnet::packet::MutablePacket` (`MutableExamplePacket` only) -//! - `std::fmt::Debug` (`ExamplePacket` and `MutableExamplePacket`) +//! - `core::fmt::Debug` (`ExamplePacket` and `MutableExamplePacket`) //! - `pnet::packet::FromPacket` (`ExamplePacket` and `MutableExamplePacket`) //! - `pnet::packet::PacketSize` (`ExamplePacket` and `MutableExamplePacket`) -//! * An `ExampleIterator` structure, which implements `std::iter::Iterator`, to allow iterating +//! * An `ExampleIterator` structure, which implements `core::iter::Iterator`, to allow iterating //! over vectors of `ExamplePacket` contained within another packet. Used internally. //! //! ## Attributes diff --git a/pnet_macros/src/util.rs b/pnet_macros/src/util.rs index 49868e81..872b4bcc 100644 --- a/pnet_macros/src/util.rs +++ b/pnet_macros/src/util.rs @@ -9,7 +9,7 @@ //! Utility functions for bit manipulation operations -use std::fmt; +use core::fmt; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Endianness { diff --git a/pnet_macros_support/Cargo.toml b/pnet_macros_support/Cargo.toml index 76393db3..bb095cb1 100644 --- a/pnet_macros_support/Cargo.toml +++ b/pnet_macros_support/Cargo.toml @@ -13,3 +13,7 @@ edition = "2021" [dependencies] pnet_base = { path = "../pnet_base", version = "0.29.0" } + +[features] +std = ["pnet_base/std"] +default = ["std"] diff --git a/pnet_macros_support/src/lib.rs b/pnet_macros_support/src/lib.rs index 7da51a7a..f7506a36 100644 --- a/pnet_macros_support/src/lib.rs +++ b/pnet_macros_support/src/lib.rs @@ -11,6 +11,7 @@ //! This exists to remove the need for the plugin_as_library feature, and allow for static linking. #![deny(missing_docs)] +#![no_std] extern crate pnet_base; diff --git a/pnet_macros_support/src/packet.rs b/pnet_macros_support/src/packet.rs index 303b98a2..d29021f5 100644 --- a/pnet_macros_support/src/packet.rs +++ b/pnet_macros_support/src/packet.rs @@ -8,8 +8,11 @@ //! Packet helpers for `pnet_macros`. +extern crate alloc; +use alloc::vec; + +use core::ops::{Deref, DerefMut, Index, IndexMut, Range, RangeFrom, RangeFull, RangeTo}; use pnet_base; -use std::ops::{Deref, DerefMut, Index, IndexMut, Range, RangeFrom, RangeFull, RangeTo}; /// Represents a generic network packet. pub trait Packet { @@ -30,7 +33,7 @@ pub trait MutablePacket: Packet { /// Initialize this packet by cloning another. fn clone_from(&mut self, other: &T) { - use std::ptr; + use core::ptr; assert!(self.packet().len() >= other.packet().len()); unsafe { @@ -87,7 +90,7 @@ macro_rules! impl_index_mut { #[derive(PartialEq)] pub enum PacketData<'p> { /// A packet owns its contents. - Owned(Vec), + Owned(vec::Vec), /// A packet borrows its contents. Borrowed(&'p [u8]), } @@ -125,7 +128,7 @@ impl_index!(PacketData, RangeFull, [u8]); #[derive(PartialEq)] pub enum MutPacketData<'p> { /// Owned mutable packet data. - Owned(Vec), + Owned(vec::Vec), /// Borrowed mutable packet data. Borrowed(&'p mut [u8]), } @@ -194,7 +197,7 @@ impl PrimitiveValues for pnet_base::MacAddr { } } -impl PrimitiveValues for ::std::net::Ipv4Addr { +impl PrimitiveValues for ::pnet_base::core_net::Ipv4Addr { type T = (u8, u8, u8, u8); #[inline] fn to_primitive_values(&self) -> (u8, u8, u8, u8) { @@ -204,7 +207,7 @@ impl PrimitiveValues for ::std::net::Ipv4Addr { } } -impl PrimitiveValues for ::std::net::Ipv6Addr { +impl PrimitiveValues for ::pnet_base::core_net::Ipv6Addr { type T = (u16, u16, u16, u16, u16, u16, u16, u16); #[inline] fn to_primitive_values(&self) -> (u16, u16, u16, u16, u16, u16, u16, u16) { diff --git a/pnet_packet/Cargo.toml b/pnet_packet/Cargo.toml index 7728ea54..ff520c47 100644 --- a/pnet_packet/Cargo.toml +++ b/pnet_packet/Cargo.toml @@ -12,10 +12,14 @@ categories = ["network-programming", "parser-implementations"] edition = "2018" [dependencies] -pnet_base = { path = "../pnet_base", version = "0.29.0" } +pnet_base = { path = "../pnet_base", version = "0.29.0", default-features = false } pnet_macros_support = { path = "../pnet_macros_support", version = "0.29.0" } pnet_macros = { path = "../pnet_macros", version = "0.29.0" } +[features] +std = ["pnet_base/std"] +default = ["std"] + [dev-dependencies] hex = "0.4.3" criterion = {version = "0.3.5", features = ["html_reports"]} #added HTML feature becuase of the annoying warnings when running the tests diff --git a/pnet_packet/src/arp.rs b/pnet_packet/src/arp.rs index 865a28bc..3378200d 100644 --- a/pnet_packet/src/arp.rs +++ b/pnet_packet/src/arp.rs @@ -11,7 +11,9 @@ use crate::PrimitiveValues; use crate::ethernet::EtherType; -use std::net::Ipv4Addr; +use alloc::vec::Vec; + +use pnet_base::core_net::Ipv4Addr; use pnet_base::MacAddr; use pnet_macros::packet; diff --git a/pnet_packet/src/ethernet.rs b/pnet_packet/src/ethernet.rs index 8f9f984b..94ed5b95 100644 --- a/pnet_packet/src/ethernet.rs +++ b/pnet_packet/src/ethernet.rs @@ -10,7 +10,9 @@ use crate::PrimitiveValues; -use std::fmt; +use alloc::vec::Vec; +use core::fmt; + use pnet_base::MacAddr; use pnet_macros::packet; diff --git a/pnet_packet/src/gre.rs b/pnet_packet/src/gre.rs index 4b5f285f..77fbaf43 100644 --- a/pnet_packet/src/gre.rs +++ b/pnet_packet/src/gre.rs @@ -12,6 +12,8 @@ #[cfg(test)] use crate::Packet; +use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; diff --git a/pnet_packet/src/icmp.rs b/pnet_packet/src/icmp.rs index 4c055a6e..d98ece0f 100644 --- a/pnet_packet/src/icmp.rs +++ b/pnet_packet/src/icmp.rs @@ -9,6 +9,9 @@ //! An ICMP packet abstraction. use crate::PrimitiveValues; + +use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; @@ -161,6 +164,9 @@ pub mod echo_reply { use crate::PrimitiveValues; use crate::icmp::{IcmpCode, IcmpType}; + + use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; @@ -240,6 +246,9 @@ pub mod echo_request { use crate::PrimitiveValues; use crate::icmp::{IcmpCode, IcmpType}; + + use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; @@ -318,6 +327,9 @@ pub mod destination_unreachable { //! ``` use crate::icmp::{IcmpCode, IcmpType}; + + use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; @@ -389,6 +401,9 @@ pub mod time_exceeded { //! ``` use crate::icmp::{IcmpCode, IcmpType}; + + use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; diff --git a/pnet_packet/src/icmpv6.rs b/pnet_packet/src/icmpv6.rs index f3c1572f..9b64694e 100644 --- a/pnet_packet/src/icmpv6.rs +++ b/pnet_packet/src/icmpv6.rs @@ -10,9 +10,12 @@ use crate::ip::IpNextHeaderProtocols; use crate::PrimitiveValues; + +use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; -use std::net::Ipv6Addr; +use pnet_base::core_net::Ipv6Addr; /// Represents the "ICMPv6 type" header field. #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -152,9 +155,12 @@ pub mod ndp { use crate::icmpv6::{Icmpv6Code, Icmpv6Type}; use crate::PrimitiveValues; use crate::Packet; + + use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; - use std::net::Ipv6Addr; + use pnet_base::core_net::Ipv6Addr; #[allow(non_snake_case)] #[allow(non_upper_case_globals)] @@ -841,6 +847,9 @@ pub mod echo_reply { use crate::PrimitiveValues; use crate::icmpv6::{Icmpv6Code, Icmpv6Type}; + + use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; @@ -920,6 +929,9 @@ pub mod echo_request { use crate::PrimitiveValues; use crate::icmpv6::{Icmpv6Code, Icmpv6Type}; + + use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; diff --git a/pnet_packet/src/ip.rs b/pnet_packet/src/ip.rs index 54b2e353..5d65662f 100644 --- a/pnet_packet/src/ip.rs +++ b/pnet_packet/src/ip.rs @@ -9,7 +9,7 @@ //! Defines the type and constants for IP next header/next level protocol //! fields. -use std::fmt; +use core::fmt; use crate::PrimitiveValues; /// Protocol numbers as defined at: diff --git a/pnet_packet/src/ipv4.rs b/pnet_packet/src/ipv4.rs index e7e5bab2..1e5a61e4 100644 --- a/pnet_packet/src/ipv4.rs +++ b/pnet_packet/src/ipv4.rs @@ -11,10 +11,12 @@ use crate::PrimitiveValues; use crate::ip::IpNextHeaderProtocol; +use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; -use std::net::Ipv4Addr; +use pnet_base::core_net::Ipv4Addr; /// The IPv4 header flags. #[allow(non_snake_case)] diff --git a/pnet_packet/src/ipv6.rs b/pnet_packet/src/ipv6.rs index d685b730..0b41e9f6 100644 --- a/pnet_packet/src/ipv6.rs +++ b/pnet_packet/src/ipv6.rs @@ -10,10 +10,12 @@ use crate::ip::IpNextHeaderProtocol; +use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; -use std::net::Ipv6Addr; +use pnet_base::core_net::Ipv6Addr; /// Represents an IPv6 Packet. #[packet] diff --git a/pnet_packet/src/lib.rs b/pnet_packet/src/lib.rs index 19656f02..85720ef9 100644 --- a/pnet_packet/src/lib.rs +++ b/pnet_packet/src/lib.rs @@ -8,8 +8,14 @@ //! Provides interfaces for interacting with packets and headers. #![allow(missing_docs)] +#![no_std] #![macro_use] +extern crate alloc; + +#[cfg(test)] +extern crate std; + extern crate pnet_base; extern crate pnet_macros_support; extern crate pnet_macros; diff --git a/pnet_packet/src/sll.rs b/pnet_packet/src/sll.rs index 817c3cf2..d8d2a9d0 100644 --- a/pnet_packet/src/sll.rs +++ b/pnet_packet/src/sll.rs @@ -1,5 +1,7 @@ //! A Linux cooked-mode capture (LINKTYPE_LINUX_SLL) packet abstraction. +use alloc::vec::Vec; + use ethernet::EtherType; use pnet_macros::packet; use pnet_macros_support::types::* diff --git a/pnet_packet/src/tcp.rs b/pnet_packet/src/tcp.rs index 115f689a..4bd2429b 100644 --- a/pnet_packet/src/tcp.rs +++ b/pnet_packet/src/tcp.rs @@ -12,11 +12,13 @@ use crate::Packet; use crate::PrimitiveValues; use crate::ip::IpNextHeaderProtocols; +use alloc::{vec, vec::Vec}; + use pnet_macros::packet; use pnet_macros_support::types::*; -use std::net::Ipv4Addr; -use std::net::Ipv6Addr; +use pnet_base::core_net::Ipv4Addr; +use pnet_base::core_net::Ipv6Addr; use crate::util::{self, Octets}; /// The TCP flags. diff --git a/pnet_packet/src/udp.rs b/pnet_packet/src/udp.rs index f34dd356..b147579c 100644 --- a/pnet_packet/src/udp.rs +++ b/pnet_packet/src/udp.rs @@ -11,10 +11,12 @@ use crate::Packet; use crate::ip::IpNextHeaderProtocols; +use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; -use std::net::{Ipv4Addr, Ipv6Addr}; +use pnet_base::core_net::{Ipv4Addr, Ipv6Addr}; use crate::util; /// Represents a UDP Packet. diff --git a/pnet_packet/src/usbpcap.rs b/pnet_packet/src/usbpcap.rs index 315955fb..736fe052 100644 --- a/pnet_packet/src/usbpcap.rs +++ b/pnet_packet/src/usbpcap.rs @@ -1,4 +1,7 @@ //! A USB PCAP packet abstraction. + +use alloc::vec::Vec; + use pnet_macros::Packet; use pnet_macros_support::types::{u1, u3, u4, u7, u16le, u32le, u64le}; use pnet_macros_support::packet::PrimitiveValues; @@ -166,4 +169,4 @@ mod tests { assert_eq!(&ref_packet[..], &packet[0..28]); } -} \ No newline at end of file +} diff --git a/pnet_packet/src/util.rs b/pnet_packet/src/util.rs index 0c8fb721..c7d4442a 100644 --- a/pnet_packet/src/util.rs +++ b/pnet_packet/src/util.rs @@ -11,10 +11,10 @@ use crate::ip::IpNextHeaderProtocol; use pnet_macros_support::types::u16be; -use std::convert::TryInto; -use std::net::{Ipv4Addr, Ipv6Addr}; -use std::u16; -use std::u8; +use core::convert::TryInto; +use pnet_base::core_net::{Ipv4Addr, Ipv6Addr}; +use core::u16; +use core::u8; /// Convert a value to a byte array. pub trait Octets { @@ -183,7 +183,7 @@ fn sum_be_words(data: &[u8], skipword: usize) -> u32 { #[cfg(test)] mod tests { use super::sum_be_words; - use std::slice; + use core::slice; #[test] fn sum_be_words_different_skipwords() { diff --git a/pnet_packet/src/vlan.rs b/pnet_packet/src/vlan.rs index a4d74126..ad098fd3 100644 --- a/pnet_packet/src/vlan.rs +++ b/pnet_packet/src/vlan.rs @@ -2,6 +2,9 @@ use crate::PrimitiveValues; use crate::ethernet::EtherType; + +use alloc::vec::Vec; + use pnet_macros::packet; use pnet_macros_support::types::*; diff --git a/pnet_transport/Cargo.toml b/pnet_transport/Cargo.toml index d28f2d12..2260fe17 100644 --- a/pnet_transport/Cargo.toml +++ b/pnet_transport/Cargo.toml @@ -13,6 +13,10 @@ edition = "2021" [dependencies] libc = "0.2.94" -pnet_base = { path = "../pnet_base", version = "0.29.0" } +pnet_base = { path = "../pnet_base", version = "0.29.0", default-features = false } pnet_sys = { path = "../pnet_sys", version = "0.29.0" } pnet_packet = { path = "../pnet_packet", version = "0.29.0" } + +[features] +std = ["pnet_base/std"] +default = ["std"] \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index f64005dd..9d3f2660 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,6 +6,17 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#![deny(missing_docs)] +#![no_std] +#![cfg_attr(feature = "nightly", feature(custom_attribute, plugin))] +#![cfg_attr(feature = "nightly", plugin(pnet_macros_plugin))] +#![cfg_attr(feature = "clippy", feature(plugin))] +#![cfg_attr(feature = "benchmark", feature(test))] +#![cfg_attr(feature = "clippy", plugin(clippy))] +// We can't implement Iterator since we use streaming iterators +#![cfg_attr(feature = "clippy", allow(should_implement_trait))] +#![cfg_attr(any(feature = "appveyor", feature = "travis"), deny(warnings))] + //! # libpnet //! //! `libpnet` provides a cross-platform API for low level networking using Rust. @@ -40,7 +51,7 @@ //! packet is received on an interface, it echo's the packet back; reversing the //! source and destination addresses. //! -//! ```rust,no_run +//! ```rust,ignore //! extern crate pnet; //! //! use pnet::datalink::{self, NetworkInterface}; @@ -102,28 +113,24 @@ //! } //! ``` -#![deny(missing_docs)] -#![cfg_attr(feature = "nightly", feature(custom_attribute, plugin))] -#![cfg_attr(feature = "nightly", plugin(pnet_macros_plugin))] -#![cfg_attr(feature = "clippy", feature(plugin))] -#![cfg_attr(feature = "benchmark", feature(test))] -#![cfg_attr(feature = "clippy", plugin(clippy))] -// We can't implement Iterator since we use streaming iterators -#![cfg_attr(feature = "clippy", allow(should_implement_trait))] -#![cfg_attr(any(feature = "appveyor", feature = "travis"), deny(warnings))] - #[cfg(feature = "benchmark")] extern crate test; +#[cfg(feature = "std")] pub extern crate ipnetwork; extern crate pnet_base; + +#[cfg(feature = "std")] extern crate pnet_datalink; extern crate pnet_packet; +#[cfg(feature = "std")] extern crate pnet_sys; +#[cfg(feature = "std")] extern crate pnet_transport; /// Support for sending and receiving data link layer packets. +#[cfg(feature = "std")] pub mod datalink { pub use pnet_datalink::*; } @@ -134,6 +141,7 @@ pub mod packet { } /// Support for sending and receiving transport layer packets. +#[cfg(feature = "std")] pub mod transport { pub use pnet_transport::*; } @@ -142,5 +150,5 @@ pub mod util; // NOTE should probably have a cfg(pnet_test_network) here, but cargo doesn't // allow custom --cfg flags -#[cfg(test)] +#[cfg(all(test, std))] mod pnettest; diff --git a/src/pnettest.rs b/src/pnettest.rs index 70400f07..45332097 100644 --- a/src/pnettest.rs +++ b/src/pnettest.rs @@ -18,7 +18,7 @@ use crate::packet::udp; use crate::packet::udp::{MutableUdpPacket, UdpPacket}; use crate::packet::Packet; use std::iter::Iterator; -use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; +use pnet_base::core_net::{IpAddr, Ipv4Addr, Ipv6Addr}; use std::sync::mpsc::channel; use std::thread; use crate::transport::TransportProtocol::{Ipv4, Ipv6}; diff --git a/src/util.rs b/src/util.rs index 7575a268..76738ea9 100644 --- a/src/util.rs +++ b/src/util.rs @@ -8,5 +8,5 @@ //! Miscellaneous utilities for low-level networking. -pub use pnet_base::{MacAddr, ParseMacAddrErr}; +pub use pnet_base::{core_net, MacAddr, ParseMacAddrErr}; pub use pnet_packet::util::{checksum, ipv4_checksum, ipv6_checksum, Octets};