aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeungjae Yoo <seungjaeyoo@google.com>2023-04-26 05:37:28 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-04-26 05:37:28 +0000
commitefbde0298eb493cd74437f302dacc89df8a7a188 (patch)
treebc4d932a366217e3a97b0a2af19a965107c834e4
parentc1e60058d0ec02d0522e0ebbecf8527ca13322fa (diff)
parent814c918d8c6249bd361d3086c9b68a97237d44b8 (diff)
downloadwmediumd-efbde0298eb493cd74437f302dacc89df8a7a188.tar.gz
Support SetCivicloc and SetLci into wmediumdservice am: 5e1bf5f20c am: 1f68ce183b am: eae6dec5b6 am: 814c918d8c
Original change: https://android-review.googlesource.com/c/platform/external/wmediumd/+/2556812 Change-Id: I3eb7cfb8ba0aa4c9a0a68e8f3af037197502c406 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--wmediumd/grpc.h2
-rw-r--r--wmediumd/wmediumd.c20
-rw-r--r--wmediumd_server/wmediumd.proto12
-rw-r--r--wmediumd_server/wmediumd_server.cc55
4 files changed, 87 insertions, 2 deletions
diff --git a/wmediumd/grpc.h b/wmediumd/grpc.h
index 1c1dc39..bd8c81a 100644
--- a/wmediumd/grpc.h
+++ b/wmediumd/grpc.h
@@ -25,6 +25,8 @@
#define MSG_TYPE_RESPONSE_SIZE (sizeof(struct wmediumd_grpc_response_message) - sizeof(long))
enum wmediumd_grpc_request_data_type {
+ REQUEST_SET_CIVICLOC,
+ REQUEST_SET_LCI,
REQUEST_SET_POSITION,
REQUEST_SET_SNR,
REQUEST_START_PCAP,
diff --git a/wmediumd/wmediumd.c b/wmediumd/wmediumd.c
index e707053..d19506e 100644
--- a/wmediumd/wmediumd.c
+++ b/wmediumd/wmediumd.c
@@ -1479,7 +1479,7 @@ static int process_set_lci_message(struct wmediumd *ctx, struct wmediumd_set_lci
}
node->lci = strdup(set_lci->lci);
- return node->lci != NULL;
+ return node->lci == NULL ? -1 : 0;
}
static int process_set_civicloc_message(struct wmediumd *ctx, struct wmediumd_set_civicloc *set_civicloc, size_t data_len) {
@@ -1498,7 +1498,7 @@ static int process_set_civicloc_message(struct wmediumd *ctx, struct wmediumd_se
}
node->civicloc = strdup(set_civicloc->civicloc);
- return node->civicloc != NULL;
+ return node->civicloc == NULL ? -1 : 0;
}
static const struct usfstl_vhost_user_ops wmediumd_vu_ops = {
@@ -1544,6 +1544,22 @@ static void wmediumd_grpc_service_handler(struct usfstl_loop_entry *entry) {
} else {
// TODO(273384914): Support more request types.
switch (request_message.data_type) {
+ case REQUEST_SET_CIVICLOC:
+ if (process_set_civicloc_message(ctx, (struct wmediumd_set_civicloc *)(request_message.data_payload), request_message.data_size) < 0) {
+ w_logf(ctx, LOG_ERR, "%s: failed to execute set_civicloc\n", __func__);
+ wmediumd_send_grpc_response(ctx->msq_id, request_message.msg_type_response, RESPONSE_INVALID);
+ break;
+ }
+ wmediumd_send_grpc_response(ctx->msq_id, request_message.msg_type_response, RESPONSE_ACK);
+ break;
+ case REQUEST_SET_LCI:
+ if (process_set_lci_message(ctx, (struct wmediumd_set_lci *)(request_message.data_payload), request_message.data_size) < 0) {
+ w_logf(ctx, LOG_ERR, "%s: failed to execute set_lci\n", __func__);
+ wmediumd_send_grpc_response(ctx->msq_id, request_message.msg_type_response, RESPONSE_INVALID);
+ break;
+ }
+ wmediumd_send_grpc_response(ctx->msq_id, request_message.msg_type_response, RESPONSE_ACK);
+ break;
case REQUEST_SET_POSITION:
if (process_set_position_message(ctx, (struct wmediumd_set_position *)(request_message.data_payload)) < 0) {
w_logf(ctx, LOG_ERR, "%s: failed to execute set_position\n", __func__);
diff --git a/wmediumd_server/wmediumd.proto b/wmediumd_server/wmediumd.proto
index 87eff96..0c21941 100644
--- a/wmediumd_server/wmediumd.proto
+++ b/wmediumd_server/wmediumd.proto
@@ -19,12 +19,24 @@ package wmediumdserver;
import "google/protobuf/empty.proto";
service WmediumdService {
+ rpc SetCivicloc(SetCiviclocRequest) returns (google.protobuf.Empty) {}
+ rpc SetLci(SetLciRequest) returns (google.protobuf.Empty) {}
rpc SetPosition(SetPositionRequest) returns (google.protobuf.Empty) {}
rpc SetSnr(SetSnrRequest) returns (google.protobuf.Empty) {}
rpc StartPcap(StartPcapRequest) returns (google.protobuf.Empty) {}
rpc StopPcap(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}
+message SetCiviclocRequest {
+ string mac_address = 1;
+ string civicloc = 2;
+}
+
+message SetLciRequest {
+ string mac_address = 1;
+ string lci = 2;
+}
+
message SetPositionRequest {
string mac_address = 1;
double x_pos = 2;
diff --git a/wmediumd_server/wmediumd_server.cc b/wmediumd_server/wmediumd_server.cc
index 0ff8670..6f38e1f 100644
--- a/wmediumd_server/wmediumd_server.cc
+++ b/wmediumd_server/wmediumd_server.cc
@@ -41,6 +41,8 @@ using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using grpc::StatusCode;
+using wmediumdserver::SetCiviclocRequest;
+using wmediumdserver::SetLciRequest;
using wmediumdserver::SetPositionRequest;
using wmediumdserver::SetSnrRequest;
using wmediumdserver::StartPcapRequest;
@@ -97,6 +99,59 @@ class WmediumdServiceImpl final : public WmediumdService::Service {
public:
WmediumdServiceImpl(int event_fd, int msq_id)
: event_fd_(event_fd), msq_id_(msq_id) {}
+ Status SetCivicloc(ServerContext* context, const SetCiviclocRequest* request,
+ Empty* reply) override {
+ // Validate parameters
+ if (!IsValidMacAddr(request->mac_address())) {
+ return Status(StatusCode::INVALID_ARGUMENT, "Got invalid mac address");
+ }
+ auto mac = ParseMacAddress(request->mac_address());
+
+ // Construct request payload
+ ssize_t size = sizeof(struct wmediumd_set_civicloc) +
+ (request->civicloc().length() + 1);
+ struct wmediumd_set_civicloc* request_data_payload =
+ (struct wmediumd_set_civicloc*)malloc(size);
+ memcpy(request_data_payload->mac, &mac, sizeof(mac));
+ strcpy(request_data_payload->civicloc, request->civicloc().c_str());
+
+ struct wmediumd_grpc_response_message response_message;
+ SendAndReceiveGrpcMessage(REQUEST_SET_CIVICLOC, size, request_data_payload,
+ &response_message);
+ free(request_data_payload);
+ if (response_message.data_type != RESPONSE_ACK) {
+ return Status(StatusCode::FAILED_PRECONDITION,
+ "Failed to execute SetCivicloc");
+ }
+ return Status::OK;
+ }
+
+ Status SetLci(ServerContext* context, const SetLciRequest* request,
+ Empty* reply) override {
+ // Validate parameters
+ if (!IsValidMacAddr(request->mac_address())) {
+ return Status(StatusCode::INVALID_ARGUMENT, "Got invalid mac address");
+ }
+ auto mac = ParseMacAddress(request->mac_address());
+
+ // Construct request payload
+ ssize_t size =
+ sizeof(struct wmediumd_set_lci) + (request->lci().length() + 1);
+ struct wmediumd_set_lci* request_data_payload =
+ (struct wmediumd_set_lci*)malloc(size);
+ memcpy(request_data_payload->mac, &mac, sizeof(mac));
+ strcpy(request_data_payload->lci, request->lci().c_str());
+
+ struct wmediumd_grpc_response_message response_message;
+ SendAndReceiveGrpcMessage(REQUEST_SET_LCI, size, request_data_payload,
+ &response_message);
+ free(request_data_payload);
+ if (response_message.data_type != RESPONSE_ACK) {
+ return Status(StatusCode::FAILED_PRECONDITION,
+ "Failed to execute SetLci");
+ }
+ return Status::OK;
+ }
Status SetPosition(ServerContext* context, const SetPositionRequest* request,
Empty* reply) override {