diff options
author | Seungjae Yoo <seungjaeyoo@google.com> | 2023-04-26 05:37:28 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-04-26 05:37:28 +0000 |
commit | efbde0298eb493cd74437f302dacc89df8a7a188 (patch) | |
tree | bc4d932a366217e3a97b0a2af19a965107c834e4 | |
parent | c1e60058d0ec02d0522e0ebbecf8527ca13322fa (diff) | |
parent | 814c918d8c6249bd361d3086c9b68a97237d44b8 (diff) | |
download | wmediumd-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.h | 2 | ||||
-rw-r--r-- | wmediumd/wmediumd.c | 20 | ||||
-rw-r--r-- | wmediumd_server/wmediumd.proto | 12 | ||||
-rw-r--r-- | wmediumd_server/wmediumd_server.cc | 55 |
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 { |