1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <array> 20 #include <cstdint> 21 #include <memory> 22 #include <optional> 23 #include <string> 24 25 #include <wmediumd/api.h> 26 27 #include "common/libs/fs/shared_fd.h" 28 29 namespace cuttlefish { 30 31 enum class WmediumdMessageType : uint32_t { 32 kInvalid = WMEDIUMD_MSG_INVALID, 33 kAck = WMEDIUMD_MSG_ACK, 34 kRegister = WMEDIUMD_MSG_REGISTER, 35 kUnregister = WMEDIUMD_MSG_UNREGISTER, 36 kNetlink = WMEDIUMD_MSG_NETLINK, 37 kSetControl = WMEDIUMD_MSG_SET_CONTROL, 38 kTxStart = WMEDIUMD_MSG_TX_START, 39 kGetStations = WMEDIUMD_MSG_GET_STATIONS, 40 kSetSnr = WMEDIUMD_MSG_SET_SNR, 41 kReloadConfig = WMEDIUMD_MSG_RELOAD_CONFIG, 42 kReloadCurrentConfig = WMEDIUMD_MSG_RELOAD_CURRENT_CONFIG, 43 kStartPcap = WMEDIUMD_MSG_START_PCAP, 44 kStopPcap = WMEDIUMD_MSG_STOP_PCAP, 45 kStationsList = WMEDIUMD_MSG_STATIONS_LIST, 46 kSetPosition = WMEDIUMD_MSG_SET_POSITION, 47 kSetLci = WMEDIUMD_MSG_SET_LCI, 48 kSetCivicloc = WMEDIUMD_MSG_SET_CIVICLOC, 49 }; 50 51 struct WmediumdStationInfo { 52 char addr[ETH_ALEN]; 53 char hwaddr[ETH_ALEN]; 54 55 double x; 56 double y; 57 58 std::string lci; 59 std::string civicloc; 60 61 int tx_power; 62 WmediumdStationInfoWmediumdStationInfo63 WmediumdStationInfo(const char addr[ETH_ALEN], const char hwaddr[ETH_ALEN], 64 double x, double y, const std::string& lci, 65 const std::string& civicloc, int tx_power) 66 : x(x), y(y), lci(lci), civicloc(civicloc), tx_power(tx_power) { 67 memcpy(this->addr, addr, sizeof(this->addr)); 68 memcpy(this->hwaddr, hwaddr, sizeof(this->hwaddr)); 69 } 70 }; 71 72 bool ValidMacAddr(const std::string& macAddr); 73 std::string MacToString(const char* macAddr); 74 75 class WmediumdMessage { 76 public: ~WmediumdMessage()77 virtual ~WmediumdMessage() {} 78 79 std::string Serialize(void) const; 80 81 virtual WmediumdMessageType Type() const = 0; 82 83 private: SerializeBody(std::string &)84 virtual void SerializeBody(std::string&) const {}; 85 }; 86 87 class WmediumdMessageSetControl : public WmediumdMessage { 88 public: WmediumdMessageSetControl(uint32_t flags)89 WmediumdMessageSetControl(uint32_t flags) : flags_(flags) {} 90 Type()91 WmediumdMessageType Type() const override { 92 return WmediumdMessageType::kSetControl; 93 } 94 95 private: 96 void SerializeBody(std::string& out) const override; 97 uint32_t flags_; 98 }; 99 100 class WmediumdMessageSetSnr : public WmediumdMessage { 101 public: 102 WmediumdMessageSetSnr(const std::string& node1, const std::string& node2, 103 uint8_t snr); 104 Type()105 WmediumdMessageType Type() const override { 106 return WmediumdMessageType::kSetSnr; 107 } 108 109 private: 110 void SerializeBody(std::string& out) const override; 111 112 std::array<uint8_t, 6> node1_mac_; 113 std::array<uint8_t, 6> node2_mac_; 114 uint8_t snr_; 115 }; 116 117 class WmediumdMessageReloadConfig : public WmediumdMessage { 118 public: WmediumdMessageReloadConfig(const std::string & configPath)119 WmediumdMessageReloadConfig(const std::string& configPath) 120 : config_path_(configPath) {} 121 Type()122 WmediumdMessageType Type() const override { 123 return WmediumdMessageType::kReloadConfig; 124 } 125 126 private: 127 void SerializeBody(std::string& out) const override; 128 129 std::string config_path_; 130 }; 131 132 class WmediumdMessageReloadCurrentConfig : public WmediumdMessage { 133 public: 134 WmediumdMessageReloadCurrentConfig() = default; 135 Type()136 WmediumdMessageType Type() const override { 137 return WmediumdMessageType::kReloadCurrentConfig; 138 } 139 }; 140 141 class WmediumdMessageStartPcap : public WmediumdMessage { 142 public: WmediumdMessageStartPcap(const std::string & pcapPath)143 WmediumdMessageStartPcap(const std::string& pcapPath) 144 : pcap_path_(pcapPath) {} 145 Type()146 WmediumdMessageType Type() const override { 147 return WmediumdMessageType::kStartPcap; 148 } 149 150 private: 151 void SerializeBody(std::string& out) const override; 152 153 std::string pcap_path_; 154 }; 155 156 class WmediumdMessageStopPcap : public WmediumdMessage { 157 public: 158 WmediumdMessageStopPcap() = default; 159 Type()160 WmediumdMessageType Type() const override { 161 return WmediumdMessageType::kStopPcap; 162 } 163 }; 164 165 class WmediumdMessageGetStations : public WmediumdMessage { 166 public: 167 WmediumdMessageGetStations() = default; 168 Type()169 WmediumdMessageType Type() const override { 170 return WmediumdMessageType::kGetStations; 171 } 172 }; 173 174 class WmediumdMessageReply : public WmediumdMessage { 175 public: 176 WmediumdMessageReply() = default; WmediumdMessageReply(WmediumdMessageType type,const std::string & data)177 WmediumdMessageReply(WmediumdMessageType type, const std::string& data) 178 : type_(type), data_(data) {} 179 Type()180 WmediumdMessageType Type() const override { return type_; } 181 Size()182 size_t Size() const { return data_.size(); } Data()183 const char* Data() const { return data_.data(); } 184 185 private: 186 WmediumdMessageType type_; 187 std::string data_; 188 }; 189 190 class WmediumdMessageStationsList : public WmediumdMessage { 191 public: 192 WmediumdMessageStationsList() = default; 193 static std::optional<WmediumdMessageStationsList> Parse( 194 const WmediumdMessageReply& reply); 195 Type()196 WmediumdMessageType Type() const override { 197 return WmediumdMessageType::kStationsList; 198 } 199 GetStations()200 const std::vector<WmediumdStationInfo>& GetStations() const { 201 return station_list_; 202 } 203 204 private: 205 std::vector<WmediumdStationInfo> station_list_; 206 }; 207 208 class WmediumdMessageSetPosition : public WmediumdMessage { 209 public: 210 WmediumdMessageSetPosition(const std::string& node, double x, double y); 211 Type()212 WmediumdMessageType Type() const override { 213 return WmediumdMessageType::kSetPosition; 214 } 215 216 private: 217 void SerializeBody(std::string& out) const override; 218 219 std::array<uint8_t, 6> mac_; 220 double x_; 221 double y_; 222 }; 223 224 class WmediumdMessageSetLci : public WmediumdMessage { 225 public: 226 WmediumdMessageSetLci(const std::string& node, const std::string& lci); 227 Type()228 WmediumdMessageType Type() const override { 229 return WmediumdMessageType::kSetLci; 230 } 231 232 private: 233 void SerializeBody(std::string& out) const override; 234 235 std::array<uint8_t, 6> mac_; 236 std::string lci_; 237 }; 238 239 class WmediumdMessageSetCivicloc : public WmediumdMessage { 240 public: 241 WmediumdMessageSetCivicloc(const std::string& node, 242 const std::string& civicloc); 243 Type()244 WmediumdMessageType Type() const override { 245 return WmediumdMessageType::kSetCivicloc; 246 } 247 248 private: 249 void SerializeBody(std::string& out) const override; 250 251 std::array<uint8_t, 6> mac_; 252 std::string civicloc_; 253 }; 254 255 } // namespace cuttlefish 256