Skip to content

Commit 2fd85cc

Browse files
committed
freebsd add basic ethernet frames support
[reference](https://github.com/freebsd/freebsd-src/blob/stable/14/sys/net/ethernet.h)
1 parent 0f9f8c9 commit 2fd85cc

File tree

3 files changed

+101
-0
lines changed

3 files changed

+101
-0
lines changed

libc-test/build.rs

+1
Original file line numberDiff line numberDiff line change
@@ -2197,6 +2197,7 @@ fn test_freebsd(target: &str) {
21972197
"memstat.h",
21982198
"mqueue.h",
21992199
"net/bpf.h",
2200+
"net/ethernet.h",
22002201
"net/if.h",
22012202
"net/if_arp.h",
22022203
"net/if_dl.h",

libc-test/semver/freebsd.txt

+13
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,17 @@ ERA_T_FMT
377377
EREMOTE
378378
ERPCMISMATCH
379379
ESOCKTNOSUPPORT
380+
ETHER_ADDR_LEN
381+
ETHER_CRC_LEN
382+
ETHER_HDR_LEN
383+
ETHER_IS_BROADCAST
384+
ETHER_IS_IPV6_MULTICAST
385+
ETHER_IS_MULTICAST
386+
ETHER_IS_ZERO
387+
ETHER_MIN_LEN
388+
ETHER_MAX_LEN
389+
ETHER_MAX_LEN_JUMBO
390+
ETHER_TYPE_LEN
380391
ETOOMANYREFS
381392
EUSERS
382393
EVFILT_AIO
@@ -1915,6 +1926,8 @@ endpwent
19151926
endservent
19161927
endutxent
19171928
erand48
1929+
ether_addr
1930+
ether_header
19181931
eui64_aton
19191932
eui64_hostton
19201933
eui64_ntoa

src/unix/bsd/freebsdlike/freebsd/mod.rs

+87
Original file line numberDiff line numberDiff line change
@@ -1661,6 +1661,18 @@ s_no_extra_traits! {
16611661
pub uc_flags: c_int,
16621662
__spare__: [c_int; 4],
16631663
}
1664+
1665+
#[repr(packed)]
1666+
pub struct ether_header {
1667+
pub ether_dhost: [crate::u_char; ETHER_ADDR_LEN as usize],
1668+
pub ether_shost: [crate::u_char; ETHER_ADDR_LEN as usize],
1669+
pub ether_type: crate::u_short,
1670+
}
1671+
1672+
#[repr(packed)]
1673+
pub struct ether_addr {
1674+
pub octet: [crate::u_char; ETHER_ADDR_LEN as usize],
1675+
}
16641676
}
16651677

16661678
cfg_if! {
@@ -2541,6 +2553,53 @@ cfg_if! {
25412553
.finish()
25422554
}
25432555
}
2556+
2557+
impl PartialEq for ether_header {
2558+
fn eq(&self, other: &ether_header) -> bool {
2559+
self.ether_dhost.iter().zip(other.ether_dhost.iter()).all(|(a, b)| a == b)
2560+
&& self.ether_dhost.iter().zip(other.ether_shost.iter()).all(|(a, b)| a == b)
2561+
&& self.ether_type == other.ether_type
2562+
}
2563+
}
2564+
2565+
impl Eq for ether_header {}
2566+
impl fmt::Debug for ether_header {
2567+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2568+
f.debug_struct("ether_header")
2569+
.field("ether_dhost", &{ self.ether_dhost })
2570+
.field("ether_shost", &{ self.ether_shost })
2571+
.field("ether_type", &{ self.ether_type })
2572+
.finish()
2573+
}
2574+
}
2575+
2576+
impl hash::Hash for ether_header {
2577+
fn hash<H: hash::Hasher>(&self, state: &mut H) {
2578+
{ self.ether_dhost }.hash(state);
2579+
{ self.ether_shost }.hash(state);
2580+
{ self.ether_type }.hash(state);
2581+
}
2582+
}
2583+
2584+
impl PartialEq for ether_addr {
2585+
fn eq(&self, other: &ether_addr) -> bool {
2586+
self.octet.iter().zip(other.octet.iter()).all(|(a, b)| a == b)
2587+
}
2588+
}
2589+
2590+
impl Eq for ether_addr {}
2591+
impl fmt::Debug for ether_addr {
2592+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2593+
f.debug_struct("ether_addr")
2594+
.field("octet", &{ self.octet })
2595+
.finish()
2596+
}
2597+
}
2598+
impl hash::Hash for ether_header {
2599+
fn hash<H: hash::Hasher>(&self, state: &mut H) {
2600+
{ self.octet }.hash(state);
2601+
}
2602+
}
25442603
}
25452604
}
25462605

@@ -4647,6 +4706,16 @@ pub const RTM_VERSION: c_int = 5;
46474706

46484707
pub const RTAX_MAX: c_int = 8;
46494708

4709+
// net/ethernet.h
4710+
4711+
pub const ETHER_ADDR_LEN: c_int = 6;
4712+
pub const ETHER_TYPE_LEN: c_int = 2;
4713+
pub const ETHER_CRC_LEN: c_int = 4;
4714+
pub const ETHER_HDR_LEN: c_int = ETHER_ADDR_LEN * 2 + ETHER_TYPE_LEN;
4715+
pub const ETHER_MIN_LEN: c_int = 64;
4716+
pub const ETHER_MAX_LEN: c_int = 1518;
4717+
pub const ETHER_MAX_LEN_JUMBO: c_int = 9018;
4718+
46504719
// sys/signal.h
46514720
pub const SIGTHR: c_int = 32;
46524721
pub const SIGLWP: c_int = SIGTHR;
@@ -4957,6 +5026,24 @@ f! {
49575026
pub fn PROT_MAX_EXTRACT(x: c_int) -> c_int {
49585027
(x >> 16) & (crate::PROT_READ | crate::PROT_WRITE | crate::PROT_EXEC)
49595028
}
5029+
5030+
pub {const} fn ETHER_IS_MULTICAST(addr: *mut u_char) -> bool {
5031+
(*addr.wrapping_add(0)) & 0x01 != 0x00
5032+
}
5033+
5034+
pub {const} fn ETHER_IS_IPV6_MULTICAST(addr: *mut u_char) -> bool {
5035+
(*addr.wrapping_add(0)) == 0x33 && (*addr.wrapping_add(1)) == 0x33
5036+
}
5037+
5038+
pub {const} fn ETHER_IS_BROADCAST(addr: *mut u_char) -> bool {
5039+
(*addr.wrapping_add(0)) & (*addr.wrapping_add(1)) & (*addr.wrapping_add(2))
5040+
& (*addr.wrapping_add(3)) & (*addr.wrapping_add(4)) & (*addr.wrapping_add(5)) == 0xff
5041+
}
5042+
5043+
pub {const} fn ETHER_IS_ZERO(addr: *mut u_char) -> bool {
5044+
(*addr.wrapping_add(0)) | (*addr.wrapping_add(1)) | (*addr.wrapping_add(2))
5045+
| (*addr.wrapping_add(3)) | (*addr.wrapping_add(4)) | (*addr.wrapping_add(5)) == 0x00
5046+
}
49605047
}
49615048

49625049
safe_f! {

0 commit comments

Comments
 (0)