Loading core/jni/android_net_wifi_Wifi.cpp +48 −34 Original line number Diff line number Diff line Loading @@ -28,18 +28,15 @@ #define WIFI_PKG_NAME "android/net/wifi/WifiNative" #define BUF_SIZE 256 //TODO: This file can be refactored to push a lot of the functionality to java //with just a few JNI calls - doBoolean/doInt/doString namespace android { static jint DBG = false; static int doCommand(const char *cmd, char *replybuf, int replybuflen) static int doCommand(const char *ifname, const char *cmd, char *replybuf, int replybuflen) { size_t reply_len = replybuflen - 1; if (::wifi_command(cmd, replybuf, &reply_len) != 0) if (::wifi_command(ifname, cmd, replybuf, &reply_len) != 0) return -1; else { // Strip off trailing newline Loading @@ -51,7 +48,7 @@ static int doCommand(const char *cmd, char *replybuf, int replybuflen) } } static jint doIntCommand(const char* fmt, ...) static jint doIntCommand(const char *ifname, const char* fmt, ...) { char buf[BUF_SIZE]; va_list args; Loading @@ -62,13 +59,13 @@ static jint doIntCommand(const char* fmt, ...) return -1; } char reply[BUF_SIZE]; if (doCommand(buf, reply, sizeof(reply)) != 0) { if (doCommand(ifname, buf, reply, sizeof(reply)) != 0) { return -1; } return static_cast<jint>(atoi(reply)); } static jboolean doBooleanCommand(const char* expect, const char* fmt, ...) static jboolean doBooleanCommand(const char *ifname, const char* expect, const char* fmt, ...) { char buf[BUF_SIZE]; va_list args; Loading @@ -79,14 +76,14 @@ static jboolean doBooleanCommand(const char* expect, const char* fmt, ...) return JNI_FALSE; } char reply[BUF_SIZE]; if (doCommand(buf, reply, sizeof(reply)) != 0) { if (doCommand(ifname, buf, reply, sizeof(reply)) != 0) { return JNI_FALSE; } return (strcmp(reply, expect) == 0); } // Send a command to the supplicant, and return the reply as a String static jstring doStringCommand(JNIEnv* env, const char* fmt, ...) { static jstring doStringCommand(JNIEnv* env, const char *ifname, const char* fmt, ...) { char buf[BUF_SIZE]; va_list args; va_start(args, fmt); Loading @@ -96,7 +93,7 @@ static jstring doStringCommand(JNIEnv* env, const char* fmt, ...) { return NULL; } char reply[4096]; if (doCommand(buf, reply, sizeof(reply)) != 0) { if (doCommand(ifname, buf, reply, sizeof(reply)) != 0) { return NULL; } // TODO: why not just NewStringUTF? Loading Loading @@ -134,21 +131,23 @@ static jboolean android_net_wifi_killSupplicant(JNIEnv* env, jobject) return (jboolean)(::wifi_stop_supplicant() == 0); } static jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject) static jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject, jstring jIface) { return (jboolean)(::wifi_connect_to_supplicant() == 0); ScopedUtfChars ifname(env, jIface); return (jboolean)(::wifi_connect_to_supplicant(ifname.c_str()) == 0); } static void android_net_wifi_closeSupplicantConnection(JNIEnv* env, jobject) static void android_net_wifi_closeSupplicantConnection(JNIEnv* env, jobject, jstring jIface) { ::wifi_close_supplicant_connection(); ScopedUtfChars ifname(env, jIface); ::wifi_close_supplicant_connection(ifname.c_str()); } static jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject) static jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject, jstring jIface) { char buf[BUF_SIZE]; int nread = ::wifi_wait_for_event(buf, sizeof buf); ScopedUtfChars ifname(env, jIface); int nread = ::wifi_wait_for_event(ifname.c_str(), buf, sizeof buf); if (nread > 0) { return env->NewStringUTF(buf); } else { Loading @@ -156,34 +155,43 @@ static jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject) } } static jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jobject, jstring javaCommand) static jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jobject, jstring jIface, jstring jCommand) { ScopedUtfChars command(env, javaCommand); ScopedUtfChars ifname(env, jIface); ScopedUtfChars command(env, jCommand); if (command.c_str() == NULL) { return JNI_FALSE; } if (DBG) LOGD("doBoolean: %s", command.c_str()); return doBooleanCommand("OK", "%s", command.c_str()); return doBooleanCommand(ifname.c_str(), "OK", "%s", command.c_str()); } static jint android_net_wifi_doIntCommand(JNIEnv* env, jobject, jstring javaCommand) static jint android_net_wifi_doIntCommand(JNIEnv* env, jobject, jstring jIface, jstring jCommand) { ScopedUtfChars command(env, javaCommand); ScopedUtfChars ifname(env, jIface); ScopedUtfChars command(env, jCommand); if (command.c_str() == NULL) { return -1; } if (DBG) LOGD("doInt: %s", command.c_str()); return doIntCommand("%s", command.c_str()); return doIntCommand(ifname.c_str(), "%s", command.c_str()); } static jstring android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring javaCommand) static jstring android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring jIface, jstring jCommand) { ScopedUtfChars command(env, javaCommand); ScopedUtfChars ifname(env, jIface); ScopedUtfChars command(env, jCommand); if (command.c_str() == NULL) { return NULL; } if (DBG) LOGD("doString: %s", command.c_str()); return doStringCommand(env, "%s", command.c_str()); return doStringCommand(env, ifname.c_str(), "%s", command.c_str()); } Loading @@ -202,12 +210,18 @@ static JNINativeMethod gWifiMethods[] = { { "startSupplicant", "()Z", (void *)android_net_wifi_startSupplicant }, { "startP2pSupplicant", "()Z", (void *)android_net_wifi_startP2pSupplicant }, { "killSupplicant", "()Z", (void *)android_net_wifi_killSupplicant }, { "connectToSupplicant", "()Z", (void *)android_net_wifi_connectToSupplicant }, { "closeSupplicantConnection", "()V", (void *)android_net_wifi_closeSupplicantConnection }, { "waitForEvent", "()Ljava/lang/String;", (void*) android_net_wifi_waitForEvent }, { "doBooleanCommand", "(Ljava/lang/String;)Z", (void*) android_net_wifi_doBooleanCommand}, { "doIntCommand", "(Ljava/lang/String;)I", (void*) android_net_wifi_doIntCommand}, { "doStringCommand", "(Ljava/lang/String;)Ljava/lang/String;", (void*) android_net_wifi_doStringCommand}, { "connectToSupplicant", "(Ljava/lang/String;)Z", (void *)android_net_wifi_connectToSupplicant }, { "closeSupplicantConnection", "(Ljava/lang/String;)V", (void *)android_net_wifi_closeSupplicantConnection }, { "waitForEvent", "(Ljava/lang/String;)Ljava/lang/String;", (void*) android_net_wifi_waitForEvent }, { "doBooleanCommand", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*) android_net_wifi_doBooleanCommand }, { "doIntCommand", "(Ljava/lang/String;Ljava/lang/String;)I", (void*) android_net_wifi_doIntCommand }, { "doStringCommand", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", (void*) android_net_wifi_doStringCommand }, }; int register_android_net_wifi_WifiManager(JNIEnv* env) Loading wifi/java/android/net/wifi/WifiNative.java +37 −6 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.net.wifi; import android.net.wifi.p2p.WifiP2pConfig; import android.net.wifi.p2p.WifiP2pGroup; import android.net.wifi.p2p.WifiP2pDevice; import android.os.SystemProperties; import android.text.TextUtils; import android.util.Log; Loading @@ -42,6 +43,8 @@ public class WifiNative { static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1; static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2; static String sDefaultInterface; public native static boolean loadDriver(); public native static boolean isDriverLoaded(); Loading @@ -56,21 +59,49 @@ public class WifiNative { or when the supplicant is hung */ public native static boolean killSupplicant(); public native static boolean connectToSupplicant(); public native static boolean connectToSupplicant(String iface); public native static void closeSupplicantConnection(); public native static void closeSupplicantConnection(String iface); /** * Wait for the supplicant to send an event, returning the event string. * @return the event string sent by the supplicant. */ public native static String waitForEvent(); public native static String waitForEvent(String iface); private native static boolean doBooleanCommand(String iface, String command); private native static int doIntCommand(String iface, String command); private native static String doStringCommand(String iface, String command); private native static boolean doBooleanCommand(String command); public static void setDefaultInterface(String iface) { sDefaultInterface = iface; } public static boolean connectToSupplicant() { return connectToSupplicant(sDefaultInterface); } private native static int doIntCommand(String command); public static void closeSupplicantConnection() { closeSupplicantConnection(sDefaultInterface); } private native static String doStringCommand(String command); public static String waitForEvent() { return waitForEvent(sDefaultInterface); } private static boolean doBooleanCommand(String command) { return doBooleanCommand(sDefaultInterface, command); } private static int doIntCommand(String command) { return doIntCommand(sDefaultInterface, command); } private static String doStringCommand(String command) { return doStringCommand(sDefaultInterface, command); } public static boolean ping() { String pong = doStringCommand("PING"); Loading wifi/java/android/net/wifi/WifiStateMachine.java +3 −0 Original line number Diff line number Diff line Loading @@ -572,6 +572,9 @@ public class WifiStateMachine extends StateMachine { mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; mLastSignalLevel = -1; /* Set default interface for all primary socket communication */ WifiNative.setDefaultInterface(mInterfaceName); mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); Intent scanIntent = new Intent(ACTION_START_SCAN, null); mScanIntent = PendingIntent.getBroadcast(mContext, SCAN_REQUEST, scanIntent, 0); Loading Loading
core/jni/android_net_wifi_Wifi.cpp +48 −34 Original line number Diff line number Diff line Loading @@ -28,18 +28,15 @@ #define WIFI_PKG_NAME "android/net/wifi/WifiNative" #define BUF_SIZE 256 //TODO: This file can be refactored to push a lot of the functionality to java //with just a few JNI calls - doBoolean/doInt/doString namespace android { static jint DBG = false; static int doCommand(const char *cmd, char *replybuf, int replybuflen) static int doCommand(const char *ifname, const char *cmd, char *replybuf, int replybuflen) { size_t reply_len = replybuflen - 1; if (::wifi_command(cmd, replybuf, &reply_len) != 0) if (::wifi_command(ifname, cmd, replybuf, &reply_len) != 0) return -1; else { // Strip off trailing newline Loading @@ -51,7 +48,7 @@ static int doCommand(const char *cmd, char *replybuf, int replybuflen) } } static jint doIntCommand(const char* fmt, ...) static jint doIntCommand(const char *ifname, const char* fmt, ...) { char buf[BUF_SIZE]; va_list args; Loading @@ -62,13 +59,13 @@ static jint doIntCommand(const char* fmt, ...) return -1; } char reply[BUF_SIZE]; if (doCommand(buf, reply, sizeof(reply)) != 0) { if (doCommand(ifname, buf, reply, sizeof(reply)) != 0) { return -1; } return static_cast<jint>(atoi(reply)); } static jboolean doBooleanCommand(const char* expect, const char* fmt, ...) static jboolean doBooleanCommand(const char *ifname, const char* expect, const char* fmt, ...) { char buf[BUF_SIZE]; va_list args; Loading @@ -79,14 +76,14 @@ static jboolean doBooleanCommand(const char* expect, const char* fmt, ...) return JNI_FALSE; } char reply[BUF_SIZE]; if (doCommand(buf, reply, sizeof(reply)) != 0) { if (doCommand(ifname, buf, reply, sizeof(reply)) != 0) { return JNI_FALSE; } return (strcmp(reply, expect) == 0); } // Send a command to the supplicant, and return the reply as a String static jstring doStringCommand(JNIEnv* env, const char* fmt, ...) { static jstring doStringCommand(JNIEnv* env, const char *ifname, const char* fmt, ...) { char buf[BUF_SIZE]; va_list args; va_start(args, fmt); Loading @@ -96,7 +93,7 @@ static jstring doStringCommand(JNIEnv* env, const char* fmt, ...) { return NULL; } char reply[4096]; if (doCommand(buf, reply, sizeof(reply)) != 0) { if (doCommand(ifname, buf, reply, sizeof(reply)) != 0) { return NULL; } // TODO: why not just NewStringUTF? Loading Loading @@ -134,21 +131,23 @@ static jboolean android_net_wifi_killSupplicant(JNIEnv* env, jobject) return (jboolean)(::wifi_stop_supplicant() == 0); } static jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject) static jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject, jstring jIface) { return (jboolean)(::wifi_connect_to_supplicant() == 0); ScopedUtfChars ifname(env, jIface); return (jboolean)(::wifi_connect_to_supplicant(ifname.c_str()) == 0); } static void android_net_wifi_closeSupplicantConnection(JNIEnv* env, jobject) static void android_net_wifi_closeSupplicantConnection(JNIEnv* env, jobject, jstring jIface) { ::wifi_close_supplicant_connection(); ScopedUtfChars ifname(env, jIface); ::wifi_close_supplicant_connection(ifname.c_str()); } static jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject) static jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject, jstring jIface) { char buf[BUF_SIZE]; int nread = ::wifi_wait_for_event(buf, sizeof buf); ScopedUtfChars ifname(env, jIface); int nread = ::wifi_wait_for_event(ifname.c_str(), buf, sizeof buf); if (nread > 0) { return env->NewStringUTF(buf); } else { Loading @@ -156,34 +155,43 @@ static jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject) } } static jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jobject, jstring javaCommand) static jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jobject, jstring jIface, jstring jCommand) { ScopedUtfChars command(env, javaCommand); ScopedUtfChars ifname(env, jIface); ScopedUtfChars command(env, jCommand); if (command.c_str() == NULL) { return JNI_FALSE; } if (DBG) LOGD("doBoolean: %s", command.c_str()); return doBooleanCommand("OK", "%s", command.c_str()); return doBooleanCommand(ifname.c_str(), "OK", "%s", command.c_str()); } static jint android_net_wifi_doIntCommand(JNIEnv* env, jobject, jstring javaCommand) static jint android_net_wifi_doIntCommand(JNIEnv* env, jobject, jstring jIface, jstring jCommand) { ScopedUtfChars command(env, javaCommand); ScopedUtfChars ifname(env, jIface); ScopedUtfChars command(env, jCommand); if (command.c_str() == NULL) { return -1; } if (DBG) LOGD("doInt: %s", command.c_str()); return doIntCommand("%s", command.c_str()); return doIntCommand(ifname.c_str(), "%s", command.c_str()); } static jstring android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring javaCommand) static jstring android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring jIface, jstring jCommand) { ScopedUtfChars command(env, javaCommand); ScopedUtfChars ifname(env, jIface); ScopedUtfChars command(env, jCommand); if (command.c_str() == NULL) { return NULL; } if (DBG) LOGD("doString: %s", command.c_str()); return doStringCommand(env, "%s", command.c_str()); return doStringCommand(env, ifname.c_str(), "%s", command.c_str()); } Loading @@ -202,12 +210,18 @@ static JNINativeMethod gWifiMethods[] = { { "startSupplicant", "()Z", (void *)android_net_wifi_startSupplicant }, { "startP2pSupplicant", "()Z", (void *)android_net_wifi_startP2pSupplicant }, { "killSupplicant", "()Z", (void *)android_net_wifi_killSupplicant }, { "connectToSupplicant", "()Z", (void *)android_net_wifi_connectToSupplicant }, { "closeSupplicantConnection", "()V", (void *)android_net_wifi_closeSupplicantConnection }, { "waitForEvent", "()Ljava/lang/String;", (void*) android_net_wifi_waitForEvent }, { "doBooleanCommand", "(Ljava/lang/String;)Z", (void*) android_net_wifi_doBooleanCommand}, { "doIntCommand", "(Ljava/lang/String;)I", (void*) android_net_wifi_doIntCommand}, { "doStringCommand", "(Ljava/lang/String;)Ljava/lang/String;", (void*) android_net_wifi_doStringCommand}, { "connectToSupplicant", "(Ljava/lang/String;)Z", (void *)android_net_wifi_connectToSupplicant }, { "closeSupplicantConnection", "(Ljava/lang/String;)V", (void *)android_net_wifi_closeSupplicantConnection }, { "waitForEvent", "(Ljava/lang/String;)Ljava/lang/String;", (void*) android_net_wifi_waitForEvent }, { "doBooleanCommand", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*) android_net_wifi_doBooleanCommand }, { "doIntCommand", "(Ljava/lang/String;Ljava/lang/String;)I", (void*) android_net_wifi_doIntCommand }, { "doStringCommand", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", (void*) android_net_wifi_doStringCommand }, }; int register_android_net_wifi_WifiManager(JNIEnv* env) Loading
wifi/java/android/net/wifi/WifiNative.java +37 −6 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.net.wifi; import android.net.wifi.p2p.WifiP2pConfig; import android.net.wifi.p2p.WifiP2pGroup; import android.net.wifi.p2p.WifiP2pDevice; import android.os.SystemProperties; import android.text.TextUtils; import android.util.Log; Loading @@ -42,6 +43,8 @@ public class WifiNative { static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1; static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2; static String sDefaultInterface; public native static boolean loadDriver(); public native static boolean isDriverLoaded(); Loading @@ -56,21 +59,49 @@ public class WifiNative { or when the supplicant is hung */ public native static boolean killSupplicant(); public native static boolean connectToSupplicant(); public native static boolean connectToSupplicant(String iface); public native static void closeSupplicantConnection(); public native static void closeSupplicantConnection(String iface); /** * Wait for the supplicant to send an event, returning the event string. * @return the event string sent by the supplicant. */ public native static String waitForEvent(); public native static String waitForEvent(String iface); private native static boolean doBooleanCommand(String iface, String command); private native static int doIntCommand(String iface, String command); private native static String doStringCommand(String iface, String command); private native static boolean doBooleanCommand(String command); public static void setDefaultInterface(String iface) { sDefaultInterface = iface; } public static boolean connectToSupplicant() { return connectToSupplicant(sDefaultInterface); } private native static int doIntCommand(String command); public static void closeSupplicantConnection() { closeSupplicantConnection(sDefaultInterface); } private native static String doStringCommand(String command); public static String waitForEvent() { return waitForEvent(sDefaultInterface); } private static boolean doBooleanCommand(String command) { return doBooleanCommand(sDefaultInterface, command); } private static int doIntCommand(String command) { return doIntCommand(sDefaultInterface, command); } private static String doStringCommand(String command) { return doStringCommand(sDefaultInterface, command); } public static boolean ping() { String pong = doStringCommand("PING"); Loading
wifi/java/android/net/wifi/WifiStateMachine.java +3 −0 Original line number Diff line number Diff line Loading @@ -572,6 +572,9 @@ public class WifiStateMachine extends StateMachine { mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; mLastSignalLevel = -1; /* Set default interface for all primary socket communication */ WifiNative.setDefaultInterface(mInterfaceName); mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); Intent scanIntent = new Intent(ACTION_START_SCAN, null); mScanIntent = PendingIntent.getBroadcast(mContext, SCAN_REQUEST, scanIntent, 0); Loading