frameworks\base\core\java\android\net\EthernetManager.java

public boolean setEthernetEnabled(boolean enabled) {        Log.d(TAG,enabled ? "turn on Ethernet" : "turn off Ethernet");        try {            return mService.setEthernetEnabled(enabled);        } catch (RemoteException e) {            return false;        }    }

frameworks\opt\net\ethernet\java\com\android\server\ethernet\EthernetService.java

EthernetServiceImpl.java

public boolean setEthernetEnabled(boolean enable) {        //enforceChangePermission();        Log.i(TAG,"setEthernetEnabled() : enable="+enable);        if ( enable ) {           return mTracker.setInterfaceUp();        } else {           return mTracker.setInterfaceDown();         }    }

EthernetNetworkFactory.java

public boolean setInterfaceUp() {       try {           if(!TextUtils.isEmpty(mIface)) {               mNMService.setInterfaceUp(mIface);               sendEthIfaceStateChangedBroadcast(EthernetManager.ETHER_IFACE_STATE_UP);               return true;           }           else              Log.e(TAG,"mIface is null");        }catch (Exception e) {            Log.e(TAG, "Error downing interface " + mIface + ": " + e);        }      return false;    }

\frameworks\base\services\core\java\com\android\server\NetworkManagementService.java

    public void setInterfaceUp(String iface) {        mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);        final InterfaceConfiguration ifcg = getInterfaceConfig(iface);        ifcg.setInterfaceUp();        setInterfaceConfig(iface, ifcg);    }            public void setInterfaceConfig(String iface, InterfaceConfiguration cfg) {        mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);        LinkAddress linkAddr = cfg.getLinkAddress();        if (linkAddr == null || linkAddr.getAddress() == null) {            throw new IllegalStateException("Null LinkAddress given");        }        final Command cmd = new Command("interface", "setcfg", iface,                linkAddr.getAddress().getHostAddress(),                linkAddr.getPrefixLength());        for (String flag : cfg.getFlags()) {            cmd.appendArg(flag);        }        try {            mConnector.execute(cmd);        } catch (NativeDaemonConnectorException e) {            throw e.rethrowAsParcelableException();        }    }    

system\netd\server\CommandListener.cpp

CommandListener::InterfaceCmd::InterfaceCmd() :                 NetdCommand("interface") {}int CommandListener::InterfaceCmd::runCommand(SocketClient *cli,                                                      int argc, char **argv) {           else if (!strcmp(argv[1], "setcfg")) {            // arglist: iface [addr prefixLength] flags            if (argc < 4) {                cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false);                return 0;            }            ALOGD("Setting iface cfg");            struct in_addr addr;            int index = 5;            ifc_init();            if (!inet_aton(argv[3], &addr)) {                // Handle flags only case                index = 3;            } else {                if (ifc_set_addr(argv[2], addr.s_addr)) {                    cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true);                    ifc_close();                    return 0;                }                // Set prefix length on a non zero address                if (addr.s_addr != 0 && ifc_set_prefixLength(argv[2], atoi(argv[4]))) {                   cli->sendMsg(ResponseCode::OperationFailed, "Failed to set prefixLength", true);                   ifc_close();                   return 0;               }            }            /* Process flags */            for (int i = index; i < argc; i++) {                char *flag = argv[i];                if (!strcmp(flag, "up")) {                    ALOGD("Trying to bring up %s", argv[2]);                    if (ifc_up(argv[2])) {                        ALOGE("Error upping interface");                        cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true);                        ifc_close();                        return 0;                    }                } else if (!strcmp(flag, "down")) {                    ALOGD("Trying to bring down %s", argv[2]);                    if (ifc_down(argv[2])) {                        ALOGE("Error downing interface");                        cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true);                        ifc_close();                        return 0;                    }                } else if (!strcmp(flag, "broadcast")) {                    // currently ignored                } else if (!strcmp(flag, "multicast")) {                    // currently ignored                } else if (!strcmp(flag, "running")) {                    // currently ignored                } else if (!strcmp(flag, "loopback")) {                    // currently ignored                } else if (!strcmp(flag, "point-to-point")) {                    // currently ignored                } else {                    cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false);                    ifc_close();                    return 0;                }            }            cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false);            ifc_close();            return 0;    }    return 0;}

system\core\libnetutils\ifc_utils.c
发送命令到内核;

int ifc_up(const char *name){    int ret = ifc_set_flags(name, IFF_UP, 0);    if (DBG) printerr("ifc_up(%s) = %d", name, ret);    return ret;}static int ifc_set_flags(const char *name, unsigned set, unsigned clr){    struct ifreq ifr;    ifc_init_ifr(name, &ifr);    if(ioctl(ifc_ctl_sock, SIOCGIFFLAGS, &ifr) < 0) return -1;    ifr.ifr_flags = (ifr.ifr_flags & (~clr)) | set;    return ioctl(ifc_ctl_sock, SIOCSIFFLAGS, &ifr);}

更多相关文章

  1. 修改Android系统目录的读写权限命令
  2. Android shell 下 busybox,clear,tcpdump、、众多命令的移植
  3. Android内核开发:序
  4. 从.Net到Android之八:Android宏内核和微内核
  5. 如何编译Android内核源码
  6. Android环境变量作用--命令行操作(ADB、AVD等)
  7. Android AM命令行启动程序的方法
  8. Andorid adb 命令

随机推荐

  1. Android Hybrid开发入门:原生Android与JS
  2. andriod 源码树
  3. Android(安卓)手机的版本号 和 API 号码
  4. unity打包android全流程
  5. camera V4L2 FIMC
  6. 如何在Android中使用编译好的.so库【转ht
  7. Android初步-HelloWorld
  8. Android(安卓)Handler类
  9. Android 屏幕实现水龙头事件
  10. Android service 启动篇之 bindService