diff options
author | San Mehat <san@google.com> | 2009-06-22 10:37:54 -0700 |
---|---|---|
committer | San Mehat <san@google.com> | 2009-06-22 10:40:48 -0700 |
commit | 54962e0fd647f5f390269994c573f80c92f537d4 (patch) | |
tree | 8aa823f50710ed0c22af79f97bf186ec63ff0b58 /nexus | |
parent | bfa2f8e9b506a4b710ebcefa7c1e324609b8ca34 (diff) | |
download | core-54962e0fd647f5f390269994c573f80c92f537d4.tar.gz core-54962e0fd647f5f390269994c573f80c92f537d4.tar.bz2 core-54962e0fd647f5f390269994c573f80c92f537d4.zip |
nexus: Add skeleton for DhcpClient
Signed-off-by: San Mehat <san@google.com>
Diffstat (limited to 'nexus')
-rw-r--r-- | nexus/Android.mk | 3 | ||||
-rw-r--r-- | nexus/DhcpClient.cpp | 105 | ||||
-rw-r--r-- | nexus/DhcpClient.h | 41 | ||||
-rw-r--r-- | nexus/DhcpListener.cpp | 34 | ||||
-rw-r--r-- | nexus/DhcpListener.h | 36 | ||||
-rw-r--r-- | nexus/DhcpState.h | 27 | ||||
-rw-r--r-- | nexus/IDhcpEventHandlers.h | 25 |
7 files changed, 270 insertions, 1 deletions
diff --git a/nexus/Android.mk b/nexus/Android.mk index 865f58a87..cd477ef45 100644 --- a/nexus/Android.mk +++ b/nexus/Android.mk @@ -34,7 +34,8 @@ LOCAL_SRC_FILES:= \ SupplicantConnectionTimeoutEvent.cpp \ SupplicantDisconnectedEvent.cpp \ SupplicantStatus.cpp \ - TiwlanEventListener.cpp + TiwlanEventListener.cpp \ + DhcpClient.cpp DhcpListener.cpp \ LOCAL_MODULE:= nexus diff --git a/nexus/DhcpClient.cpp b/nexus/DhcpClient.cpp new file mode 100644 index 000000000..2bd9c68f1 --- /dev/null +++ b/nexus/DhcpClient.cpp @@ -0,0 +1,105 @@ +/* + * 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> +#include <sys/types.h> +#include <arpa/inet.h> + +#define LOG_TAG "DhcpClient" +#include <cutils/log.h> +#include <cutils/properties.h> + +#include <sysutils/ServiceManager.h> + +#include "DhcpClient.h" +#include "DhcpState.h" +#include "DhcpListener.h" +#include "IDhcpEventHandlers.h" + +extern "C" { +int ifc_disable(const char *ifname); +int ifc_add_host_route(const char *ifname, uint32_t addr); +int ifc_remove_host_routes(const char *ifname); +int ifc_set_default_route(const char *ifname, uint32_t gateway); +int ifc_get_default_route(const char *ifname); +int ifc_remove_default_route(const char *ifname); +int ifc_reset_connections(const char *ifname); +int ifc_configure(const char *ifname, in_addr_t ipaddr, in_addr_t netmask, in_addr_t gateway, in_addr_t dns1, in_addr_t dns2); + +int dhcp_do_request(const char *ifname, + in_addr_t *ipaddr, + in_addr_t *gateway, + in_addr_t *mask, + in_addr_t *dns1, + in_addr_t *dns2, + in_addr_t *server, + uint32_t *lease); +int dhcp_stop(const char *ifname); +int dhcp_release_lease(const char *ifname); +char *dhcp_get_errmsg(); +} + +DhcpClient::DhcpClient(IDhcpEventHandlers *handlers) : + mState(DhcpState::STOPPED), mHandlers(handlers) { + mServiceManager = new ServiceManager(); + mListener = NULL; +} + +DhcpClient::~DhcpClient() { + delete mServiceManager; + if (mListener) + delete mListener; +} + +int DhcpClient::start(const char *interface) { + + char svc[PROPERTY_VALUE_MAX]; + snprintf(svc, sizeof(svc), "dhcpcd_ng:%s", interface); + + if (mServiceManager->start(svc)) { + LOGE("Failed to start dhcp service"); + return -1; + } + + mListener = new DhcpListener(mHandlers); + if (mListener->startListener()) { + LOGE("Failed to start listener"); +#if 0 + mServiceManager->stop("dhcpcd_ng"); + return -1; +#endif + delete mListener; + mListener = NULL; + } + + mState = DhcpState::STARTED; + + return 0; +} + +int DhcpClient::stop() { + if (mListener) { + mListener->stopListener(); + delete mListener; + mListener = NULL; + } + + if (mServiceManager->stop("dhcpcd_ng")) + LOGW("Failed to stop DHCP service (%s)", strerror(errno)); + mState = DhcpState::STOPPED; + return 0; +} diff --git a/nexus/DhcpClient.h b/nexus/DhcpClient.h new file mode 100644 index 000000000..e0a2784b5 --- /dev/null +++ b/nexus/DhcpClient.h @@ -0,0 +1,41 @@ + +/* + * 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 _DhcpClient_H +#define _DhcpClient_H + +class IDhcpEventHandlers; +class ServiceManager; +class DhcpListener; + +class DhcpClient { + int mState; + IDhcpEventHandlers *mHandlers; + ServiceManager *mServiceManager; + DhcpListener *mListener; + +public: + DhcpClient(IDhcpEventHandlers *handlers); + virtual ~DhcpClient(); + + int getState() { return mState; } + + int start(const char *interface); + int stop(); +}; + +#endif diff --git a/nexus/DhcpListener.cpp b/nexus/DhcpListener.cpp new file mode 100644 index 000000000..2d07ee85d --- /dev/null +++ b/nexus/DhcpListener.cpp @@ -0,0 +1,34 @@ +/* + * 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. + */ + +#define LOG_TAG "DhcpListener" +#include <cutils/log.h> + +#include <DhcpListener.h> +#include "IDhcpEventHandlers.h" + +DhcpListener::DhcpListener(IDhcpEventHandlers *handlers) : + SocketListener("dhcp_ng", false) { + mHandlers = handlers; +} + +DhcpListener::~DhcpListener() { +} + +bool DhcpListener::onDataAvailable(SocketClient *cli) { + LOGD("onDataAvailable()"); + return true; +} diff --git a/nexus/DhcpListener.h b/nexus/DhcpListener.h new file mode 100644 index 000000000..bfc5a3771 --- /dev/null +++ b/nexus/DhcpListener.h @@ -0,0 +1,36 @@ +/* + * 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 _DhcpListener_H +#define _DhcpListener_H + +#include <sysutils/SocketListener.h> + +class IDhcpEventHandlers; + +class DhcpListener : public SocketListener { + IDhcpEventHandlers *mHandlers; + +public: + + DhcpListener(IDhcpEventHandlers *handlers); + virtual ~DhcpListener(); + +private: + bool onDataAvailable(SocketClient *cli); +}; + +#endif diff --git a/nexus/DhcpState.h b/nexus/DhcpState.h new file mode 100644 index 000000000..27d7c7e37 --- /dev/null +++ b/nexus/DhcpState.h @@ -0,0 +1,27 @@ +/* + * 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 _DhcpState_H +#define _DhcpState_H + +class DhcpState { +public: + static const int UNKNOWN = 0; + static const int STOPPED = 1; + static const int STARTED = 2; +}; + +#endif diff --git a/nexus/IDhcpEventHandlers.h b/nexus/IDhcpEventHandlers.h new file mode 100644 index 000000000..3f51f645d --- /dev/null +++ b/nexus/IDhcpEventHandlers.h @@ -0,0 +1,25 @@ + +/* + * 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 _IDhcpEventHandlers_H +#define _IDhcpEventHandlers_H + +class IDhcpEventHandlers { +public: +}; + +#endif |