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);