aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeungjae Yoo <seungjaeyoo@google.com>2023-04-27 12:07:09 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-04-27 12:07:09 +0000
commit6d53aa2db06336222a201264dc7561732dae12b0 (patch)
tree301563f5cbe9b4a1997b29716586a2255155b9ac
parent7f05c09a3e49e1d582b6e2ce963df56b4483930d (diff)
parentdd4d11d622c0e5486d618360d2d637ce2f9a123d (diff)
downloadwmediumd-6d53aa2db06336222a201264dc7561732dae12b0.tar.gz
Support SetTxpower into wmediumdservice am: 6e19702a29 am: e38ee7b8b8 am: 2b4aba113f am: fdacb0c62e am: dd4d11d622
Original change: https://android-review.googlesource.com/c/platform/external/wmediumd/+/2567131 Change-Id: Ib1212d78ac7363db2a0f52c014ce35433e78ebed Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--wmediumd/api.h7
-rw-r--r--wmediumd/grpc.h1
-rw-r--r--wmediumd/wmediumd.c22
-rw-r--r--wmediumd_server/wmediumd.proto6
-rw-r--r--wmediumd_server/wmediumd_server.cc25
5 files changed, 61 insertions, 0 deletions
diff --git a/wmediumd/api.h b/wmediumd/api.h
index 05b363b..60323e8 100644
--- a/wmediumd/api.h
+++ b/wmediumd/api.h
@@ -176,6 +176,13 @@ struct wmediumd_set_position {
double y;
};
+struct wmediumd_set_tx_power {
+ /* MAC address */
+ uint8_t mac[6];
+ /* TX power of station */
+ int tx_power;
+};
+
struct wmediumd_set_lci {
/* MAC address */
uint8_t mac[6];
diff --git a/wmediumd/grpc.h b/wmediumd/grpc.h
index 644766a..8bf66e9 100644
--- a/wmediumd/grpc.h
+++ b/wmediumd/grpc.h
@@ -32,6 +32,7 @@ enum wmediumd_grpc_request_data_type {
REQUEST_SET_LCI,
REQUEST_SET_POSITION,
REQUEST_SET_SNR,
+ REQUEST_SET_TX_POWER,
REQUEST_START_PCAP,
REQUEST_STOP_PCAP,
};
diff --git a/wmediumd/wmediumd.c b/wmediumd/wmediumd.c
index 0edc76c..53f22c6 100644
--- a/wmediumd/wmediumd.c
+++ b/wmediumd/wmediumd.c
@@ -1463,6 +1463,20 @@ static int process_set_position_message(struct wmediumd *ctx, struct wmediumd_se
return 0;
}
+static int process_set_tx_power_message(struct wmediumd *ctx, struct wmediumd_set_tx_power *set_tx_power) {
+ struct station *node = get_station_by_addr(ctx, set_tx_power->mac);
+
+ if (node == NULL) {
+ return -1;
+ }
+
+ node->tx_power = set_tx_power->tx_power;
+
+ calc_path_loss(ctx);
+
+ return 0;
+}
+
static int process_set_lci_message(struct wmediumd *ctx, struct wmediumd_set_lci *set_lci, size_t data_len) {
struct station *node = get_station_by_addr(ctx, set_lci->mac);
@@ -1604,6 +1618,14 @@ static void wmediumd_grpc_service_handler(struct usfstl_loop_entry *entry) {
}
wmediumd_send_grpc_response(ctx->msq_id, request_message.msg_type_response, RESPONSE_ACK, 0, NULL);
break;
+ case REQUEST_SET_TX_POWER:
+ if (process_set_tx_power_message(ctx, (struct wmediumd_set_tx_power *)(request_message.data_payload)) < 0) {
+ w_logf(ctx, LOG_ERR, "%s: failed to execute set_tx_power\n", __func__);
+ wmediumd_send_grpc_response(ctx->msq_id, request_message.msg_type_response, RESPONSE_INVALID, 0, NULL);
+ break;
+ }
+ wmediumd_send_grpc_response(ctx->msq_id, request_message.msg_type_response, RESPONSE_ACK, 0, NULL);
+ break;
case REQUEST_START_PCAP:
init_pcapng(ctx, ((struct wmediumd_start_pcap *)(request_message.data_payload))->pcap_path);
wmediumd_send_grpc_response(ctx->msq_id, request_message.msg_type_response, RESPONSE_ACK, 0, NULL);
diff --git a/wmediumd_server/wmediumd.proto b/wmediumd_server/wmediumd.proto
index b4adf2f..4404931 100644
--- a/wmediumd_server/wmediumd.proto
+++ b/wmediumd_server/wmediumd.proto
@@ -26,6 +26,7 @@ service WmediumdService {
rpc SetLci(SetLciRequest) returns (google.protobuf.Empty) {}
rpc SetPosition(SetPositionRequest) returns (google.protobuf.Empty) {}
rpc SetSnr(SetSnrRequest) returns (google.protobuf.Empty) {}
+ rpc SetTxpower(SetTxpowerRequest) returns (google.protobuf.Empty) {}
rpc StartPcap(StartPcapRequest) returns (google.protobuf.Empty) {}
rpc StopPcap(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}
@@ -70,6 +71,11 @@ message SetSnrRequest {
int32 snr = 3;
}
+message SetTxpowerRequest {
+ string mac_address = 1;
+ int32 tx_power = 2;
+}
+
message StartPcapRequest {
string path = 1;
}
diff --git a/wmediumd_server/wmediumd_server.cc b/wmediumd_server/wmediumd_server.cc
index bf3de03..6a22e90 100644
--- a/wmediumd_server/wmediumd_server.cc
+++ b/wmediumd_server/wmediumd_server.cc
@@ -50,6 +50,7 @@ using wmediumdserver::SetCiviclocRequest;
using wmediumdserver::SetLciRequest;
using wmediumdserver::SetPositionRequest;
using wmediumdserver::SetSnrRequest;
+using wmediumdserver::SetTxpowerRequest;
using wmediumdserver::StartPcapRequest;
using wmediumdserver::WmediumdService;
@@ -279,6 +280,30 @@ class WmediumdServiceImpl final : public WmediumdService::Service {
return Status::OK;
}
+ Status SetTxpower(ServerContext* context, const SetTxpowerRequest* 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
+ struct wmediumd_set_tx_power request_data_payload;
+ memcpy(request_data_payload.mac, &mac, sizeof(mac));
+ request_data_payload.tx_power = request->tx_power();
+
+ struct wmediumd_grpc_response_message response_message;
+ SendAndReceiveGrpcMessage(REQUEST_SET_TX_POWER,
+ sizeof(request_data_payload),
+ &request_data_payload, &response_message);
+ if (response_message.data_type != RESPONSE_ACK) {
+ return Status(StatusCode::FAILED_PRECONDITION,
+ "Failed to execute SetTxpower");
+ }
+ return Status::OK;
+ }
+
Status StartPcap(ServerContext* context, const StartPcapRequest* request,
Empty* reply) override {
// Construct request payload