Add enable/disable control of USB networking
diff --git a/Android.mk b/Android.mk
index ce73697..1b53293 100644
--- a/Android.mk
+++ b/Android.mk
@@ -20,7 +20,8 @@
NatController.cpp \
PppController.cpp \
PanController.cpp \
- SoftapController.cpp
+ SoftapController.cpp \
+ UsbController.cpp
LOCAL_MODULE:= netd
diff --git a/CommandListener.cpp b/CommandListener.cpp
index 0bbab15..d233699 100644
--- a/CommandListener.cpp
+++ b/CommandListener.cpp
@@ -45,6 +45,7 @@
PppController *CommandListener::sPppCtrl = NULL;
PanController *CommandListener::sPanCtrl = NULL;
SoftapController *CommandListener::sSoftapCtrl = NULL;
+UsbController *CommandListener::sUsbCtrl = NULL;
CommandListener::CommandListener() :
FrameworkListener("netd") {
@@ -56,6 +57,7 @@
registerCmd(new PppdCmd());
registerCmd(new PanCmd());
registerCmd(new SoftapCmd());
+ registerCmd(new UsbCmd());
if (!sTetherCtrl)
sTetherCtrl = new TetherController();
@@ -67,6 +69,8 @@
sPanCtrl = new PanController();
if (!sSoftapCtrl)
sSoftapCtrl = new SoftapController();
+ if (!sUsbCtrl)
+ sUsbCtrl = new UsbController();
}
CommandListener::InterfaceCmd::InterfaceCmd() :
@@ -516,3 +520,41 @@
return 0;
}
+
+CommandListener::UsbCmd::UsbCmd() :
+ NetdCommand("usb") {
+}
+
+int CommandListener::UsbCmd::runCommand(SocketClient *cli, int argc, char **argv) {
+ int rc = 0;
+
+ if (argc < 2) {
+ cli->sendMsg(ResponseCode::CommandSyntaxError, "Usb Missing argument", false);
+ return 0;
+ }
+
+ if (!strcmp(argv[1], "startrndis")) {
+ rc = sUsbCtrl->startRNDIS();
+ } else if (!strcmp(argv[1], "stoprndis")) {
+ rc = sUsbCtrl->stopRNDIS();
+ } else if (!strcmp(argv[1], "rndisstatus")) {
+ char *tmp = NULL;
+
+ asprintf(&tmp, "Usb RNDIS %s",
+ (sUsbCtrl->isRNDISStarted() ? "started" : "stopped"));
+ cli->sendMsg(ResponseCode::UsbRNDISStatusResult, tmp, false);
+ free(tmp);
+ return 0;
+ } else {
+ cli->sendMsg(ResponseCode::CommandSyntaxError, "Usb Unknown cmd", false);
+ return 0;
+ }
+
+ if (!rc) {
+ cli->sendMsg(ResponseCode::CommandOkay, "Usb operation succeeded", false);
+ } else {
+ cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true);
+ }
+
+ return 0;
+}
diff --git a/CommandListener.h b/CommandListener.h
index 82bebdd..4dc77f9 100644
--- a/CommandListener.h
+++ b/CommandListener.h
@@ -25,6 +25,7 @@
#include "PppController.h"
#include "PanController.h"
#include "SoftapController.h"
+#include "UsbController.h"
class CommandListener : public FrameworkListener {
static TetherController *sTetherCtrl;
@@ -32,6 +33,7 @@
static PppController *sPppCtrl;
static PanController *sPanCtrl;
static SoftapController *sSoftapCtrl;
+ static UsbController *sUsbCtrl;
public:
CommandListener();
@@ -39,6 +41,13 @@
private:
+ class UsbCmd : public NetdCommand {
+ public:
+ UsbCmd();
+ virtual ~UsbCmd() {}
+ int runCommand(SocketClient *c, int argc, char ** argv);
+ };
+
class SoftapCmd : public NetdCommand {
public:
SoftapCmd();
diff --git a/UsbController.cpp b/UsbController.cpp
new file mode 100644
index 0000000..9f4f7ae
--- /dev/null
+++ b/UsbController.cpp
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#define LOG_TAG "UsbController"
+#include <cutils/log.h>
+
+#include "UsbController.h"
+
+
+UsbController::UsbController() {
+}
+
+UsbController::~UsbController() {
+}
+
+int UsbController::startRNDIS() {
+ LOGD("Usb RNDIS start");
+ return enableRNDIS(true);
+}
+
+int UsbController::stopRNDIS() {
+ LOGD("Usb RNDIS stop");
+ return enableRNDIS(false);
+}
+
+int UsbController::enableRNDIS(bool enable) {
+ char value[20];
+ int fd = open("/sys/class/usb_composite/rndis/enable", O_RDWR);
+ int count = snprintf(value, sizeof(value), "%d\n", (enable ? 1 : 0));
+ write(fd, value, count);
+ return 0;
+}
+
+bool UsbController::isRNDISStarted() {
+ char value=0;
+ int fd = open("/sys/class/usb_composite/rndis/enable", O_RDWR);
+ read(fd, &value, 1);
+ return (value == 1 ? true : false);
+}
diff --git a/UsbController.h b/UsbController.h
new file mode 100644
index 0000000..2de4bfa
--- /dev/null
+++ b/UsbController.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _USB_CONTROLLER_H
+#define _USB_CONTROLLER_H
+
+#include <linux/in.h>
+
+
+class UsbController {
+
+public:
+ UsbController();
+ virtual ~UsbController();
+
+ int startRNDIS();
+ int stopRNDIS();
+ bool isRNDISStarted();
+
+private:
+ int enableRNDIS(bool enable);
+};
+
+#endif