diff --git a/wifi/Android.mk b/wifi/Android.mk
new file mode 100644
index 0000000..8444a40
--- /dev/null
+++ b/wifi/Android.mk
@@ -0,0 +1,5 @@
+# Copyright 2006 The Android Open Source Project
+
+LOCAL_SRC_FILES += wifi/wifi.c
+
+LOCAL_SHARED_LIBRARIES += libnetutils
diff --git a/wifi/wifi.c b/wifi/wifi.c
new file mode 100644
index 0000000..68b1a1e
--- /dev/null
+++ b/wifi/wifi.c
@@ -0,0 +1,399 @@
+/*
+ * Copyright 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 <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+#include "hardware/wifi.h"
+#include "libwpa_client/wpa_ctrl.h"
+
+#define LOG_TAG "WifiHW"
+#include "cutils/log.h"
+#include "cutils/memory.h"
+#include "cutils/misc.h"
+#include "cutils/properties.h"
+#include "private/android_filesystem_config.h"
+
+static struct wpa_ctrl *ctrl_conn;
+static struct wpa_ctrl *monitor_conn;
+
+extern int do_dhcp();
+extern int ifc_init();
+extern void ifc_close();
+extern char *dhcp_lasterror();
+extern void get_dhcp_info();
+extern int init_module(void *, unsigned long, const char *);
+extern int delete_module(const char *, unsigned int);
+
+static char iface[PROPERTY_VALUE_MAX];
+// TODO: use new ANDROID_SOCKET mechanism, once support for multiple
+// sockets is in
+
+static const char IFACE_DIR[]           = "/data/system/wpa_supplicant";
+static const char DRIVER_MODULE_NAME[]  = "wlan";
+static const char DRIVER_MODULE_TAG[]   = "wlan ";
+static const char DRIVER_MODULE_PATH[]  = "/system/lib/modules/wlan.ko";
+static const char FIRMWARE_LOADER[]     = "wlan_loader";
+static const char DRIVER_PROP_NAME[]    = "wlan.driver.status";
+static const char SUPPLICANT_NAME[]     = "wpa_supplicant";
+static const char SUPP_PROP_NAME[]      = "init.svc.wpa_supplicant";
+static const char SUPP_CONFIG_TEMPLATE[]= "/system/etc/wifi/wpa_supplicant.conf";
+static const char SUPP_CONFIG_FILE[]    = "/data/misc/wifi/wpa_supplicant.conf";
+static const char MODULE_FILE[]         = "/proc/modules";
+
+static int insmod(const char *filename)
+{
+    void *module;
+    unsigned int size;
+    int ret;
+
+    module = load_file(filename, &size);
+    if (!module)
+        return -1;
+
+    ret = init_module(module, size, "");
+
+    free(module);
+
+    return ret;
+}
+
+static int rmmod(const char *modname)
+{
+    int ret = -1;
+    int maxtry = 10;
+
+    while (maxtry-- > 0) {
+        ret = delete_module(modname, O_NONBLOCK | O_EXCL);
+        if (ret < 0 && errno == EAGAIN)
+            usleep(500000);
+        else
+            break;
+    }
+
+    if (ret != 0)
+        LOGD("Unable to unload driver module \"%s\": %s\n",
+             modname, strerror(errno));
+    return ret;
+}
+
+int do_dhcp_request(int *ipaddr, int *gateway, int *mask,
+                    int *dns1, int *dns2, int *server, int *lease) {
+    /* For test driver, always report success */
+    if (strcmp(iface, "sta") == 0)
+        return 0;
+
+    if (ifc_init() < 0)
+        return -1;
+
+    if (do_dhcp(iface) < 0) {
+        ifc_close();
+        return -1;
+    }
+    ifc_close();
+    get_dhcp_info(ipaddr, gateway, mask, dns1, dns2, server, lease);
+    return 0;
+}
+
+const char *get_dhcp_error_string() {
+    return dhcp_lasterror();
+}
+
+static int check_driver_loaded() {
+    char driver_status[PROPERTY_VALUE_MAX];
+    FILE *proc;
+    char line[sizeof(DRIVER_MODULE_TAG)+10];
+
+    if (!property_get(DRIVER_PROP_NAME, driver_status, NULL)
+            || strcmp(driver_status, "ok") != 0) {
+        return 0;  /* driver not loaded */
+    }
+    /*
+     * If the property says the driver is loaded, check to
+     * make sure that the property setting isn't just left
+     * over from a previous manual shutdown or a runtime
+     * crash.
+     */
+    if ((proc = fopen(MODULE_FILE, "r")) == NULL) {
+        LOGW("Could not open %s: %s", MODULE_FILE, strerror(errno));
+        return 0;
+    }
+    while ((fgets(line, sizeof(line), proc)) != NULL) {
+        if (strncmp(line, DRIVER_MODULE_TAG, strlen(DRIVER_MODULE_TAG)) == 0) {
+            fclose(proc);
+            return 1;
+        }
+    }
+    fclose(proc);
+    property_set(DRIVER_PROP_NAME, "unloaded");
+    return 0;
+}
+
+int wifi_load_driver()
+{
+    char driver_status[PROPERTY_VALUE_MAX];
+    int count = 40; /* wait at most 20 seconds for completion */
+
+    if (check_driver_loaded()) {
+        return 0;
+    }
+    insmod(DRIVER_MODULE_PATH);
+    property_set("ctl.start", FIRMWARE_LOADER);
+    while (count-- > 0) {
+        usleep(500000);
+        if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
+            if (strcmp(driver_status, "ok") == 0)
+                return 0;
+            else if (strcmp(DRIVER_PROP_NAME, "failed") == 0)
+                return -1;
+        }
+    }
+    property_set(DRIVER_PROP_NAME, "timeout");
+    return -1;
+}
+
+int wifi_unload_driver()
+{
+    if (rmmod(DRIVER_MODULE_NAME) == 0) {
+        usleep(1000000);
+        property_set(DRIVER_PROP_NAME, "unloaded");
+        return 0;
+    } else
+        return -1;
+}
+
+static int control_supplicant(int startIt)
+{
+    char supp_status[PROPERTY_VALUE_MAX] = {'\0'};
+    const char *ctrl_prop = (startIt ? "ctl.start" : "ctl.stop");
+    const char *desired_status = (startIt ? "running" : "stopped");
+    int count = 20; /* wait at most 20 seconds for completion */
+
+    if (property_get(SUPP_PROP_NAME, supp_status, NULL)
+        && strcmp(supp_status, desired_status) == 0) {
+        return 0;  /* supplicant already running */
+    }
+    property_set(ctrl_prop, SUPPLICANT_NAME);
+
+    while (count-- > 0) {
+        usleep(1000000);
+        if (property_get(SUPP_PROP_NAME, supp_status, NULL)) {
+            if (strcmp(supp_status, desired_status) == 0)
+                return 0;
+        }
+    }
+    return -1;
+}
+
+int ensure_config_file_exists()
+{
+    char buf[2048];
+    int srcfd, destfd;
+    int nread;
+
+    if (access(SUPP_CONFIG_FILE, R_OK|W_OK) == 0) {
+        return 0;
+    } else if (errno != ENOENT) {
+        LOGE("Cannot access \"%s\": %s", SUPP_CONFIG_FILE, strerror(errno));
+        return -1;
+    }
+
+    srcfd = open(SUPP_CONFIG_TEMPLATE, O_RDONLY);
+    if (srcfd < 0) {
+        LOGE("Cannot open \"%s\": %s", SUPP_CONFIG_TEMPLATE, strerror(errno));
+        return -1;
+    }
+
+    destfd = open(SUPP_CONFIG_FILE, O_CREAT|O_WRONLY, 0660);
+    if (destfd < 0) {
+        close(srcfd);
+        LOGE("Cannot create \"%s\": %s", SUPP_CONFIG_FILE, strerror(errno));
+        return -1;
+    }
+
+    while ((nread = read(srcfd, buf, sizeof(buf))) != 0) {
+        if (nread < 0) {
+            LOGE("Error reading \"%s\": %s", SUPP_CONFIG_TEMPLATE, strerror(errno));
+            close(srcfd);
+            close(destfd);
+            unlink(SUPP_CONFIG_FILE);
+            return -1;
+        }
+        write(destfd, buf, nread);
+    }
+
+    close(destfd);
+    close(srcfd);
+
+    if (chown(SUPP_CONFIG_FILE, AID_SYSTEM, AID_WIFI) < 0) {
+        LOGE("Error changing group ownership of %s to %d: %s",
+             SUPP_CONFIG_FILE, AID_WIFI, strerror(errno));
+        unlink(SUPP_CONFIG_FILE);
+        return -1;
+    }
+    return 0;
+}
+
+int wifi_start_supplicant()
+{
+    /* Before starting the daemon, make sure its config file exists */
+    if (ensure_config_file_exists() < 0) {
+        LOGE("Wi-Fi will not be enabled");
+        return -1;
+    }
+    return control_supplicant(1);
+}
+
+int wifi_stop_supplicant()
+{
+    return control_supplicant(0);
+}
+
+int wifi_connect_to_supplicant()
+{
+    char ifname[256];
+    static int cleaned_up = 0;
+
+    property_get("wifi.interface", iface, "sta");
+
+    if (access(IFACE_DIR, F_OK) == 0) {
+        snprintf(ifname, sizeof(ifname), "%s/%s", IFACE_DIR, iface);
+    } else {
+        strlcpy(ifname, iface, sizeof(ifname));
+    }
+
+    ctrl_conn = wpa_ctrl_open(ifname);
+    if (ctrl_conn == NULL) {
+        LOGD("Unable to open connection to supplicant on \"%s\": %s",
+             ifname, strerror(errno));
+        /*
+         * errno == ENOENT means the supplicant daemon isn't
+         * running. Take this opportunity to clear out any
+         * stale socket files that might be left over. Note
+         * there's a possible race with the command line client
+         * trying to connect to the daemon, but it would require
+         * that the supplicant be started and the command line
+         * client connect to it during the window between the
+         * error check and the removal of the files. And in
+         * any event, the remedy is that the user would simply
+         * have to run the command line program again.
+         */
+        if (!cleaned_up && (errno == ENOENT || errno == EADDRINUSE)) {
+            cleaned_up = 1; /* do this just once */
+            wpa_ctrl_cleanup();
+        }
+        return -1;
+    }
+    monitor_conn = wpa_ctrl_open(ifname);
+    if (monitor_conn == NULL) {
+        wpa_ctrl_close(ctrl_conn);
+        ctrl_conn = NULL;
+        return -1;
+    }
+    if (wpa_ctrl_attach(monitor_conn) != 0) {
+        wpa_ctrl_close(monitor_conn);
+        wpa_ctrl_close(ctrl_conn);
+        ctrl_conn = monitor_conn = NULL;
+        return -1;
+    }
+    return 0;
+}
+
+int wifi_send_command(struct wpa_ctrl *ctrl, const char *cmd, char *reply, size_t *reply_len)
+{
+    int ret;
+
+    if (ctrl_conn == NULL) {
+        LOGV("Not connected to wpa_supplicant - \"%s\" command dropped.\n", cmd);
+        return -1;
+    }
+    ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), reply, reply_len, NULL);
+    if (ret == -2) {
+        LOGD("'%s' command timed out.\n", cmd);
+        return -2;
+    } else if (ret < 0 || strncmp(reply, "FAIL", 4) == 0) {
+        return -1;
+    }
+    if (strncmp(cmd, "PING", 4) == 0) {
+        reply[*reply_len] = '\0';
+    }
+    return 0;
+}
+
+int wifi_wait_for_event(char *buf, size_t buflen)
+{
+    size_t nread = buflen - 1;
+    int fd;
+    fd_set rfds;
+    int result;
+    struct timeval tval;
+    struct timeval *tptr;
+    
+    if (monitor_conn == NULL)
+        return 0;
+
+    result = wpa_ctrl_recv(monitor_conn, buf, &nread);
+    if (result < 0) {
+        LOGD("wpa_ctrl_recv failed: %s\n", strerror(errno));
+        return -1;
+    }
+    buf[nread] = '\0';
+    /* LOGD("wait_for_event: result=%d nread=%d string=\"%s\"\n", result, nread, buf); */
+    /* Check for EOF on the socket */
+    if (result == 0 && nread == 0) {
+        /* Fabricate an event to pass up */
+        LOGD("Received EOF on supplicant socket\n");
+        strncpy(buf, WPA_EVENT_TERMINATING " - signal 0 received", buflen-1);
+        buf[buflen-1] = '\0';
+        return strlen(buf);
+    }
+    /*
+     * Events strings are in the format
+     *
+     *     <N>CTRL-EVENT-XXX 
+     *
+     * where N is the message level in numerical form (0=VERBOSE, 1=DEBUG,
+     * etc.) and XXX is the event name. The level information is not useful
+     * to us, so strip it off.
+     */
+    if (buf[0] == '<') {
+        char *match = strchr(buf, '>');
+        if (match != NULL) {
+            nread -= (match+1-buf);
+            memmove(buf, match+1, nread+1);
+        }
+    }
+    return nread;
+}
+
+void wifi_close_supplicant_connection()
+{
+    if (ctrl_conn != NULL) {
+        wpa_ctrl_close(ctrl_conn);
+        ctrl_conn = NULL;
+    }
+    if (monitor_conn != NULL) {
+        wpa_ctrl_close(monitor_conn);
+        monitor_conn = NULL;
+    }
+}
+
+int wifi_command(const char *command, char *reply, size_t *reply_len)
+{
+    return wifi_send_command(ctrl_conn, command, reply, reply_len);
+}
