summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2023-08-22 11:39:56 +0800
committerluwenpeng <[email protected]>2023-08-22 11:39:56 +0800
commitd528b3c2ffe2bb6e7456a264c438c1c90ff96412 (patch)
tree839241eac438e821d948b34776b80aeb8ecd1694
parent3a6c7d587e6e8d7c3e7b70a93646c0e41a385220 (diff)
[feature] Support Packet Capture
-rw-r--r--Cargo.toml3
-rw-r--r--src/main.rs24
-rw-r--r--src/packet/capture.rs40
-rw-r--r--src/packet/mod.rs3
-rw-r--r--src/session/manager.rs2
-rw-r--r--src/session/session.rs20
6 files changed, 78 insertions, 14 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 22f845b..6327a08 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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 {