|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 #ifndef NetworkUtils_h |
|
6 #define NetworkUtils_h |
|
7 |
|
8 #include "nsString.h" |
|
9 #include "mozilla/dom/NetworkOptionsBinding.h" |
|
10 #include "mozilla/dom/network/NetUtils.h" |
|
11 #include "mozilla/ipc/Netd.h" |
|
12 #include "nsTArray.h" |
|
13 |
|
14 class NetworkParams; |
|
15 class CommandChain; |
|
16 |
|
17 using namespace mozilla::dom; |
|
18 |
|
19 typedef void (*CommandCallback)(CommandChain*, bool, NetworkResultOptions& aResult); |
|
20 typedef void (*CommandFunc)(CommandChain*, CommandCallback, NetworkResultOptions& aResult); |
|
21 typedef void (*MessageCallback)(NetworkResultOptions& aResult); |
|
22 typedef void (*ErrorCallback)(NetworkParams& aOptions, NetworkResultOptions& aResult); |
|
23 |
|
24 class NetworkParams |
|
25 { |
|
26 public: |
|
27 NetworkParams() { |
|
28 } |
|
29 |
|
30 NetworkParams(const NetworkParams& aOther) { |
|
31 mIp = aOther.mIp; |
|
32 mCmd = aOther.mCmd; |
|
33 mDomain = aOther.mDomain; |
|
34 mGateway = aOther.mGateway; |
|
35 mGateways = aOther.mGateways; |
|
36 mHostnames = aOther.mHostnames; |
|
37 mId = aOther.mId; |
|
38 mIfname = aOther.mIfname; |
|
39 mPrefixLength = aOther.mPrefixLength; |
|
40 mOldIfname = aOther.mOldIfname; |
|
41 mMode = aOther.mMode; |
|
42 mReport = aOther.mReport; |
|
43 mIsAsync = aOther.mIsAsync; |
|
44 mEnabled = aOther.mEnabled; |
|
45 mWifictrlinterfacename = aOther.mWifictrlinterfacename; |
|
46 mInternalIfname = aOther.mInternalIfname; |
|
47 mExternalIfname = aOther.mExternalIfname; |
|
48 mEnable = aOther.mEnable; |
|
49 mSsid = aOther.mSsid; |
|
50 mSecurity = aOther.mSecurity; |
|
51 mKey = aOther.mKey; |
|
52 mPrefix = aOther.mPrefix; |
|
53 mLink = aOther.mLink; |
|
54 mInterfaceList = aOther.mInterfaceList; |
|
55 mWifiStartIp = aOther.mWifiStartIp; |
|
56 mWifiEndIp = aOther.mWifiEndIp; |
|
57 mUsbStartIp = aOther.mUsbStartIp; |
|
58 mUsbEndIp = aOther.mUsbEndIp; |
|
59 mDns1 = aOther.mDns1; |
|
60 mDns2 = aOther.mDns2; |
|
61 mDnses = aOther.mDnses; |
|
62 mRxBytes = aOther.mRxBytes; |
|
63 mTxBytes = aOther.mTxBytes; |
|
64 mDate = aOther.mDate; |
|
65 mStartIp = aOther.mStartIp; |
|
66 mEndIp = aOther.mEndIp; |
|
67 mServerIp = aOther.mServerIp; |
|
68 mMaskLength = aOther.mMaskLength; |
|
69 mPreInternalIfname = aOther.mPreInternalIfname; |
|
70 mPreExternalIfname = aOther.mPreExternalIfname; |
|
71 mCurInternalIfname = aOther.mCurInternalIfname; |
|
72 mCurExternalIfname = aOther.mCurExternalIfname; |
|
73 mThreshold = aOther.mThreshold; |
|
74 } |
|
75 |
|
76 NetworkParams(const NetworkCommandOptions& aOther) { |
|
77 |
|
78 #define COPY_SEQUENCE_FIELD(prop, type) \ |
|
79 if (aOther.prop.WasPassed()) { \ |
|
80 mozilla::dom::Sequence<type > const & currentValue = aOther.prop.InternalValue(); \ |
|
81 uint32_t length = currentValue.Length(); \ |
|
82 for (uint32_t idx = 0; idx < length; idx++) { \ |
|
83 prop.AppendElement(currentValue[idx]); \ |
|
84 } \ |
|
85 } |
|
86 |
|
87 #define COPY_OPT_STRING_FIELD(prop, defaultValue) \ |
|
88 if (aOther.prop.WasPassed()) { \ |
|
89 if (aOther.prop.Value().EqualsLiteral("null")) { \ |
|
90 prop = defaultValue; \ |
|
91 } else { \ |
|
92 prop = aOther.prop.Value(); \ |
|
93 } \ |
|
94 } else { \ |
|
95 prop = defaultValue; \ |
|
96 } |
|
97 |
|
98 #define COPY_OPT_FIELD(prop, defaultValue) \ |
|
99 if (aOther.prop.WasPassed()) { \ |
|
100 prop = aOther.prop.Value(); \ |
|
101 } else { \ |
|
102 prop = defaultValue; \ |
|
103 } |
|
104 |
|
105 #define COPY_FIELD(prop) prop = aOther.prop; |
|
106 |
|
107 COPY_FIELD(mId) |
|
108 COPY_FIELD(mCmd) |
|
109 COPY_OPT_STRING_FIELD(mDomain, EmptyString()) |
|
110 COPY_OPT_STRING_FIELD(mGateway, EmptyString()) |
|
111 COPY_SEQUENCE_FIELD(mGateways, nsString) |
|
112 COPY_SEQUENCE_FIELD(mHostnames, nsString) |
|
113 COPY_OPT_STRING_FIELD(mIfname, EmptyString()) |
|
114 COPY_OPT_STRING_FIELD(mIp, EmptyString()) |
|
115 COPY_OPT_FIELD(mPrefixLength, 0) |
|
116 COPY_OPT_STRING_FIELD(mOldIfname, EmptyString()) |
|
117 COPY_OPT_STRING_FIELD(mMode, EmptyString()) |
|
118 COPY_OPT_FIELD(mReport, false) |
|
119 COPY_OPT_FIELD(mIsAsync, true) |
|
120 COPY_OPT_FIELD(mEnabled, false) |
|
121 COPY_OPT_STRING_FIELD(mWifictrlinterfacename, EmptyString()) |
|
122 COPY_OPT_STRING_FIELD(mInternalIfname, EmptyString()) |
|
123 COPY_OPT_STRING_FIELD(mExternalIfname, EmptyString()) |
|
124 COPY_OPT_FIELD(mEnable, false) |
|
125 COPY_OPT_STRING_FIELD(mSsid, EmptyString()) |
|
126 COPY_OPT_STRING_FIELD(mSecurity, EmptyString()) |
|
127 COPY_OPT_STRING_FIELD(mKey, EmptyString()) |
|
128 COPY_OPT_STRING_FIELD(mPrefix, EmptyString()) |
|
129 COPY_OPT_STRING_FIELD(mLink, EmptyString()) |
|
130 COPY_SEQUENCE_FIELD(mInterfaceList, nsString) |
|
131 COPY_OPT_STRING_FIELD(mWifiStartIp, EmptyString()) |
|
132 COPY_OPT_STRING_FIELD(mWifiEndIp, EmptyString()) |
|
133 COPY_OPT_STRING_FIELD(mUsbStartIp, EmptyString()) |
|
134 COPY_OPT_STRING_FIELD(mUsbEndIp, EmptyString()) |
|
135 COPY_OPT_STRING_FIELD(mDns1, EmptyString()) |
|
136 COPY_OPT_STRING_FIELD(mDns2, EmptyString()) |
|
137 COPY_SEQUENCE_FIELD(mDnses, nsString) |
|
138 COPY_OPT_FIELD(mRxBytes, -1) |
|
139 COPY_OPT_FIELD(mTxBytes, -1) |
|
140 COPY_OPT_STRING_FIELD(mDate, EmptyString()) |
|
141 COPY_OPT_STRING_FIELD(mStartIp, EmptyString()) |
|
142 COPY_OPT_STRING_FIELD(mEndIp, EmptyString()) |
|
143 COPY_OPT_STRING_FIELD(mServerIp, EmptyString()) |
|
144 COPY_OPT_STRING_FIELD(mMaskLength, EmptyString()) |
|
145 COPY_OPT_STRING_FIELD(mPreInternalIfname, EmptyString()) |
|
146 COPY_OPT_STRING_FIELD(mPreExternalIfname, EmptyString()) |
|
147 COPY_OPT_STRING_FIELD(mCurInternalIfname, EmptyString()) |
|
148 COPY_OPT_STRING_FIELD(mCurExternalIfname, EmptyString()) |
|
149 COPY_OPT_FIELD(mThreshold, -1) |
|
150 |
|
151 #undef COPY_SEQUENCE_FIELD |
|
152 #undef COPY_OPT_STRING_FIELD |
|
153 #undef COPY_OPT_FIELD |
|
154 #undef COPY_FIELD |
|
155 } |
|
156 |
|
157 int32_t mId; |
|
158 nsString mCmd; |
|
159 nsString mDomain; |
|
160 nsString mGateway; |
|
161 nsTArray<nsString> mGateways; |
|
162 nsTArray<nsString> mHostnames; |
|
163 nsString mIfname; |
|
164 nsString mIp; |
|
165 uint32_t mPrefixLength; |
|
166 nsString mOldIfname; |
|
167 nsString mMode; |
|
168 bool mReport; |
|
169 bool mIsAsync; |
|
170 bool mEnabled; |
|
171 nsString mWifictrlinterfacename; |
|
172 nsString mInternalIfname; |
|
173 nsString mExternalIfname; |
|
174 bool mEnable; |
|
175 nsString mSsid; |
|
176 nsString mSecurity; |
|
177 nsString mKey; |
|
178 nsString mPrefix; |
|
179 nsString mLink; |
|
180 nsTArray<nsString> mInterfaceList; |
|
181 nsString mWifiStartIp; |
|
182 nsString mWifiEndIp; |
|
183 nsString mUsbStartIp; |
|
184 nsString mUsbEndIp; |
|
185 nsString mDns1; |
|
186 nsString mDns2; |
|
187 nsTArray<nsString> mDnses; |
|
188 float mRxBytes; |
|
189 float mTxBytes; |
|
190 nsString mDate; |
|
191 nsString mStartIp; |
|
192 nsString mEndIp; |
|
193 nsString mServerIp; |
|
194 nsString mMaskLength; |
|
195 nsString mPreInternalIfname; |
|
196 nsString mPreExternalIfname; |
|
197 nsString mCurInternalIfname; |
|
198 nsString mCurExternalIfname; |
|
199 long mThreshold; |
|
200 }; |
|
201 |
|
202 // CommandChain store the necessary information to execute command one by one. |
|
203 // Including : |
|
204 // 1. Command parameters. |
|
205 // 2. Command list. |
|
206 // 3. Error callback function. |
|
207 // 4. Index of current execution command. |
|
208 class CommandChain MOZ_FINAL |
|
209 { |
|
210 public: |
|
211 CommandChain(const NetworkParams& aParams, |
|
212 CommandFunc aCmds[], |
|
213 uint32_t aLength, |
|
214 ErrorCallback aError) |
|
215 : mIndex(-1) |
|
216 , mParams(aParams) |
|
217 , mCommands(aCmds) |
|
218 , mLength(aLength) |
|
219 , mError(aError) { |
|
220 } |
|
221 |
|
222 NetworkParams& |
|
223 getParams() |
|
224 { |
|
225 return mParams; |
|
226 }; |
|
227 |
|
228 CommandFunc |
|
229 getNextCommand() |
|
230 { |
|
231 mIndex++; |
|
232 return mIndex < mLength ? mCommands[mIndex] : nullptr; |
|
233 }; |
|
234 |
|
235 ErrorCallback |
|
236 getErrorCallback() const |
|
237 { |
|
238 return mError; |
|
239 }; |
|
240 |
|
241 private: |
|
242 uint32_t mIndex; |
|
243 NetworkParams mParams; |
|
244 CommandFunc* mCommands; |
|
245 uint32_t mLength; |
|
246 ErrorCallback mError; |
|
247 }; |
|
248 |
|
249 class NetworkUtils MOZ_FINAL |
|
250 { |
|
251 public: |
|
252 NetworkUtils(MessageCallback aCallback); |
|
253 ~NetworkUtils(); |
|
254 |
|
255 void ExecuteCommand(NetworkParams aOptions); |
|
256 void onNetdMessage(mozilla::ipc::NetdCommand* aCommand); |
|
257 |
|
258 MessageCallback getMessageCallback() { return mMessageCallback; } |
|
259 |
|
260 private: |
|
261 /** |
|
262 * Commands supported by NetworkUtils. |
|
263 */ |
|
264 bool setDNS(NetworkParams& aOptions); |
|
265 bool setDefaultRouteAndDNS(NetworkParams& aOptions); |
|
266 bool addHostRoute(NetworkParams& aOptions); |
|
267 bool removeDefaultRoute(NetworkParams& aOptions); |
|
268 bool removeHostRoute(NetworkParams& aOptions); |
|
269 bool removeHostRoutes(NetworkParams& aOptions); |
|
270 bool removeNetworkRoute(NetworkParams& aOptions); |
|
271 bool addSecondaryRoute(NetworkParams& aOptions); |
|
272 bool removeSecondaryRoute(NetworkParams& aOptions); |
|
273 bool getNetworkInterfaceStats(NetworkParams& aOptions); |
|
274 bool setNetworkInterfaceAlarm(NetworkParams& aOptions); |
|
275 bool enableNetworkInterfaceAlarm(NetworkParams& aOptions); |
|
276 bool disableNetworkInterfaceAlarm(NetworkParams& aOptions); |
|
277 bool setWifiOperationMode(NetworkParams& aOptions); |
|
278 bool setDhcpServer(NetworkParams& aOptions); |
|
279 bool setWifiTethering(NetworkParams& aOptions); |
|
280 bool setUSBTethering(NetworkParams& aOptions); |
|
281 bool enableUsbRndis(NetworkParams& aOptions); |
|
282 bool updateUpStream(NetworkParams& aOptions); |
|
283 |
|
284 /** |
|
285 * function pointer array holds all netd commands should be executed |
|
286 * in sequence to accomplish a given command by other module. |
|
287 */ |
|
288 static CommandFunc sWifiEnableChain[]; |
|
289 static CommandFunc sWifiDisableChain[]; |
|
290 static CommandFunc sWifiFailChain[]; |
|
291 static CommandFunc sWifiOperationModeChain[]; |
|
292 static CommandFunc sUSBEnableChain[]; |
|
293 static CommandFunc sUSBDisableChain[]; |
|
294 static CommandFunc sUSBFailChain[]; |
|
295 static CommandFunc sUpdateUpStreamChain[]; |
|
296 static CommandFunc sStartDhcpServerChain[]; |
|
297 static CommandFunc sStopDhcpServerChain[]; |
|
298 static CommandFunc sNetworkInterfaceStatsChain[]; |
|
299 static CommandFunc sNetworkInterfaceEnableAlarmChain[]; |
|
300 static CommandFunc sNetworkInterfaceDisableAlarmChain[]; |
|
301 static CommandFunc sNetworkInterfaceSetAlarmChain[]; |
|
302 static CommandFunc sSetDnsChain[]; |
|
303 |
|
304 /** |
|
305 * Individual netd command stored in command chain. |
|
306 */ |
|
307 #define PARAMS CommandChain* aChain, CommandCallback aCallback, NetworkResultOptions& aResult |
|
308 static void wifiFirmwareReload(PARAMS); |
|
309 static void startAccessPointDriver(PARAMS); |
|
310 static void stopAccessPointDriver(PARAMS); |
|
311 static void setAccessPoint(PARAMS); |
|
312 static void cleanUpStream(PARAMS); |
|
313 static void createUpStream(PARAMS); |
|
314 static void startSoftAP(PARAMS); |
|
315 static void stopSoftAP(PARAMS); |
|
316 static void getRxBytes(PARAMS); |
|
317 static void getTxBytes(PARAMS); |
|
318 static void enableAlarm(PARAMS); |
|
319 static void disableAlarm(PARAMS); |
|
320 static void setQuota(PARAMS); |
|
321 static void removeQuota(PARAMS); |
|
322 static void setAlarm(PARAMS); |
|
323 static void setInterfaceUp(PARAMS); |
|
324 static void tetherInterface(PARAMS); |
|
325 static void preTetherInterfaceList(PARAMS); |
|
326 static void postTetherInterfaceList(PARAMS); |
|
327 static void setIpForwardingEnabled(PARAMS); |
|
328 static void tetheringStatus(PARAMS); |
|
329 static void stopTethering(PARAMS); |
|
330 static void startTethering(PARAMS); |
|
331 static void untetherInterface(PARAMS); |
|
332 static void setDnsForwarders(PARAMS); |
|
333 static void enableNat(PARAMS); |
|
334 static void disableNat(PARAMS); |
|
335 static void setDefaultInterface(PARAMS); |
|
336 static void setInterfaceDns(PARAMS); |
|
337 static void wifiTetheringSuccess(PARAMS); |
|
338 static void usbTetheringSuccess(PARAMS); |
|
339 static void networkInterfaceStatsSuccess(PARAMS); |
|
340 static void networkInterfaceAlarmSuccess(PARAMS); |
|
341 static void updateUpStreamSuccess(PARAMS); |
|
342 static void setDhcpServerSuccess(PARAMS); |
|
343 static void wifiOperationModeSuccess(PARAMS); |
|
344 #undef PARAMS |
|
345 |
|
346 /** |
|
347 * Error callback function executed when a command is fail. |
|
348 */ |
|
349 #define PARAMS NetworkParams& aOptions, NetworkResultOptions& aResult |
|
350 static void wifiTetheringFail(PARAMS); |
|
351 static void wifiOperationModeFail(PARAMS); |
|
352 static void usbTetheringFail(PARAMS); |
|
353 static void updateUpStreamFail(PARAMS); |
|
354 static void setDhcpServerFail(PARAMS); |
|
355 static void networkInterfaceStatsFail(PARAMS); |
|
356 static void networkInterfaceAlarmFail(PARAMS); |
|
357 static void setDnsFail(PARAMS); |
|
358 #undef PARAMS |
|
359 |
|
360 /** |
|
361 * Command chain processing functions. |
|
362 */ |
|
363 static void next(CommandChain* aChain, bool aError, NetworkResultOptions& aResult); |
|
364 static void nextNetdCommand(); |
|
365 static void doCommand(const char* aCommand, CommandChain* aChain, CommandCallback aCallback); |
|
366 |
|
367 /** |
|
368 * Notify broadcast message to main thread. |
|
369 */ |
|
370 void sendBroadcastMessage(uint32_t code, char* reason); |
|
371 |
|
372 /** |
|
373 * Utility functions. |
|
374 */ |
|
375 void checkUsbRndisState(NetworkParams& aOptions); |
|
376 void dumpParams(NetworkParams& aOptions, const char* aType); |
|
377 |
|
378 static void escapeQuote(nsCString& aString); |
|
379 inline uint32_t netdResponseType(uint32_t code); |
|
380 inline bool isBroadcastMessage(uint32_t code); |
|
381 inline bool isError(uint32_t code); |
|
382 inline bool isComplete(uint32_t code); |
|
383 inline bool isProceeding(uint32_t code); |
|
384 void Shutdown(); |
|
385 /** |
|
386 * Callback function to send netd result to main thread. |
|
387 */ |
|
388 MessageCallback mMessageCallback; |
|
389 |
|
390 /* |
|
391 * Utility class to access libnetutils. |
|
392 */ |
|
393 nsAutoPtr<NetUtils> mNetUtils; |
|
394 }; |
|
395 |
|
396 #endif |