Bug 864931 - Rewrite net worker in C++. r=fabrice, r=vchang

This commit is contained in:
Dimi Lee 2014-01-29 19:38:50 +08:00
Родитель f06445241f
Коммит 9f240876a9
19 изменённых файлов: 2320 добавлений и 1176 удалений

Просмотреть файл

@ -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,
@ -54,7 +65,7 @@ public:
#define USE_DLFUNC(name) \
FUNC##name name = (FUNC##name) dlsym(GetSharedLibrary(), #name); \
if (!name) { \
MOZ_ASSUME_UNREACHABLE("Symbol not found in shared library : " #name); \
MOZ_ASSUME_UNREACHABLE("Symbol not found in shared library : " #name); \
}
#endif // NetUtils_h

Просмотреть файл

@ -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
};