diff options
Diffstat (limited to 'dom/system/gonk/NetworkUtils.h')
-rw-r--r-- | dom/system/gonk/NetworkUtils.h | 498 |
1 files changed, 498 insertions, 0 deletions
diff --git a/dom/system/gonk/NetworkUtils.h b/dom/system/gonk/NetworkUtils.h new file mode 100644 index 000000000..d1af35f09 --- /dev/null +++ b/dom/system/gonk/NetworkUtils.h @@ -0,0 +1,498 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef NetworkUtils_h +#define NetworkUtils_h + +#include "nsAutoPtr.h" +#include "nsString.h" +#include "mozilla/dom/NetworkOptionsBinding.h" +#include "mozilla/dom/network/NetUtils.h" +#include "mozilla/ipc/Netd.h" +#include "nsTArray.h" +#include "NetIdManager.h" + +class NetworkParams; +class CommandChain; + +class CommandCallback { +public: + typedef void (*CallbackType)(CommandChain*, bool, + mozilla::dom::NetworkResultOptions& aResult); + + typedef void (*CallbackWrapperType)(CallbackType aOriginalCallback, + CommandChain*, bool, + mozilla::dom::NetworkResultOptions& aResult); + + CommandCallback() + : mCallback(nullptr) + , mCallbackWrapper(nullptr) + { + } + + CommandCallback(CallbackType aCallback) + : mCallback(aCallback) + , mCallbackWrapper(nullptr) + { + } + + CommandCallback(CallbackWrapperType aCallbackWrapper, + CommandCallback aOriginalCallback) + : mCallback(aOriginalCallback.mCallback) + , mCallbackWrapper(aCallbackWrapper) + { + } + + void operator()(CommandChain* aChain, bool aError, + mozilla::dom::NetworkResultOptions& aResult) + { + if (mCallbackWrapper) { + return mCallbackWrapper(mCallback, aChain, aError, aResult); + } + if (mCallback) { + return mCallback(aChain, aError, aResult); + } + } + +private: + CallbackType mCallback; + CallbackWrapperType mCallbackWrapper; +}; + +typedef void (*CommandFunc)(CommandChain*, CommandCallback, + mozilla::dom::NetworkResultOptions& aResult); +typedef void (*MessageCallback)(mozilla::dom::NetworkResultOptions& aResult); +typedef void (*ErrorCallback)(NetworkParams& aOptions, + mozilla::dom::NetworkResultOptions& aResult); + +class NetworkParams +{ +public: + NetworkParams() { + } + + NetworkParams(const mozilla::dom::NetworkCommandOptions& aOther) { + +#define COPY_SEQUENCE_FIELD(prop, type) \ + if (aOther.prop.WasPassed()) { \ + mozilla::dom::Sequence<type > const & currentValue = aOther.prop.InternalValue(); \ + uint32_t length = currentValue.Length(); \ + for (uint32_t idx = 0; idx < length; idx++) { \ + prop.AppendElement(currentValue[idx]); \ + } \ + } + +#define COPY_OPT_STRING_FIELD(prop, defaultValue) \ + if (aOther.prop.WasPassed()) { \ + if (aOther.prop.Value().EqualsLiteral("null")) { \ + prop = defaultValue; \ + } else { \ + prop = aOther.prop.Value(); \ + } \ + } else { \ + prop = defaultValue; \ + } + +#define COPY_OPT_FIELD(prop, defaultValue) \ + if (aOther.prop.WasPassed()) { \ + prop = aOther.prop.Value(); \ + } else { \ + prop = defaultValue; \ + } + +#define COPY_FIELD(prop) prop = aOther.prop; + + COPY_FIELD(mId) + COPY_FIELD(mCmd) + COPY_OPT_STRING_FIELD(mDomain, EmptyString()) + COPY_OPT_STRING_FIELD(mGateway, EmptyString()) + COPY_SEQUENCE_FIELD(mGateways, nsString) + COPY_OPT_STRING_FIELD(mIfname, EmptyString()) + COPY_OPT_STRING_FIELD(mIp, EmptyString()) + COPY_OPT_FIELD(mPrefixLength, 0) + COPY_OPT_STRING_FIELD(mMode, EmptyString()) + COPY_OPT_FIELD(mReport, false) + COPY_OPT_FIELD(mEnabled, false) + COPY_OPT_STRING_FIELD(mWifictrlinterfacename, EmptyString()) + COPY_OPT_STRING_FIELD(mInternalIfname, EmptyString()) + COPY_OPT_STRING_FIELD(mExternalIfname, EmptyString()) + COPY_OPT_FIELD(mEnable, false) + COPY_OPT_STRING_FIELD(mSsid, EmptyString()) + COPY_OPT_STRING_FIELD(mSecurity, EmptyString()) + COPY_OPT_STRING_FIELD(mKey, EmptyString()) + COPY_OPT_STRING_FIELD(mPrefix, EmptyString()) + COPY_OPT_STRING_FIELD(mLink, EmptyString()) + COPY_SEQUENCE_FIELD(mInterfaceList, nsString) + COPY_OPT_STRING_FIELD(mWifiStartIp, EmptyString()) + COPY_OPT_STRING_FIELD(mWifiEndIp, EmptyString()) + COPY_OPT_STRING_FIELD(mUsbStartIp, EmptyString()) + COPY_OPT_STRING_FIELD(mUsbEndIp, EmptyString()) + COPY_OPT_STRING_FIELD(mDns1, EmptyString()) + COPY_OPT_STRING_FIELD(mDns2, EmptyString()) + COPY_SEQUENCE_FIELD(mDnses, nsString) + COPY_OPT_STRING_FIELD(mStartIp, EmptyString()) + COPY_OPT_STRING_FIELD(mEndIp, EmptyString()) + COPY_OPT_STRING_FIELD(mServerIp, EmptyString()) + COPY_OPT_STRING_FIELD(mMaskLength, EmptyString()) + COPY_OPT_STRING_FIELD(mPreInternalIfname, EmptyString()) + COPY_OPT_STRING_FIELD(mPreExternalIfname, EmptyString()) + COPY_OPT_STRING_FIELD(mCurInternalIfname, EmptyString()) + COPY_OPT_STRING_FIELD(mCurExternalIfname, EmptyString()) + COPY_OPT_FIELD(mThreshold, -1) + COPY_OPT_FIELD(mIpaddr, 0) + COPY_OPT_FIELD(mMask, 0) + COPY_OPT_FIELD(mGateway_long, 0) + COPY_OPT_FIELD(mDns1_long, 0) + COPY_OPT_FIELD(mDns2_long, 0) + COPY_OPT_FIELD(mMtu, 0) + + mLoopIndex = 0; + +#undef COPY_SEQUENCE_FIELD +#undef COPY_OPT_STRING_FIELD +#undef COPY_OPT_FIELD +#undef COPY_FIELD + } + + // Followings attributes are 1-to-1 mapping to NetworkCommandOptions. + int32_t mId; + nsString mCmd; + nsString mDomain; + nsString mGateway; + nsTArray<nsString> mGateways; + nsString mIfname; + nsString mIp; + uint32_t mPrefixLength; + nsString mMode; + bool mReport; + bool mEnabled; + nsString mWifictrlinterfacename; + nsString mInternalIfname; + nsString mExternalIfname; + bool mEnable; + nsString mSsid; + nsString mSecurity; + nsString mKey; + nsString mPrefix; + nsString mLink; + nsTArray<nsString> mInterfaceList; + nsString mWifiStartIp; + nsString mWifiEndIp; + nsString mUsbStartIp; + nsString mUsbEndIp; + nsString mDns1; + nsString mDns2; + nsTArray<nsString> mDnses; + nsString mStartIp; + nsString mEndIp; + nsString mServerIp; + nsString mMaskLength; + nsString mPreInternalIfname; + nsString mPreExternalIfname; + nsString mCurInternalIfname; + nsString mCurExternalIfname; + long long mThreshold; + long mIpaddr; + long mMask; + long mGateway_long; + long mDns1_long; + long mDns2_long; + long mMtu; + + // Auxiliary information required to carry accros command chain. + int mNetId; // A locally defined id per interface. + uint32_t mLoopIndex; // Loop index for adding/removing multiple gateways. +}; + +// CommandChain store the necessary information to execute command one by one. +// Including : +// 1. Command parameters. +// 2. Command list. +// 3. Error callback function. +// 4. Index of current execution command. +class CommandChain final +{ +public: + CommandChain(const NetworkParams& aParams, + const CommandFunc aCmds[], + uint32_t aLength, + ErrorCallback aError) + : mIndex(-1) + , mParams(aParams) + , mCommands(aCmds) + , mLength(aLength) + , mError(aError) { + } + + NetworkParams& + getParams() + { + return mParams; + }; + + CommandFunc + getNextCommand() + { + mIndex++; + return mIndex < mLength ? mCommands[mIndex] : nullptr; + }; + + ErrorCallback + getErrorCallback() const + { + return mError; + }; + +private: + uint32_t mIndex; + NetworkParams mParams; + const CommandFunc* mCommands; + uint32_t mLength; + ErrorCallback mError; +}; + +// A helper class to easily construct a resolved +// or a pending result for command execution. +class CommandResult +{ +public: + struct Pending {}; + +public: + CommandResult(int32_t aResultCode); + CommandResult(const mozilla::dom::NetworkResultOptions& aResult); + CommandResult(const Pending&); + bool isPending() const; + + mozilla::dom::NetworkResultOptions mResult; + +private: + bool mIsPending; +}; + +class NetworkUtils final +{ +public: + NetworkUtils(MessageCallback aCallback); + ~NetworkUtils(); + + void ExecuteCommand(NetworkParams aOptions); + void onNetdMessage(mozilla::ipc::NetdCommand* aCommand); + + MessageCallback getMessageCallback() { return mMessageCallback; } + +private: + /** + * Commands supported by NetworkUtils. + */ + CommandResult configureInterface(NetworkParams& aOptions); + CommandResult dhcpRequest(NetworkParams& aOptions); + CommandResult stopDhcp(NetworkParams& aOptions); + CommandResult enableInterface(NetworkParams& aOptions); + CommandResult disableInterface(NetworkParams& aOptions); + CommandResult resetConnections(NetworkParams& aOptions); + CommandResult setDefaultRoute(NetworkParams& aOptions); + CommandResult addHostRoute(NetworkParams& aOptions); + CommandResult removeDefaultRoute(NetworkParams& aOptions); + CommandResult removeHostRoute(NetworkParams& aOptions); + CommandResult removeNetworkRoute(NetworkParams& aOptions); + CommandResult setDNS(NetworkParams& aOptions); + CommandResult addSecondaryRoute(NetworkParams& aOptions); + CommandResult removeSecondaryRoute(NetworkParams& aOptions); + CommandResult setNetworkInterfaceAlarm(NetworkParams& aOptions); + CommandResult enableNetworkInterfaceAlarm(NetworkParams& aOptions); + CommandResult disableNetworkInterfaceAlarm(NetworkParams& aOptions); + CommandResult setTetheringAlarm(NetworkParams& aOptions); + CommandResult removeTetheringAlarm(NetworkParams& aOptions); + CommandResult getTetheringStatus(NetworkParams& aOptions); + CommandResult setWifiOperationMode(NetworkParams& aOptions); + CommandResult setDhcpServer(NetworkParams& aOptions); + CommandResult setWifiTethering(NetworkParams& aOptions); + CommandResult setUSBTethering(NetworkParams& aOptions); + CommandResult enableUsbRndis(NetworkParams& aOptions); + CommandResult updateUpStream(NetworkParams& aOptions); + CommandResult createNetwork(NetworkParams& aOptions); + CommandResult destroyNetwork(NetworkParams& aOptions); + CommandResult getNetId(NetworkParams& aOptions); + CommandResult setMtu(NetworkParams& aOptions); + CommandResult getInterfaces(NetworkParams& aOptions); + CommandResult getInterfaceConfig(NetworkParams& aOptions); + CommandResult setInterfaceConfig(NetworkParams& aOptions); + + CommandResult addHostRouteLegacy(NetworkParams& aOptions); + CommandResult removeHostRouteLegacy(NetworkParams& aOptions); + CommandResult setDefaultRouteLegacy(NetworkParams& aOptions); + CommandResult removeDefaultRouteLegacy(NetworkParams& aOptions); + CommandResult removeNetworkRouteLegacy(NetworkParams& aOptions); + + + /** + * function pointer array holds all netd commands should be executed + * in sequence to accomplish a given command by other module. + */ + static const CommandFunc sWifiEnableChain[]; + static const CommandFunc sWifiDisableChain[]; + static const CommandFunc sWifiFailChain[]; + static const CommandFunc sWifiRetryChain[]; + static const CommandFunc sWifiOperationModeChain[]; + static const CommandFunc sUSBEnableChain[]; + static const CommandFunc sUSBDisableChain[]; + static const CommandFunc sUSBFailChain[]; + static const CommandFunc sUpdateUpStreamChain[]; + static const CommandFunc sStartDhcpServerChain[]; + static const CommandFunc sStopDhcpServerChain[]; + static const CommandFunc sNetworkInterfaceEnableAlarmChain[]; + static const CommandFunc sNetworkInterfaceDisableAlarmChain[]; + static const CommandFunc sNetworkInterfaceSetAlarmChain[]; + static const CommandFunc sTetheringInterfaceSetAlarmChain[]; + static const CommandFunc sTetheringInterfaceRemoveAlarmChain[]; + static const CommandFunc sTetheringGetStatusChain[]; + static const CommandFunc sGetInterfacesChain[]; + static const CommandFunc sGetInterfaceConfigChain[]; + static const CommandFunc sSetInterfaceConfigChain[]; + + /** + * Individual netd command stored in command chain. + */ +#define PARAMS CommandChain* aChain, CommandCallback aCallback, \ + mozilla::dom::NetworkResultOptions& aResult + static void wifiFirmwareReload(PARAMS); + static void startAccessPointDriver(PARAMS); + static void stopAccessPointDriver(PARAMS); + static void setAccessPoint(PARAMS); + static void cleanUpStream(PARAMS); + static void createUpStream(PARAMS); + static void startSoftAP(PARAMS); + static void stopSoftAP(PARAMS); + static void clearWifiTetherParms(PARAMS); + static void enableAlarm(PARAMS); + static void disableAlarm(PARAMS); + static void setQuota(PARAMS); + static void removeQuota(PARAMS); + static void setAlarm(PARAMS); + static void removeAlarm(PARAMS); + static void setGlobalAlarm(PARAMS); + static void removeGlobalAlarm(PARAMS); + static void tetherInterface(PARAMS); + static void addInterfaceToLocalNetwork(PARAMS); + static void addRouteToLocalNetwork(PARAMS); + static void preTetherInterfaceList(PARAMS); + static void postTetherInterfaceList(PARAMS); + static void addUpstreamInterface(PARAMS); + static void removeUpstreamInterface(PARAMS); + static void setIpForwardingEnabled(PARAMS); + static void tetheringStatus(PARAMS); + static void stopTethering(PARAMS); + static void startTethering(PARAMS); + static void untetherInterface(PARAMS); + static void removeInterfaceFromLocalNetwork(PARAMS); + static void setDnsForwarders(PARAMS); + static void enableNat(PARAMS); + static void disableNat(PARAMS); + static void setDefaultInterface(PARAMS); + static void setInterfaceDns(PARAMS); + static void getInterfaceList(PARAMS); + static void getConfig(PARAMS); + static void setConfig(PARAMS); + static void wifiTetheringSuccess(PARAMS); + static void usbTetheringSuccess(PARAMS); + static void networkInterfaceAlarmSuccess(PARAMS); + static void updateUpStreamSuccess(PARAMS); + static void setDhcpServerSuccess(PARAMS); + static void wifiOperationModeSuccess(PARAMS); + static void clearAddrForInterface(PARAMS); + static void createNetwork(PARAMS); + static void destroyNetwork(PARAMS); + static void addInterfaceToNetwork(PARAMS); + static void addDefaultRouteToNetwork(PARAMS); + static void setDefaultNetwork(PARAMS); + static void removeDefaultRoute(PARAMS); + static void removeNetworkRouteSuccess(PARAMS); + static void removeNetworkRoute(PARAMS); + static void addRouteToInterface(PARAMS); + static void removeRouteFromInterface(PARAMS); + static void modifyRouteOnInterface(PARAMS, bool aDoAdd); + static void enableIpv6(PARAMS); + static void disableIpv6(PARAMS); + static void setMtu(PARAMS); + static void setIpv6Enabled(PARAMS, bool aEnabled); + static void addRouteToSecondaryTable(PARAMS); + static void removeRouteFromSecondaryTable(PARAMS); + static void defaultAsyncSuccessHandler(PARAMS); + static void getInterfacesSuccess(PARAMS); + static void getInterfaceConfigSuccess(PARAMS); + static void setInterfaceConfigSuccess(PARAMS); + +#undef PARAMS + + /** + * Error callback function executed when a command is fail. + */ +#define PARAMS NetworkParams& aOptions, \ + mozilla::dom::NetworkResultOptions& aResult + static void wifiTetheringFail(PARAMS); + static void wifiOperationModeFail(PARAMS); + static void usbTetheringFail(PARAMS); + static void updateUpStreamFail(PARAMS); + static void setDhcpServerFail(PARAMS); + static void networkInterfaceAlarmFail(PARAMS); + static void setDnsFail(PARAMS); + static void defaultAsyncFailureHandler(PARAMS); + static void getInterfacesFail(PARAMS); + static void getInterfaceConfigFail(PARAMS); + static void setInterfaceConfigFail(PARAMS); + +#undef PARAMS + + /** + * Command chain processing functions. + */ + static void next(CommandChain* aChain, bool aError, + mozilla::dom::NetworkResultOptions& aResult); + static void nextNetdCommand(); + static void doCommand(const char* aCommand, CommandChain* aChain, CommandCallback aCallback); + + /** + * Notify broadcast message to main thread. + */ + void sendBroadcastMessage(uint32_t code, char* reason); + + /** + * Utility functions. + */ + CommandResult checkUsbRndisState(NetworkParams& aOptions); + void dumpParams(NetworkParams& aOptions, const char* aType); + + static void escapeQuote(nsCString& aString); + inline uint32_t netdResponseType(uint32_t code); + inline bool isBroadcastMessage(uint32_t code); + inline bool isError(uint32_t code); + inline bool isComplete(uint32_t code); + inline bool isProceeding(uint32_t code); + void Shutdown(); + static void runNextQueuedCommandChain(); + static void finalizeSuccess(CommandChain* aChain, + mozilla::dom::NetworkResultOptions& aResult); + + template<size_t N> + static void runChain(const NetworkParams& aParams, + const CommandFunc (&aCmds)[N], + ErrorCallback aError); + + static nsCString getSubnetIp(const nsCString& aIp, int aPrefixLength); + + /** + * Callback function to send netd result to main thread. + */ + MessageCallback mMessageCallback; + + /* + * Utility class to access libnetutils. + */ + nsAutoPtr<NetUtils> mNetUtils; + + NetIdManager mNetIdManager; +}; + +#endif |