author | Ryan VanderMeulen <ryanvm@gmail.com> |
Wed, 03 Sep 2014 11:30:32 -0400 | |
changeset 203376 | e934b3bc1feafc77fafcdd08da9c6a163ba20f5b |
parent 203375 | 927da4815ef94ee899995fd92387120e197db31e |
child 203377 | 3390001fd2a6f14e62b488a12d2b275c72d816f2 |
push id | 48665 |
push user | ryanvm@gmail.com |
push date | Wed, 03 Sep 2014 20:40:15 +0000 |
treeherder | mozilla-inbound@0da762e6868a [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
bugs | 1038531 |
milestone | 35.0a1 |
backs out | 59611423c368154340dc87981f4e9c92a9a2bb73 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/system/gonk/NetworkManager.js +++ b/dom/system/gonk/NetworkManager.js @@ -587,28 +587,28 @@ NetworkManager.prototype = { let oldActive = this.active; if (this._overriddenActive) { debug("We have an override for the active network: " + this._overriddenActive.name); // The override was just set, so reconfigure the network. if (this.active != this._overriddenActive) { this.active = this._overriddenActive; - this._setDefaultRouteAndDNS(this.active, oldActive); + gNetworkService.setDefaultRouteAndDNS(this.active, oldActive); Services.obs.notifyObservers(this.active, TOPIC_ACTIVE_CHANGED, null); } return; } // The active network is already our preferred type. if (this.active && this.active.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED && this.active.type == this._preferredNetworkType) { debug("Active network is already our preferred type."); - this._setDefaultRouteAndDNS(this.active, oldActive); + gNetworkService.setDefaultRouteAndDNS(this.active, oldActive); return; } // Find a suitable network interface to activate. this.active = null; #ifdef MOZ_B2G_RIL let defaultDataNetwork; #endif @@ -637,17 +637,17 @@ NetworkManager.prototype = { this.active.type != this.preferredNetworkType) { this.active = defaultDataNetwork; } // Don't set default route on secondary APN if (this.isNetworkTypeSecondaryMobile(this.active.type)) { gNetworkService.setDNS(this.active); } else { #endif // MOZ_B2G_RIL - this._setDefaultRouteAndDNS(this.active, oldActive); + gNetworkService.setDefaultRouteAndDNS(this.active, oldActive); #ifdef MOZ_B2G_RIL } #endif } if (this.active != oldActive) { Services.obs.notifyObservers(this.active, TOPIC_ACTIVE_CHANGED, null); } @@ -1244,25 +1244,17 @@ NetworkManager.prototype = { if (this._usbTetheringAction === TETHERING_STATE_ONGOING) { debug("Postpone the event and handle it when state is idle."); this.wantConnectionEvent = callback; return; } this.wantConnectionEvent = null; callback.call(this); - }, - - _setDefaultRouteAndDNS: function(network, oldInterface) { - gNetworkService.setDefaultRoute(network, oldInterface, function(success) { - gNetworkService.setDNS(network, function(result) { - gNetworkService.setNetworkProxy(network); - }); - }); - }, + } }; let CaptivePortalDetectionHelper = (function() { const EVENT_CONNECT = "Connect"; const EVENT_DISCONNECT = "Disconnect"; let _ongoingInterface = null; let _available = ("nsICaptivePortalDetector" in Ci);
--- a/dom/system/gonk/NetworkService.js +++ b/dom/system/gonk/NetworkService.js @@ -183,16 +183,17 @@ NetworkService.prototype = { let params = { cmd: "setNetworkInterfaceAlarm", ifname: networkName, threshold: threshold }; params.report = true; + params.isAsync = true; this.controlMessage(params, function(result) { if (!isError(result.resultCode)) { callback.networkUsageAlarmResult(null); return; } this._enableNetworkInterfaceAlarm(networkName, threshold, callback); @@ -204,16 +205,17 @@ NetworkService.prototype = { let params = { cmd: "enableNetworkInterfaceAlarm", ifname: networkName, threshold: threshold }; params.report = true; + params.isAsync = true; this.controlMessage(params, function(result) { if (!isError(result.resultCode)) { callback.networkUsageAlarmResult(null); return; } callback.networkUsageAlarmResult(result.reason); }); @@ -223,32 +225,34 @@ NetworkService.prototype = { if(DEBUG) debug("disableNetworkInterfaceAlarm for " + networkName); let params = { cmd: "disableNetworkInterfaceAlarm", ifname: networkName, }; params.report = true; + params.isAsync = true; this.controlMessage(params, function(result) { callback(result); }); }, setWifiOperationMode: function(interfaceName, mode, callback) { if(DEBUG) debug("setWifiOperationMode on " + interfaceName + " to " + mode); let params = { cmd: "setWifiOperationMode", ifname: interfaceName, mode: mode }; params.report = true; + params.isAsync = true; this.controlMessage(params, function(result) { if (isError(result.resultCode)) { callback.wifiOperationModeResult("netd command error"); } else { callback.wifiOperationModeResult(null); } }); @@ -268,42 +272,42 @@ NetworkService.prototype = { ifname: network.name, ip: ip, prefixLength: prefixLength }; this.controlMessage(options); } }, - setDNS: function(networkInterface, callback) { - if (DEBUG) debug("Going DNS to " + networkInterface.name); + setDNS: function(networkInterface) { + if(DEBUG) debug("Going DNS to " + networkInterface.name); let dnses = networkInterface.getDnses(); let options = { cmd: "setDNS", ifname: networkInterface.name, domain: "mozilla." + networkInterface.name + ".doman", dnses: dnses }; - this.controlMessage(options, function(result) { - callback.setDnsResult(result.success ? null : result.reason); - }); + this.controlMessage(options); }, - setDefaultRoute: function(network, oldInterface, callback) { - if (DEBUG) debug("Going to change default route to " + network.name); + setDefaultRouteAndDNS: function(network, oldInterface) { + if(DEBUG) debug("Going to change route and DNS to " + network.name); let gateways = network.getGateways(); + let dnses = network.getDnses(); let options = { - cmd: "setDefaultRoute", + cmd: "setDefaultRouteAndDNS", ifname: network.name, oldIfname: (oldInterface && oldInterface !== network) ? oldInterface.name : null, - gateways: gateways + gateways: gateways, + domain: "mozilla." + network.name + ".doman", + dnses: dnses }; - this.controlMessage(options, function(result) { - callback.nativeCommandResult(!result.error); - }); + this.controlMessage(options); + this.setNetworkProxy(network); }, removeDefaultRoute: function(network) { if(DEBUG) debug("Remove default route for " + network.name); let gateways = network.getGateways(); let options = { cmd: "removeDefaultRoute", ifname: network.name, @@ -406,16 +410,17 @@ NetworkService.prototype = { // Enable/Disable DHCP server. setDhcpServer: function(enabled, config, callback) { if (null === config) { config = {}; } config.cmd = "setDhcpServer"; + config.isAsync = true; config.enabled = enabled; this.controlMessage(config, function setDhcpServerResult(response) { if (!response.success) { callback.dhcpServerResult('Set DHCP server error'); return; } callback.dhcpServerResult(null); @@ -427,16 +432,17 @@ NetworkService.prototype = { // config should've already contained: // .ifname // .internalIfname // .externalIfname config.wifictrlinterfacename = WIFI_CTRL_INTERFACE; config.cmd = "setWifiTethering"; // The callback function in controlMessage may not be fired immediately. + config.isAsync = true; this.controlMessage(config, function setWifiTetheringResult(data) { let code = data.resultCode; let reason = data.resultReason; let enable = data.enable; let enableString = enable ? "Enable" : "Disable"; if(DEBUG) debug(enableString + " Wifi tethering result: Code " + code + " reason " + reason); @@ -447,16 +453,17 @@ NetworkService.prototype = { } }); }, // Enable/disable USB tethering by sending commands to netd. setUSBTethering: function(enable, config, callback) { config.cmd = "setUSBTethering"; // The callback function in controlMessage may not be fired immediately. + config.isAsync = true; this.controlMessage(config, function setUsbTetheringResult(data) { let code = data.resultCode; let reason = data.resultReason; let enable = data.enable; let enableString = enable ? "Enable" : "Disable"; if(DEBUG) debug(enableString + " USB tethering result: Code " + code + " reason " + reason); @@ -479,99 +486,41 @@ NetworkService.prototype = { // Ask net work to report the result when this value is set to true. if (callback) { params.report = true; } else { params.report = false; } // The callback function in controlMessage may not be fired immediately. + params.isAsync = true; //this._usbTetheringAction = TETHERING_STATE_ONGOING; this.controlMessage(params, function(data) { callback.enableUsbRndisResult(data.result, data.enable); }); }, updateUpStream: function(previous, current, callback) { let params = { cmd: "updateUpStream", + isAsync: true, preInternalIfname: previous.internalIfname, preExternalIfname: previous.externalIfname, curInternalIfname: current.internalIfname, curExternalIfname: current.externalIfname }; this.controlMessage(params, function(data) { let code = data.resultCode; let reason = data.resultReason; if(DEBUG) debug("updateUpStream result: Code " + code + " reason " + reason); callback.updateUpStreamResult(!isError(code), data.curExternalIfname); }); }, - configureInterface: function(config, callback) { - let params = { - cmd: "configureInterface", - ifname: config.ifname, - ipaddr: config.ipaddr, - mask: config.mask, - gateway_long: config.gateway, - dns1_long: config.dns1, - dns2_long: config.dns2, - }; - - this.controlMessage(params, function(result) { - callback.nativeCommandResult(!result.error); - }); - }, - - dhcpRequest: function(interfaceName, callback) { - let params = { - cmd: "dhcpRequest", - ifname: interfaceName - }; - - this.controlMessage(params, function(result) { - callback.dhcpRequestResult(!result.error, result.error ? null : result); - }); - }, - - enableInterface: function(interfaceName, callback) { - let params = { - cmd: "enableInterface", - ifname: interfaceName - }; - - this.controlMessage(params, function(result) { - callback.nativeCommandResult(!result.error); - }); - }, - - disableInterface: function(interfaceName, callback) { - let params = { - cmd: "disableInterface", - ifname: interfaceName - }; - - this.controlMessage(params, function(result) { - callback.nativeCommandResult(!result.error); - }); - }, - - resetConnections: function(interfaceName, callback) { - let params = { - cmd: "resetConnections", - ifname: interfaceName - }; - - this.controlMessage(params, function(result) { - callback.nativeCommandResult(!result.error); - }); - }, - shutdown: false, observe: function observe(aSubject, aTopic, aData) { switch (aTopic) { case "xpcom-shutdown": debug("NetworkService shutdown"); this.shutdown = true; Services.obs.removeObserver(this, "xpcom-shutdown");
--- a/dom/system/gonk/NetworkUtils.cpp +++ b/dom/system/gonk/NetworkUtils.cpp @@ -96,24 +96,17 @@ struct CurrentCommand { typedef Tuple3<NetdCommand*, CommandChain*, CommandCallback> QueueData; #define GET_CURRENT_NETD_COMMAND (gCommandQueue.IsEmpty() ? nullptr : gCommandQueue[0].a) #define GET_CURRENT_CHAIN (gCommandQueue.IsEmpty() ? nullptr : gCommandQueue[0].b) #define GET_CURRENT_CALLBACK (gCommandQueue.IsEmpty() ? nullptr : gCommandQueue[0].c) #define GET_CURRENT_COMMAND (gCommandQueue.IsEmpty() ? nullptr : gCommandQueue[0].a->mData) -// A macro for native function call return value check. -// For native function call, non-zero return value means failure. -#define RETURN_IF_FAILED(rv) do { \ - if (SUCCESS != rv) { \ - return rv; \ - } \ -} while (0); - +#define CNT_OF_ARRAY(a) (sizeof(a) / sizeof(a[0])) static NetworkUtils* gNetworkUtils; static nsTArray<QueueData> gCommandQueue; static CurrentCommand gCurrentCommand; static bool gPending = false; static nsTArray<nsCString> gReason; static NetworkParams *gWifiTetheringParms = 0; @@ -395,50 +388,16 @@ void NetworkUtils::next(CommandChain* aC if (!f) { delete aChain; return; } (*f)(aChain, next, aResult); } -CommandResult::CommandResult(int32_t aResultCode) - : mIsPending(false) -{ - // This is usually not a netd command. We treat the return code - // typical linux convention, which uses 0 to indicate success. - mResult.mError = (aResultCode == SUCCESS ? false : true); - mResult.mResultCode = aResultCode; - if (aResultCode != SUCCESS) { - // The returned value is sometimes negative, make sure we pass a positive - // error number to strerror. - enum { STRERROR_R_BUF_SIZE = 1024, }; - char strerrorBuf[STRERROR_R_BUF_SIZE]; - strerror_r(abs(aResultCode), strerrorBuf, STRERROR_R_BUF_SIZE); - mResult.mReason = NS_ConvertUTF8toUTF16(strerrorBuf); - } - mResult.mRet = true; -} - -CommandResult::CommandResult(const mozilla::dom::NetworkResultOptions& aResult) - : mResult(aResult) - , mIsPending(false) -{ -} - -CommandResult::CommandResult(const Pending&) - : mIsPending(true) -{ -} - -bool CommandResult::isPending() const -{ - return mIsPending; -} - /** * Send command to netd. */ void NetworkUtils::nextNetdCommand() { if (gCommandQueue.IsEmpty() || gPending) { return; } @@ -1066,89 +1025,85 @@ NetworkUtils::NetworkUtils(MessageCallba NetworkUtils::~NetworkUtils() { } #define GET_CHAR(prop) NS_ConvertUTF16toUTF8(aOptions.prop).get() #define GET_FIELD(prop) aOptions.prop -// Hoist this type definition to global to avoid template -// instantiation error on gcc 4.4 used by ICS emulator. -typedef CommandResult (NetworkUtils::*CommandHandler)(NetworkParams&); -struct CommandHandlerEntry -{ - const char* mCommandName; - CommandHandler mCommandHandler; -}; - void NetworkUtils::ExecuteCommand(NetworkParams aOptions) { - const static CommandHandlerEntry - COMMAND_HANDLER_TABLE[] = { + typedef int32_t (NetworkUtils::*CommandHandler)(NetworkParams&); + + const static struct { + const char* mCommandName; + CommandHandler mCommandHandler; + } COMMAND_HANDLER_TABLE[] = { // For command 'testCommand', BUILD_ENTRY(testCommand) will generate // {"testCommand", NetworkUtils::testCommand} #define BUILD_ENTRY(c) {#c, &NetworkUtils::c} BUILD_ENTRY(removeNetworkRoute), BUILD_ENTRY(setDNS), - BUILD_ENTRY(setDefaultRoute), + BUILD_ENTRY(setDefaultRouteAndDNS), BUILD_ENTRY(removeDefaultRoute), BUILD_ENTRY(addHostRoute), BUILD_ENTRY(removeHostRoute), BUILD_ENTRY(removeHostRoutes), BUILD_ENTRY(addSecondaryRoute), BUILD_ENTRY(removeSecondaryRoute), BUILD_ENTRY(setNetworkInterfaceAlarm), BUILD_ENTRY(enableNetworkInterfaceAlarm), BUILD_ENTRY(disableNetworkInterfaceAlarm), BUILD_ENTRY(setWifiOperationMode), BUILD_ENTRY(setDhcpServer), BUILD_ENTRY(setWifiTethering), BUILD_ENTRY(setUSBTethering), BUILD_ENTRY(enableUsbRndis), BUILD_ENTRY(updateUpStream), - BUILD_ENTRY(configureInterface), - BUILD_ENTRY(dhcpRequest), - BUILD_ENTRY(enableInterface), - BUILD_ENTRY(disableInterface), - BUILD_ENTRY(resetConnections), #undef BUILD_ENTRY }; // Loop until we find the command name which matches aOptions.mCmd. CommandHandler handler = nullptr; - for (size_t i = 0; i < mozilla::ArrayLength(COMMAND_HANDLER_TABLE); i++) { + for (size_t i = 0; i < CNT_OF_ARRAY(COMMAND_HANDLER_TABLE); i++) { if (aOptions.mCmd.EqualsASCII(COMMAND_HANDLER_TABLE[i].mCommandName)) { handler = COMMAND_HANDLER_TABLE[i].mCommandHandler; break; } } if (!handler) { // Command not found in COMMAND_HANDLER_TABLE. WARN("unknown message: %s", NS_ConvertUTF16toUTF8(aOptions.mCmd).get()); return; } - // The handler would return one of the following 3 values - // to be wrapped to CommandResult: - // - // 1) |int32_t| for mostly synchronous native function calls. - // 2) |NetworkResultOptions| to populate additional results. (e.g. dhcpRequest) - // 3) |CommandResult::Pending| to indicate the result is not - // obtained yet. - // - // If the handler returns "Pending", the handler should take the - // responsibility for posting result to main thread. - CommandResult commandResult = (this->*handler)(aOptions); - if (!commandResult.isPending()) { - postMessage(aOptions, commandResult.mResult); + // Command matches! Dispatch to the handler. + int32_t ret = 0; + ret = (this->*handler)(aOptions); + + if (!aOptions.mIsAsync) { + // The requested command is synchronous, which implies the actual result + // from netd is not important to the client. So, just notify the + // registered callback. + NetworkResultOptions result; + result.mError = ret == SUCCESS ? false : true; + result.mResultCode = ret; + if (ret != SUCCESS) { + // The returned value is sometimes negative, make sure we pass a positive + // error number to strerror. + result.mReason = NS_ConvertUTF8toUTF16(strerror(abs(ret))); + } + + result.mRet = true; + postMessage(aOptions, result); } } /** * Handle received data from netd. */ void NetworkUtils::onNetdMessage(NetdCommand* aCommand) { @@ -1223,36 +1178,36 @@ void NetworkUtils::onNetdMessage(NetdCom if (isComplete(code)) { nextNetdCommand(); } } /** * Start/Stop DHCP server. */ -CommandResult NetworkUtils::setDhcpServer(NetworkParams& aOptions) +int32_t NetworkUtils::setDhcpServer(NetworkParams& aOptions) { if (aOptions.mEnabled) { aOptions.mWifiStartIp = aOptions.mStartIp; aOptions.mWifiEndIp = aOptions.mEndIp; aOptions.mIp = aOptions.mServerIp; aOptions.mPrefix = aOptions.mMaskLength; aOptions.mLink = NS_ConvertUTF8toUTF16("up"); RUN_CHAIN(aOptions, sStartDhcpServerChain, setDhcpServerFail) } else { RUN_CHAIN(aOptions, sStopDhcpServerChain, setDhcpServerFail) } - return CommandResult::Pending(); + return SUCCESS; } /** * Set DNS servers for given network interface. */ -CommandResult NetworkUtils::setDNS(NetworkParams& aOptions) +int32_t NetworkUtils::setDNS(NetworkParams& aOptions) { uint32_t length = aOptions.mDnses.Length(); if (length > 0) { for (uint32_t i = 0; i < length; i++) { NS_ConvertUTF16toUTF8 autoDns(aOptions.mDnses[i]); char dns_prop_key[PROPERTY_VALUE_MAX]; @@ -1274,193 +1229,101 @@ CommandResult NetworkUtils::setDNS(Netwo char num[PROPERTY_VALUE_MAX]; snprintf(num, PROPERTY_VALUE_MAX - 1, "%d", atoi(dnschange) + 1); property_set("net.dnschange", num); // DNS needs to be set through netd since JellyBean (4.3). if (SDK_VERSION >= 18) { RUN_CHAIN(aOptions, sSetDnsChain, setDnsFail) - return CommandResult::Pending(); } return SUCCESS; } -CommandResult NetworkUtils::configureInterface(NetworkParams& aOptions) -{ - NS_ConvertUTF16toUTF8 autoIfname(aOptions.mIfname); - return mNetUtils->do_ifc_configure( - autoIfname.get(), - aOptions.mIpaddr, - aOptions.mMask, - aOptions.mGateway_long, - aOptions.mDns1_long, - aOptions.mDns2_long - ); -} - -CommandResult NetworkUtils::dhcpRequest(NetworkParams& aOptions) { - mozilla::dom::NetworkResultOptions result; - - NS_ConvertUTF16toUTF8 autoIfname(aOptions.mIfname); - char ipaddr[PROPERTY_VALUE_MAX]; - char gateway[PROPERTY_VALUE_MAX]; - uint32_t prefixLength; - char dns1[PROPERTY_VALUE_MAX]; - char dns2[PROPERTY_VALUE_MAX]; - char server[PROPERTY_VALUE_MAX]; - uint32_t lease; - char vendorinfo[PROPERTY_VALUE_MAX]; - int32_t ret = mNetUtils->do_dhcp_do_request(autoIfname.get(), - ipaddr, - gateway, - &prefixLength, - dns1, - dns2, - server, - &lease, - vendorinfo); - - RETURN_IF_FAILED(ret); - - result.mIpaddr_str = NS_ConvertUTF8toUTF16(ipaddr); - result.mGateway_str = NS_ConvertUTF8toUTF16(gateway); - result.mDns1_str = NS_ConvertUTF8toUTF16(dns1); - result.mDns2_str = NS_ConvertUTF8toUTF16(dns2); - result.mServer_str = NS_ConvertUTF8toUTF16(server); - result.mVendor_str = NS_ConvertUTF8toUTF16(vendorinfo); - result.mLease = lease; - result.mMask = makeMask(prefixLength); - - uint32_t inet4; // only support IPv4 for now. - -#define INET_PTON(var, field) \ - PR_BEGIN_MACRO \ - inet_pton(AF_INET, var, &inet4); \ - result.field = inet4; \ - PR_END_MACRO - - INET_PTON(ipaddr, mIpaddr); - INET_PTON(gateway, mGateway); - - if (dns1[0] != '\0') { - INET_PTON(dns1, mDns1); - } - - if (dns2[0] != '\0') { - INET_PTON(dns2, mDns2); - } - - INET_PTON(server, mServer); - - char inet_str[64]; - if (inet_ntop(AF_INET, &result.mMask, inet_str, sizeof(inet_str))) { - result.mMask_str = NS_ConvertUTF8toUTF16(inet_str); - } - - return result; -} - -CommandResult NetworkUtils::enableInterface(NetworkParams& aOptions) { - return mNetUtils->do_ifc_enable( - NS_ConvertUTF16toUTF8(aOptions.mIfname).get()); -} - -CommandResult NetworkUtils::disableInterface(NetworkParams& aOptions) { - return mNetUtils->do_ifc_disable( - NS_ConvertUTF16toUTF8(aOptions.mIfname).get()); -} - -CommandResult NetworkUtils::resetConnections(NetworkParams& aOptions) { - NS_ConvertUTF16toUTF8 autoIfname(aOptions.mIfname); - return mNetUtils->do_ifc_reset_connections( - NS_ConvertUTF16toUTF8(aOptions.mIfname).get(), - RESET_ALL_ADDRESSES); -} - /** * Set default route and DNS servers for given network interface. */ -CommandResult NetworkUtils::setDefaultRoute(NetworkParams& aOptions) +int32_t NetworkUtils::setDefaultRouteAndDNS(NetworkParams& aOptions) { NS_ConvertUTF16toUTF8 autoIfname(aOptions.mIfname); if (!aOptions.mOldIfname.IsEmpty()) { // Remove IPv4's default route. - RETURN_IF_FAILED(mNetUtils->do_ifc_remove_default_route(GET_CHAR(mOldIfname))); + mNetUtils->do_ifc_remove_default_route(GET_CHAR(mOldIfname)); // Remove IPv6's default route. - RETURN_IF_FAILED(mNetUtils->do_ifc_remove_route(GET_CHAR(mOldIfname), "::", 0, NULL)); + mNetUtils->do_ifc_remove_route(GET_CHAR(mOldIfname), "::", 0, NULL); } uint32_t length = aOptions.mGateways.Length(); if (length > 0) { for (uint32_t i = 0; i < length; i++) { NS_ConvertUTF16toUTF8 autoGateway(aOptions.mGateways[i]); int type = getIpType(autoGateway.get()); if (type != AF_INET && type != AF_INET6) { continue; } if (type == AF_INET6) { - RETURN_IF_FAILED(mNetUtils->do_ifc_add_route(autoIfname.get(), "::", 0, autoGateway.get())); + mNetUtils->do_ifc_add_route(autoIfname.get(), "::", 0, autoGateway.get()); } else { /* type == AF_INET */ - RETURN_IF_FAILED(mNetUtils->do_ifc_set_default_route(autoIfname.get(), inet_addr(autoGateway.get()))); + mNetUtils->do_ifc_set_default_route(autoIfname.get(), inet_addr(autoGateway.get())); } } } else { // Set default froute from system properties. char key[PROPERTY_KEY_MAX]; char gateway[PROPERTY_KEY_MAX]; snprintf(key, sizeof key - 1, "net.%s.gw", autoIfname.get()); property_get(key, gateway, ""); int type = getIpType(gateway); if (type != AF_INET && type != AF_INET6) { return EAFNOSUPPORT; } if (type == AF_INET6) { - RETURN_IF_FAILED(mNetUtils->do_ifc_add_route(autoIfname.get(), "::", 0, gateway)); + mNetUtils->do_ifc_add_route(autoIfname.get(), "::", 0, gateway); } else { /* type == AF_INET */ - RETURN_IF_FAILED(mNetUtils->do_ifc_set_default_route(autoIfname.get(), inet_addr(gateway))); + mNetUtils->do_ifc_set_default_route(autoIfname.get(), inet_addr(gateway)); } } + setDNS(aOptions); return SUCCESS; } /** * Remove default route for given network interface. */ -CommandResult NetworkUtils::removeDefaultRoute(NetworkParams& aOptions) +int32_t NetworkUtils::removeDefaultRoute(NetworkParams& aOptions) { uint32_t length = aOptions.mGateways.Length(); for (uint32_t i = 0; i < length; i++) { NS_ConvertUTF16toUTF8 autoGateway(aOptions.mGateways[i]); int type = getIpType(autoGateway.get()); if (type != AF_INET && type != AF_INET6) { return EAFNOSUPPORT; } - RETURN_IF_FAILED(mNetUtils->do_ifc_remove_route(GET_CHAR(mIfname), - type == AF_INET ? "0.0.0.0" : "::", - 0, autoGateway.get())); + mNetUtils->do_ifc_remove_route(GET_CHAR(mIfname), + type == AF_INET ? "0.0.0.0" : "::", + 0, autoGateway.get()); } return SUCCESS; } /** * Add host route for given network interface. */ -CommandResult NetworkUtils::addHostRoute(NetworkParams& aOptions) +int32_t NetworkUtils::addHostRoute(NetworkParams& aOptions) { NS_ConvertUTF16toUTF8 autoIfname(aOptions.mIfname); NS_ConvertUTF16toUTF8 autoHostname(aOptions.mIp); NS_ConvertUTF16toUTF8 autoGateway(aOptions.mGateway); int type, prefix; type = getIpType(autoHostname.get()); if (type != AF_INET && type != AF_INET6) { @@ -1474,17 +1337,17 @@ CommandResult NetworkUtils::addHostRoute prefix = type == AF_INET ? 32 : 128; return mNetUtils->do_ifc_add_route(autoIfname.get(), autoHostname.get(), prefix, autoGateway.get()); } /** * Remove host route for given network interface. */ -CommandResult NetworkUtils::removeHostRoute(NetworkParams& aOptions) +int32_t NetworkUtils::removeHostRoute(NetworkParams& aOptions) { NS_ConvertUTF16toUTF8 autoIfname(aOptions.mIfname); NS_ConvertUTF16toUTF8 autoHostname(aOptions.mIp); NS_ConvertUTF16toUTF8 autoGateway(aOptions.mGateway); int type, prefix; type = getIpType(autoHostname.get()); if (type != AF_INET && type != AF_INET6) { @@ -1498,22 +1361,22 @@ CommandResult NetworkUtils::removeHostRo prefix = type == AF_INET ? 32 : 128; return mNetUtils->do_ifc_remove_route(autoIfname.get(), autoHostname.get(), prefix, autoGateway.get()); } /** * Remove the routes associated with the named interface. */ -CommandResult NetworkUtils::removeHostRoutes(NetworkParams& aOptions) +int32_t NetworkUtils::removeHostRoutes(NetworkParams& aOptions) { return mNetUtils->do_ifc_remove_host_routes(GET_CHAR(mIfname)); } -CommandResult NetworkUtils::removeNetworkRoute(NetworkParams& aOptions) +int32_t NetworkUtils::removeNetworkRoute(NetworkParams& aOptions) { NS_ConvertUTF16toUTF8 autoIfname(aOptions.mIfname); NS_ConvertUTF16toUTF8 autoIp(aOptions.mIp); int type = getIpType(autoIp.get()); if (type != AF_INET && type != AF_INET6) { return EAFNOSUPPORT; } @@ -1538,100 +1401,100 @@ CommandResult NetworkUtils::removeNetwor } char subnetStr[INET6_ADDRSTRLEN]; if (!inet_ntop(AF_INET6, &in6, subnetStr, sizeof subnetStr)) { return EINVAL; } // Remove default route. - RETURN_IF_FAILED(mNetUtils->do_ifc_remove_route(autoIfname.get(), "::", 0, NULL)); + mNetUtils->do_ifc_remove_route(autoIfname.get(), "::", 0, NULL); // Remove subnet route. - RETURN_IF_FAILED(mNetUtils->do_ifc_remove_route(autoIfname.get(), subnetStr, prefixLength, NULL)); + mNetUtils->do_ifc_remove_route(autoIfname.get(), subnetStr, prefixLength, NULL); return SUCCESS; } /* type == AF_INET */ uint32_t ip = inet_addr(autoIp.get()); uint32_t netmask = makeMask(prefixLength); uint32_t subnet = ip & netmask; const char* gateway = "0.0.0.0"; struct in_addr addr; addr.s_addr = subnet; const char* dst = inet_ntoa(addr); - RETURN_IF_FAILED(mNetUtils->do_ifc_remove_default_route(autoIfname.get())); - RETURN_IF_FAILED(mNetUtils->do_ifc_remove_route(autoIfname.get(), dst, prefixLength, gateway)); + mNetUtils->do_ifc_remove_default_route(autoIfname.get()); + mNetUtils->do_ifc_remove_route(autoIfname.get(), dst, prefixLength, gateway); return SUCCESS; } -CommandResult NetworkUtils::addSecondaryRoute(NetworkParams& aOptions) +int32_t NetworkUtils::addSecondaryRoute(NetworkParams& aOptions) { char command[MAX_COMMAND_SIZE]; snprintf(command, MAX_COMMAND_SIZE - 1, "interface route add %s secondary %s %s %s", GET_CHAR(mIfname), GET_CHAR(mIp), GET_CHAR(mPrefix), GET_CHAR(mGateway)); doCommand(command, nullptr, nullptr); return SUCCESS; } -CommandResult NetworkUtils::removeSecondaryRoute(NetworkParams& aOptions) +int32_t NetworkUtils::removeSecondaryRoute(NetworkParams& aOptions) { char command[MAX_COMMAND_SIZE]; snprintf(command, MAX_COMMAND_SIZE - 1, "interface route remove %s secondary %s %s %s", GET_CHAR(mIfname), GET_CHAR(mIp), GET_CHAR(mPrefix), GET_CHAR(mGateway)); doCommand(command, nullptr, nullptr); return SUCCESS; } -CommandResult NetworkUtils::setNetworkInterfaceAlarm(NetworkParams& aOptions) +int32_t NetworkUtils::setNetworkInterfaceAlarm(NetworkParams& aOptions) { DEBUG("setNetworkInterfaceAlarms: %s", GET_CHAR(mIfname)); RUN_CHAIN(aOptions, sNetworkInterfaceSetAlarmChain, networkInterfaceAlarmFail); - return CommandResult::Pending(); + return SUCCESS; } -CommandResult NetworkUtils::enableNetworkInterfaceAlarm(NetworkParams& aOptions) +int32_t NetworkUtils::enableNetworkInterfaceAlarm(NetworkParams& aOptions) { DEBUG("enableNetworkInterfaceAlarm: %s", GET_CHAR(mIfname)); RUN_CHAIN(aOptions, sNetworkInterfaceEnableAlarmChain, networkInterfaceAlarmFail); - return CommandResult::Pending(); + return SUCCESS; } -CommandResult NetworkUtils::disableNetworkInterfaceAlarm(NetworkParams& aOptions) +int32_t NetworkUtils::disableNetworkInterfaceAlarm(NetworkParams& aOptions) { DEBUG("disableNetworkInterfaceAlarms: %s", GET_CHAR(mIfname)); RUN_CHAIN(aOptions, sNetworkInterfaceDisableAlarmChain, networkInterfaceAlarmFail); - return CommandResult::Pending(); + return SUCCESS; } /** * handling main thread's reload Wifi firmware request */ -CommandResult NetworkUtils::setWifiOperationMode(NetworkParams& aOptions) +int32_t NetworkUtils::setWifiOperationMode(NetworkParams& aOptions) { DEBUG("setWifiOperationMode: %s %s", GET_CHAR(mIfname), GET_CHAR(mMode)); RUN_CHAIN(aOptions, sWifiOperationModeChain, wifiOperationModeFail); - return CommandResult::Pending(); + return SUCCESS; } /** * handling main thread's enable/disable WiFi Tethering request */ -CommandResult NetworkUtils::setWifiTethering(NetworkParams& aOptions) +int32_t NetworkUtils::setWifiTethering(NetworkParams& aOptions) { bool enable = aOptions.mEnable; IFProperties interfaceProperties; getIFProperties(GET_CHAR(mExternalIfname), interfaceProperties); if (strcmp(interfaceProperties.dns1, "")) { int type = getIpType(interfaceProperties.dns1); if (type != AF_INET6) { @@ -1650,20 +1513,20 @@ CommandResult NetworkUtils::setWifiTethe DEBUG("Starting Wifi Tethering on %s <-> %s", GET_CHAR(mInternalIfname), GET_CHAR(mExternalIfname)); RUN_CHAIN(aOptions, sWifiEnableChain, wifiTetheringFail) } else { DEBUG("Stopping Wifi Tethering on %s <-> %s", GET_CHAR(mInternalIfname), GET_CHAR(mExternalIfname)); RUN_CHAIN(aOptions, sWifiDisableChain, wifiTetheringFail) } - return CommandResult::Pending(); + return SUCCESS; } -CommandResult NetworkUtils::setUSBTethering(NetworkParams& aOptions) +int32_t NetworkUtils::setUSBTethering(NetworkParams& aOptions) { bool enable = aOptions.mEnable; IFProperties interfaceProperties; getIFProperties(GET_CHAR(mExternalIfname), interfaceProperties); if (strcmp(interfaceProperties.dns1, "")) { int type = getIpType(interfaceProperties.dns1); if (type != AF_INET6) { @@ -1682,59 +1545,61 @@ CommandResult NetworkUtils::setUSBTether DEBUG("Starting USB Tethering on %s <-> %s", GET_CHAR(mInternalIfname), GET_CHAR(mExternalIfname)); RUN_CHAIN(aOptions, sUSBEnableChain, usbTetheringFail) } else { DEBUG("Stopping USB Tethering on %s <-> %s", GET_CHAR(mInternalIfname), GET_CHAR(mExternalIfname)); RUN_CHAIN(aOptions, sUSBDisableChain, usbTetheringFail) } - return CommandResult::Pending(); + return SUCCESS; } void NetworkUtils::escapeQuote(nsCString& aString) { aString.ReplaceSubstring("\\", "\\\\"); aString.ReplaceSubstring("\"", "\\\""); } -CommandResult NetworkUtils::checkUsbRndisState(NetworkParams& aOptions) +void NetworkUtils::checkUsbRndisState(NetworkParams& aOptions) { static uint32_t retry = 0; char currentState[PROPERTY_VALUE_MAX]; property_get(SYS_USB_STATE_PROPERTY, currentState, nullptr); nsTArray<nsCString> stateFuncs; split(currentState, USB_CONFIG_DELIMIT, stateFuncs); bool rndisPresent = stateFuncs.Contains(nsCString(USB_FUNCTION_RNDIS)); if (aOptions.mEnable == rndisPresent) { NetworkResultOptions result; result.mEnable = aOptions.mEnable; result.mResult = true; + postMessage(aOptions, result); retry = 0; - return result; + return; } if (retry < USB_FUNCTION_RETRY_TIMES) { retry++; usleep(USB_FUNCTION_RETRY_INTERVAL * 1000); - return checkUsbRndisState(aOptions); + checkUsbRndisState(aOptions); + return; } NetworkResultOptions result; result.mResult = false; + postMessage(aOptions, result); retry = 0; - return result; } /** * Modify usb function's property to turn on USB RNDIS function */ -CommandResult NetworkUtils::enableUsbRndis(NetworkParams& aOptions) +int32_t NetworkUtils::enableUsbRndis(NetworkParams& aOptions) { bool report = aOptions.mReport; // For some reason, rndis doesn't play well with diag,modem,nmea. // So when turning rndis on, we set sys.usb.config to either "rndis" // or "rndis,adb". When turning rndis off, we go back to // persist.sys.usb.config. // @@ -1780,28 +1645,28 @@ CommandResult NetworkUtils::enableUsbRnd join(configFuncs, USB_CONFIG_DELIMIT, PROPERTY_VALUE_MAX, newConfig); if (strcmp(currentConfig, newConfig)) { property_set(SYS_USB_CONFIG_PROPERTY, newConfig); } // Trigger the timer to check usb state and report the result to NetworkManager. if (report) { usleep(USB_FUNCTION_RETRY_INTERVAL * 1000); - return checkUsbRndisState(aOptions); + checkUsbRndisState(aOptions); } return SUCCESS; } /** * handling upstream interface change event. */ -CommandResult NetworkUtils::updateUpStream(NetworkParams& aOptions) +int32_t NetworkUtils::updateUpStream(NetworkParams& aOptions) { RUN_CHAIN(aOptions, sUpdateUpStreamChain, updateUpStreamFail) - return CommandResult::Pending(); + return SUCCESS; } void NetworkUtils::sendBroadcastMessage(uint32_t code, char* reason) { NetworkResultOptions result; switch(code) { case NETD_COMMAND_INTERFACE_CHANGE: result.mTopic = NS_ConvertUTF8toUTF16("netd-interface-change");
--- a/dom/system/gonk/NetworkUtils.h +++ b/dom/system/gonk/NetworkUtils.h @@ -23,16 +23,58 @@ typedef void (*ErrorCallback)(NetworkPar mozilla::dom::NetworkResultOptions& aResult); class NetworkParams { public: NetworkParams() { } + NetworkParams(const NetworkParams& aOther) { + mIp = aOther.mIp; + mCmd = aOther.mCmd; + mDomain = aOther.mDomain; + mGateway = aOther.mGateway; + mGateways = aOther.mGateways; + mId = aOther.mId; + mIfname = aOther.mIfname; + mPrefixLength = aOther.mPrefixLength; + mOldIfname = aOther.mOldIfname; + mMode = aOther.mMode; + mReport = aOther.mReport; + mIsAsync = aOther.mIsAsync; + mEnabled = aOther.mEnabled; + mWifictrlinterfacename = aOther.mWifictrlinterfacename; + mInternalIfname = aOther.mInternalIfname; + mExternalIfname = aOther.mExternalIfname; + mEnable = aOther.mEnable; + mSsid = aOther.mSsid; + mSecurity = aOther.mSecurity; + mKey = aOther.mKey; + mPrefix = aOther.mPrefix; + mLink = aOther.mLink; + mInterfaceList = aOther.mInterfaceList; + mWifiStartIp = aOther.mWifiStartIp; + mWifiEndIp = aOther.mWifiEndIp; + mUsbStartIp = aOther.mUsbStartIp; + mUsbEndIp = aOther.mUsbEndIp; + mDns1 = aOther.mDns1; + mDns2 = aOther.mDns2; + mDnses = aOther.mDnses; + mStartIp = aOther.mStartIp; + mEndIp = aOther.mEndIp; + mServerIp = aOther.mServerIp; + mMaskLength = aOther.mMaskLength; + mPreInternalIfname = aOther.mPreInternalIfname; + mPreExternalIfname = aOther.mPreExternalIfname; + mCurInternalIfname = aOther.mCurInternalIfname; + mCurExternalIfname = aOther.mCurExternalIfname; + mThreshold = aOther.mThreshold; + } + 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]); \ @@ -65,16 +107,17 @@ public: 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(mOldIfname, EmptyString()) COPY_OPT_STRING_FIELD(mMode, EmptyString()) COPY_OPT_FIELD(mReport, false) + COPY_OPT_FIELD(mIsAsync, 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()) @@ -92,21 +135,16 @@ public: 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) #undef COPY_SEQUENCE_FIELD #undef COPY_OPT_STRING_FIELD #undef COPY_OPT_FIELD #undef COPY_FIELD } int32_t mId; @@ -115,16 +153,17 @@ public: nsString mGateway; nsTArray<nsString> mGateways; nsString mIfname; nsString mIp; uint32_t mPrefixLength; nsString mOldIfname; nsString mMode; bool mReport; + bool mIsAsync; bool mEnabled; nsString mWifictrlinterfacename; nsString mInternalIfname; nsString mExternalIfname; bool mEnable; nsString mSsid; nsString mSecurity; nsString mKey; @@ -142,21 +181,16 @@ public: nsString mEndIp; nsString mServerIp; nsString mMaskLength; nsString mPreInternalIfname; nsString mPreExternalIfname; nsString mCurInternalIfname; nsString mCurExternalIfname; long mThreshold; - long mIpaddr; - long mMask; - long mGateway_long; - long mDns1_long; - long mDns2_long; }; // 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. @@ -196,73 +230,49 @@ public: private: uint32_t mIndex; NetworkParams mParams; 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 MOZ_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 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 removeHostRoutes(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 setWifiOperationMode(NetworkParams& aOptions); - CommandResult setDhcpServer(NetworkParams& aOptions); - CommandResult setWifiTethering(NetworkParams& aOptions); - CommandResult setUSBTethering(NetworkParams& aOptions); - CommandResult enableUsbRndis(NetworkParams& aOptions); - CommandResult updateUpStream(NetworkParams& aOptions); + int32_t setDNS(NetworkParams& aOptions); + int32_t setDefaultRouteAndDNS(NetworkParams& aOptions); + int32_t addHostRoute(NetworkParams& aOptions); + int32_t removeDefaultRoute(NetworkParams& aOptions); + int32_t removeHostRoute(NetworkParams& aOptions); + int32_t removeHostRoutes(NetworkParams& aOptions); + int32_t removeNetworkRoute(NetworkParams& aOptions); + int32_t addSecondaryRoute(NetworkParams& aOptions); + int32_t removeSecondaryRoute(NetworkParams& aOptions); + int32_t setNetworkInterfaceAlarm(NetworkParams& aOptions); + int32_t enableNetworkInterfaceAlarm(NetworkParams& aOptions); + int32_t disableNetworkInterfaceAlarm(NetworkParams& aOptions); + int32_t setWifiOperationMode(NetworkParams& aOptions); + int32_t setDhcpServer(NetworkParams& aOptions); + int32_t setWifiTethering(NetworkParams& aOptions); + int32_t setUSBTethering(NetworkParams& aOptions); + int32_t enableUsbRndis(NetworkParams& aOptions); + int32_t updateUpStream(NetworkParams& aOptions); /** * function pointer array holds all netd commands should be executed * in sequence to accomplish a given command by other module. */ static CommandFunc sWifiEnableChain[]; static CommandFunc sWifiDisableChain[]; static CommandFunc sWifiFailChain[]; @@ -345,17 +355,17 @@ private: /** * Notify broadcast message to main thread. */ void sendBroadcastMessage(uint32_t code, char* reason); /** * Utility functions. */ - CommandResult checkUsbRndisState(NetworkParams& aOptions); + void 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);
--- a/dom/system/gonk/NetworkWorker.cpp +++ b/dom/system/gonk/NetworkWorker.cpp @@ -28,19 +28,34 @@ StaticRefPtr<NetworkWorker> gNetworkWork // The singleton networkutils class, that can be used on any thread. static nsAutoPtr<NetworkUtils> gNetworkUtils; // Runnable used dispatch command result on the main thread. class NetworkResultDispatcher : public nsRunnable { public: NetworkResultDispatcher(const NetworkResultOptions& aResult) - : mResult(aResult) { MOZ_ASSERT(!NS_IsMainThread()); + +#define COPY_FIELD(prop) mResult.prop = aResult.prop; + COPY_FIELD(mId) + COPY_FIELD(mRet) + COPY_FIELD(mBroadcast) + COPY_FIELD(mTopic) + COPY_FIELD(mReason) + COPY_FIELD(mResultCode) + COPY_FIELD(mResultReason) + COPY_FIELD(mError) + COPY_FIELD(mEnable) + COPY_FIELD(mResult) + COPY_FIELD(mSuccess) + COPY_FIELD(mCurExternalIfname) + COPY_FIELD(mCurInternalIfname) +#undef COPY_FIELD } NS_IMETHOD Run() { MOZ_ASSERT(NS_IsMainThread()); if (gNetworkWorker) { gNetworkWorker->DispatchNetworkResult(mResult);
--- a/dom/system/gonk/nsINetworkService.idl +++ b/dom/system/gonk/nsINetworkService.idl @@ -96,75 +96,20 @@ interface nsIUpdateUpStreamCallback : ns * @param success * Boolean to indicate the operation is successful or not. * @param externalIfname * The external interface name. */ void updateUpStreamResult(in boolean success, in DOMString externalIfname); }; -[scriptable, function, uuid(eedca6c0-1310-11e4-9191-0800200c9a66)] -interface nsISetDnsCallback : nsISupports -{ - /** - * Callback function used to report the result of setting DNS server. - * - * @param error - * An error message if the operation wasn't successful, - * or `null` if it was. - */ - void setDnsResult(in jsval error); -}; - -[scriptable, function, uuid(5d0e1a60-1187-11e4-9191-0800200c9a66)] -interface nsINativeCommandCallback : nsISupports -{ - /** - * Callback function used to report the result of a network native command. - * - * @param success - * Boolean to indicate the operation is successful or not. - */ - void nativeCommandResult(in boolean success); -}; - -[scriptable, function, uuid(694abb80-1187-11e4-9191-0800200c9a66)] -interface nsIDhcpRequestCallback : nsISupports -{ - /** - * Callback function used to report the result of DHCP client request. - * - * @param success - * Boolean to indicate the operation is successful or not. - * - * @param dhcpInfo - * An object to represent the successful DHCP request: - * - * - gateway_str: string - * - dns1_str: string - * - dns2_str: string - * - mask_str: string - * - server_str: string - * - vendor_str: string - * - lease: long - * - mask: long - * - ipaddr: long - * - gateway: long - * - dns1: long - * - dns2: long - * - server: long - */ - void dhcpRequestResult(in boolean success, in jsval dhcpInfo); -}; - - /** * Provide network services. */ -[scriptable, uuid(9f1d78e0-1314-11e4-9191-0800200c9a66)] +[scriptable, uuid(ddb38428-0cf2-4c6a-a3c9-5e2f00fc54db)] interface nsINetworkService : nsISupports { /** * Enable or disable Wifi Tethering * * @param enabled * Boolean that indicates whether tethering should be enabled (true) or disabled (false). * @param config @@ -279,36 +224,29 @@ interface nsINetworkService : nsISupport */ void resetRoutingTable(in nsINetworkInterface networkInterface); /** * Set DNS. * * @param networkInterface * The network interface which contains the DNS we want to set. - * - * @param callback - * Callback to notify the result of setting DNS server. */ - void setDNS(in nsINetworkInterface networkInterface, - in nsISetDnsCallback callback); + void setDNS(in nsINetworkInterface networkInterface); /** - * Set default route. + * Set default route and DNS. * * @param networkInterface - * The network interface we want to set to the default route. + * The network interface we want to set to the default route and dns. * @param oldInterface * The previous network interface. - * @param callback - * Callback to notify the result of setting default route. */ - void setDefaultRoute(in nsINetworkInterface networkInterface, - in nsINetworkInterface oldInterface, - in nsINativeCommandCallback callback); + void setDefaultRouteAndDNS(in nsINetworkInterface networkInterface, + in nsINetworkInterface oldInterface); /** * Remove default route. * * @param networkInterface * The network interface we want remove from the default route. */ void removeDefaultRoute(in nsINetworkInterface networkInterface); @@ -398,76 +336,9 @@ interface nsINetworkService : nsISupport * @param current * The current internal and external interface. * @param callback * Callback function to report the result. */ void updateUpStream(in jsval previous, in jsval current, in nsIUpdateUpStreamCallback callback); - - /** - * Configure a network interface. - * - * @param config - * An object containing the detail that we want to configure the interface: - * - * - ifname: string - * - ipaddr: long - * - mask: long - * - gateway: long - * - dns1: long - * - dns2: long - * - * @param callback - * Callback to notify the result of configurating network interface. - */ - void configureInterface(in jsval config, - in nsINativeCommandCallback callback); - - /** - * Issue a DHCP client request. - * - * @param networkInterface - * The network interface which we wnat to do the DHCP request on. - * - * @param callback - * Callback to notify the result of the DHCP request. - */ - void dhcpRequest(in DOMString interfaceName, - in nsIDhcpRequestCallback callback); - - /** - * Enable a network interface. - * - * @param networkInterface - * The network interface name which we want to enable. - * - * @param callback - * Callback to notify the result of disabling network interface. - */ - void enableInterface(in DOMString interfaceName, - in nsINativeCommandCallback callback); - - /** - * Disable a network interface. - * - * @param networkInterface - * The network interface name which we want to disable. - * - * @param callback - * Callback to notify the result of disabling network interface. - */ - void disableInterface(in DOMString interfaceName, - in nsINativeCommandCallback callback); - - /** - * Reset all connections - * - * @param networkInterface - * The network interface name which we want to reset. - * - * @param callback - * Callback to notify the result of resetting connections. - */ - void resetConnections(in DOMString interfaceName, - in nsINativeCommandCallback callback); };
--- a/dom/webidl/NetworkOptions.webidl +++ b/dom/webidl/NetworkOptions.webidl @@ -17,16 +17,17 @@ dictionary NetworkCommandOptions unsigned long prefixLength; // for "removeNetworkRoute". DOMString domain; // for "setDNS" sequence<DOMString> dnses; // for "setDNS", "setDefaultRouteAndDNS". DOMString oldIfname; // for "setDefaultRouteAndDNS". DOMString gateway; // for "addSecondaryRoute", "removeSecondaryRoute". sequence<DOMString> gateways; // for "setDefaultRouteAndDNS", "removeDefaultRoute". DOMString mode; // for "setWifiOperationMode". boolean report; // for "setWifiOperationMode". + boolean isAsync; // for "setWifiOperationMode". boolean enabled; // for "setDhcpServer". DOMString wifictrlinterfacename; // for "setWifiTethering". DOMString internalIfname; // for "setWifiTethering". DOMString externalIfname; // for "setWifiTethering". boolean enable; // for "setWifiTethering". DOMString ssid; // for "setWifiTethering". DOMString security; // for "setWifiTethering". DOMString key; // for "setWifiTethering". @@ -44,22 +45,16 @@ dictionary NetworkCommandOptions DOMString startIp; // for "setDhcpServer". DOMString endIp; // for "setDhcpServer". DOMString serverIp; // for "setDhcpServer". DOMString maskLength; // for "setDhcpServer". DOMString preInternalIfname; // for "updateUpStream". DOMString preExternalIfname; // for "updateUpStream". DOMString curInternalIfname; // for "updateUpStream". DOMString curExternalIfname; // for "updateUpStream". - - long ipaddr; // for "ifc_configure". - long mask; // for "ifc_configure". - long gateway_long; // for "ifc_configure". - long dns1_long; // for "ifc_configure". - long dns2_long; // for "ifc_configure". }; /** * This dictionary holds the parameters sent back to NetworkService.js. */ dictionary NetworkResultOptions { long id = 0; // opaque id. @@ -73,27 +68,9 @@ dictionary NetworkResultOptions boolean error = false; // for all commands. boolean enable = false; // for "setWifiTethering", "setUSBTethering" // "enableUsbRndis". boolean result = false; // for "enableUsbRndis". boolean success = false; // for "setDhcpServer". DOMString curExternalIfname = ""; // for "updateUpStream". DOMString curInternalIfname = ""; // for "updateUpStream". - - DOMString reply = ""; // for "command". - DOMString route = ""; // for "ifc_get_default_route". - DOMString ipaddr_str = ""; // The following are for the result of - // dhcp_do_request. - DOMString gateway_str = ""; - DOMString dns1_str = ""; - DOMString dns2_str = ""; - DOMString mask_str = ""; - DOMString server_str = ""; - DOMString vendor_str = ""; - long lease = 0; - long mask = 0; - long ipaddr = 0; - long gateway = 0; - long dns1 = 0; - long dns2 = 0; - long server = 0; };
--- a/dom/webidl/WifiOptions.webidl +++ b/dom/webidl/WifiOptions.webidl @@ -5,27 +5,61 @@ /** * This dictionnary holds the parameters sent to the wifi service. */ dictionary WifiCommandOptions { long id = 0; // opaque id. DOMString cmd = ""; // the command name. DOMString request; // for "command" + DOMString ifname; // for "ifc_reset_connections", "ifc_enable", + // "ifc_disable", "ifc_remove_host_routes", + // "ifc_remove_default_route", "dhcp_stop", + // "dhcp_release_lease", "ifc_get_default_route", + // "ifc_add_host_route", "ifc_set_default_route", + // "ifc_configure", "dhcp_do_request", + // "dhcp_do_request_renew". + long route; // for "ifc_add_host_route", "ifc_set_default_route". + long ipaddr; // for "ifc_configure". + long mask; // for "ifc_configure". + long gateway; // for "ifc_configure". + long dns1; // for "ifc_configure". + long dns2; // for "ifc_configure". + DOMString key; // for "property_get", "property_set". + DOMString value; // for "property_set". + DOMString defaultValue; // for "property_get". }; /** * This dictionnary holds the parameters sent back to WifiWorker.js */ dictionary WifiResultOptions { long id = 0; // opaque id. long status = 0; // the return status of the command. // Used by most commands. DOMString reply = ""; // for "command". + DOMString route = ""; // for "ifc_get_default_route". + DOMString error = ""; // for "dhcp_get_errmsg". + DOMString value = ""; // for "property_get". + DOMString ipaddr_str = ""; // The following are for the result of + // dhcp_do_request. + DOMString gateway_str = ""; + DOMString dns1_str = ""; + DOMString dns2_str = ""; + DOMString mask_str = ""; + DOMString server_str = ""; + DOMString vendor_str = ""; + long lease = 0; + long mask = 0; + long ipaddr = 0; + long gateway = 0; + long dns1 = 0; + long dns2 = 0; + long server = 0; }; /** * This dictionary holds the callback parameter sent back from WifiCertService * to WifiWorker, and should only be passed around in chrome process. */ dictionary WifiCertServiceResultOptions
--- a/dom/wifi/WifiNetUtil.jsm +++ b/dom/wifi/WifiNetUtil.jsm @@ -25,45 +25,126 @@ this.WifiNetUtil = function(controlMessa function debug(msg) { if (DEBUG) { dump('-------------- NetUtil: ' + msg); } } var util = {}; + util.configureInterface = function(cfg, callback) { + let message = { cmd: "ifc_configure", + ifname: cfg.ifname, + ipaddr: cfg.ipaddr, + mask: cfg.mask, + gateway: cfg.gateway, + dns1: cfg.dns1, + dns2: cfg.dns2 }; + + controlMessage(message, function(data) { + callback(!data.status); + }); + }; + util.runDhcp = function (ifname, callback) { - gNetworkService.dhcpRequest(ifname, function(success, dhcpInfo) { + controlMessage({ cmd: "dhcp_do_request", ifname: ifname }, function(data) { + var dhcpInfo = data.status ? null : data; util.runIpConfig(ifname, dhcpInfo, callback); }); }; util.stopDhcp = function (ifname, callback) { // This function does exactly what dhcp_stop does. Unforunately, if we call // this function twice before the previous callback is returned. We may block // our self waiting for the callback. It slows down the wifi startup procedure. // Therefore, we have to roll our own version here. let dhcpService = DHCP_PROP + "_" + ifname; let suffix = (ifname.substr(0, 3) === "p2p") ? "p2p" : ifname; let processName = DHCP + "_" + suffix; stopProcess(dhcpService, processName, callback); }; + util.enableInterface = function (ifname, callback) { + controlMessage({ cmd: "ifc_enable", ifname: ifname }, function (data) { + callback(!data.status); + }); + }; + + util.disableInterface = function (ifname, callback) { + controlMessage({ cmd: "ifc_disable", ifname: ifname }, function (data) { + callback(!data.status); + }); + }; + util.startDhcpServer = function (config, callback) { gNetworkService.setDhcpServer(true, config, function (error) { callback(!error); }); }; util.stopDhcpServer = function (callback) { gNetworkService.setDhcpServer(false, null, function (error) { callback(!error); }); }; + util.addHostRoute = function (ifname, route, callback) { + controlMessage({ cmd: "ifc_add_host_route", ifname: ifname, route: route }, function(data) { + callback(!data.status); + }); + }; + + util.removeHostRoutes = function (ifname, callback) { + controlMessage({ cmd: "ifc_remove_host_routes", ifname: ifname }, function(data) { + callback(!data.status); + }); + }; + + util.setDefaultRoute = function (ifname, route, callback) { + controlMessage({ cmd: "ifc_set_default_route", ifname: ifname, route: route }, function(data) { + callback(!data.status); + }); + }; + + util.getDefaultRoute = function (ifname, callback) { + controlMessage({ cmd: "ifc_get_default_route", ifname: ifname }, function(data) { + callback(!data.route); + }); + }; + + util.removeDefaultRoute = function (ifname, callback) { + controlMessage({ cmd: "ifc_remove_default_route", ifname: ifname }, function(data) { + callback(!data.status); + }); + }; + + util.resetConnections = function (ifname, callback) { + controlMessage({ cmd: "ifc_reset_connections", ifname: ifname }, function(data) { + callback(!data.status); + }); + }; + + util.releaseDhcpLease = function (ifname, callback) { + controlMessage({ cmd: "dhcp_release_lease", ifname: ifname }, function(data) { + callback(!data.status); + }); + }; + + util.getDhcpError = function (callback) { + controlMessage({ cmd: "dhcp_get_errmsg" }, function(data) { + callback(data.error); + }); + }; + + util.runDhcpRenew = function (ifname, callback) { + controlMessage({ cmd: "dhcp_do_request", ifname: ifname }, function(data) { + callback(data.status ? null : data); + }); + }; + util.runIpConfig = function (name, data, callback) { if (!data) { debug("IP config failed to run"); callback({ info: data }); return; } setProperty("net." + name + ".dns1", ipToString(data.dns1),
--- a/dom/wifi/WifiP2pManager.jsm +++ b/dom/wifi/WifiP2pManager.jsm @@ -16,20 +16,16 @@ Cu.import("resource://gre/modules/system XPCOMUtils.defineLazyServiceGetter(this, "gSysMsgr", "@mozilla.org/system-message-internal;1", "nsISystemMessagesInternal"); XPCOMUtils.defineLazyServiceGetter(this, "gNetworkManager", "@mozilla.org/network/manager;1", "nsINetworkManager"); -XPCOMUtils.defineLazyServiceGetter(this, "gNetworkService", - "@mozilla.org/network/service;1", - "nsINetworkService"); - this.EXPORTED_SYMBOLS = ["WifiP2pManager"]; const EVENT_IGNORED = -1; const EVENT_UNKNOWN = -2; // Events from supplicant for p2p. const EVENT_P2P_DEVICE_FOUND = 0; const EVENT_P2P_DEVICE_LOST = 1; @@ -646,17 +642,17 @@ function P2pStateMachine(aP2pCommand, aN onFailure(); return; } debug('P2P is enabled! Enabling net interface...'); // Step 4: Enable p2p0 net interface. wpa_supplicant may have // already done it for us. - gNetworkService.enableInterface(P2P_INTERFACE_NAME, function (success) { + aNetUtil.enableInterface(P2P_INTERFACE_NAME, function (success) { onSuccess(); }); }); }); }, handleEvent: function(aEvent) { // We won't receive any event since all of them will be blocked. @@ -1317,17 +1313,17 @@ function P2pStateMachine(aP2pCommand, aN enter: function() { _sm.pause(); aNetUtil.stopDhcpServer(function (success) { // Stopping DHCP server is harmless. debug('Stop DHCP server result: ' + success); aP2pCommand.p2pDisable(function(success) { debug('P2P function disabled'); aP2pCommand.closeSupplicantConnection(function (status) { debug('Supplicant connection closed'); - gNetworkService.disableInterface(P2P_INTERFACE_NAME, function (success){ + aNetUtil.disableInterface(P2P_INTERFACE_NAME, function (success){ debug('Disabled interface: ' + P2P_INTERFACE_NAME); _onDisabled(true); _sm.gotoState(stateDisabled); }); }); }); }); },
--- a/dom/wifi/WifiProxyService.cpp +++ b/dom/wifi/WifiProxyService.cpp @@ -84,20 +84,46 @@ private: nsCString mInterface; }; // Runnable used dispatch the Command result on the main thread. class WifiResultDispatcher : public nsRunnable { public: WifiResultDispatcher(WifiResultOptions& aResult, const nsACString& aInterface) - : mResult(aResult) - , mInterface(aInterface) + : mInterface(aInterface) { MOZ_ASSERT(!NS_IsMainThread()); + + // XXX: is there a better way to copy webidl dictionnaries? + // the copy constructor is private. +#define COPY_FIELD(prop) mResult.prop = aResult.prop; + + COPY_FIELD(mId) + COPY_FIELD(mStatus) + COPY_FIELD(mReply) + COPY_FIELD(mRoute) + COPY_FIELD(mError) + COPY_FIELD(mValue) + COPY_FIELD(mIpaddr_str) + COPY_FIELD(mGateway_str) + COPY_FIELD(mDns1_str) + COPY_FIELD(mDns2_str) + COPY_FIELD(mMask_str) + COPY_FIELD(mServer_str) + COPY_FIELD(mVendor_str) + COPY_FIELD(mLease) + COPY_FIELD(mMask) + COPY_FIELD(mIpaddr) + COPY_FIELD(mGateway) + COPY_FIELD(mDns1) + COPY_FIELD(mDns2) + COPY_FIELD(mServer) + +#undef COPY_FIELD } NS_IMETHOD Run() { MOZ_ASSERT(NS_IsMainThread()); gWifiProxyService->DispatchWifiResult(mResult, mInterface); return NS_OK; }
--- a/dom/wifi/WifiUtils.cpp +++ b/dom/wifi/WifiUtils.cpp @@ -3,16 +3,17 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "WifiUtils.h" #include <dlfcn.h> #include <errno.h> #include <cutils/properties.h> #include "prinit.h" #include "js/CharacterEncoding.h" +#include "mozilla/dom/network/NetUtils.h" using namespace mozilla::dom; #define BUFFER_SIZE 4096 #define COMMAND_SIZE 256 #define PROPERTY_VALUE_MAX 80 // Intentionally not trying to dlclose() this handle. That's playing @@ -374,27 +375,24 @@ public: USE_DLFUNC(wifi_command) return wifi_command(command, buf, len); } }; // Concrete class to use to access the wpa supplicant. WpaSupplicant::WpaSupplicant() { - char propVersion[PROPERTY_VALUE_MAX]; - property_get("ro.build.version.sdk", propVersion, "0"); - mSdkVersion = strtol(propVersion, nullptr, 10); - - if (mSdkVersion < 16) { + if (NetUtils::SdkVersion() < 16) { mImpl = new ICSWpaSupplicantImpl(); - } else if (mSdkVersion < 19) { + } else if (NetUtils::SdkVersion() < 19) { mImpl = new JBWpaSupplicantImpl(); } else { mImpl = new KKWpaSupplicantImpl(); } + mNetUtils = new NetUtils(); mWifiHotspotUtils = new WifiHotspotUtils(); }; void WpaSupplicant::WaitForEvent(nsAString& aEvent, const nsCString& aInterface) { CHECK_HWLIB() char buffer[BUFFER_SIZE]; @@ -415,16 +413,19 @@ uint32_t WpaSupplicant::MakeMask(uint32_ return ntohl(mask); } bool WpaSupplicant::ExecuteCommand(CommandOptions aOptions, WifiResultOptions& aResult, const nsCString& aInterface) { CHECK_HWLIB(false) + if (!mNetUtils->GetSharedLibrary()) { + return false; + } if (!mWifiHotspotUtils->GetSharedLibrary()) { return false; } // Always correlate the opaque ids. aResult.mId = aOptions.mId; @@ -449,16 +450,91 @@ bool WpaSupplicant::ExecuteCommand(Comma } else if (aOptions.mCmd.EqualsLiteral("unload_driver")) { aResult.mStatus = mImpl->do_wifi_unload_driver(); } else if (aOptions.mCmd.EqualsLiteral("start_supplicant")) { aResult.mStatus = mImpl->do_wifi_start_supplicant(GetWifiP2pSupported() ? 1 : 0); } else if (aOptions.mCmd.EqualsLiteral("stop_supplicant")) { aResult.mStatus = mImpl->do_wifi_stop_supplicant(0); } else if (aOptions.mCmd.EqualsLiteral("connect_to_supplicant")) { aResult.mStatus = mImpl->do_wifi_connect_to_supplicant(aInterface.get()); + } else if (aOptions.mCmd.EqualsLiteral("ifc_enable")) { + aResult.mStatus = mNetUtils->do_ifc_enable(GET_CHAR(mIfname)); + } else if (aOptions.mCmd.EqualsLiteral("ifc_disable")) { + aResult.mStatus = mNetUtils->do_ifc_disable(GET_CHAR(mIfname)); + } else if (aOptions.mCmd.EqualsLiteral("ifc_configure")) { + aResult.mStatus = mNetUtils->do_ifc_configure( + GET_CHAR(mIfname), aOptions.mIpaddr, aOptions.mMask, + aOptions.mGateway, aOptions.mDns1, aOptions.mDns2 + ); + } else if (aOptions.mCmd.EqualsLiteral("ifc_reset_connections")) { + aResult.mStatus = mNetUtils->do_ifc_reset_connections( + GET_CHAR(mIfname), RESET_ALL_ADDRESSES + ); + } else if (aOptions.mCmd.EqualsLiteral("dhcp_stop")) { + aResult.mStatus = mNetUtils->do_dhcp_stop(GET_CHAR(mIfname)); + } else if (aOptions.mCmd.EqualsLiteral("dhcp_do_request")) { + char ipaddr[PROPERTY_VALUE_MAX]; + char gateway[PROPERTY_VALUE_MAX]; + uint32_t prefixLength; + char dns1[PROPERTY_VALUE_MAX]; + char dns2[PROPERTY_VALUE_MAX]; + char server[PROPERTY_VALUE_MAX]; + uint32_t lease; + char vendorinfo[PROPERTY_VALUE_MAX]; + aResult.mStatus = + mNetUtils->do_dhcp_do_request(GET_CHAR(mIfname), + ipaddr, + gateway, + &prefixLength, + dns1, + dns2, + server, + &lease, + vendorinfo); + + if (aResult.mStatus == -1) { + // Early return since we failed. + return true; + } + + aResult.mIpaddr_str = NS_ConvertUTF8toUTF16(ipaddr); + aResult.mGateway_str = NS_ConvertUTF8toUTF16(gateway); + aResult.mDns1_str = NS_ConvertUTF8toUTF16(dns1); + aResult.mDns2_str = NS_ConvertUTF8toUTF16(dns2); + aResult.mServer_str = NS_ConvertUTF8toUTF16(server); + aResult.mVendor_str = NS_ConvertUTF8toUTF16(vendorinfo); + aResult.mLease = lease; + aResult.mMask = MakeMask(prefixLength); + + uint32_t inet4; // only support IPv4 for now. + +#define INET_PTON(var, field) \ + PR_BEGIN_MACRO \ + inet_pton(AF_INET, var, &inet4); \ + aResult.field = inet4; \ + PR_END_MACRO + + INET_PTON(ipaddr, mIpaddr); + INET_PTON(gateway, mGateway); + + if (dns1[0] != '\0') { + INET_PTON(dns1, mDns1); + } + + if (dns2[0] != '\0') { + INET_PTON(dns2, mDns2); + } + + INET_PTON(server, mServer); + + //aResult.mask_str = netHelpers.ipToString(obj.mask); + char inet_str[64]; + if (inet_ntop(AF_INET, &aResult.mMask, inet_str, sizeof(inet_str))) { + aResult.mMask_str = NS_ConvertUTF8toUTF16(inet_str); + } } else if (aOptions.mCmd.EqualsLiteral("hostapd_command")) { size_t len = BUFFER_SIZE - 1; char buffer[BUFFER_SIZE]; NS_ConvertUTF16toUTF8 request(aOptions.mRequest); aResult.mStatus = mWifiHotspotUtils->do_wifi_hostapd_command(request.get(), buffer, &len); nsString value; @@ -514,17 +590,17 @@ void WpaSupplicant::CheckBuffer(char* buffer, int32_t length, nsAString& aEvent) { if (length <= 0 || length >= (BUFFER_SIZE - 1)) { NS_WARNING("WpaSupplicant::CheckBuffer: Invalid buffer length"); return; } - if (mSdkVersion < 18) { + if (NetUtils::SdkVersion() < 18) { buffer[length] = 0; LossyConvertUTF8toUTF16(buffer, length, aEvent); return; } // After Android JB4.3, the SSIDs have been converted into printable form. // In most of cases, SSIDs do not use unprintable characters, but IEEE 802.11 // standard does not limit the used character set, so anything could be used
--- a/dom/wifi/WifiUtils.h +++ b/dom/wifi/WifiUtils.h @@ -8,44 +8,81 @@ */ #ifndef WifiUtils_h #define WifiUtils_h #include "nsString.h" #include "nsAutoPtr.h" #include "mozilla/dom/WifiOptionsBinding.h" +#include "mozilla/dom/network/NetUtils.h" #include "WifiHotspotUtils.h" // Needed to add a copy constructor to WifiCommandOptions. struct CommandOptions { public: + CommandOptions(const CommandOptions& aOther) { + mId = aOther.mId; + mCmd = aOther.mCmd; + mRequest = aOther.mRequest; + mIfname = aOther.mIfname; + mRoute = aOther.mRoute; + mIpaddr = aOther.mIpaddr; + mMask = aOther.mMask; + mGateway = aOther.mGateway; + mDns1 = aOther.mDns1; + mDns2 = aOther.mDns2; + mKey = aOther.mKey; + mValue = aOther.mValue; + mDefaultValue = aOther.mDefaultValue; + } + CommandOptions(const mozilla::dom::WifiCommandOptions& aOther) { #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_FIELD(mRequest, EmptyString()) + COPY_OPT_FIELD(mIfname, EmptyString()) + COPY_OPT_FIELD(mIpaddr, 0) + COPY_OPT_FIELD(mRoute, 0) + COPY_OPT_FIELD(mMask, 0) + COPY_OPT_FIELD(mGateway, 0) + COPY_OPT_FIELD(mDns1, 0) + COPY_OPT_FIELD(mDns2, 0) + COPY_OPT_FIELD(mKey, EmptyString()) + COPY_OPT_FIELD(mValue, EmptyString()) + COPY_OPT_FIELD(mDefaultValue, EmptyString()) #undef COPY_OPT_FIELD #undef COPY_FIELD } // All the fields, not Optional<> anymore to get copy constructors. nsString mCmd; + nsString mDefaultValue; + int32_t mDns1; + int32_t mDns2; + int32_t mGateway; int32_t mId; + nsString mIfname; + int32_t mIpaddr; + nsString mKey; + int32_t mMask; nsString mRequest; + int32_t mRoute; + nsString mValue; }; // Abstract class that exposes libhardware_legacy functions we need for // wifi management. // We use the ICS signatures here since they are likely more future-proof. class WpaSupplicantImpl { public: @@ -88,18 +125,17 @@ public: // conversion void WaitForEvent(nsAString& aEvent, const nsCString& aInterface); bool ExecuteCommand(CommandOptions aOptions, mozilla::dom::WifiResultOptions& result, const nsCString& aInterface); private: nsAutoPtr<WpaSupplicantImpl> mImpl; + nsAutoPtr<NetUtils> mNetUtils; nsAutoPtr<WifiHotspotUtils> mWifiHotspotUtils; - uint32_t mSdkVersion; - protected: void CheckBuffer(char* buffer, int32_t length, nsAString& aEvent); uint32_t MakeMask(uint32_t len); }; #endif // WifiUtils_h
--- a/dom/wifi/WifiWorker.js +++ b/dom/wifi/WifiWorker.js @@ -410,18 +410,18 @@ var WifiManager = (function() { // If the ssid of current connection is the same as configured ssid // It means we need update current connection to use static IP address. if (setNetworkKey == curNetworkKey) { // Use configureInterface directly doesn't work, the network iterface // and routing table is changed but still cannot connect to network // so the workaround here is disable interface the enable again to // trigger network reconnect with static ip. - gNetworkService.disableInterface(manager.ifname, function (ok) { - gNetworkService.enableInterface(manager.ifname, function (ok) { + netUtil.disableInterface(manager.ifname, function (ok) { + netUtil.enableInterface(manager.ifname, function (ok) { }); }); } }); } var dhcpInfo = null; @@ -437,22 +437,22 @@ var WifiManager = (function() { staticIpInfo = staticIpConfig[key]; // Stop dhcpd when use static IP if (dhcpInfo != null) { netUtil.stopDhcp(manager.ifname, function() {}); } // Set ip, mask length, gateway, dns to network interface - gNetworkService.configureInterface( { ifname: ifname, - ipaddr: staticIpInfo.ipaddr, - mask: staticIpInfo.maskLength, - gateway: staticIpInfo.gateway, - dns1: staticIpInfo.dns1, - dns2: staticIpInfo.dns2 }, function (data) { + netUtil.configureInterface( { ifname: ifname, + ipaddr: staticIpInfo.ipaddr, + mask: staticIpInfo.maskLength, + gateway: staticIpInfo.gateway, + dns1: staticIpInfo.dns1, + dns2: staticIpInfo.dns2 }, function (data) { netUtil.runIpConfig(ifname, staticIpInfo, function(data) { dhcpInfo = data.info; notify("networkconnected", data); }); }); } var suppressEvents = false; @@ -582,27 +582,27 @@ var WifiManager = (function() { retryTimer = null; connectTries = 0; notify("supplicantlost", { success: false }); } manager.connectionDropped = function(callback) { // Reset network interface when connection drop - gNetworkService.configureInterface( { ifname: manager.ifname, - ipaddr: 0, - mask: 0, - gateway: 0, - dns1: 0, - dns2: 0 }, function (data) { + netUtil.configureInterface( { ifname: manager.ifname, + ipaddr: 0, + mask: 0, + gateway: 0, + dns1: 0, + dns2: 0 }, function (data) { }); // If we got disconnected, kill the DHCP client in preparation for // reconnection. - gNetworkService.resetConnections(manager.ifname, function() { + netUtil.resetConnections(manager.ifname, function() { netUtil.stopDhcp(manager.ifname, function() { callback(); }); }); } manager.start = function() { debug("detected SDK version " + sdkVersion); @@ -884,17 +884,17 @@ var WifiManager = (function() { function tryStopSupplicant () { let status = libcutils.property_get(SUPP_PROP); if (status !== "running") { callback(); return; } suppressEvents = true; wifiCommand.killSupplicant(function() { - gNetworkService.disableInterface(manager.ifname, function (ok) { + netUtil.disableInterface(manager.ifname, function (ok) { suppressEvents = false; callback(); }); }); } } // Initial state. @@ -991,17 +991,17 @@ var WifiManager = (function() { unloadDriver(WIFI_FIRMWARE_STATION, function() { callback(status); }); manager.state = "UNINITIALIZED"; return; } manager.supplicantStarted = true; - gNetworkService.enableInterface(manager.ifname, function (ok) { + netUtil.enableInterface(manager.ifname, function (ok) { callback(ok ? 0 : -1); }); }); } function doStartSupplicant() { cancelWaitForDriverReadyTimer(); @@ -1035,17 +1035,17 @@ var WifiManager = (function() { // supplicant gracefully, then we need to continue telling it to die // until it does. let doDisableWifi = function() { manager.stopSupplicantCallback = (function () { wifiCommand.stopSupplicant(function (status) { wifiCommand.closeSupplicantConnection(function() { manager.connectToSupplicant = false; manager.state = "UNINITIALIZED"; - gNetworkService.disableInterface(manager.ifname, function (ok) { + netUtil.disableInterface(manager.ifname, function (ok) { unloadDriver(WIFI_FIRMWARE_STATION, callback); }); }); }); }).bind(this); let terminateEventCallback = (function() { handleEvent("CTRL-EVENT-TERMINATING");