@@ -4,7 +4,7 @@ use color_eyre::owo_colors::OwoColorize;
44use crossterm:: event:: { KeyCode , KeyEvent } ;
55use ipnetwork:: Ipv4Network ;
66
7- use pnet:: datalink:: { Channel , NetworkInterface } ;
7+ use pnet:: datalink:: { Channel , ChannelType , NetworkInterface } ;
88use pnet:: packet:: icmpv6:: Icmpv6Types ;
99use 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