summaryrefslogtreecommitdiffstats
path: root/nexus
diff options
context:
space:
mode:
authorSan Mehat <san@google.com>2009-06-22 10:37:54 -0700
committerSan Mehat <san@google.com>2009-06-22 10:40:48 -0700
commit54962e0fd647f5f390269994c573f80c92f537d4 (patch)
tree8aa823f50710ed0c22af79f97bf186ec63ff0b58 /nexus
parentbfa2f8e9b506a4b710ebcefa7c1e324609b8ca34 (diff)
downloadcore-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.mk3
-rw-r--r--nexus/DhcpClient.cpp105
-rw-r--r--nexus/DhcpClient.h41
-rw-r--r--nexus/DhcpListener.cpp34
-rw-r--r--nexus/DhcpListener.h36
-rw-r--r--nexus/DhcpState.h27
-rw-r--r--nexus/IDhcpEventHandlers.h25
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