1- use futures:: channel:: { mpsc, oneshot} ;
2- use futures:: future:: { poll_fn, FutureExt } ;
3- use futures:: stream:: { FuturesUnordered , StreamExt } ;
1+ use futures:: {
2+ channel:: { mpsc, oneshot} ,
3+ future:: { poll_fn, FutureExt } ,
4+ stream:: { FuturesUnordered , StreamExt } ,
5+ } ;
46use libpacket:: ipv4:: Ipv4Packet ;
57use netsim_embed_core:: { Ipv4Route , Plug } ;
6- use std:: net:: Ipv4Addr ;
7- use std:: task:: Poll ;
8+ use std:: {
9+ net:: Ipv4Addr ,
10+ sync:: {
11+ atomic:: { AtomicUsize , Ordering } ,
12+ Arc ,
13+ } ,
14+ task:: Poll ,
15+ } ;
816
917#[ derive( Debug ) ]
1018#[ allow( clippy:: enum_variant_names) ]
@@ -20,13 +28,43 @@ pub struct Ipv4Router {
2028 #[ allow( unused) ]
2129 addr : Ipv4Addr ,
2230 ctrl : mpsc:: UnboundedSender < RouterCtrl > ,
31+ counters : Arc < Counters > ,
32+ }
33+
34+ #[ derive( Debug , Default ) ]
35+ struct Counters {
36+ forwarded : AtomicUsize ,
37+ invalid : AtomicUsize ,
38+ disabled : AtomicUsize ,
39+ unroutable : AtomicUsize ,
2340}
2441
2542impl Ipv4Router {
2643 pub fn new ( addr : Ipv4Addr ) -> Self {
2744 let ( tx, rx) = mpsc:: unbounded ( ) ;
28- router ( addr, rx) ;
29- Self { addr, ctrl : tx }
45+ let counters = Arc :: new ( Counters :: default ( ) ) ;
46+ router ( addr, Arc :: clone ( & counters) , rx) ;
47+ Self {
48+ addr,
49+ ctrl : tx,
50+ counters,
51+ }
52+ }
53+
54+ pub fn forwarded ( & self ) -> usize {
55+ self . counters . forwarded . load ( Ordering :: Relaxed )
56+ }
57+
58+ pub fn invalid ( & self ) -> usize {
59+ self . counters . invalid . load ( Ordering :: Relaxed )
60+ }
61+
62+ pub fn disabled ( & self ) -> usize {
63+ self . counters . disabled . load ( Ordering :: Relaxed )
64+ }
65+
66+ pub fn unroutable ( & self ) -> usize {
67+ self . counters . unroutable . load ( Ordering :: Relaxed )
3068 }
3169
3270 pub fn add_connection ( & self , id : usize , plug : Plug , routes : Vec < Ipv4Route > ) {
@@ -56,7 +94,7 @@ impl Ipv4Router {
5694 }
5795}
5896
59- fn router ( addr : Ipv4Addr , mut ctrl : mpsc:: UnboundedReceiver < RouterCtrl > ) {
97+ fn router ( addr : Ipv4Addr , counters : Arc < Counters > , mut ctrl : mpsc:: UnboundedReceiver < RouterCtrl > ) {
6098 async_global_executor:: spawn ( async move {
6199 let mut conns = vec ! [ ] ;
62100 loop {
@@ -87,7 +125,7 @@ fn router(addr: Ipv4Addr, mut ctrl: mpsc::UnboundedReceiver<RouterCtrl>) {
87125 None => break ,
88126 } ,
89127 incoming = incoming( & mut conns) . fuse( ) => match incoming {
90- ( _, Some ( packet) ) => forward_packet( addr, & mut conns, packet) ,
128+ ( _, Some ( packet) ) => forward_packet( addr, & counters , & mut conns, packet) ,
91129 ( i, None ) => { conns. swap_remove( i) ; }
92130 }
93131 }
@@ -111,12 +149,14 @@ async fn incoming(conns: &mut [(usize, Plug, Vec<Ipv4Route>, bool)]) -> (usize,
111149
112150fn forward_packet (
113151 addr : Ipv4Addr ,
152+ counters : & Counters ,
114153 conns : & mut [ ( usize , Plug , Vec < Ipv4Route > , bool ) ] ,
115154 bytes : Vec < u8 > ,
116155) {
117156 let packet = if let Some ( packet) = Ipv4Packet :: new ( & bytes) {
118157 packet
119158 } else {
159+ counters. invalid . fetch_add ( 1 , Ordering :: Relaxed ) ;
120160 log:: info!( "router {}: dropping invalid ipv4 packet" , addr) ;
121161 return ;
122162 } ;
@@ -130,8 +170,10 @@ fn forward_packet(
130170 for route in routes {
131171 if route. dest ( ) . contains ( dest) || dest. is_broadcast ( ) || dest. is_multicast ( ) {
132172 if !* en {
173+ counters. disabled . fetch_add ( 1 , Ordering :: Relaxed ) ;
133174 log:: trace!( "router {}: route {:?} disabled" , addr, route) ;
134175 } else {
176+ counters. forwarded . fetch_add ( 1 , Ordering :: Relaxed ) ;
135177 log:: trace!( "router {}: routing packet on route {:?}" , addr, route) ;
136178 tx. unbounded_send ( bytes. clone ( ) ) ;
137179 forwarded = true ;
@@ -141,6 +183,7 @@ fn forward_packet(
141183 }
142184 if !forwarded {
143185 let src = packet. get_source ( ) ;
186+ counters. unroutable . fetch_add ( 1 , Ordering :: Relaxed ) ;
144187 log:: debug!(
145188 "router {}: dropping unroutable packet from {} to {}" ,
146189 addr,
0 commit comments