• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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