33use p4rs:: { Pipeline , TableEntry } ;
44use serde:: { Deserialize , Serialize } ;
55use slog:: Logger ;
6- use std:: collections:: BTreeMap ;
6+ use std:: collections:: { BTreeMap , HashMap } ;
77use std:: fs:: OpenOptions ;
88use std:: io:: { Read , Write } ;
99use std:: os:: unix:: io:: AsRawFd ;
@@ -19,13 +19,15 @@ pub enum ManagementRequest {
1919 RadixRequest ,
2020 TableAdd ( TableAdd ) ,
2121 TableRemove ( TableRemove ) ,
22+ TableCounters ( TableCounters ) ,
2223 DumpRequest ,
2324}
2425
2526#[ derive( Debug , Serialize , Deserialize ) ]
2627pub enum ManagementResponse {
2728 RadixResponse ( u16 ) ,
2829 DumpResponse ( BTreeMap < String , Vec < TableEntry > > ) ,
30+ TableCountersResponse ( Option < HashMap < Vec < u8 > , u128 > > ) ,
2931}
3032
3133#[ derive( Debug , Default , Serialize , Deserialize ) ]
@@ -42,6 +44,11 @@ pub struct TableRemove {
4244 pub keyset_data : Vec < u8 > ,
4345}
4446
47+ #[ derive( Debug , Default , Serialize , Deserialize ) ]
48+ pub struct TableCounters {
49+ pub table : String ,
50+ }
51+
4552pub async fn handle_management_message (
4653 msg : ManagementRequest ,
4754 pipeline : Arc < Mutex < Box < dyn Pipeline > > > ,
@@ -65,6 +72,17 @@ pub async fn handle_management_message(
6572 ManagementRequest :: TableRemove ( tm) => {
6673 pl. remove_table_entry ( & tm. table , & tm. keyset_data ) ;
6774 }
75+ ManagementRequest :: TableCounters ( tc) => {
76+ let response = match pl. get_table_counters ( & tc. table ) {
77+ None => ManagementResponse :: TableCountersResponse ( None ) ,
78+ Some ( counters) => {
79+ let entries = counters. entries . lock ( ) . unwrap ( ) . clone ( ) ;
80+ ManagementResponse :: TableCountersResponse ( Some ( entries) )
81+ }
82+ } ;
83+ let buf = serde_json:: to_vec ( & response) . unwrap ( ) ;
84+ uds. send_to ( & buf, uds_dst) . await . unwrap ( ) ;
85+ }
6886 ManagementRequest :: RadixRequest => {
6987 let response = ManagementResponse :: RadixResponse ( radix as u16 ) ;
7088 let buf = serde_json:: to_vec ( & response) . unwrap ( ) ;
0 commit comments