OSDN Git Service

Add enable/disable control of USB networking
authorRobert Greenwalt <robdroid@android.com>
Thu, 18 Feb 2010 18:54:08 +0000 (10:54 -0800)
committerRobert Greenwalt <robdroid@android.com>
Thu, 18 Feb 2010 18:54:08 +0000 (10:54 -0800)
Android.mk
CommandListener.cpp
CommandListener.h
UsbController.cpp [new file with mode: 0644]
UsbController.h [new file with mode: 0644]

index ce73697..1b53293 100644 (file)
@@ -20,7 +20,8 @@ LOCAL_SRC_FILES:=                                      \
                   NatController.cpp                    \
                   PppController.cpp                    \
                   PanController.cpp                    \
-                  SoftapController.cpp
+                  SoftapController.cpp                 \
+                  UsbController.cpp
 
 LOCAL_MODULE:= netd
 
index 0bbab15..d233699 100644 (file)
@@ -45,6 +45,7 @@ NatController *CommandListener::sNatCtrl = NULL;
 PppController *CommandListener::sPppCtrl = NULL;
 PanController *CommandListener::sPanCtrl = NULL;
 SoftapController *CommandListener::sSoftapCtrl = NULL;
+UsbController *CommandListener::sUsbCtrl = NULL;
 
 CommandListener::CommandListener() :
                  FrameworkListener("netd") {
@@ -56,6 +57,7 @@ CommandListener::CommandListener() :
     registerCmd(new PppdCmd());
     registerCmd(new PanCmd());
     registerCmd(new SoftapCmd());
+    registerCmd(new UsbCmd());
 
     if (!sTetherCtrl)
         sTetherCtrl = new TetherController();
@@ -67,6 +69,8 @@ CommandListener::CommandListener() :
         sPanCtrl = new PanController();
     if (!sSoftapCtrl)
         sSoftapCtrl = new SoftapController();
+    if (!sUsbCtrl)
+        sUsbCtrl = new UsbController();
 }
 
 CommandListener::InterfaceCmd::InterfaceCmd() :
@@ -516,3 +520,41 @@ int CommandListener::SoftapCmd::runCommand(SocketClient *cli,
 
     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;
+}
index 82bebdd..4dc77f9 100644 (file)
@@ -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 @@ class CommandListener : public FrameworkListener {
     static PppController *sPppCtrl;
     static PanController *sPanCtrl;
     static SoftapController *sSoftapCtrl;
+    static UsbController *sUsbCtrl;
 
 public:
     CommandListener();
@@ -39,6 +41,13 @@ public:
 
 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 (file)
index 0000000..9f4f7ae
--- /dev/null
@@ -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 (file)
index 0000000..2de4bfa
--- /dev/null
@@ -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