Skip to content

Commit f364a8e

Browse files
committed
fix: switch intf not working, add timeout to datalink reciever
1 parent dcf35d6 commit f364a8e

File tree

1 file changed

+49
-6
lines changed

1 file changed

+49
-6
lines changed

src/components/packetdump.rs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use color_eyre::owo_colors::OwoColorize;
44
use crossterm::event::{KeyCode, KeyEvent};
55
use ipnetwork::Ipv4Network;
66

7-
use pnet::datalink::{Channel, NetworkInterface};
7+
use pnet::datalink::{Channel, ChannelType, NetworkInterface};
88
use pnet::packet::icmpv6::Icmpv6Types;
99
use pnet::packet::{
1010
arp::{ArpHardwareTypes, ArpOperations, ArpPacket, MutableArpPacket},
@@ -71,13 +71,15 @@ pub struct PacketDump {
7171
loop_thread: Option<JoinHandle<()>>,
7272
should_quit: bool,
7373
dump_paused: Arc<AtomicBool>,
74+
dump_stop: Arc<AtomicBool>,
7475
active_interface: Option<NetworkInterface>,
7576
table_state: TableState,
7677
scrollbar_state: ScrollbarState,
7778
packet_type: PacketTypeEnum,
7879
input: Input,
7980
mode: Mode,
8081
filter_str: String,
82+
changed_interface: bool,
8183

8284
arp_packets: MaxSizeVec<(DateTime<Local>, PacketsInfoTypesEnum)>,
8385
udp_packets: MaxSizeVec<(DateTime<Local>, PacketsInfoTypesEnum)>,
@@ -101,13 +103,15 @@ impl PacketDump {
101103
loop_thread: None,
102104
should_quit: false,
103105
dump_paused: Arc::new(AtomicBool::new(false)),
106+
dump_stop: Arc::new(AtomicBool::new(false)),
104107
active_interface: None,
105108
table_state: TableState::default().with_selected(0),
106109
scrollbar_state: ScrollbarState::new(0),
107110
packet_type: PacketTypeEnum::All,
108111
input: Input::default().with_value(String::from("")),
109112
mode: Mode::Normal,
110113
filter_str: String::from(""),
114+
changed_interface: false,
111115

112116
arp_packets: MaxSizeVec::new(1000),
113117
udp_packets: MaxSizeVec::new(1000),
@@ -410,8 +414,21 @@ impl PacketDump {
410414
}
411415
}
412416

413-
fn t_logic(tx: UnboundedSender<Action>, interface: NetworkInterface, paused: Arc<AtomicBool>) {
414-
let (_, mut receiver) = match pnet::datalink::channel(&interface, Default::default()) {
417+
fn t_logic(tx: UnboundedSender<Action>, interface: NetworkInterface, stop: Arc<AtomicBool>) {
418+
let (_, mut receiver) = match pnet::datalink::channel(
419+
&interface,
420+
pnet::datalink::Config {
421+
write_buffer_size: 4096,
422+
read_buffer_size: 4096,
423+
read_timeout: Some(Duration::new(1, 0)),
424+
write_timeout: None,
425+
channel_type: ChannelType::Layer2,
426+
bpf_fd_attempts: 1000,
427+
linux_fanout: None,
428+
promiscuous: true,
429+
socket_fd: None,
430+
},
431+
) {
415432
Ok(Channel::Ethernet(tx, rx)) => (tx, rx),
416433
Ok(_) => {
417434
tx.send(Action::Error("Unknown or unsupported channel type".into()))
@@ -428,6 +445,10 @@ impl PacketDump {
428445
};
429446

430447
loop {
448+
if stop.load(Ordering::Relaxed) {
449+
break;
450+
}
451+
431452
let mut buf: [u8; 1600] = [0u8; 1600];
432453
let mut fake_ethernet_frame = MutableEthernetPacket::new(&mut buf[..]).unwrap();
433454

@@ -482,7 +503,8 @@ impl PacketDump {
482503
tx.clone(),
483504
);
484505
}
485-
Err(e) => panic!("packetdump: unable to receive packet: {}", e),
506+
// Err(e) => println!("packetdump: unable to receive packet: {}", e),
507+
Err(e) => {}
486508
}
487509
}
488510
}
@@ -491,14 +513,20 @@ impl PacketDump {
491513
if self.loop_thread.is_none() {
492514
let tx = self.action_tx.clone().unwrap();
493515
let interface = self.active_interface.clone().unwrap();
494-
let paused = self.dump_paused.clone();
516+
// self.dump_stop.store(false, Ordering::Relaxed);
517+
// let paused = self.dump_paused.clone();
518+
let dump_stop = self.dump_stop.clone();
495519
let t_handle = thread::spawn(move || {
496-
Self::t_logic(tx, interface, paused);
520+
Self::t_logic(tx, interface, dump_stop);
497521
});
498522
self.loop_thread = Some(t_handle);
499523
}
500524
}
501525

526+
fn restart_loop(&mut self) {
527+
self.dump_stop.store(true, Ordering::Relaxed);
528+
}
529+
502530
pub fn get_array_by_packet_type(
503531
&mut self,
504532
packet_type: PacketTypeEnum,
@@ -1058,6 +1086,18 @@ impl Component for PacketDump {
10581086
}
10591087

10601088
fn update(&mut self, action: Action) -> Result<Option<Action>> {
1089+
// -- change thread loop if interface is changed
1090+
if self.changed_interface {
1091+
if let Some(ref lt) = self.loop_thread {
1092+
if lt.is_finished() {
1093+
self.loop_thread = None;
1094+
self.dump_stop.store(false, Ordering::SeqCst);
1095+
self.start_loop();
1096+
self.changed_interface = false;
1097+
}
1098+
}
1099+
}
1100+
10611101
// -- tab change
10621102
if let Action::TabChange(tab) = action {
10631103
self.tab_changed(tab).unwrap();
@@ -1071,6 +1111,9 @@ impl Component for PacketDump {
10711111
self.active_interface = Some(interface.clone());
10721112
if was_none {
10731113
self.start_loop();
1114+
} else {
1115+
self.changed_interface = true;
1116+
self.restart_loop();
10741117
}
10751118
}
10761119
if self.active_tab == TabsEnum::Packets {

0 commit comments

Comments
 (0)