Skip to content

Commit cff88a3

Browse files
jttoherrala
authored andcommitted
tpacketv3: Use type definitions from libc crate
All relevant type definitions and constants are now available in libc crate, thus use those instead of providing our own.
1 parent 0c34afc commit cff88a3

4 files changed

Lines changed: 37 additions & 141 deletions

File tree

luomu-tpacketv3/src/if_packet.rs

Lines changed: 0 additions & 103 deletions
This file was deleted.

luomu-tpacketv3/src/lib.rs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use std::time::{Duration, SystemTime};
88

99
use luomu_libpcap::PcapFilter;
1010

11-
mod if_packet;
1211
mod ringbuf;
1312
mod socket;
1413

@@ -35,20 +34,20 @@ pub enum FanoutMode {
3534

3635
impl FanoutMode {
3736
// Get the actual numeric code for this fanout mode
38-
fn val(self) -> libc::c_int {
37+
fn val(self) -> u32 {
3938
match self {
40-
FanoutMode::HASH(_) => if_packet::PACKET_FANOUT_HASH,
41-
FanoutMode::LB(_) => if_packet::PACKET_FANOUT_LB,
42-
FanoutMode::ROLLOVER(_) => if_packet::PACKET_FANOUT_ROLLOVER,
43-
FanoutMode::RND(_) => if_packet::PACKET_FANOUT_RND,
44-
FanoutMode::QM(_) => if_packet::PACKET_FANOUT_QM,
45-
FanoutMode::CBPF(_) => if_packet::PACKET_FANOUT_CBPF,
46-
FanoutMode::EBPF(_) => if_packet::PACKET_FANOUT_EBPF,
47-
FanoutMode::CPU(_) => if_packet::PACKET_FANOUT_CPU,
39+
FanoutMode::HASH(_) => libc::PACKET_FANOUT_HASH,
40+
FanoutMode::LB(_) => libc::PACKET_FANOUT_LB,
41+
FanoutMode::ROLLOVER(_) => libc::PACKET_FANOUT_ROLLOVER,
42+
FanoutMode::RND(_) => libc::PACKET_FANOUT_RND,
43+
FanoutMode::QM(_) => libc::PACKET_FANOUT_QM,
44+
FanoutMode::CBPF(_) => libc::PACKET_FANOUT_CBPF,
45+
FanoutMode::EBPF(_) => libc::PACKET_FANOUT_EBPF,
46+
FanoutMode::CPU(_) => libc::PACKET_FANOUT_CPU,
4847
}
4948
}
5049

51-
fn arg(self) -> i32 {
50+
fn arg(self) -> u32 {
5251
let group_id = match self {
5352
FanoutMode::HASH(v)
5453
| FanoutMode::LB(v)
@@ -60,7 +59,7 @@ impl FanoutMode {
6059
| FanoutMode::CPU(v) => v,
6160
};
6261

63-
i32::from(group_id) | (self.val() << 16)
62+
u32::from(group_id) | (self.val() << 16)
6463
}
6564
}
6665

@@ -139,13 +138,13 @@ pub fn reader<'a>(
139138

140139
// set version to tpacket_v3
141140
let opt = socket::OptValue {
142-
val: if_packet::TPACKET_V3,
141+
val: libc::tpacket_versions::TPACKET_V3,
143142
};
144143
tracing::trace!("Setting packet version");
145144
sock.setopt(&socket::Option::PacketVersion(opt))
146145
.map_err(|e| format!("packet version sockopt failed: {e}"))?;
147146

148-
let req = if_packet::tpacket_req3 {
147+
let req = libc::tpacket_req3 {
149148
tp_block_size: parameters.block_size,
150149
tp_block_nr: parameters.block_count,
151150
tp_frame_size: parameters.frame_size,
@@ -260,7 +259,7 @@ impl<'a> Reader<'a> {
260259
/// packets captured (first element) and dropped (second element) or
261260
/// Err if stats could not be read.
262261
pub fn stats(&self) -> Result<(u32, u32), String> {
263-
let t_stats = if_packet::tpacket_stats_v3 {
262+
let t_stats = libc::tpacket_stats_v3 {
264263
tp_packets: 0,
265264
tp_drops: 0,
266265
tp_freeze_q_cnt: 0,

luomu-tpacketv3/src/ringbuf.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
1-
use crate::if_packet;
21
use std::fmt;
32
use std::time::{Duration, SystemTime, UNIX_EPOCH};
43

54
/// Descriptor for single packet within a block in mmapped ringbuffer
65
pub struct PacketDescriptor<'a> {
76
ptr: *mut u8,
8-
hdr: &'a if_packet::tpacket3_hdr,
7+
hdr: &'a libc::tpacket3_hdr,
98
}
109

1110
impl<'a> PacketDescriptor<'a> {
1211
#[allow(clippy::cast_ptr_alignment)]
1312
pub fn get_next(self) -> PacketDescriptor<'a> {
1413
let next_offset = isize::try_from(self.hdr.tp_next_offset).unwrap_or(isize::MAX);
1514
let next_ptr = unsafe { self.ptr.offset(next_offset) };
16-
let next_hdr_ptr = next_ptr as *const if_packet::tpacket3_hdr;
15+
let next_hdr_ptr = next_ptr as *const libc::tpacket3_hdr;
1716
PacketDescriptor {
1817
ptr: next_ptr,
1918
hdr: unsafe { next_hdr_ptr.as_ref().unwrap() },
@@ -32,11 +31,11 @@ impl<'a> PacketDescriptor<'a> {
3231
}
3332

3433
pub fn has_vlan_tci(&self) -> bool {
35-
(self.hdr.tp_status & if_packet::TP_STATUS_VLAN_VALID) == if_packet::TP_STATUS_VLAN_VALID
34+
(self.hdr.tp_status & libc::TP_STATUS_VLAN_VALID) == libc::TP_STATUS_VLAN_VALID
3635
}
3736

3837
pub fn has_vlan_tpid(&self) -> bool {
39-
(self.hdr.tp_status & if_packet::TP_STATUS_VLAN_TPID_VALID) == if_packet::TP_STATUS_VLAN_TPID_VALID
38+
(self.hdr.tp_status & libc::TP_STATUS_VLAN_TPID_VALID) == libc::TP_STATUS_VLAN_TPID_VALID
4039
}
4140

4241
pub fn get_vlan_tci(&self) -> u32 {
@@ -51,7 +50,7 @@ impl<'a> PacketDescriptor<'a> {
5150
impl From<*mut u8> for PacketDescriptor<'_> {
5251
#[allow(clippy::cast_ptr_alignment)]
5352
fn from(ptr: *mut u8) -> Self {
54-
let hdr_ptr = ptr as *const if_packet::tpacket3_hdr;
53+
let hdr_ptr = ptr as *const libc::tpacket3_hdr;
5554
let hdr = unsafe { hdr_ptr.as_ref().unwrap() };
5655
PacketDescriptor { ptr, hdr }
5756
}
@@ -64,35 +63,40 @@ impl From<*mut u8> for PacketDescriptor<'_> {
6463
/// needs to be called to indicate kernel that it free to use this block again
6564
#[derive(Debug)]
6665
pub struct BlockDescriptor<'a> {
67-
ptr: *mut u8, // pointer to the start of the data
68-
desc: &'a mut if_packet::tpacket_block_desc, // the actual block descriptor
66+
ptr: *mut u8, // pointer to the start of the data
67+
desc: &'a mut libc::tpacket_block_desc, // the actual block descriptor
6968
}
7069

7170
unsafe impl Send for BlockDescriptor<'_> {}
7271

7372
impl<'a> BlockDescriptor<'a> {
73+
// Returns reference to block header
74+
fn block_header(&self) -> &libc::tpacket_hdr_v1 {
75+
unsafe { &self.desc.hdr.bh1 }
76+
}
77+
7478
pub fn flush(&mut self) {
75-
self.desc.hdr.block_status = if_packet::TP_STATUS_KERNEL;
79+
self.desc.hdr.bh1.block_status = libc::TP_STATUS_KERNEL;
7680
}
7781

7882
pub fn is_ready(&self) -> bool {
79-
self.desc.hdr.block_status & if_packet::TP_STATUS_USER != 0
83+
self.block_header().block_status & libc::TP_STATUS_USER != 0
8084
}
8185

8286
pub fn get_number_of_packets(&self) -> u32 {
83-
self.desc.hdr.num_packets
87+
self.block_header().num_pkts
8488
}
8589

8690
pub fn get_first_packet(&self) -> PacketDescriptor<'a> {
87-
let offset = isize::try_from(self.desc.hdr.offset_to_first_pkt).unwrap_or(isize::MAX);
91+
let offset = isize::try_from(self.block_header().offset_to_first_pkt).unwrap_or(isize::MAX);
8892
unsafe { self.ptr.offset(offset) }.into()
8993
}
9094
}
9195

9296
impl From<*mut u8> for BlockDescriptor<'_> {
9397
#[allow(clippy::cast_ptr_alignment)]
9498
fn from(ptr: *mut u8) -> Self {
95-
let desc_ptr = ptr.cast::<if_packet::tpacket_block_desc>();
99+
let desc_ptr = ptr.cast::<libc::tpacket_block_desc>();
96100

97101
BlockDescriptor {
98102
ptr,

luomu-tpacketv3/src/socket.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ use std::time::Duration;
33

44
use luomu_libpcap::PcapFilter;
55

6-
use crate::if_packet;
7-
8-
const SO_ATTACH_FILTER: libc::c_int = libc::SO_ATTACH_FILTER;
9-
106
pub fn htons(val: u16) -> u16 {
117
val.to_be()
128
}
@@ -48,12 +44,12 @@ impl<T> Option<T> {
4844

4945
fn name(&self) -> libc::c_int {
5046
match self {
51-
Option::PacketVersion(_) => if_packet::PACKET_VERSION,
52-
Option::PacketRxRing(_) => if_packet::PACKET_RX_RING,
53-
Option::PacketAddMembership(_) => if_packet::PACKET_ADD_MEMBERSHIP,
54-
Option::PacketStatistics(_) => if_packet::PACKET_STATISTICS,
55-
Option::PacketFanout(_) => if_packet::PACKET_FANOUT,
56-
Option::SocketAttachFilter(_) => SO_ATTACH_FILTER,
47+
Option::PacketVersion(_) => libc::PACKET_VERSION,
48+
Option::PacketRxRing(_) => libc::PACKET_RX_RING,
49+
Option::PacketAddMembership(_) => libc::PACKET_ADD_MEMBERSHIP,
50+
Option::PacketStatistics(_) => libc::PACKET_STATISTICS,
51+
Option::PacketFanout(_) => libc::PACKET_FANOUT,
52+
Option::SocketAttachFilter(_) => libc::SO_ATTACH_FILTER,
5753
}
5854
}
5955

0 commit comments

Comments
 (0)