OSDN Git Service

am a47ea0b4: am 667c4771: Add a socket mark parameter to tethering DNS commands.
authorLorenzo Colitti <lorenzo@google.com>
Wed, 3 Sep 2014 09:14:15 +0000 (09:14 +0000)
committerAndroid Git Automerger <android-git-automerger@android.com>
Wed, 3 Sep 2014 09:14:15 +0000 (09:14 +0000)
* commit 'a47ea0b4e4e40c8ee184fe1b53faf255bee29b44':
  Add a socket mark parameter to tethering DNS commands.

server/CommandListener.cpp
server/ResponseCode.h
server/TetherController.cpp
server/TetherController.h

index b946492..e03a5fc 100644 (file)
@@ -536,6 +536,10 @@ int CommandListener::TetherCmd::runCommand(SocketClient *cli,
                 cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false);
             }
         } else if (!strcmp(argv[1], "dns") && !strcmp(argv[2], "list")) {
+            char netIdStr[UINT32_STRLEN];
+            snprintf(netIdStr, sizeof(netIdStr), "%u", sTetherCtrl->getDnsNetId());
+            cli->sendMsg(ResponseCode::TetherDnsFwdNetIdResult, netIdStr, false);
+
             NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders();
             NetAddressCollection::iterator it;
 
@@ -584,7 +588,12 @@ int CommandListener::TetherCmd::runCommand(SocketClient *cli,
             }
         } else if (!strcmp(argv[1], "dns")) {
             if (!strcmp(argv[2], "set")) {
-                rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3);
+                if (argc < 5) {
+                    cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false);
+                    return 0;
+                }
+                unsigned netId = stringToNetId(argv[3]);
+                rc = sTetherCtrl->setDnsForwarders(netId, &argv[4], argc - 4);
             /* else if (!strcmp(argv[2], "list")) handled above */
             } else {
                 cli->sendMsg(ResponseCode::CommandParameterError,
index c623acd..6a0c22c 100644 (file)
@@ -29,6 +29,7 @@ public:
     static const int TetherDnsFwdTgtListResult = 112;
     static const int TtyListResult             = 113;
     static const int TetheringStatsListResult  = 114;
+    static const int TetherDnsFwdNetIdResult   = 115;
 
     // 200 series - Requested action has been successfully completed
     static const int CommandOkay               = 200;
index fbee5a2..fb51c06 100644 (file)
 #include <cutils/log.h>
 #include <cutils/properties.h>
 
+#include "Fwmark.h"
 #include "NetdConstants.h"
+#include "Permission.h"
 #include "TetherController.h"
 
 TetherController::TetherController() {
     mInterfaces = new InterfaceCollection();
+    mDnsNetId = 0;
     mDnsForwarders = new NetAddressCollection();
     mDaemonFd = -1;
     mDaemonPid = 0;
@@ -197,16 +200,22 @@ bool TetherController::isTetheringStarted() {
 
 #define MAX_CMD_SIZE 1024
 
-int TetherController::setDnsForwarders(char **servers, int numServers) {
+int TetherController::setDnsForwarders(unsigned netId, char **servers, int numServers) {
     int i;
     char daemonCmd[MAX_CMD_SIZE];
 
-    strcpy(daemonCmd, "update_dns");
+    Fwmark fwmark;
+    fwmark.netId = netId;
+    fwmark.explicitlySelected = true;
+    fwmark.protectedFromVpn = true;
+    fwmark.permission = PERMISSION_SYSTEM;
+
+    snprintf(daemonCmd, sizeof(daemonCmd), "update_dns:0x%x", fwmark.intValue);
     int cmdLen = strlen(daemonCmd);
 
     mDnsForwarders->clear();
     for (i = 0; i < numServers; i++) {
-        ALOGD("setDnsForwarders(%d = '%s')", i, servers[i]);
+        ALOGD("setDnsForwarders(0x%x %d = '%s')", fwmark.intValue, i, servers[i]);
 
         struct in_addr a;
 
@@ -227,6 +236,7 @@ int TetherController::setDnsForwarders(char **servers, int numServers) {
         mDnsForwarders->push_back(a);
     }
 
+    mDnsNetId = netId;
     if (mDaemonFd != -1) {
         ALOGD("Sending update msg to dnsmasq [%s]", daemonCmd);
         if (write(mDaemonFd, daemonCmd, strlen(daemonCmd) +1) < 0) {
@@ -238,6 +248,10 @@ int TetherController::setDnsForwarders(char **servers, int numServers) {
     return 0;
 }
 
+unsigned TetherController::getDnsNetId() {
+    return mDnsNetId;
+}
+
 NetAddressCollection *TetherController::getDnsForwarders() {
     return mDnsForwarders;
 }
index 4da10b0..1c32627 100644 (file)
@@ -26,6 +26,9 @@ typedef android::netd::List<struct in_addr> NetAddressCollection;
 
 class TetherController {
     InterfaceCollection  *mInterfaces;
+    // NetId to use for forwarded DNS queries. This may not be the default
+    // network, e.g., in the case where we are tethering to a DUN APN.
+    unsigned              mDnsNetId;
     NetAddressCollection *mDnsForwarders;
     pid_t                 mDaemonPid;
     int                   mDaemonFd;
@@ -42,7 +45,8 @@ public:
     int stopTethering();
     bool isTetheringStarted();
 
-    int setDnsForwarders(char **servers, int numServers);
+    unsigned getDnsNetId();
+    int setDnsForwarders(unsigned netId, char **servers, int numServers);
     NetAddressCollection *getDnsForwarders();
 
     int tetherInterface(const char *interface);