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;
}
} 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,
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;
#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;
#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;
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) {
return 0;
}
+unsigned TetherController::getDnsNetId() {
+ return mDnsNetId;
+}
+
NetAddressCollection *TetherController::getDnsForwarders() {
return mDnsForwarders;
}
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;
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);