patchpanel: Add GetTrafficCounters in patchpanel client
BUG=b:160112867
TEST=unit_tests and fuzzer test;
TEST=wrote experiment code in shill::Manager to invoke this method, it
seems to be working well.
Change-Id: Iae0c4aca2278a80917dc3f593e2142c005e0f761
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2319439
Tested-by: Jie Jiang <jiejiang@chromium.org>
Commit-Queue: Jie Jiang <jiejiang@chromium.org>
Reviewed-by: Garrick Evans <garrick@chromium.org>
Reviewed-by: Hugo Benichi <hugobenichi@google.com>
Reviewed-by: Matthew Wang <matthewmwang@chromium.org>
diff --git a/patchpanel/client.cc b/patchpanel/client.cc
index eabd51b..e5cffdd 100644
--- a/patchpanel/client.cc
+++ b/patchpanel/client.cc
@@ -437,6 +437,39 @@
return std::make_pair(std::move(fd_local), std::move(response));
}
+std::vector<TrafficCounter> Client::GetTrafficCounters(
+ const std::set<std::string>& devices) {
+ dbus::MethodCall method_call(kPatchPanelInterface, kGetTrafficCountersMethod);
+ dbus::MessageWriter writer(&method_call);
+
+ TrafficCountersRequest request;
+ for (const auto& device : devices) {
+ request.add_devices(device);
+ }
+
+ if (!writer.AppendProtoAsArrayOfBytes(request)) {
+ LOG(ERROR) << "Failed to encode TrafficCountersRequest proto";
+ return {};
+ }
+
+ std::unique_ptr<dbus::Response> dbus_response = proxy_->CallMethodAndBlock(
+ &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT);
+ if (!dbus_response) {
+ LOG(ERROR) << "Failed to send TrafficCountersRequest message to patchpanel "
+ "service";
+ return {};
+ }
+
+ TrafficCountersResponse response;
+ dbus::MessageReader reader(dbus_response.get());
+ if (!reader.PopArrayOfBytesAsProto(&response)) {
+ LOG(ERROR) << "Failed to parse TrafficCountersResponse proto";
+ return {};
+ }
+
+ return {response.counters().begin(), response.counters().end()};
+}
+
bool Client::ModifyPortRule(ModifyPortRuleRequest::Operation op,
ModifyPortRuleRequest::RuleType type,
ModifyPortRuleRequest::Protocol proto,