/* * 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 <stdio.h> #include <errno.h> #define LOG_TAG "Nexus" #include <cutils/log.h> #include "NetworkManager.h" #include "InterfaceConfig.h" #include "DhcpClient.h" NetworkManager *NetworkManager::sInstance = NULL; NetworkManager *NetworkManager::Instance() { if (!sInstance) sInstance = new NetworkManager(new PropertyManager()); return sInstance; } NetworkManager::NetworkManager(PropertyManager *propMngr) { mBroadcaster = NULL; mControllers = new ControllerCollection(); mPropMngr = propMngr; mDhcp = new DhcpClient(this); } NetworkManager::~NetworkManager() { } int NetworkManager::run() { if (startControllers()) { LOGW("Unable to start all controllers (%s)", strerror(errno)); } return 0; } int NetworkManager::attachController(Controller *c) { mControllers->push_back(c); return 0; } int NetworkManager::startControllers() { int rc = 0; ControllerCollection::iterator i; for (i = mControllers->begin(); i != mControllers->end(); ++i) { int irc = (*i)->start(); LOGD("Controller '%s' start rc = %d", (*i)->getName(), irc); if (irc && !rc) rc = irc; } return rc; } int NetworkManager::stopControllers() { int rc = 0; ControllerCollection::iterator i; for (i = mControllers->begin(); i != mControllers->end(); ++i) { int irc = (*i)->stop(); LOGD("Controller '%s' stop rc = %d", (*i)->getName(), irc); if (irc && !rc) rc = irc; } return rc; } Controller *NetworkManager::findController(const char *name) { ControllerCollection::iterator i; for (i = mControllers->begin(); i != mControllers->end(); ++i) { if (!strcmp((*i)->getName(), name)) return *i; } LOGW("Controller '%s' not found", name); return NULL; } void NetworkManager::onInterfaceConnected(Controller *c, const InterfaceConfig *cfg) { LOGD("Controller %s interface %s connected", c->getName(), c->getBoundInterface()); // Look up the interface if (0) { // already started? } if (cfg) { if (cfg->getUseDhcp() && mDhcp->start(c->getBoundInterface())) { LOGE("DHCP start failed"); } else if (!cfg->getUseDhcp()) { // Static configuration } } else { LOGD("No InterfaceConfig for %s:%s - assuming self-managed", c->getName(), c->getBoundInterface()); } } void NetworkManager::onInterfaceDisconnected(Controller *c, const char *name) { LOGD("Controller %s interface %s disconnected", c->getName(), name); // If we have a DHCP request out on this interface then stop it if (1) { mDhcp->stop(); } }