Fix tethering in the case of a regular upstream connection.
Fixes tethering via Ethernet, Bluetooth and WiFi (hotspot).
Tethering when the upstream has a DUN-specific APN is likely still broken
(untested).
For now, assign a fixed NetId (a hack) until we can change the framework to
create a valid NetworkAgent and all that jazz.
Bug: 15968336
Bug: 14988803
Change-Id: Idcf4d492d9329a9c87913e27be6dd835a792bea2
diff --git a/server/NetworkController.cpp b/server/NetworkController.cpp
index 1487b72..3bc0e70 100644
--- a/server/NetworkController.cpp
+++ b/server/NetworkController.cpp
@@ -32,6 +32,7 @@
#include "NetworkController.h"
+#include "LocalNetwork.h"
#include "PhysicalNetwork.h"
#include "RouteController.h"
#include "VirtualNetwork.h"
@@ -110,6 +111,29 @@
return NETID_UNSET;
}
+unsigned NetworkController::getNetIdForLocalNetwork() const {
+ return MIN_NET_ID - 1;
+}
+
+int NetworkController::createLocalNetwork(unsigned netId) {
+ // TODO: Enable this check after removing the getNetIdForLocalNetwork() hack.
+ if (false) {
+ if (netId < MIN_NET_ID || netId > MAX_NET_ID) {
+ ALOGE("invalid netId %u", netId);
+ return -EINVAL;
+ }
+ }
+
+ if (isValidNetwork(netId)) {
+ ALOGE("duplicate netId %u", netId);
+ return -EEXIST;
+ }
+
+ android::RWLock::AutoWLock lock(mRWLock);
+ mNetworks[netId] = new LocalNetwork(netId);
+ return 0;
+}
+
int NetworkController::createPhysicalNetwork(unsigned netId, Permission permission) {
if (netId < MIN_NET_ID || netId > MAX_NET_ID) {
ALOGE("invalid netId %u", netId);