if (!strcmp(argv[1], "stop")) {
rc = sTetherCtrl->stopTethering();
+ } else if(!strcmp(argv[1], "start-reverse")) {
+ LOGD("CommandListener::TetherCmd::run, call startReverseTethering, iface:%s", argv[2]);
+ sTetherCtrl->startReverseTethering(argv[2]);
+ } else if (!strcmp(argv[1], "stop-reverse")) {
+ LOGD("CommandListener::TetherCmd::run, call stopReverseTethering");
+ rc = sTetherCtrl->stopReverseTethering();
} else if (!strcmp(argv[1], "status")) {
char *tmp = NULL;
mDnsForwarders = new NetAddressCollection();
mDaemonFd = -1;
mDaemonPid = 0;
+ mDhcpcdPid = 0;
}
TetherController::~TetherController() {
ALOGD("Tethering services stopped");
return 0;
}
+int TetherController::startReverseTethering(const char* iface) {
+ if (mDhcpcdPid != 0) {
+ LOGE("Reverse tethering already started");
+ errno = EBUSY;
+ return -1;
+ }
+
+ LOGD("TetherController::startReverseTethering, Starting reverse tethering");
+
+ /*
+ * TODO: Create a monitoring thread to handle and restart
+ * the daemon if it exits prematurely
+ */
+ //cleanup the dhcp result
+ char dhcp_result_name[64];
+ snprintf(dhcp_result_name, sizeof(dhcp_result_name) - 1, "dhcp.%s.result", iface);
+ property_set(dhcp_result_name, "");
+
+ pid_t pid;
+ if ((pid = fork()) < 0) {
+ LOGE("fork failed (%s)", strerror(errno));
+ return -1;
+ }
+
+ if (!pid) {
+ char *args[10];
+ int argc = 0;
+ args[argc++] = "/system/bin/dhcpcd";
+ char host_name[128];
+ if (property_get("net.hostname", host_name, NULL) && (host_name[0] != '\0'))
+ {
+ args[argc++] = "-h";
+ args[argc++] = host_name;
+ }
+ args[argc++] = (char*)iface;
+ args[argc] = NULL;
+ if (execv(args[0], args)) {
+ LOGE("startReverseTethering, execv failed (%s)", strerror(errno));
+ }
+ LOGE("startReverseTethering, Should never get here!");
+ return 0;
+ } else {
+ mDhcpcdPid = pid;
+ LOGD("Reverse Tethering running, pid:%d", pid);
+ }
+ return 0;
+}
+int TetherController::stopReverseTethering() {
+
+ if (mDhcpcdPid == 0) {
+ LOGE("Tethering already stopped");
+ return 0;
+ }
+
+ LOGD("Stopping tethering services");
+
+ kill(mDhcpcdPid, SIGTERM);
+ waitpid(mDhcpcdPid, NULL, 0);
+ mDhcpcdPid = 0;
+ LOGD("Tethering services stopped");
+ return 0;
+}
bool TetherController::isTetheringStarted() {
return (mDaemonPid == 0 ? false : true);
}
InterfaceCollection *mInterfaces;
NetAddressCollection *mDnsForwarders;
pid_t mDaemonPid;
+ pid_t mDhcpcdPid;
int mDaemonFd;
public:
int stopTethering();
bool isTetheringStarted();
+ int startReverseTethering(const char* iface);
+ int stopReverseTethering();
+
int setDnsForwarders(char **servers, int numServers);
NetAddressCollection *getDnsForwarders();