diff --git a/Cargo.lock b/Cargo.lock index 8c66742..1087652 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1336,17 +1336,12 @@ checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" [[package]] name = "p4rs" version = "0.1.0" -source = "git+https://github.com/oxidecomputer/p4?branch=main#b1007658f9638dfc60af75286ff5c108d6b2714c" +source = "git+https://github.com/oxidecomputer/p4?branch=counter#10f1f6cf2dd43057d19269177ccaf9463bb32fb2" dependencies = [ "bitvec", - "colored", "num", "serde", "serde_json", - "slog", - "slog-async", - "slog-envlogger", - "slog-term", "usdt", ] diff --git a/Cargo.toml b/Cargo.toml index e705d88..29f557e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ dlpi = { git = "https://github.com/oxidecomputer/dlpi-sys", branch = "main" } indicatif = "0.17.2" libc = "0.2.137" libloading = "0.7.3" -p4rs = { git = "https://github.com/oxidecomputer/p4", branch = "main" } +p4rs = { git = "https://github.com/oxidecomputer/p4", branch = "counter" } p9ds = { git = "https://github.com/oxidecomputer/p9fs", branch = "main" } p9kp = { git = "https://github.com/oxidecomputer/p9fs", branch = "main" } serde = { version = "1.0.147", features = ["derive"] } diff --git a/src/mgmt.rs b/src/mgmt.rs index 4c52c39..a8ba361 100644 --- a/src/mgmt.rs +++ b/src/mgmt.rs @@ -19,6 +19,7 @@ pub enum ManagementRequest { RadixRequest, TableAdd(TableAdd), TableRemove(TableRemove), + TableCounters(TableCounters), DumpRequest, } @@ -26,6 +27,13 @@ pub enum ManagementRequest { pub enum ManagementResponse { RadixResponse(u16), DumpResponse(BTreeMap>), + TableCountersResponse(Option>), +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct TableCounter { + pub key: Vec, + pub value: u128, } #[derive(Debug, Default, Serialize, Deserialize)] @@ -42,6 +50,11 @@ pub struct TableRemove { pub keyset_data: Vec, } +#[derive(Debug, Default, Serialize, Deserialize)] +pub struct TableCounters { + pub table: String, +} + pub async fn handle_management_message( msg: ManagementRequest, pipeline: Arc>>, @@ -65,6 +78,24 @@ pub async fn handle_management_message( ManagementRequest::TableRemove(tm) => { pl.remove_table_entry(&tm.table, &tm.keyset_data); } + ManagementRequest::TableCounters(tc) => { + let response = match pl.get_table_counters(&tc.table) { + None => ManagementResponse::TableCountersResponse(None), + Some(counters) => { + let entries = counters + .entries + .lock() + .unwrap() + .clone() + .into_iter() + .map(|(k, v)| TableCounter { key: k, value: v }) + .collect(); + ManagementResponse::TableCountersResponse(Some(entries)) + } + }; + let buf = serde_json::to_vec(&response).unwrap(); + uds.send_to(&buf, uds_dst).await.unwrap(); + } ManagementRequest::RadixRequest => { let response = ManagementResponse::RadixResponse(radix as u16); let buf = serde_json::to_vec(&response).unwrap();