diff options
| author | luwenpeng <[email protected]> | 2023-08-22 11:39:56 +0800 |
|---|---|---|
| committer | luwenpeng <[email protected]> | 2023-08-22 11:39:56 +0800 |
| commit | d528b3c2ffe2bb6e7456a264c438c1c90ff96412 (patch) | |
| tree | 839241eac438e821d948b34776b80aeb8ecd1694 | |
| parent | 3a6c7d587e6e8d7c3e7b70a93646c0e41a385220 (diff) | |
[feature] Support Packet Capture
| -rw-r--r-- | Cargo.toml | 3 | ||||
| -rw-r--r-- | src/main.rs | 24 | ||||
| -rw-r--r-- | src/packet/capture.rs | 40 | ||||
| -rw-r--r-- | src/packet/mod.rs | 3 | ||||
| -rw-r--r-- | src/session/manager.rs | 2 | ||||
| -rw-r--r-- | src/session/session.rs | 20 |
6 files changed, 78 insertions, 14 deletions
@@ -7,4 +7,5 @@ edition = "2021" [dependencies] nom = "7" -chrono = "0.4"
\ No newline at end of file +chrono = "0.4" +pcap = "0.11"
\ No newline at end of file diff --git a/src/main.rs b/src/main.rs index e7a11a9..d4cad89 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,25 @@ +use stellar_rs::packet::capture::PacketCapture; +use stellar_rs::packet::packet::Packet; + +fn packet_callback(data: &[u8], len: u32) { + let mut packet = Packet::new(data, len); + let result = packet.handle(); + match result { + Ok(v) => { + // println!("SUCCESS: {:?}, {:?}", packet, v); + // println!("SUCCESS: {:#?}, {:?}", packet, v); + // dbg!(packet); + } + Err(e) => { + // println!("ERROR Data: {:?}", packet); + // println!("ERROR Code: {:?}", e); + println!("ERROR Desc: {}", e); + } + } +} + fn main() { - println!("Hello, world!"); + PacketCapture::show_devices(); + let mut cap = PacketCapture::new("en0"); + cap.poll_packet(packet_callback); } diff --git a/src/packet/capture.rs b/src/packet/capture.rs new file mode 100644 index 0000000..aa1204d --- /dev/null +++ b/src/packet/capture.rs @@ -0,0 +1,40 @@ +use pcap::Capture; + +pub struct PacketCapture { + capture: Capture<pcap::Active>, +} + +impl PacketCapture { + pub fn new(device: &str) -> Self { + println!("Packet Capture Open Device {:?}", device); + let mut capture = Capture::from_device(device) + .unwrap() + .immediate_mode(true) + .open() + .unwrap(); + + PacketCapture { capture } + } + + pub fn poll_packet(&mut self, callback: fn(data: &[u8], len: u32)) { + let mut packet_num = 0; + while let Ok(packet) = self.capture.next_packet() { + packet_num += 1; + println!("Packet[{}]->header : {:?}", packet_num, packet.header); + println!("Packet[{}]->data : {:?}", packet_num, packet.data); + callback(&packet.data, packet.header.len); + } + } + + pub fn show_devices() { + let mut device_num = 0; + for device in pcap::Device::list().expect("device list failed") { + device_num += 1; + println!( + "======================== Available Device [{}]========================", + device_num + ); + println!("{:#?}", device); + } + } +} diff --git a/src/packet/mod.rs b/src/packet/mod.rs index 8971449..3201aa1 100644 --- a/src/packet/mod.rs +++ b/src/packet/mod.rs @@ -1,2 +1,3 @@ pub mod packet; -pub mod error;
\ No newline at end of file +pub mod error; +pub mod capture;
\ No newline at end of file diff --git a/src/session/manager.rs b/src/session/manager.rs index 3128da5..d02a5db 100644 --- a/src/session/manager.rs +++ b/src/session/manager.rs @@ -93,7 +93,7 @@ mod tests { // Insert Session let mut session = Session::new(five_tuple_4); - session.set_session_c2s_metrics(0, 2, 0, 120); + session.inc_session_c2s_metrics(0, 2, 0, 120); session.set_session_exdata("Hello".to_string(), "Word".to_string()); session_mgr.insert_session(session_id.clone(), session); diff --git a/src/session/session.rs b/src/session/session.rs index 8eb5dae..36d899c 100644 --- a/src/session/session.rs +++ b/src/session/session.rs @@ -104,30 +104,30 @@ impl Session { self.session_state } - pub fn set_session_c2s_metrics( + pub fn inc_session_c2s_metrics( &mut self, pkts_sent: u64, pkts_recv: u64, bytes_sent: u64, bytes_recv: u64, ) { - self.session_metrics.c2s_pkts_sent = pkts_sent; - self.session_metrics.c2s_pkts_recv = pkts_recv; - self.session_metrics.c2s_bytes_sent = bytes_sent; - self.session_metrics.c2s_bytes_recv = bytes_recv; + self.session_metrics.c2s_pkts_sent += pkts_sent; + self.session_metrics.c2s_pkts_recv += pkts_recv; + self.session_metrics.c2s_bytes_sent += bytes_sent; + self.session_metrics.c2s_bytes_recv += bytes_recv; } - pub fn set_session_s2c_metrics( + pub fn inc_session_s2c_metrics( &mut self, pkts_sent: u64, pkts_recv: u64, bytes_sent: u64, bytes_recv: u64, ) { - self.session_metrics.s2c_pkts_sent = pkts_sent; - self.session_metrics.s2c_pkts_recv = pkts_recv; - self.session_metrics.s2c_bytes_sent = bytes_sent; - self.session_metrics.s2c_bytes_recv = bytes_recv; + self.session_metrics.s2c_pkts_sent += pkts_sent; + self.session_metrics.s2c_pkts_recv += pkts_recv; + self.session_metrics.s2c_bytes_sent += bytes_sent; + self.session_metrics.s2c_bytes_recv += bytes_recv; } pub fn get_session_metrics(&self) -> SessionMetrics { |
