11use std:: {
22 collections:: HashMap ,
33 net:: IpAddr ,
4- sync:: { Arc , Mutex , RwLock , atomic:: AtomicBool } ,
4+ sync:: { Arc , RwLock , atomic:: AtomicBool } ,
55 thread,
66 time:: Duration ,
77} ;
@@ -25,12 +25,12 @@ const WIN_SIZE: usize = 100_000;
2525#[ derive( Debug ) ]
2626pub struct SynFlood {
2727 pub detected : Arc < AtomicBool > ,
28- pub map : Arc < Mutex < HashMap < IpAddr , usize > > > ,
28+ pub map : Arc < RwLock < HashMap < IpAddr , usize > > > ,
2929}
3030
3131impl SynFlood {
3232 pub fn new ( packets : Arc < RwLock < Vec < AppPacket > > > ) -> Self {
33- let map: Arc < Mutex < HashMap < IpAddr , usize > > > = Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ;
33+ let map: Arc < RwLock < HashMap < IpAddr , usize > > > = Arc :: new ( RwLock :: new ( HashMap :: new ( ) ) ) ;
3434
3535 let detected = Arc :: new ( AtomicBool :: new ( false ) ) ;
3636
@@ -41,7 +41,12 @@ impl SynFlood {
4141 move || loop {
4242 let start_index = {
4343 let packets = packets. read ( ) . unwrap ( ) ;
44- packets. len ( ) . saturating_sub ( 1 )
44+ let count = packets
45+ . iter ( )
46+ . filter ( |packet| packet. direction == TrafficDirection :: Ingress )
47+ . count ( ) ;
48+
49+ count. saturating_sub ( 1 )
4550 } ;
4651
4752 thread:: sleep ( Duration :: from_secs ( 5 ) ) ;
@@ -56,7 +61,7 @@ impl SynFlood {
5661 . filter ( |packet| packet. direction == TrafficDirection :: Ingress )
5762 . collect ( ) ;
5863
59- let mut map = map. lock ( ) . unwrap ( ) ;
64+ let mut map = map. write ( ) . unwrap ( ) ;
6065 map. clear ( ) ;
6166
6267 if app_packets. len ( ) < WIN_SIZE {
@@ -116,7 +121,7 @@ impl SynFlood {
116121
117122 pub fn render ( & self , frame : & mut Frame , block : Rect ) {
118123 let mut ips: Vec < ( IpAddr , usize ) > = {
119- let map = self . map . lock ( ) . unwrap ( ) ;
124+ let map = self . map . read ( ) . unwrap ( ) ;
120125 map. clone ( ) . into_iter ( ) . collect ( )
121126 } ;
122127 ips. sort_by ( |a, b| b. 1 . cmp ( & a. 1 ) ) ;
0 commit comments