зеркало из https://github.com/mozilla/gecko-dev.git
Bug 864931 - Rewrite net worker in C++. r=fabrice, r=vchang
This commit is contained in:
Родитель
f06445241f
Коммит
9f240876a9
|
@ -54,6 +54,11 @@ DEFINE_DLFUNC(ifc_disable, int32_t, const char*)
|
|||
DEFINE_DLFUNC(ifc_configure, int32_t, const char*, in_addr_t, uint32_t,
|
||||
in_addr_t, in_addr_t, in_addr_t)
|
||||
DEFINE_DLFUNC(ifc_reset_connections, int32_t, const char*, const int32_t)
|
||||
DEFINE_DLFUNC(ifc_set_default_route, int32_t, const char*, in_addr_t)
|
||||
DEFINE_DLFUNC(ifc_add_route, int32_t, const char*, const char*, uint32_t, const char*)
|
||||
DEFINE_DLFUNC(ifc_remove_route, int32_t, const char*, const char*, uint32_t, const char*)
|
||||
DEFINE_DLFUNC(ifc_remove_host_routes, int32_t, const char*)
|
||||
DEFINE_DLFUNC(ifc_remove_default_route, int32_t, const char*)
|
||||
DEFINE_DLFUNC(dhcp_stop, int32_t, const char*)
|
||||
|
||||
int32_t NetUtils::do_ifc_enable(const char *ifname)
|
||||
|
@ -87,6 +92,43 @@ int32_t NetUtils::do_ifc_reset_connections(const char *ifname,
|
|||
return ifc_reset_connections(ifname, resetMask);
|
||||
}
|
||||
|
||||
int32_t NetUtils::do_ifc_set_default_route(const char *ifname,
|
||||
in_addr_t gateway)
|
||||
{
|
||||
USE_DLFUNC(ifc_set_default_route)
|
||||
return ifc_set_default_route(ifname, gateway);
|
||||
}
|
||||
|
||||
int32_t NetUtils::do_ifc_add_route(const char *ifname,
|
||||
const char *dst,
|
||||
uint32_t prefixLength,
|
||||
const char *gateway)
|
||||
{
|
||||
USE_DLFUNC(ifc_add_route)
|
||||
return ifc_add_route(ifname, dst, prefixLength, gateway);
|
||||
}
|
||||
|
||||
int32_t NetUtils::do_ifc_remove_route(const char *ifname,
|
||||
const char *dst,
|
||||
uint32_t prefixLength,
|
||||
const char *gateway)
|
||||
{
|
||||
USE_DLFUNC(ifc_remove_route)
|
||||
return ifc_remove_route(ifname, dst, prefixLength, gateway);
|
||||
}
|
||||
|
||||
int32_t NetUtils::do_ifc_remove_host_routes(const char *ifname)
|
||||
{
|
||||
USE_DLFUNC(ifc_remove_host_routes)
|
||||
return ifc_remove_host_routes(ifname);
|
||||
}
|
||||
|
||||
int32_t NetUtils::do_ifc_remove_default_route(const char *ifname)
|
||||
{
|
||||
USE_DLFUNC(ifc_remove_default_route)
|
||||
return ifc_remove_default_route(ifname);
|
||||
}
|
||||
|
||||
int32_t NetUtils::do_dhcp_stop(const char *ifname)
|
||||
{
|
||||
USE_DLFUNC(dhcp_stop)
|
||||
|
@ -132,16 +174,6 @@ int32_t NetUtils::do_dhcp_do_request(const char *ifname,
|
|||
char domains[PROPERTY_VALUE_MAX];
|
||||
ret = dhcp_do_request(ifname, ipaddr, gateway, prefixLength, dns,
|
||||
server, lease, vendorinfo, domains);
|
||||
} else if (sdkVersion == 19) {
|
||||
// JB 4.4
|
||||
// http://androidxref.com/4.4_r1/xref/system/core/libnetutils/dhcp_utils.c#18
|
||||
DEFINE_DLFUNC(dhcp_do_request, int32_t, const char*, char*, char*, uint32_t*, char**, char*, uint32_t*, char*, char*, char*)
|
||||
USE_DLFUNC(dhcp_do_request)
|
||||
char *dns[3] = {dns1, dns2, nullptr};
|
||||
char domains[PROPERTY_VALUE_MAX];
|
||||
char mtu[PROPERTY_VALUE_MAX];
|
||||
ret = dhcp_do_request(ifname, ipaddr, gateway, prefixLength, dns,
|
||||
server, lease, vendorinfo, domains, mtu);
|
||||
} else {
|
||||
NS_WARNING("Unable to perform do_dhcp_request: unsupported sdk version!");
|
||||
}
|
|
@ -33,6 +33,17 @@ public:
|
|||
in_addr_t dns1,
|
||||
in_addr_t dns2);
|
||||
int32_t do_ifc_reset_connections(const char *ifname, const int32_t resetMask);
|
||||
int32_t do_ifc_set_default_route(const char *ifname, in_addr_t gateway);
|
||||
int32_t do_ifc_add_route(const char *ifname,
|
||||
const char *dst,
|
||||
uint32_t prefixLength,
|
||||
const char *gateway);
|
||||
int32_t do_ifc_remove_route(const char *ifname,
|
||||
const char *dst,
|
||||
uint32_t prefixLength,
|
||||
const char *gateway);
|
||||
int32_t do_ifc_remove_host_routes(const char *ifname);
|
||||
int32_t do_ifc_remove_default_route(const char *ifname);
|
||||
int32_t do_dhcp_stop(const char *ifname);
|
||||
int32_t do_dhcp_do_request(const char *ifname,
|
||||
char *ipaddr,
|
|
@ -49,6 +49,12 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
|||
'NetworkStatsServiceProxy.js',
|
||||
'NetworkStatsServiceProxy.manifest',
|
||||
]
|
||||
EXPORTS.mozilla.dom.network += [
|
||||
'NetUtils.h',
|
||||
]
|
||||
UNIFIED_SOURCES += [
|
||||
'NetUtils.cpp',
|
||||
]
|
||||
|
||||
IPDL_SOURCES += [
|
||||
'PTCPServerSocket.ipdl',
|
||||
|
|
|
@ -14,6 +14,10 @@ Cu.import("resource://gre/modules/FileUtils.jsm");
|
|||
const NETWORKSERVICE_CONTRACTID = "@mozilla.org/network/service;1";
|
||||
const NETWORKSERVICE_CID = Components.ID("{c14cabaf-bb8e-470d-a2f1-2cb6de6c5e5c}");
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "gNetworkWorker",
|
||||
"@mozilla.org/network/worker;1",
|
||||
"nsINetworkWorker");
|
||||
|
||||
// 1xx - Requested action is proceeding
|
||||
const NETD_COMMAND_PROCEEDING = 100;
|
||||
// 2xx - Requested action has been successfully completed
|
||||
|
@ -51,17 +55,23 @@ function debug(msg) {
|
|||
*/
|
||||
function NetworkService() {
|
||||
if(DEBUG) debug("Starting net_worker.");
|
||||
this.worker = new ChromeWorker("resource://gre/modules/net_worker.js");
|
||||
this.worker.onmessage = this.handleWorkerMessage.bind(this);
|
||||
this.worker.onerror = function onerror(event) {
|
||||
if(DEBUG) debug("Received error from worker: " + event.filename +
|
||||
":" + event.lineno + ": " + event.message + "\n");
|
||||
// Prevent the event from bubbling any further.
|
||||
event.preventDefault();
|
||||
};
|
||||
|
||||
let self = this;
|
||||
|
||||
if (gNetworkWorker) {
|
||||
let networkListener = {
|
||||
onEvent: function(event) {
|
||||
self.handleWorkerMessage(event);
|
||||
}
|
||||
};
|
||||
this.worker = gNetworkWorker;
|
||||
gNetworkWorker.start(networkListener);
|
||||
}
|
||||
// Callbacks to invoke when a reply arrives from the net_worker.
|
||||
this.controlCallbacks = Object.create(null);
|
||||
|
||||
this.shutdown = false;
|
||||
Services.obs.addObserver(this, "xpcom-shutdown", false);
|
||||
}
|
||||
|
||||
NetworkService.prototype = {
|
||||
|
@ -82,19 +92,24 @@ NetworkService.prototype = {
|
|||
|
||||
idgen: 0,
|
||||
controlMessage: function(params, callback) {
|
||||
if (this.shutdown) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (callback) {
|
||||
let id = this.idgen++;
|
||||
params.id = id;
|
||||
this.controlCallbacks[id] = callback;
|
||||
}
|
||||
this.worker.postMessage(params);
|
||||
if (gNetworkWorker) {
|
||||
gNetworkWorker.postMessage(params);
|
||||
}
|
||||
},
|
||||
|
||||
handleWorkerMessage: function(e) {
|
||||
if(DEBUG) debug("NetworkManager received message from worker: " + JSON.stringify(e.data));
|
||||
let response = e.data;
|
||||
handleWorkerMessage: function(response) {
|
||||
if(DEBUG) debug("NetworkManager received message from worker: " + JSON.stringify(response));
|
||||
let id = response.id;
|
||||
if (id === 'broadcast') {
|
||||
if (response.broadcast === true) {
|
||||
Services.obs.notifyObservers(null, response.topic, response.reason);
|
||||
return;
|
||||
}
|
||||
|
@ -109,8 +124,12 @@ NetworkService.prototype = {
|
|||
|
||||
getNetworkInterfaceStats: function(networkName, callback) {
|
||||
if(DEBUG) debug("getNetworkInterfaceStats for " + networkName);
|
||||
let file = new FileUtils.File("/proc/net/dev");
|
||||
|
||||
if (this.shutdown) {
|
||||
return;
|
||||
}
|
||||
|
||||
let file = new FileUtils.File("/proc/net/dev");
|
||||
if (!file) {
|
||||
callback.networkStatsAvailable(false, -1, -1, new Date());
|
||||
return;
|
||||
|
@ -159,7 +178,7 @@ NetworkService.prototype = {
|
|||
},
|
||||
|
||||
_setNetworkInterfaceAlarm: function(networkName, threshold, callback) {
|
||||
debug("setNetworkInterfaceAlarm for " + networkName + " at " + threshold + "bytes");
|
||||
if(DEBUG) debug("setNetworkInterfaceAlarm for " + networkName + " at " + threshold + "bytes");
|
||||
|
||||
let params = {
|
||||
cmd: "setNetworkInterfaceAlarm",
|
||||
|
@ -181,7 +200,7 @@ NetworkService.prototype = {
|
|||
},
|
||||
|
||||
_enableNetworkInterfaceAlarm: function(networkName, threshold, callback) {
|
||||
debug("enableNetworkInterfaceAlarm for " + networkName + " at " + threshold + "bytes");
|
||||
if(DEBUG) debug("enableNetworkInterfaceAlarm for " + networkName + " at " + threshold + "bytes");
|
||||
|
||||
let params = {
|
||||
cmd: "enableNetworkInterfaceAlarm",
|
||||
|
@ -202,7 +221,7 @@ NetworkService.prototype = {
|
|||
},
|
||||
|
||||
_disableNetworkInterfaceAlarm: function(networkName, callback) {
|
||||
debug("disableNetworkInterfaceAlarm for " + networkName);
|
||||
if(DEBUG) debug("disableNetworkInterfaceAlarm for " + networkName);
|
||||
|
||||
let params = {
|
||||
cmd: "disableNetworkInterfaceAlarm",
|
||||
|
@ -253,7 +272,7 @@ NetworkService.prototype = {
|
|||
ip: network.ip,
|
||||
netmask: network.netmask
|
||||
};
|
||||
this.worker.postMessage(options);
|
||||
this.controlMessage(options, function() {});
|
||||
},
|
||||
|
||||
setDNS: function(networkInterface) {
|
||||
|
@ -264,7 +283,7 @@ NetworkService.prototype = {
|
|||
dns1_str: networkInterface.dns1,
|
||||
dns2_str: networkInterface.dns2
|
||||
};
|
||||
this.worker.postMessage(options);
|
||||
this.controlMessage(options, function() {});
|
||||
},
|
||||
|
||||
setDefaultRouteAndDNS: function(network, oldInterface) {
|
||||
|
@ -277,7 +296,7 @@ NetworkService.prototype = {
|
|||
dns1_str: network.dns1,
|
||||
dns2_str: network.dns2
|
||||
};
|
||||
this.worker.postMessage(options);
|
||||
this.controlMessage(options, function() {});
|
||||
this.setNetworkProxy(network);
|
||||
},
|
||||
|
||||
|
@ -287,7 +306,7 @@ NetworkService.prototype = {
|
|||
cmd: "removeDefaultRoute",
|
||||
ifname: ifname
|
||||
};
|
||||
this.worker.postMessage(options);
|
||||
this.controlMessage(options, function() {});
|
||||
},
|
||||
|
||||
addHostRoute: function(network) {
|
||||
|
@ -298,7 +317,7 @@ NetworkService.prototype = {
|
|||
gateway: network.gateway,
|
||||
hostnames: [network.dns1, network.dns2, network.httpProxyHost]
|
||||
};
|
||||
this.worker.postMessage(options);
|
||||
this.controlMessage(options, function() {});
|
||||
},
|
||||
|
||||
removeHostRoute: function(network) {
|
||||
|
@ -309,7 +328,7 @@ NetworkService.prototype = {
|
|||
gateway: network.gateway,
|
||||
hostnames: [network.dns1, network.dns2, network.httpProxyHost]
|
||||
};
|
||||
this.worker.postMessage(options);
|
||||
this.controlMessage(options, function() {});
|
||||
},
|
||||
|
||||
removeHostRoutes: function(ifname) {
|
||||
|
@ -318,7 +337,7 @@ NetworkService.prototype = {
|
|||
cmd: "removeHostRoutes",
|
||||
ifname: ifname,
|
||||
};
|
||||
this.worker.postMessage(options);
|
||||
this.controlMessage(options, function() {});
|
||||
},
|
||||
|
||||
addHostRouteWithResolve: function(network, hosts) {
|
||||
|
@ -329,7 +348,7 @@ NetworkService.prototype = {
|
|||
gateway: network.gateway,
|
||||
hostnames: hosts
|
||||
};
|
||||
this.worker.postMessage(options);
|
||||
this.controlMessage(options, function() {});
|
||||
},
|
||||
|
||||
removeHostRouteWithResolve: function(network, hosts) {
|
||||
|
@ -340,7 +359,7 @@ NetworkService.prototype = {
|
|||
gateway: network.gateway,
|
||||
hostnames: hosts
|
||||
};
|
||||
this.worker.postMessage(options);
|
||||
this.controlMessage(options, function() {});
|
||||
},
|
||||
|
||||
setNetworkProxy: function(network) {
|
||||
|
@ -478,6 +497,18 @@ NetworkService.prototype = {
|
|||
callback.updateUpStreamResult(!isError(code), data.current.externalIfname);
|
||||
});
|
||||
},
|
||||
|
||||
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");
|
||||
break;
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([NetworkService]);
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,389 @@
|
|||
/* 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 "nsString.h"
|
||||
#include "mozilla/dom/NetworkOptionsBinding.h"
|
||||
#include "mozilla/dom/network/NetUtils.h"
|
||||
#include "mozilla/ipc/Netd.h"
|
||||
#include "nsTArray.h"
|
||||
|
||||
class NetworkParams;
|
||||
class CommandChain;
|
||||
|
||||
using namespace mozilla::dom;
|
||||
|
||||
typedef void (*CommandCallback)(CommandChain*, bool, NetworkResultOptions& aResult);
|
||||
typedef void (*CommandFunc)(CommandChain*, CommandCallback, NetworkResultOptions& aResult);
|
||||
typedef void (*MessageCallback)(NetworkResultOptions& aResult);
|
||||
typedef void (*ErrorCallback)(NetworkParams& aOptions, NetworkResultOptions& aResult);
|
||||
|
||||
class NetworkParams
|
||||
{
|
||||
public:
|
||||
NetworkParams() {
|
||||
}
|
||||
|
||||
NetworkParams(const NetworkParams& aOther) {
|
||||
mIp = aOther.mIp;
|
||||
mCmd = aOther.mCmd;
|
||||
mDns1_str = aOther.mDns1_str;
|
||||
mDns2_str = aOther.mDns2_str;
|
||||
mGateway = aOther.mGateway;
|
||||
mGateway_str = aOther.mGateway_str;
|
||||
mHostnames = aOther.mHostnames;
|
||||
mId = aOther.mId;
|
||||
mIfname = aOther.mIfname;
|
||||
mNetmask = aOther.mNetmask;
|
||||
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;
|
||||
mRxBytes = aOther.mRxBytes;
|
||||
mTxBytes = aOther.mTxBytes;
|
||||
mDate = aOther.mDate;
|
||||
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 NetworkCommandOptions& aOther) {
|
||||
|
||||
#define COPY_SEQUENCE_FIELD(prop) \
|
||||
if (aOther.prop.WasPassed()) { \
|
||||
mozilla::dom::Sequence<nsString > const & currentValue = aOther.prop.InternalValue(); \
|
||||
uint32_t length = currentValue.Length(); \
|
||||
for (uint32_t idx = 0; idx < length; idx++) { \
|
||||
mHostnames.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(mDns1_str, EmptyString())
|
||||
COPY_OPT_STRING_FIELD(mDns2_str, EmptyString())
|
||||
COPY_OPT_STRING_FIELD(mGateway, EmptyString())
|
||||
COPY_OPT_STRING_FIELD(mGateway_str, EmptyString())
|
||||
COPY_SEQUENCE_FIELD(mHostnames)
|
||||
COPY_OPT_STRING_FIELD(mIfname, EmptyString())
|
||||
COPY_OPT_STRING_FIELD(mIp, EmptyString())
|
||||
COPY_OPT_STRING_FIELD(mNetmask, EmptyString())
|
||||
COPY_OPT_STRING_FIELD(mOldIfname, EmptyString())
|
||||
COPY_OPT_STRING_FIELD(mMode, EmptyString())
|
||||
COPY_OPT_FIELD(mReport, false)
|
||||
COPY_OPT_FIELD(mIsAsync, true)
|
||||
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)
|
||||
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_OPT_FIELD(mRxBytes, -1)
|
||||
COPY_OPT_FIELD(mTxBytes, -1)
|
||||
COPY_OPT_STRING_FIELD(mDate, EmptyString())
|
||||
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)
|
||||
|
||||
#undef COPY_SEQUENCE_FIELD
|
||||
#undef COPY_OPT_STRING_FIELD
|
||||
#undef COPY_OPT_FIELD
|
||||
#undef COPY_FIELD
|
||||
}
|
||||
|
||||
int32_t mId;
|
||||
nsString mCmd;
|
||||
nsString mDns1_str;
|
||||
nsString mDns2_str;
|
||||
nsString mGateway;
|
||||
nsString mGateway_str;
|
||||
nsTArray<nsString> mHostnames;
|
||||
nsString mIfname;
|
||||
nsString mIp;
|
||||
nsString mNetmask;
|
||||
nsString mOldIfname;
|
||||
nsString mMode;
|
||||
bool mReport;
|
||||
bool mIsAsync;
|
||||
bool mEnabled;
|
||||
nsString mWifictrlinterfacename;
|
||||
nsString mInternalIfname;
|
||||
nsString mExternalIfname;
|
||||
bool mEnable;
|
||||
nsString mSsid;
|
||||
nsString mSecurity;
|
||||
nsString mKey;
|
||||
nsString mPrefix;
|
||||
nsString mLink;
|
||||
nsTArray<nsCString> mInterfaceList;
|
||||
nsString mWifiStartIp;
|
||||
nsString mWifiEndIp;
|
||||
nsString mUsbStartIp;
|
||||
nsString mUsbEndIp;
|
||||
nsString mDns1;
|
||||
nsString mDns2;
|
||||
float mRxBytes;
|
||||
float mTxBytes;
|
||||
nsString mDate;
|
||||
nsString mStartIp;
|
||||
nsString mEndIp;
|
||||
nsString mServerIp;
|
||||
nsString mMaskLength;
|
||||
nsString mPreInternalIfname;
|
||||
nsString mPreExternalIfname;
|
||||
nsString mCurInternalIfname;
|
||||
nsString mCurExternalIfname;
|
||||
long mThreshold;
|
||||
};
|
||||
|
||||
// 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 MOZ_FINAL
|
||||
{
|
||||
public:
|
||||
CommandChain(const NetworkParams& aParams,
|
||||
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;
|
||||
CommandFunc* mCommands;
|
||||
uint32_t mLength;
|
||||
ErrorCallback mError;
|
||||
};
|
||||
|
||||
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.
|
||||
*/
|
||||
bool setDNS(NetworkParams& aOptions);
|
||||
bool setDefaultRouteAndDNS(NetworkParams& aOptions);
|
||||
bool addHostRoute(NetworkParams& aOptions);
|
||||
bool removeDefaultRoute(NetworkParams& aOptions);
|
||||
bool removeHostRoute(NetworkParams& aOptions);
|
||||
bool removeHostRoutes(NetworkParams& aOptions);
|
||||
bool removeNetworkRoute(NetworkParams& aOptions);
|
||||
bool getNetworkInterfaceStats(NetworkParams& aOptions);
|
||||
bool setNetworkInterfaceAlarm(NetworkParams& aOptions);
|
||||
bool enableNetworkInterfaceAlarm(NetworkParams& aOptions);
|
||||
bool disableNetworkInterfaceAlarm(NetworkParams& aOptions);
|
||||
bool setWifiOperationMode(NetworkParams& aOptions);
|
||||
bool setDhcpServer(NetworkParams& aOptions);
|
||||
bool setWifiTethering(NetworkParams& aOptions);
|
||||
bool setUSBTethering(NetworkParams& aOptions);
|
||||
bool enableUsbRndis(NetworkParams& aOptions);
|
||||
bool 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[];
|
||||
static CommandFunc sWifiOperationModeChain[];
|
||||
static CommandFunc sUSBEnableChain[];
|
||||
static CommandFunc sUSBDisableChain[];
|
||||
static CommandFunc sUSBFailChain[];
|
||||
static CommandFunc sUpdateUpStreamChain[];
|
||||
static CommandFunc sStartDhcpServerChain[];
|
||||
static CommandFunc sStopDhcpServerChain[];
|
||||
static CommandFunc sNetworkInterfaceStatsChain[];
|
||||
static CommandFunc sNetworkInterfaceEnableAlarmChain[];
|
||||
static CommandFunc sNetworkInterfaceDisableAlarmChain[];
|
||||
static CommandFunc sNetworkInterfaceSetAlarmChain[];
|
||||
|
||||
/**
|
||||
* Individual netd command stored in command chain.
|
||||
*/
|
||||
#define PARAMS CommandChain* aChain, CommandCallback aCallback, 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 getRxBytes(PARAMS);
|
||||
static void getTxBytes(PARAMS);
|
||||
static void enableAlarm(PARAMS);
|
||||
static void disableAlarm(PARAMS);
|
||||
static void setQuota(PARAMS);
|
||||
static void removeQuota(PARAMS);
|
||||
static void setAlarm(PARAMS);
|
||||
static void setInterfaceUp(PARAMS);
|
||||
static void tetherInterface(PARAMS);
|
||||
static void preTetherInterfaceList(PARAMS);
|
||||
static void postTetherInterfaceList(PARAMS);
|
||||
static void setIpForwardingEnabled(PARAMS);
|
||||
static void tetheringStatus(PARAMS);
|
||||
static void stopTethering(PARAMS);
|
||||
static void startTethering(PARAMS);
|
||||
static void untetherInterface(PARAMS);
|
||||
static void setDnsForwarders(PARAMS);
|
||||
static void enableNat(PARAMS);
|
||||
static void disableNat(PARAMS);
|
||||
static void wifiTetheringSuccess(PARAMS);
|
||||
static void usbTetheringSuccess(PARAMS);
|
||||
static void networkInterfaceStatsSuccess(PARAMS);
|
||||
static void networkInterfaceAlarmSuccess(PARAMS);
|
||||
static void updateUpStreamSuccess(PARAMS);
|
||||
static void setDhcpServerSuccess(PARAMS);
|
||||
static void wifiOperationModeSuccess(PARAMS);
|
||||
#undef PARAMS
|
||||
|
||||
/**
|
||||
* Error callback function executed when a command is fail.
|
||||
*/
|
||||
#define PARAMS NetworkParams& aOptions, NetworkResultOptions& aResult
|
||||
static void wifiTetheringFail(PARAMS);
|
||||
static void wifiOperationModeFail(PARAMS);
|
||||
static void usbTetheringFail(PARAMS);
|
||||
static void updateUpStreamFail(PARAMS);
|
||||
static void setDhcpServerFail(PARAMS);
|
||||
static void networkInterfaceStatsFail(PARAMS);
|
||||
static void networkInterfaceAlarmFail(PARAMS);
|
||||
#undef PARAMS
|
||||
|
||||
/**
|
||||
* Command chain processing functions.
|
||||
*/
|
||||
static void next(CommandChain* aChain, bool aError, 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.
|
||||
*/
|
||||
void checkUsbRndisState(NetworkParams& aOptions);
|
||||
void dumpParams(NetworkParams& aOptions, const char* aType);
|
||||
|
||||
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();
|
||||
/**
|
||||
* Callback function to send netd result to main thread.
|
||||
*/
|
||||
MessageCallback mMessageCallback;
|
||||
|
||||
/*
|
||||
* Utility class to access libnetutils.
|
||||
*/
|
||||
nsAutoPtr<NetUtils> mNetUtils;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,263 @@
|
|||
/* 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/. */
|
||||
|
||||
#include "NetworkWorker.h"
|
||||
#include "NetworkUtils.h"
|
||||
#include <nsThreadUtils.h>
|
||||
#include "mozilla/ModuleUtils.h"
|
||||
#include "mozilla/ClearOnShutdown.h"
|
||||
#include "nsXULAppAPI.h"
|
||||
#include "nsCxPusher.h"
|
||||
|
||||
#define NS_NETWORKWORKER_CID \
|
||||
{ 0x6df093e1, 0x8127, 0x4fa7, {0x90, 0x13, 0xa3, 0xaa, 0xa7, 0x79, 0xbb, 0xdd} }
|
||||
|
||||
using namespace mozilla;
|
||||
using namespace mozilla::dom;
|
||||
using namespace mozilla::ipc;
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
// The singleton network worker, to be used on the main thread.
|
||||
StaticRefPtr<NetworkWorker> gNetworkWorker;
|
||||
|
||||
// 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)
|
||||
{
|
||||
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(mRxBytes)
|
||||
COPY_FIELD(mTxBytes)
|
||||
COPY_FIELD(mDate)
|
||||
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);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
private:
|
||||
NetworkResultOptions mResult;
|
||||
};
|
||||
|
||||
// Runnable used dispatch netd command on the worker thread.
|
||||
class NetworkCommandDispatcher : public nsRunnable
|
||||
{
|
||||
public:
|
||||
NetworkCommandDispatcher(const NetworkParams& aParams)
|
||||
: mParams(aParams)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
}
|
||||
|
||||
NS_IMETHOD Run()
|
||||
{
|
||||
if (gNetworkUtils) {
|
||||
gNetworkUtils->ExecuteCommand(mParams);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
private:
|
||||
NetworkParams mParams;
|
||||
};
|
||||
|
||||
// Runnable used dispatch netd result on the worker thread.
|
||||
class NetdEventRunnable : public nsRunnable
|
||||
{
|
||||
public:
|
||||
NetdEventRunnable(NetdCommand* aCommand)
|
||||
: mCommand(aCommand)
|
||||
{ }
|
||||
|
||||
NS_IMETHOD Run()
|
||||
{
|
||||
if (gNetworkUtils) {
|
||||
gNetworkUtils->onNetdMessage(mCommand);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
nsAutoPtr<NetdCommand> mCommand;
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS1(NetworkWorker, nsINetworkWorker)
|
||||
|
||||
NetworkWorker::NetworkWorker()
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
MOZ_ASSERT(!gNetworkWorker);
|
||||
}
|
||||
|
||||
NetworkWorker::~NetworkWorker()
|
||||
{
|
||||
MOZ_ASSERT(!gNetworkWorker);
|
||||
}
|
||||
|
||||
already_AddRefed<NetworkWorker>
|
||||
NetworkWorker::FactoryCreate()
|
||||
{
|
||||
if (XRE_GetProcessType() != GeckoProcessType_Default) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
if (!gNetworkWorker) {
|
||||
gNetworkWorker = new NetworkWorker();
|
||||
ClearOnShutdown(&gNetworkWorker);
|
||||
|
||||
gNetworkUtils = new NetworkUtils(NetworkWorker::NotifyResult);
|
||||
ClearOnShutdown(&gNetworkUtils);
|
||||
}
|
||||
|
||||
nsRefPtr<NetworkWorker> worker = gNetworkWorker.get();
|
||||
return worker.forget();
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NetworkWorker::Start(nsINetworkEventListener* aListener)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
MOZ_ASSERT(aListener);
|
||||
|
||||
nsresult rv;
|
||||
|
||||
if (gNetworkWorker) {
|
||||
StartNetd(gNetworkWorker);
|
||||
}
|
||||
|
||||
rv = NS_NewThread(getter_AddRefs(mWorkerThread));
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_WARNING("Can't create network control thread");
|
||||
Shutdown();
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
mListener = aListener;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NetworkWorker::Shutdown()
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
StopNetd();
|
||||
|
||||
if (mWorkerThread) {
|
||||
mWorkerThread->Shutdown();
|
||||
mWorkerThread = nullptr;
|
||||
}
|
||||
mListener = nullptr;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Receive command from main thread (NetworkService.js).
|
||||
NS_IMETHODIMP
|
||||
NetworkWorker::PostMessage(JS::Handle<JS::Value> aOptions, JSContext* aCx)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
NetworkCommandOptions options;
|
||||
if (!options.Init(aCx, aOptions)) {
|
||||
NS_WARNING("Bad dictionary passed to NetworkWorker::SendCommand");
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// Dispatch the command to the control thread.
|
||||
NetworkParams NetworkParams(options);
|
||||
nsCOMPtr<nsIRunnable> runnable = new NetworkCommandDispatcher(NetworkParams);
|
||||
if (mWorkerThread) {
|
||||
mWorkerThread->Dispatch(runnable, nsIEventTarget::DISPATCH_NORMAL);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
NetworkWorker::DispatchNetworkResult(const NetworkResultOptions& aOptions)
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
||||
mozilla::AutoSafeJSContext cx;
|
||||
JS::RootedValue val(cx);
|
||||
|
||||
if (!aOptions.ToObject(cx, JS::NullPtr(), &val)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Call the listener with a JS value.
|
||||
if (mListener) {
|
||||
mListener->OnEvent(val);
|
||||
}
|
||||
}
|
||||
|
||||
// Callback function from Netd, dispatch result to network worker thread.
|
||||
void
|
||||
NetworkWorker::MessageReceived(NetdCommand* aCommand)
|
||||
{
|
||||
nsCOMPtr<nsIRunnable> runnable = new NetdEventRunnable(aCommand);
|
||||
if (mWorkerThread) {
|
||||
mWorkerThread->Dispatch(runnable, nsIEventTarget::DISPATCH_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
// Callback function from network worker thread to update result on main thread.
|
||||
void
|
||||
NetworkWorker::NotifyResult(NetworkResultOptions& aResult)
|
||||
{
|
||||
nsCOMPtr<nsIRunnable> runnable = new NetworkResultDispatcher(aResult);
|
||||
NS_DispatchToMainThread(runnable);
|
||||
}
|
||||
|
||||
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(NetworkWorker,
|
||||
NetworkWorker::FactoryCreate)
|
||||
|
||||
NS_DEFINE_NAMED_CID(NS_NETWORKWORKER_CID);
|
||||
|
||||
static const mozilla::Module::CIDEntry kNetworkWorkerCIDs[] = {
|
||||
{ &kNS_NETWORKWORKER_CID, false, nullptr, NetworkWorkerConstructor },
|
||||
{ nullptr }
|
||||
};
|
||||
|
||||
static const mozilla::Module::ContractIDEntry kNetworkWorkerContracts[] = {
|
||||
{ "@mozilla.org/network/worker;1", &kNS_NETWORKWORKER_CID },
|
||||
{ nullptr }
|
||||
};
|
||||
|
||||
static const mozilla::Module kNetworkWorkerModule = {
|
||||
mozilla::Module::kVersion,
|
||||
kNetworkWorkerCIDs,
|
||||
kNetworkWorkerContracts,
|
||||
nullptr
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
|
||||
NSMODULE_DEFN(NetworkWorkerModule) = &kNetworkWorkerModule;
|
|
@ -0,0 +1,40 @@
|
|||
/* 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 NetworkWorker_h
|
||||
#define NetworkWorker_h
|
||||
|
||||
#include "mozilla/dom/NetworkOptionsBinding.h"
|
||||
#include "mozilla/ipc/Netd.h"
|
||||
#include "nsINetworkWorker.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsThread.h"
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
class NetworkWorker MOZ_FINAL : public nsINetworkWorker,
|
||||
public mozilla::ipc::NetdConsumer
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSINETWORKWORKER
|
||||
|
||||
static already_AddRefed<NetworkWorker> FactoryCreate();
|
||||
|
||||
void DispatchNetworkResult(const mozilla::dom::NetworkResultOptions& aOptions);
|
||||
void MessageReceived(mozilla::ipc::NetdCommand* aMessage);
|
||||
|
||||
private:
|
||||
NetworkWorker();
|
||||
~NetworkWorker();
|
||||
|
||||
static void NotifyResult(mozilla::dom::NetworkResultOptions& aResult);
|
||||
|
||||
nsCOMPtr<nsIThread> mWorkerThread;
|
||||
nsCOMPtr<nsINetworkEventListener> mListener;
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // NetworkWorker_h
|
|
@ -24,7 +24,6 @@
|
|||
|
||||
#include "jsfriendapi.h"
|
||||
#include "mozilla/dom/workers/Workers.h"
|
||||
#include "mozilla/ipc/Netd.h"
|
||||
#include "AutoMounter.h"
|
||||
#include "TimeZoneSettingObserver.h"
|
||||
#include "AudioManager.h"
|
||||
|
@ -57,151 +56,6 @@ NS_DEFINE_CID(kNetworkServiceCID, NS_INETWORKSERVICE_IID);
|
|||
// Doesn't carry a reference, we're owned by services.
|
||||
SystemWorkerManager *gInstance = nullptr;
|
||||
|
||||
bool
|
||||
DoNetdCommand(JSContext *cx, unsigned argc, JS::Value *vp)
|
||||
{
|
||||
NS_ASSERTION(!NS_IsMainThread(), "Expecting to be on the worker thread");
|
||||
|
||||
if (argc != 1) {
|
||||
JS_ReportError(cx, "Expecting a single argument with the Netd message");
|
||||
return false;
|
||||
}
|
||||
|
||||
JS::Value v = JS_ARGV(cx, vp)[0];
|
||||
|
||||
JSAutoByteString abs;
|
||||
void *data;
|
||||
size_t size;
|
||||
if (JSVAL_IS_STRING(v)) {
|
||||
JSString *str = JSVAL_TO_STRING(v);
|
||||
if (!abs.encodeUtf8(cx, str)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
size = abs.length();
|
||||
if (!size) {
|
||||
JS_ReportError(cx, "Command length is zero");
|
||||
return false;
|
||||
}
|
||||
|
||||
data = abs.ptr();
|
||||
if (!data) {
|
||||
JS_ReportError(cx, "Command string is empty");
|
||||
return false;
|
||||
}
|
||||
} else if (!JSVAL_IS_PRIMITIVE(v)) {
|
||||
JSObject *obj = JSVAL_TO_OBJECT(v);
|
||||
if (!JS_IsTypedArrayObject(obj)) {
|
||||
JS_ReportError(cx, "Object passed in wasn't a typed array");
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t type = JS_GetArrayBufferViewType(obj);
|
||||
if (type != js::ArrayBufferView::TYPE_INT8 &&
|
||||
type != js::ArrayBufferView::TYPE_UINT8 &&
|
||||
type != js::ArrayBufferView::TYPE_UINT8_CLAMPED) {
|
||||
JS_ReportError(cx, "Typed array data is not octets");
|
||||
return false;
|
||||
}
|
||||
|
||||
size = JS_GetTypedArrayByteLength(obj);
|
||||
if (!size) {
|
||||
JS_ReportError(cx, "Typed array byte length is zero");
|
||||
return false;
|
||||
}
|
||||
|
||||
data = JS_GetArrayBufferViewData(obj);
|
||||
if (!data) {
|
||||
JS_ReportError(cx, "Array buffer view data is NULL");
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
JS_ReportError(cx,
|
||||
"Incorrect argument. Expecting a string or a typed array");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Reserve one space for '\0'.
|
||||
if (size > MAX_COMMAND_SIZE - 1 || size <= 0) {
|
||||
JS_ReportError(cx, "Passed-in data size is invalid");
|
||||
return false;
|
||||
}
|
||||
|
||||
NetdCommand* command = new NetdCommand();
|
||||
|
||||
memcpy(command->mData, data, size);
|
||||
// Include the null terminate to the command to make netd happy.
|
||||
command->mData[size] = 0;
|
||||
command->mSize = size + 1;
|
||||
SendNetdCommand(command);
|
||||
return true;
|
||||
}
|
||||
|
||||
class ConnectWorkerToNetd : public WorkerTask
|
||||
{
|
||||
public:
|
||||
virtual bool RunTask(JSContext *aCx);
|
||||
};
|
||||
|
||||
bool
|
||||
ConnectWorkerToNetd::RunTask(JSContext *aCx)
|
||||
{
|
||||
// Set up the DoNetdCommand on the function for worker <--> Netd process
|
||||
// communication.
|
||||
NS_ASSERTION(!NS_IsMainThread(), "Expecting to be on the worker thread");
|
||||
NS_ASSERTION(!JS_IsRunning(aCx), "Are we being called somehow?");
|
||||
JS::Rooted<JSObject*> workerGlobal(aCx, JS::CurrentGlobalOrNull(aCx));
|
||||
return !!JS_DefineFunction(aCx, workerGlobal, "postNetdCommand",
|
||||
DoNetdCommand, 1, 0);
|
||||
}
|
||||
|
||||
class NetdReceiver : public NetdConsumer
|
||||
{
|
||||
class DispatchNetdEvent : public WorkerTask
|
||||
{
|
||||
public:
|
||||
DispatchNetdEvent(NetdCommand *aMessage)
|
||||
: mMessage(aMessage)
|
||||
{ }
|
||||
|
||||
virtual bool RunTask(JSContext *aCx);
|
||||
|
||||
private:
|
||||
nsAutoPtr<NetdCommand> mMessage;
|
||||
};
|
||||
|
||||
public:
|
||||
NetdReceiver(WorkerCrossThreadDispatcher *aDispatcher)
|
||||
: mDispatcher(aDispatcher)
|
||||
{ }
|
||||
|
||||
virtual void MessageReceived(NetdCommand *aMessage) {
|
||||
nsRefPtr<DispatchNetdEvent> dre(new DispatchNetdEvent(aMessage));
|
||||
if (!mDispatcher->PostTask(dre)) {
|
||||
NS_WARNING("Failed to PostTask to net worker");
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
nsRefPtr<WorkerCrossThreadDispatcher> mDispatcher;
|
||||
};
|
||||
|
||||
bool
|
||||
NetdReceiver::DispatchNetdEvent::RunTask(JSContext *aCx)
|
||||
{
|
||||
JSObject *obj = JS::CurrentGlobalOrNull(aCx);
|
||||
|
||||
JSObject *array = JS_NewUint8Array(aCx, mMessage->mSize);
|
||||
if (!array) {
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(JS_GetUint8ArrayData(array), mMessage->mData, mMessage->mSize);
|
||||
JS::Value argv[] = { OBJECT_TO_JSVAL(array) };
|
||||
return JS_CallFunctionName(aCx, obj, "onNetdMessage", NS_ARRAY_LENGTH(argv),
|
||||
argv, argv);
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
SystemWorkerManager::SystemWorkerManager()
|
||||
|
@ -278,7 +132,6 @@ SystemWorkerManager::Shutdown()
|
|||
NfcConsumer::Shutdown();
|
||||
#endif
|
||||
|
||||
StopNetd();
|
||||
mNetdWorker = nullptr;
|
||||
|
||||
nsCOMPtr<nsIWifi> wifi(do_QueryInterface(mWifiWorker));
|
||||
|
@ -391,30 +244,6 @@ SystemWorkerManager::InitNetd(JSContext *cx)
|
|||
{
|
||||
nsCOMPtr<nsIWorkerHolder> worker = do_GetService(kNetworkServiceCID);
|
||||
NS_ENSURE_TRUE(worker, NS_ERROR_FAILURE);
|
||||
|
||||
JS::Rooted<JS::Value> workerval(cx);
|
||||
nsresult rv = worker->GetWorker(&workerval);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
NS_ENSURE_TRUE(workerval.isObject(), NS_ERROR_UNEXPECTED);
|
||||
|
||||
JSAutoCompartment ac(cx, &workerval.toObject());
|
||||
|
||||
WorkerCrossThreadDispatcher *wctd =
|
||||
GetWorkerCrossThreadDispatcher(cx, workerval);
|
||||
if (!wctd) {
|
||||
NS_WARNING("Failed to GetWorkerCrossThreadDispatcher for netd");
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsRefPtr<ConnectWorkerToNetd> connection = new ConnectWorkerToNetd();
|
||||
if (!wctd->PostTask(connection)) {
|
||||
NS_WARNING("Failed to connect worker to netd");
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
// Now that we're set up, connect ourselves to the Netd process.
|
||||
mozilla::RefPtr<NetdReceiver> receiver = new NetdReceiver(wctd);
|
||||
StartNetd(receiver);
|
||||
mNetdWorker = worker;
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ XPIDL_SOURCES += [
|
|||
'nsINetworkInterfaceListService.idl',
|
||||
'nsINetworkManager.idl',
|
||||
'nsINetworkService.idl',
|
||||
'nsINetworkWorker.idl',
|
||||
'nsISystemWorkerManager.idl',
|
||||
'nsIVolume.idl',
|
||||
'nsIVolumeMountLock.idl',
|
||||
|
@ -40,6 +41,8 @@ SOURCES += [
|
|||
'AutoMounter.cpp',
|
||||
'AutoMounterSetting.cpp',
|
||||
'GonkGPSGeolocationProvider.cpp',
|
||||
'NetworkUtils.cpp',
|
||||
'NetworkWorker.cpp',
|
||||
'nsVolume.cpp',
|
||||
'nsVolumeMountLock.cpp',
|
||||
'nsVolumeService.cpp',
|
||||
|
@ -68,7 +71,6 @@ EXTRA_PP_COMPONENTS += [
|
|||
'NetworkService.js',
|
||||
]
|
||||
EXTRA_JS_MODULES += [
|
||||
'net_worker.js',
|
||||
'systemlibs.js',
|
||||
]
|
||||
|
||||
|
|
|
@ -1,964 +0,0 @@
|
|||
/* Copyright 2012 Mozilla Foundation and Mozilla contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const DEBUG = false;
|
||||
|
||||
const PERSIST_SYS_USB_CONFIG_PROPERTY = "persist.sys.usb.config";
|
||||
const SYS_USB_CONFIG_PROPERTY = "sys.usb.config";
|
||||
const SYS_USB_STATE_PROPERTY = "sys.usb.state";
|
||||
|
||||
const USB_FUNCTION_RNDIS = "rndis";
|
||||
const USB_FUNCTION_ADB = "adb";
|
||||
|
||||
const kNetdInterfaceChangedTopic = "netd-interface-change";
|
||||
const kNetdBandwidthControlTopic = "netd-bandwidth-control";
|
||||
|
||||
// Use this command to continue the function chain.
|
||||
const DUMMY_COMMAND = "tether status";
|
||||
|
||||
// Retry 20 times (2 seconds) for usb state transition.
|
||||
const USB_FUNCTION_RETRY_TIMES = 20;
|
||||
// Check "sys.usb.state" every 100ms.
|
||||
const USB_FUNCTION_RETRY_INTERVAL = 100;
|
||||
|
||||
// 1xx - Requested action is proceeding
|
||||
const NETD_COMMAND_PROCEEDING = 100;
|
||||
// 2xx - Requested action has been successfully completed
|
||||
const NETD_COMMAND_OKAY = 200;
|
||||
// 4xx - The command is accepted but the requested action didn't
|
||||
// take place.
|
||||
const NETD_COMMAND_FAIL = 400;
|
||||
// 5xx - The command syntax or parameters error
|
||||
const NETD_COMMAND_ERROR = 500;
|
||||
// 6xx - Unsolicited broadcasts
|
||||
const NETD_COMMAND_UNSOLICITED = 600;
|
||||
|
||||
// Broadcast messages
|
||||
const NETD_COMMAND_INTERFACE_CHANGE = 600;
|
||||
const NETD_COMMAND_BANDWIDTH_CONTROLLER = 601;
|
||||
|
||||
const INTERFACE_DELIMIT = "\0";
|
||||
|
||||
importScripts("systemlibs.js");
|
||||
|
||||
const SDK_VERSION = libcutils.property_get("ro.build.version.sdk", "0");
|
||||
|
||||
function netdResponseType(code) {
|
||||
return Math.floor(code/100)*100;
|
||||
}
|
||||
|
||||
function isBroadcastMessage(code) {
|
||||
let type = netdResponseType(code);
|
||||
return (type == NETD_COMMAND_UNSOLICITED);
|
||||
}
|
||||
|
||||
function isError(code) {
|
||||
let type = netdResponseType(code);
|
||||
return (type != NETD_COMMAND_PROCEEDING && type != NETD_COMMAND_OKAY);
|
||||
}
|
||||
|
||||
function isComplete(code) {
|
||||
let type = netdResponseType(code);
|
||||
return (type != NETD_COMMAND_PROCEEDING);
|
||||
}
|
||||
|
||||
function isProceeding(code) {
|
||||
let type = netdResponseType(code);
|
||||
return (type === NETD_COMMAND_PROCEEDING);
|
||||
}
|
||||
|
||||
function sendBroadcastMessage(code, reason) {
|
||||
let topic = null;
|
||||
switch (code) {
|
||||
case NETD_COMMAND_INTERFACE_CHANGE:
|
||||
topic = "netd-interface-change";
|
||||
break;
|
||||
case NETD_COMMAND_BANDWIDTH_CONTROLLER:
|
||||
topic = "netd-bandwidth-control";
|
||||
break;
|
||||
}
|
||||
|
||||
if (topic) {
|
||||
postMessage({id: 'broadcast', topic: topic, reason: reason});
|
||||
}
|
||||
}
|
||||
|
||||
let gWifiFailChain = [stopSoftAP,
|
||||
setIpForwardingEnabled,
|
||||
stopTethering];
|
||||
|
||||
function wifiTetheringFail(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
|
||||
// If one of the stages fails, we try roll back to ensure
|
||||
// we don't leave the network systems in limbo.
|
||||
|
||||
// This parameter is used to disable ipforwarding.
|
||||
params.enable = false;
|
||||
chain(params, gWifiFailChain, null);
|
||||
}
|
||||
|
||||
function wifiTetheringSuccess(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
return true;
|
||||
}
|
||||
|
||||
let gUSBFailChain = [stopSoftAP,
|
||||
setIpForwardingEnabled,
|
||||
stopTethering];
|
||||
|
||||
function usbTetheringFail(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
// Try to roll back to ensure
|
||||
// we don't leave the network systems in limbo.
|
||||
// This parameter is used to disable ipforwarding.
|
||||
params.enable = false;
|
||||
chain(params, gUSBFailChain, null);
|
||||
|
||||
// Disable usb rndis function.
|
||||
enableUsbRndis({enable: false, report: false});
|
||||
}
|
||||
|
||||
function usbTetheringSuccess(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
return true;
|
||||
}
|
||||
|
||||
function networkInterfaceAlarmFail(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
return true;
|
||||
}
|
||||
|
||||
function networkInterfaceAlarmSuccess(params) {
|
||||
// Notify the main thread.
|
||||
params.error = parseFloat(params.resultReason);
|
||||
postMessage(params);
|
||||
return true;
|
||||
}
|
||||
|
||||
function updateUpStreamSuccess(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
return true;
|
||||
}
|
||||
|
||||
function updateUpStreamFail(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
return true;
|
||||
}
|
||||
|
||||
function wifiOperationModeFail(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
return true;
|
||||
}
|
||||
|
||||
function wifiOperationModeSuccess(params) {
|
||||
// Notify the main thread.
|
||||
postMessage(params);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get network interface properties from the system property table.
|
||||
*
|
||||
* @param ifname
|
||||
* Name of the network interface.
|
||||
*/
|
||||
function getIFProperties(ifname) {
|
||||
return {
|
||||
ifname: ifname,
|
||||
gateway_str: libcutils.property_get("net." + ifname + ".gw"),
|
||||
dns1_str: libcutils.property_get("net." + ifname + ".dns1"),
|
||||
dns2_str: libcutils.property_get("net." + ifname + ".dns2"),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Routines accessible to the main thread.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Dispatch a message from the main thread to a function.
|
||||
*/
|
||||
self.onmessage = function onmessage(event) {
|
||||
let message = event.data;
|
||||
if (DEBUG) debug("received message: " + JSON.stringify(message));
|
||||
// We have to keep the id in message. It will be used when post the result
|
||||
// to NetworkManager later.
|
||||
let ret = self[message.cmd](message);
|
||||
if (!message.isAsync) {
|
||||
postMessage({id: message.id, ret: ret});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Start/Stop DHCP server.
|
||||
*/
|
||||
function setDhcpServer(config) {
|
||||
function onSuccess() {
|
||||
postMessage({ id: config.id, success: true });
|
||||
return true;
|
||||
}
|
||||
|
||||
function onError() {
|
||||
postMessage({ id: config.id, success: false });
|
||||
}
|
||||
|
||||
let startDhcpServerChain = [setInterfaceUp,
|
||||
startTethering,
|
||||
onSuccess];
|
||||
|
||||
let stopDhcpServerChain = [stopTethering,
|
||||
onSuccess];
|
||||
|
||||
if (config.enabled) {
|
||||
let params = { wifiStartIp: config.startIp,
|
||||
wifiEndIp: config.endIp,
|
||||
ip: config.serverIp,
|
||||
prefix: config.maskLength,
|
||||
ifname: config.ifname,
|
||||
link: "up" };
|
||||
|
||||
chain(params, startDhcpServerChain, onError);
|
||||
} else {
|
||||
chain({}, stopDhcpServerChain, onError);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set DNS servers for given network interface.
|
||||
*/
|
||||
function setDNS(options) {
|
||||
let ifprops = getIFProperties(options.ifname);
|
||||
let dns1_str = options.dns1_str || ifprops.dns1_str;
|
||||
let dns2_str = options.dns2_str || ifprops.dns2_str;
|
||||
libcutils.property_set("net.dns1", dns1_str);
|
||||
libcutils.property_set("net.dns2", dns2_str);
|
||||
// Bump the DNS change property.
|
||||
let dnschange = libcutils.property_get("net.dnschange", "0");
|
||||
libcutils.property_set("net.dnschange", (parseInt(dnschange, 10) + 1).toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set default route and DNS servers for given network interface.
|
||||
*/
|
||||
function setDefaultRouteAndDNS(options) {
|
||||
if (options.oldIfname) {
|
||||
libnetutils.ifc_remove_default_route(options.oldIfname);
|
||||
}
|
||||
|
||||
let ifprops = getIFProperties(options.ifname);
|
||||
let gateway_str = options.gateway_str || ifprops.gateway_str;
|
||||
let dns1_str = options.dns1_str || ifprops.dns1_str;
|
||||
let dns2_str = options.dns2_str || ifprops.dns2_str;
|
||||
let gateway = netHelpers.stringToIP(gateway_str);
|
||||
|
||||
libnetutils.ifc_set_default_route(options.ifname, gateway);
|
||||
libcutils.property_set("net.dns1", dns1_str);
|
||||
libcutils.property_set("net.dns2", dns2_str);
|
||||
|
||||
// Bump the DNS change property.
|
||||
let dnschange = libcutils.property_get("net.dnschange", "0");
|
||||
libcutils.property_set("net.dnschange", (parseInt(dnschange, 10) + 1).toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove default route for given network interface.
|
||||
*/
|
||||
function removeDefaultRoute(options) {
|
||||
libnetutils.ifc_remove_default_route(options.ifname);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add host route for given network interface.
|
||||
*/
|
||||
function addHostRoute(options) {
|
||||
for (let i = 0; i < options.hostnames.length; i++) {
|
||||
libnetutils.ifc_add_route(options.ifname, options.hostnames[i], 32, options.gateway);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove host route for given network interface.
|
||||
*/
|
||||
function removeHostRoute(options) {
|
||||
for (let i = 0; i < options.hostnames.length; i++) {
|
||||
libnetutils.ifc_remove_route(options.ifname, options.hostnames[i], 32, options.gateway);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the routes associated with the named interface.
|
||||
*/
|
||||
function removeHostRoutes(options) {
|
||||
libnetutils.ifc_remove_host_routes(options.ifname);
|
||||
}
|
||||
|
||||
function removeNetworkRoute(options) {
|
||||
let ipvalue = netHelpers.stringToIP(options.ip);
|
||||
let netmaskvalue = netHelpers.stringToIP(options.netmask);
|
||||
let subnet = netmaskvalue & ipvalue;
|
||||
let dst = netHelpers.ipToString(subnet);
|
||||
let prefixLength = netHelpers.getMaskLength(netmaskvalue);
|
||||
let gateway = "0.0.0.0";
|
||||
|
||||
libnetutils.ifc_remove_default_route(options.ifname);
|
||||
libnetutils.ifc_remove_route(options.ifname, dst, prefixLength, gateway);
|
||||
}
|
||||
|
||||
let gCommandQueue = [];
|
||||
let gCurrentCommand = null;
|
||||
let gCurrentCallback = null;
|
||||
let gPending = false;
|
||||
let gReason = [];
|
||||
|
||||
/**
|
||||
* This helper function acts like String.split() fucntion.
|
||||
* The function finds the first token in the javascript
|
||||
* uint8 type array object, where tokens are delimited by
|
||||
* the delimiter. The first token and the index pointer to
|
||||
* the next token are returned in this function.
|
||||
*/
|
||||
function split(start, data, delimiter) {
|
||||
// Sanity check.
|
||||
if (start < 0 || data.length <= 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let result = "";
|
||||
let i = start;
|
||||
while (i < data.length) {
|
||||
let octet = data[i];
|
||||
i += 1;
|
||||
if (octet === delimiter) {
|
||||
return {token: result, index: i};
|
||||
}
|
||||
result += String.fromCharCode(octet);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle received data from netd.
|
||||
*/
|
||||
function onNetdMessage(data) {
|
||||
let result = split(0, data, 32);
|
||||
if (!result) {
|
||||
nextNetdCommand();
|
||||
return;
|
||||
}
|
||||
let code = parseInt(result.token);
|
||||
|
||||
// Netd response contains the command sequence number
|
||||
// in non-broadcast message for Android jb version.
|
||||
// The format is ["code" "optional sequence number" "reason"]
|
||||
if (!isBroadcastMessage(code) && SDK_VERSION >= 16) {
|
||||
result = split(result.index, data, 32);
|
||||
}
|
||||
|
||||
let i = result.index;
|
||||
let reason = "";
|
||||
for (; i < data.length; i++) {
|
||||
let octet = data[i];
|
||||
reason += String.fromCharCode(octet);
|
||||
}
|
||||
|
||||
if (isBroadcastMessage(code)) {
|
||||
debug("Receiving broadcast message from netd.");
|
||||
debug(" ==> Code: " + code + " Reason: " + reason);
|
||||
sendBroadcastMessage(code, reason);
|
||||
nextNetdCommand();
|
||||
return;
|
||||
}
|
||||
|
||||
// Set pending to false before we handle next command.
|
||||
debug("Receiving '" + gCurrentCommand + "' command response from netd.");
|
||||
debug(" ==> Code: " + code + " Reason: " + reason);
|
||||
|
||||
gReason.push(reason);
|
||||
|
||||
// 1xx response code regards as command is proceeding, we need to wait for
|
||||
// final response code such as 2xx, 4xx and 5xx before sending next command.
|
||||
if (isProceeding(code)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isComplete(code)) {
|
||||
gPending = false;
|
||||
}
|
||||
|
||||
if (gCurrentCallback) {
|
||||
gCurrentCallback(isError(code),
|
||||
{code: code, reason: gReason.join(INTERFACE_DELIMIT)});
|
||||
gReason = [];
|
||||
}
|
||||
|
||||
// Handling pending commands if any.
|
||||
if (isComplete(code)) {
|
||||
nextNetdCommand();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send command to netd.
|
||||
*/
|
||||
function doCommand(command, callback) {
|
||||
debug("Preparing to send '" + command + "' command...");
|
||||
gCommandQueue.push([command, callback]);
|
||||
return nextNetdCommand();
|
||||
}
|
||||
|
||||
function nextNetdCommand() {
|
||||
if (!gCommandQueue.length || gPending) {
|
||||
return true;
|
||||
}
|
||||
[gCurrentCommand, gCurrentCallback] = gCommandQueue.shift();
|
||||
debug("Sending '" + gCurrentCommand + "' command to netd.");
|
||||
gPending = true;
|
||||
|
||||
// Android JB version adds sequence number to netd command.
|
||||
let command = (SDK_VERSION >= 16) ? "0 " + gCurrentCommand : gCurrentCommand;
|
||||
return postNetdCommand(command);
|
||||
}
|
||||
|
||||
function setInterfaceUp(params, callback) {
|
||||
let command = "interface setcfg " + params.ifname + " " + params.ip + " " +
|
||||
params.prefix + " ";
|
||||
if (SDK_VERSION >= 16) {
|
||||
command += params.link;
|
||||
} else {
|
||||
command += "[" + params.link + "]";
|
||||
}
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function setInterfaceDown(params, callback) {
|
||||
let command = "interface setcfg " + params.ifname + " " + params.ip + " " +
|
||||
params.prefix + " ";
|
||||
if (SDK_VERSION >= 16) {
|
||||
command += params.link;
|
||||
} else {
|
||||
command += "[" + params.link + "]";
|
||||
}
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function setIpForwardingEnabled(params, callback) {
|
||||
let command;
|
||||
|
||||
if (params.enable) {
|
||||
command = "ipfwd enable";
|
||||
} else {
|
||||
// Don't disable ip forwarding because others interface still need it.
|
||||
// Send the dummy command to continue the function chain.
|
||||
if ("interfaceList" in params && params.interfaceList.length > 1) {
|
||||
command = DUMMY_COMMAND;
|
||||
} else {
|
||||
command = "ipfwd disable";
|
||||
}
|
||||
}
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function startTethering(params, callback) {
|
||||
let command;
|
||||
// We don't need to start tethering again.
|
||||
// Send the dummy command to continue the function chain.
|
||||
if (params.resultReason.indexOf("started") !== -1) {
|
||||
command = DUMMY_COMMAND;
|
||||
} else {
|
||||
command = "tether start " + params.wifiStartIp + " " + params.wifiEndIp;
|
||||
|
||||
// If usbStartIp/usbEndIp is not valid, don't append them since
|
||||
// the trailing white spaces will be parsed to extra empty args
|
||||
// See: http://androidxref.com/4.3_r2.1/xref/system/core/libsysutils/src/FrameworkListener.cpp#78
|
||||
if (params.usbStartIp && params.usbEndIp) {
|
||||
command += " " + params.usbStartIp + " " + params.usbEndIp;
|
||||
}
|
||||
}
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function tetheringStatus(params, callback) {
|
||||
let command = "tether status";
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function stopTethering(params, callback) {
|
||||
let command;
|
||||
|
||||
// Don't stop tethering because others interface still need it.
|
||||
// Send the dummy to continue the function chain.
|
||||
if ("interfaceList" in params && params.interfaceList.length > 1) {
|
||||
command = DUMMY_COMMAND;
|
||||
} else {
|
||||
command = "tether stop";
|
||||
}
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function tetherInterface(params, callback) {
|
||||
let command = "tether interface add " + params.ifname;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function preTetherInterfaceList(params, callback) {
|
||||
let command = (SDK_VERSION >= 16) ? "tether interface list"
|
||||
: "tether interface list 0";
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function postTetherInterfaceList(params, callback) {
|
||||
params.interfaceList = params.resultReason.split(INTERFACE_DELIMIT);
|
||||
|
||||
// Send the dummy command to continue the function chain.
|
||||
let command = DUMMY_COMMAND;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function untetherInterface(params, callback) {
|
||||
let command = "tether interface remove " + params.ifname;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function setDnsForwarders(params, callback) {
|
||||
let command = "tether dns set " + params.dns1 + " " + params.dns2;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function enableNat(params, callback) {
|
||||
let command = "nat enable " + params.internalIfname + " " +
|
||||
params.externalIfname + " " + "0";
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function disableNat(params, callback) {
|
||||
let command = "nat disable " + params.internalIfname + " " +
|
||||
params.externalIfname + " " + "0";
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function wifiFirmwareReload(params, callback) {
|
||||
let command = "softap fwreload " + params.ifname + " " + params.mode;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function startAccessPointDriver(params, callback) {
|
||||
// Skip the command for sdk version >= 16.
|
||||
if (SDK_VERSION >= 16) {
|
||||
callback(false, {code: "", reason: ""});
|
||||
return true;
|
||||
}
|
||||
let command = "softap start " + params.ifname;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function stopAccessPointDriver(params, callback) {
|
||||
// Skip the command for sdk version >= 16.
|
||||
if (SDK_VERSION >= 16) {
|
||||
callback(false, {code: "", reason: ""});
|
||||
return true;
|
||||
}
|
||||
let command = "softap stop " + params.ifname;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function startSoftAP(params, callback) {
|
||||
let command = "softap startap";
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function stopSoftAP(params, callback) {
|
||||
let command = "softap stopap";
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function enableAlarm(params, callback) {
|
||||
let command = "bandwidth enable";
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function disableAlarm(params, callback) {
|
||||
let command = "bandwidth disable";
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function setQuota(params, callback) {
|
||||
let command = "bandwidth setiquota " + params.ifname + " " + parseInt('0xffffffffffffffff');
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function removeQuota(params, callback) {
|
||||
let command = "bandwidth removeiquota " + params.ifname;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function setAlarm(params, callback) {
|
||||
let command = "bandwidth setinterfacealert " + params.ifname + " " + params.threshold;
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function escapeQuote(str) {
|
||||
str = str.replace(/\\/g, "\\\\");
|
||||
return str.replace(/"/g, "\\\"");
|
||||
}
|
||||
|
||||
/**
|
||||
* Command format for sdk version < 16
|
||||
* Arguments:
|
||||
* argv[2] - wlan interface
|
||||
* argv[3] - SSID
|
||||
* argv[4] - Security
|
||||
* argv[5] - Key
|
||||
* argv[6] - Channel
|
||||
* argv[7] - Preamble
|
||||
* argv[8] - Max SCB
|
||||
*
|
||||
* Command format for sdk version >= 16
|
||||
* Arguments:
|
||||
* argv[2] - wlan interface
|
||||
* argv[3] - SSID
|
||||
* argv[4] - Security
|
||||
* argv[5] - Key
|
||||
*/
|
||||
function setAccessPoint(params, callback) {
|
||||
let command;
|
||||
if (SDK_VERSION >= 16) {
|
||||
command = "softap set " + params.ifname +
|
||||
" \"" + escapeQuote(params.ssid) + "\"" +
|
||||
" " + params.security +
|
||||
" \"" + escapeQuote(params.key) + "\"";
|
||||
} else {
|
||||
command = "softap set " + params.ifname +
|
||||
" " + params.wifictrlinterfacename +
|
||||
" \"" + escapeQuote(params.ssid) + "\"" +
|
||||
" " + params.security +
|
||||
" \"" + escapeQuote(params.key) + "\"" +
|
||||
" " + "6 0 8";
|
||||
}
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function cleanUpStream(params, callback) {
|
||||
let command = "nat disable " + params.previous.internalIfname + " " +
|
||||
params.previous.externalIfname + " " + "0";
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
function createUpStream(params, callback) {
|
||||
let command = "nat enable " + params.current.internalIfname + " " +
|
||||
params.current.externalIfname + " " + "0";
|
||||
return doCommand(command, callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify usb function's property to turn on USB RNDIS function
|
||||
*/
|
||||
function enableUsbRndis(params) {
|
||||
let report = params.report;
|
||||
let retry = 0;
|
||||
|
||||
// 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.
|
||||
//
|
||||
// On the otoro/unagi, persist.sys.usb.config should be one of:
|
||||
//
|
||||
// diag,modem,nmea,mass_storage
|
||||
// diag,modem,nmea,mass_storage,adb
|
||||
//
|
||||
// When rndis is enabled, sys.usb.config should be one of:
|
||||
//
|
||||
// rdnis
|
||||
// rndis,adb
|
||||
//
|
||||
// and when rndis is disabled, it should revert to persist.sys.usb.config
|
||||
|
||||
let currentConfig = libcutils.property_get(SYS_USB_CONFIG_PROPERTY);
|
||||
let configFuncs = currentConfig.split(",");
|
||||
let persistConfig = libcutils.property_get(PERSIST_SYS_USB_CONFIG_PROPERTY);
|
||||
let persistFuncs = persistConfig.split(",");
|
||||
|
||||
if (params.enable) {
|
||||
configFuncs = [USB_FUNCTION_RNDIS];
|
||||
if (persistFuncs.indexOf(USB_FUNCTION_ADB) >= 0) {
|
||||
configFuncs.push(USB_FUNCTION_ADB);
|
||||
}
|
||||
} else {
|
||||
// We're turning rndis off, revert back to the persist setting.
|
||||
// adb will already be correct there, so we don't need to do any
|
||||
// further adjustments.
|
||||
configFuncs = persistFuncs;
|
||||
}
|
||||
let newConfig = configFuncs.join(",");
|
||||
if (newConfig != currentConfig) {
|
||||
libcutils.property_set(SYS_USB_CONFIG_PROPERTY, newConfig);
|
||||
}
|
||||
|
||||
// Trigger the timer to check usb state and report the result to NetworkManager.
|
||||
if (report) {
|
||||
setTimeout(checkUsbRndisState, USB_FUNCTION_RETRY_INTERVAL, params);
|
||||
}
|
||||
|
||||
function checkUsbRndisState(params) {
|
||||
let currentState = libcutils.property_get(SYS_USB_STATE_PROPERTY);
|
||||
let stateFuncs = currentState.split(",");
|
||||
let rndisPresent = (stateFuncs.indexOf(USB_FUNCTION_RNDIS) >= 0);
|
||||
if (params.enable == rndisPresent) {
|
||||
params.result = true;
|
||||
postMessage(params);
|
||||
retry = 0;
|
||||
return;
|
||||
}
|
||||
if (retry < USB_FUNCTION_RETRY_TIMES) {
|
||||
retry++;
|
||||
setTimeout(checkUsbRndisState, USB_FUNCTION_RETRY_INTERVAL, params);
|
||||
return;
|
||||
}
|
||||
params.result = false;
|
||||
postMessage(params);
|
||||
};
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function dumpParams(params, type) {
|
||||
if (!DEBUG) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug("Dump params:");
|
||||
debug(" ifname: " + params.ifname);
|
||||
debug(" ip: " + params.ip);
|
||||
debug(" link: " + params.link);
|
||||
debug(" prefix: " + params.prefix);
|
||||
debug(" wifiStartIp: " + params.wifiStartIp);
|
||||
debug(" wifiEndIp: " + params.wifiEndIp);
|
||||
debug(" usbStartIp: " + params.usbStartIp);
|
||||
debug(" usbEndIp: " + params.usbEndIp);
|
||||
debug(" dnsserver1: " + params.dns1);
|
||||
debug(" dnsserver2: " + params.dns2);
|
||||
debug(" internalIfname: " + params.internalIfname);
|
||||
debug(" externalIfname: " + params.externalIfname);
|
||||
if (type == "WIFI") {
|
||||
debug(" wifictrlinterfacename: " + params.wifictrlinterfacename);
|
||||
debug(" ssid: " + params.ssid);
|
||||
debug(" security: " + params.security);
|
||||
debug(" key: " + params.key);
|
||||
}
|
||||
}
|
||||
|
||||
function chain(params, funcs, onError) {
|
||||
let i = -1;
|
||||
let f = funcs[i];
|
||||
function next(error, result) {
|
||||
params.resultCode = result.code;
|
||||
params.resultReason = result.reason;
|
||||
if (error) {
|
||||
if (onError) {
|
||||
params.error = error;
|
||||
params.state = f.name;
|
||||
onError(params);
|
||||
}
|
||||
return;
|
||||
}
|
||||
i += 1;
|
||||
f = funcs[i];
|
||||
if (f) {
|
||||
let ret = f(params, next);
|
||||
if (!ret && onError) {
|
||||
params.error = true;
|
||||
params.state = f.name;
|
||||
onError(params);
|
||||
}
|
||||
}
|
||||
};
|
||||
next(null, {code: NETD_COMMAND_ERROR, reason: ""});
|
||||
}
|
||||
|
||||
let gWifiEnableChain = [wifiFirmwareReload,
|
||||
startAccessPointDriver,
|
||||
setAccessPoint,
|
||||
startSoftAP,
|
||||
setInterfaceUp,
|
||||
tetherInterface,
|
||||
setIpForwardingEnabled,
|
||||
tetheringStatus,
|
||||
startTethering,
|
||||
setDnsForwarders,
|
||||
enableNat,
|
||||
wifiTetheringSuccess];
|
||||
|
||||
let gWifiDisableChain = [stopSoftAP,
|
||||
stopAccessPointDriver,
|
||||
wifiFirmwareReload,
|
||||
untetherInterface,
|
||||
preTetherInterfaceList,
|
||||
postTetherInterfaceList,
|
||||
disableNat,
|
||||
setIpForwardingEnabled,
|
||||
stopTethering,
|
||||
wifiTetheringSuccess];
|
||||
|
||||
/**
|
||||
* handling main thread's enable/disable WiFi Tethering request
|
||||
*/
|
||||
function setWifiTethering(params) {
|
||||
let enable = params.enable;
|
||||
let interfaceProperties = getIFProperties(params.externalIfname);
|
||||
|
||||
if (interfaceProperties.dns1_str) {
|
||||
params.dns1 = interfaceProperties.dns1_str;
|
||||
}
|
||||
if (interfaceProperties.dns2_str) {
|
||||
params.dns2 = interfaceProperties.dns2_str;
|
||||
}
|
||||
dumpParams(params, "WIFI");
|
||||
|
||||
if (enable) {
|
||||
// Enable Wifi tethering.
|
||||
debug("Starting Wifi Tethering on " +
|
||||
params.internalIfname + "<->" + params.externalIfname);
|
||||
chain(params, gWifiEnableChain, wifiTetheringFail);
|
||||
} else {
|
||||
// Disable Wifi tethering.
|
||||
debug("Stopping Wifi Tethering on " +
|
||||
params.internalIfname + "<->" + params.externalIfname);
|
||||
chain(params, gWifiDisableChain, wifiTetheringFail);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
let gUpdateUpStreamChain = [cleanUpStream,
|
||||
createUpStream,
|
||||
updateUpStreamSuccess];
|
||||
/**
|
||||
* handling upstream interface change event.
|
||||
*/
|
||||
function updateUpStream(params) {
|
||||
chain(params, gUpdateUpStreamChain, updateUpStreamFail);
|
||||
}
|
||||
|
||||
let gUSBEnableChain = [setInterfaceUp,
|
||||
enableNat,
|
||||
setIpForwardingEnabled,
|
||||
tetherInterface,
|
||||
tetheringStatus,
|
||||
startTethering,
|
||||
setDnsForwarders,
|
||||
usbTetheringSuccess];
|
||||
|
||||
let gUSBDisableChain = [untetherInterface,
|
||||
preTetherInterfaceList,
|
||||
postTetherInterfaceList,
|
||||
disableNat,
|
||||
setIpForwardingEnabled,
|
||||
stopTethering,
|
||||
usbTetheringSuccess];
|
||||
|
||||
/**
|
||||
* handling main thread's enable/disable USB Tethering request
|
||||
*/
|
||||
function setUSBTethering(params) {
|
||||
let enable = params.enable;
|
||||
let interfaceProperties = getIFProperties(params.externalIfname);
|
||||
|
||||
if (interfaceProperties.dns1_str) {
|
||||
params.dns1 = interfaceProperties.dns1_str;
|
||||
}
|
||||
if (interfaceProperties.dns2_str) {
|
||||
params.dns2 = interfaceProperties.dns2_str;
|
||||
}
|
||||
|
||||
dumpParams(params, "USB");
|
||||
|
||||
if (enable) {
|
||||
// Enable USB tethering.
|
||||
debug("Starting USB Tethering on " +
|
||||
params.internalIfname + "<->" + params.externalIfname);
|
||||
chain(params, gUSBEnableChain, usbTetheringFail);
|
||||
} else {
|
||||
// Disable USB tetehring.
|
||||
debug("Stopping USB Tethering on " +
|
||||
params.internalIfname + "<->" + params.externalIfname);
|
||||
chain(params, gUSBDisableChain, usbTetheringFail);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
let gNetworkInterfaceEnableAlarmChain = [enableAlarm,
|
||||
setQuota,
|
||||
setAlarm,
|
||||
networkInterfaceAlarmSuccess];
|
||||
|
||||
function enableNetworkInterfaceAlarm(params) {
|
||||
debug("enableNetworkInterfaceAlarms: " + params.ifname);
|
||||
|
||||
chain(params, gNetworkInterfaceEnableAlarmChain, networkInterfaceAlarmFail);
|
||||
return true;
|
||||
}
|
||||
|
||||
let gNetworkInterfaceDisableAlarmChain = [removeQuota,
|
||||
disableAlarm,
|
||||
networkInterfaceAlarmSuccess];
|
||||
|
||||
function disableNetworkInterfaceAlarm(params) {
|
||||
debug("disableNetworkInterfaceAlarms: " + params.ifname);
|
||||
|
||||
chain(params, gNetworkInterfaceDisableAlarmChain, networkInterfaceAlarmFail);
|
||||
return true;
|
||||
}
|
||||
|
||||
let gNetworkInterfaceSetAlarmChain = [setAlarm,
|
||||
networkInterfaceAlarmSuccess];
|
||||
|
||||
function setNetworkInterfaceAlarm(params) {
|
||||
debug("setNetworkInterfaceAlarms: " + params.ifname);
|
||||
|
||||
chain(params, gNetworkInterfaceSetAlarmChain, networkInterfaceAlarmFail);
|
||||
return true;
|
||||
}
|
||||
|
||||
let gWifiOperationModeChain = [wifiFirmwareReload,
|
||||
wifiOperationModeSuccess];
|
||||
|
||||
/**
|
||||
* handling main thread's reload Wifi firmware request
|
||||
*/
|
||||
function setWifiOperationMode(params) {
|
||||
debug("setWifiOperationMode: " + params.ifname + " " + params.mode);
|
||||
chain(params, gWifiOperationModeChain, wifiOperationModeFail);
|
||||
return true;
|
||||
}
|
||||
|
||||
let debug;
|
||||
if (DEBUG) {
|
||||
debug = function(s) {
|
||||
dump("Network Worker: " + s + "\n");
|
||||
};
|
||||
} else {
|
||||
debug = function(s) {};
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
/* 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/. */
|
||||
|
||||
#include "nsISupports.idl"
|
||||
|
||||
[scriptable, uuid(98e31d3b-6cad-4cab-b4b3-4afff566ea65)]
|
||||
interface nsINetworkEventListener : nsISupports {
|
||||
void onEvent(in jsval result);
|
||||
};
|
||||
|
||||
[scriptable, uuid(f9d9c694-0aac-4f9a-98ac-7788f954239a)]
|
||||
interface nsINetworkWorker : nsISupports {
|
||||
void start(in nsINetworkEventListener listener);
|
||||
void shutdown();
|
||||
[implicit_jscontext]
|
||||
void postMessage(in jsval options);
|
||||
};
|
|
@ -31,6 +31,8 @@ interface DummyInterface : EventTarget {
|
|||
void AppNotificationServiceOptions(optional AppNotificationServiceOptions arg);
|
||||
void AppInfo(optional AppInfo arg1);
|
||||
void DOMFileMetadataParameters(optional DOMFileMetadataParameters arg);
|
||||
void NetworkOptions(optional NetworkCommandOptions arg1,
|
||||
optional NetworkResultOptions arg2);
|
||||
};
|
||||
|
||||
interface DummyInterfaceWorkers {
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
/* 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/. */
|
||||
|
||||
/**
|
||||
* This dictionnary holds the parameters sent to the network worker.
|
||||
*/
|
||||
dictionary NetworkCommandOptions
|
||||
{
|
||||
long id = 0; // opaque id.
|
||||
DOMString cmd = ""; // the command name.
|
||||
DOMString ifname; // for "removeNetworkRoute", "setDNS",
|
||||
// "setDefaultRouteAndDNS", "removeDefaultRoute"
|
||||
// "addHostRoute", "removeHostRoute"
|
||||
// "removeHostRoutes".
|
||||
DOMString ip; // for "removeNetworkRoute", "setWifiTethering".
|
||||
DOMString netmask; // for "removeNetworkRoute".
|
||||
DOMString dns1_str; // for "setDNS", "setDefaultRouteAndDNS".
|
||||
DOMString dns2_str; // for "setDNS", "setDefaultRouteAndDNS".
|
||||
DOMString oldIfname; // for "setDefaultRouteAndDNS".
|
||||
DOMString gateway_str; // for "setDefaultRouteAndDNS".
|
||||
DOMString gateway; // for "addHostRoute", "removeHostRoute".
|
||||
sequence<DOMString> hostnames; // for "addHostRoute", "removeHostRoute".
|
||||
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".
|
||||
DOMString prefix; // for "setWifiTethering", "setDhcpServer".
|
||||
DOMString link; // for "setWifiTethering", "setDhcpServer".
|
||||
sequence<DOMString> interfaceList; // for "setWifiTethering".
|
||||
DOMString wifiStartIp; // for "setWifiTethering".
|
||||
DOMString wifiEndIp; // for "setWifiTethering".
|
||||
DOMString usbStartIp; // for "setWifiTethering".
|
||||
DOMString usbEndIp; // for "setWifiTethering".
|
||||
DOMString dns1; // for "setWifiTethering".
|
||||
DOMString dns2; // for "setWifiTethering".
|
||||
float rxBytes; // for "getNetworkInterfaceStats".
|
||||
float txBytes; // for "getNetworkInterfaceStats".
|
||||
DOMString date; // for "getNetworkInterfaceStats".
|
||||
long threshold; // for "setNetworkInterfaceAlarm",
|
||||
// "enableNetworkInterfaceAlarm".
|
||||
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".
|
||||
};
|
||||
|
||||
/**
|
||||
* This dictionary holds the parameters sent back to NetworkService.js.
|
||||
*/
|
||||
dictionary NetworkResultOptions
|
||||
{
|
||||
long id = 0; // opaque id.
|
||||
boolean ret = false; // for sync command.
|
||||
boolean broadcast = false; // for netd broadcast message.
|
||||
DOMString topic = ""; // for netd broadcast message.
|
||||
DOMString reason = ""; // for netd broadcast message.
|
||||
|
||||
long resultCode = 0; // for all commands.
|
||||
DOMString resultReason = ""; // for all commands.
|
||||
boolean error = false; // for all commands.
|
||||
|
||||
float rxBytes = -1; // for "getNetworkInterfaceStats".
|
||||
float txBytes = -1; // for "getNetworkInterfaceStats".
|
||||
DOMString date = ""; // for "getNetworkInterfaceStats".
|
||||
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".
|
||||
};
|
|
@ -239,6 +239,7 @@ WEBIDL_FILES = [
|
|||
'MutationEvent.webidl',
|
||||
'MutationObserver.webidl',
|
||||
'NetDashboard.webidl',
|
||||
'NetworkOptions.webidl',
|
||||
'Node.webidl',
|
||||
'NodeFilter.webidl',
|
||||
'NodeIterator.webidl',
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <cutils/properties.h>
|
||||
#include "prinit.h"
|
||||
#include "js/CharacterEncoding.h"
|
||||
#include "NetUtils.h"
|
||||
#include "mozilla/dom/network/NetUtils.h"
|
||||
|
||||
using namespace mozilla::dom;
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#include "nsString.h"
|
||||
#include "nsAutoPtr.h"
|
||||
#include "mozilla/dom/WifiOptionsBinding.h"
|
||||
#include "NetUtils.h"
|
||||
#include "mozilla/dom/network/NetUtils.h"
|
||||
#include "nsCxPusher.h"
|
||||
|
||||
// Needed to add a copy constructor to WifiCommandOptions.
|
||||
|
|
|
@ -33,7 +33,6 @@ EXTRA_JS_MODULES += [
|
|||
|
||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
||||
SOURCES = [
|
||||
'NetUtils.cpp',
|
||||
'WifiProxyService.cpp',
|
||||
'WifiUtils.cpp',
|
||||
]
|
||||
|
|
|
@ -249,6 +249,7 @@ XUL_MODULES
|
|||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
MODULE(WifiProxyServiceModule)
|
||||
MODULE(NetworkWorkerModule)
|
||||
#endif
|
||||
|
||||
#undef MODULE
|
||||
|
@ -260,6 +261,7 @@ extern const mozilla::Module *const *const kPStaticModules[] = {
|
|||
XUL_MODULES
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
MODULE(WifiProxyServiceModule)
|
||||
MODULE(NetworkWorkerModule)
|
||||
#endif
|
||||
nullptr
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче