From 3e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3 Mon Sep 17 00:00:00 2001 From: Robert Greenwalt Date: Thu, 18 Feb 2010 10:54:08 -0800 Subject: [PATCH] Add enable/disable control of USB networking --- Android.mk | 3 ++- CommandListener.cpp | 42 +++++++++++++++++++++++++++++++++++++ CommandListener.h | 9 ++++++++ UsbController.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ UsbController.h | 37 +++++++++++++++++++++++++++++++++ 5 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 UsbController.cpp create mode 100644 UsbController.h diff --git a/Android.mk b/Android.mk index ce73697..1b53293 100644 --- a/Android.mk +++ b/Android.mk @@ -20,7 +20,8 @@ LOCAL_SRC_FILES:= \ 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 @@ 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; +} 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 @@ 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 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 +#include +#include + + +#include +#include + +#define LOG_TAG "UsbController" +#include + +#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 + + +class UsbController { + +public: + UsbController(); + virtual ~UsbController(); + + int startRNDIS(); + int stopRNDIS(); + bool isRNDISStarted(); + +private: + int enableRNDIS(bool enable); +}; + +#endif -- 2.11.0