summaryrefslogtreecommitdiffstats
path: root/service
diff options
context:
space:
mode:
authorxinhe <xinhe@google.com>2015-04-15 13:23:43 -0700
committerxinhe <xinhe@google.com>2015-04-22 17:54:59 -0700
commitd57f630f6a7a5fca872d2b96fc4cce1905daee5d (patch)
tree7606156c48751e4fe1211d6a1d5bbc615ea04b21 /service
parentea5c862ceca7130bfcbcc4c072d6fae3f433b909 (diff)
downloadandroid_frameworks_opt_net_wifi-d57f630f6a7a5fca872d2b96fc4cce1905daee5d.tar.gz
android_frameworks_opt_net_wifi-d57f630f6a7a5fca872d2b96fc4cce1905daee5d.tar.bz2
android_frameworks_opt_net_wifi-d57f630f6a7a5fca872d2b96fc4cce1905daee5d.zip
TDLS enhancement HAL interface update
Bug:15152152 Change-Id: I6ef4924f8db85244723cdee89166811f058fd675
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/WifiNative.java73
-rw-r--r--service/jni/com_android_server_wifi_WifiNative.cpp103
-rw-r--r--service/jni/wifi_hal_stub.h27
-rw-r--r--service/lib/wifi_hal_stub.cpp19
4 files changed, 210 insertions, 12 deletions
diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java
index c558d072f..5ebdea227 100644
--- a/service/java/com/android/server/wifi/WifiNative.java
+++ b/service/java/com/android/server/wifi/WifiNative.java
@@ -1804,6 +1804,79 @@ public class WifiNative {
}
}
+ /* Rtt related commands/events */
+ public abstract class TdlsEventHandler {
+ abstract public void onTdlsStatus(String macAddr, int status, int reason);
+ }
+
+ private static TdlsEventHandler sTdlsEventHandler;
+
+
+ private static native boolean enableDisableTdlsNative(int iface, boolean enable,
+ String macAddr);
+ synchronized public static boolean enableDisableTdls(boolean enable, String macAdd,
+ TdlsEventHandler tdlsCallBack) {
+ synchronized (mLock) {
+ if (startHal()) {
+ sTdlsEventHandler = tdlsCallBack;
+ return enableDisableTdlsNative(sWlan0Index, enable, macAdd);
+ } else {
+ return false;
+ }
+ }
+ }
+
+ // Once TDLS per mac and event feature is implemented, this class definition should be
+ // moved to the right place, like WifiManager etc
+ public static class TdlsStatus {
+ int channel;
+ int global_operating_class;
+ int state;
+ int reason;
+ }
+ private static native TdlsStatus getTdlsStatusNative(int iface, String macAddr);
+ synchronized public static TdlsStatus getTdlsStatus (String macAdd) {
+ synchronized (mLock) {
+ if (startHal()) {
+ return getTdlsStatusNative(sWlan0Index, macAdd);
+ } else {
+ return null;
+ }
+ }
+ }
+
+ //ToFix: Once TDLS per mac and event feature is implemented, this class definition should be
+ // moved to the right place, like WifiStateMachine etc
+ public static class TdlsCapabilities {
+ /* Maximum TDLS session number can be supported by the Firmware and hardware */
+ int maxConcurrentTdlsSessionNumber;
+ boolean isGlobalTdlsSupported;
+ boolean isPerMacTdlsSupported;
+ boolean isOffChannelTdlsSupported;
+ }
+
+
+
+ private static native TdlsCapabilities getTdlsCapabilitiesNative(int iface);
+ synchronized public static TdlsCapabilities getTdlsCapabilities () {
+ synchronized (mLock) {
+ if (startHal()) {
+ return getTdlsCapabilitiesNative(sWlan0Index);
+ } else {
+ return null;
+ }
+ }
+ }
+
+ synchronized private static boolean onTdlsStatus(String macAddr, int status, int reason) {
+ if (sTdlsEventHandler == null) {
+ return false;
+ } else {
+ sTdlsEventHandler.onTdlsStatus(macAddr, status, reason);
+ return true;
+ }
+ }
+
//---------------------------------------------------------------------------------
/* Wifi Logger commands/events */
diff --git a/service/jni/com_android_server_wifi_WifiNative.cpp b/service/jni/com_android_server_wifi_WifiNative.cpp
index 14233f559..14a3c3aa1 100644
--- a/service/jni/com_android_server_wifi_WifiNative.cpp
+++ b/service/jni/com_android_server_wifi_WifiNative.cpp
@@ -73,10 +73,13 @@ int init_wifi_hal_func_table(wifi_hal_fn *hal_fn) {
hal_fn->wifi_rtt_range_request = wifi_rtt_range_request_stub;
hal_fn->wifi_rtt_range_cancel = wifi_rtt_range_cancel_stub;
hal_fn->wifi_get_rtt_capabilities = wifi_get_rtt_capabilities_stub;
- hal_fn->wifi_set_nodfs_flag = wifi_set_nodfs_flag_stub;
hal_fn->wifi_start_logging = wifi_start_logging_stub;
hal_fn->wifi_set_epno_list = wifi_set_epno_list_stub;
hal_fn->wifi_set_country_code = wifi_set_country_code_stub;
+ hal_fn->wifi_enable_tdls = wifi_enable_tdls_stub;
+ hal_fn->wifi_disable_tdls = wifi_disable_tdls_stub;
+ hal_fn->wifi_get_tdls_status = wifi_get_tdls_status_stub;
+ hal_fn->wifi_get_tdls_capabilities = wifi_get_tdls_capabilities_stub;
return 0;
}
@@ -1381,6 +1384,94 @@ static jboolean android_net_wifi_set_Country_Code_Hal(JNIEnv *env,jclass cls, ji
return res == WIFI_SUCCESS;
}
+
+static jboolean android_net_wifi_enable_disable_tdls(JNIEnv *env,jclass cls, jint iface,
+ jboolean enable, jstring addr) {
+ wifi_interface_handle handle = getIfaceHandle(env, cls, iface);
+
+ mac_addr address;
+ parseMacAddress(env, addr, address);
+ wifi_tdls_handler tdls_handler;
+ //tdls_handler.on_tdls_state_changed = &on_tdls_state_changed;
+
+ if(enable) {
+ return (hal_fn.wifi_enable_tdls(handle, address, NULL, tdls_handler) == WIFI_SUCCESS);
+ } else {
+ return (hal_fn.wifi_disable_tdls(handle, address) == WIFI_SUCCESS);
+ }
+}
+
+static void on_tdls_state_changed(mac_addr addr, wifi_tdls_status status) {
+ JNIEnv *env = NULL;
+ mVM->AttachCurrentThread(&env, NULL);
+
+ ALOGD("on_tdls_state_changed is called: vm = %p, obj = %p, env = %p", mVM, mCls, env);
+
+ char mac[32];
+ sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], addr[2], addr[3], addr[4],
+ addr[5]);
+
+ jstring mac_address = env->NewStringUTF(mac);
+ reportEvent(env, mCls, "onTdlsStatus", "(Ljava/lang/StringII;)V",
+ mac_address, status.state, status.reason);
+
+}
+
+static jobject android_net_wifi_get_tdls_status(JNIEnv *env,jclass cls, jint iface,jstring addr) {
+ wifi_interface_handle handle = getIfaceHandle(env, cls, iface);
+
+ mac_addr address;
+ parseMacAddress(env, addr, address);
+
+ wifi_tdls_status status;
+
+ wifi_error ret;
+ ret = hal_fn.wifi_get_tdls_status(handle, address, &status );
+
+ if (ret != WIFI_SUCCESS) {
+ return NULL;
+ } else {
+ jobject tdls_status = createObject(env, "com/android/server/wifi/WifiNative$TdlsStatus");
+ setIntField(env, tdls_status, "channel", status.channel);
+ setIntField(env, tdls_status, "global_operating_class", status.global_operating_class);
+ setIntField(env, tdls_status, "state", status.state);
+ setIntField(env, tdls_status, "reason", status.reason);
+ return tdls_status;
+ }
+}
+
+static jobject android_net_wifi_get_tdls_capabilities(JNIEnv *env, jclass cls, jint iface) {
+ wifi_tdls_capabilities tdls_capabilities;
+ wifi_interface_handle handle = getIfaceHandle(env, cls, iface);
+ wifi_error ret = hal_fn.wifi_get_tdls_capabilities(handle, &tdls_capabilities);
+
+ if(WIFI_SUCCESS == ret) {
+ jobject capabilities = createObject(env,
+ "com/android/server/wifi/WifiNative$TdlsCapabilities");
+ setIntField(env, capabilities, "maxConcurrentTdlsSessionNumber",
+ tdls_capabilities.max_concurrent_tdls_session_num);
+ setBooleanField(env, capabilities, "isGlobalTdlsSupported",
+ tdls_capabilities.is_global_tdls_supported == 1);
+ setBooleanField(env, capabilities, "isPerMacTdlsSupported",
+ tdls_capabilities.is_per_mac_tdls_supported == 1);
+ setBooleanField(env,capabilities, "isOffChannelTdlsSupported",
+ tdls_capabilities.is_off_channel_tdls_supported);
+
+ ALOGD("TDLS Max Concurrent Tdls Session Number is: %d",
+ tdls_capabilities.max_concurrent_tdls_session_num);
+ ALOGD("Global Tdls is: %s", tdls_capabilities.is_global_tdls_supported == 1 ? "support" :
+ "not support");
+ ALOGD("Per Mac Tdls is: %s", tdls_capabilities.is_per_mac_tdls_supported == 1 ? "support" :
+ "not support");
+ ALOGD("Off Channel Tdls is: %s", tdls_capabilities.is_off_channel_tdls_supported == 1 ?
+ "support" : "not support");
+
+ return capabilities;
+ } else {
+ return NULL;
+ }
+}
+
// ----------------------------------------------------------------------------
// Debug framework
// ----------------------------------------------------------------------------
@@ -1396,7 +1487,7 @@ int buffer_size, wifi_ring_buffer_status *status) {
0, 0);
}
-static jboolean android_net_wifi_start_logging(JNIEnv *env, jclass cls, jint iface) {
+static jboolean android_net_wifi_start_logging(JNIEnv *env, jclass cls, jint iface) {
wifi_interface_handle handle = getIfaceHandle(env, cls, iface);
ALOGD("android_net_wifi_start_logging = %p", handle);
@@ -1613,7 +1704,13 @@ static JNINativeMethod gWifiMethods[] = {
{"setCountryCodeHalNative", "(ILjava/lang/String;)Z",
(void*) android_net_wifi_set_Country_Code_Hal},
{ "setPnoListNative", "(II[Lcom/android/server/wifi/WifiNative$WifiPnoNetwork;)Z",
- (void*) android_net_wifi_setPnoListNative}
+ (void*) android_net_wifi_setPnoListNative},
+ {"enableDisableTdlsNative", "(IZLjava/lang/String;)Z",
+ (void*) android_net_wifi_enable_disable_tdls},
+ {"getTdlsStatusNative", "(ILjava/lang/String;)Lcom/android/server/wifi/WifiNative$TdlsStatus;",
+ (void*) android_net_wifi_get_tdls_status},
+ {"getTdlsCapabilitiesNative", "(I)Lcom/android/server/wifi/WifiNative$TdlsCapabilities;",
+ (void*) android_net_wifi_get_tdls_capabilities}
};
int register_android_net_wifi_WifiNative(JNIEnv* env) {
diff --git a/service/jni/wifi_hal_stub.h b/service/jni/wifi_hal_stub.h
index f1a535fd4..ee91596ff 100644
--- a/service/jni/wifi_hal_stub.h
+++ b/service/jni/wifi_hal_stub.h
@@ -56,22 +56,31 @@ wifi_error wifi_get_gscan_capabilities_stub(wifi_interface_handle handle,
wifi_error wifi_set_link_stats_stub(wifi_interface_handle iface, wifi_link_layer_params params);
wifi_error wifi_get_link_stats_stub(wifi_request_id id,
wifi_interface_handle iface, wifi_stats_result_handler handler);
- wifi_error wifi_clear_link_stats_stub(wifi_interface_handle iface,
+wifi_error wifi_clear_link_stats_stub(wifi_interface_handle iface,
u32 stats_clear_req_mask, u32 *stats_clear_rsp_mask, u8 stop_req, u8 *stop_rsp);
- wifi_error wifi_get_valid_channels_stub(wifi_interface_handle handle,
+wifi_error wifi_get_valid_channels_stub(wifi_interface_handle handle,
int band, int max_channels, wifi_channel *channels, int *num_channels);
- wifi_error wifi_rtt_range_request_stub(wifi_request_id id, wifi_interface_handle iface,
+wifi_error wifi_rtt_range_request_stub(wifi_request_id id, wifi_interface_handle iface,
unsigned num_rtt_config, wifi_rtt_config rtt_config[], wifi_rtt_event_handler handler);
- wifi_error wifi_rtt_range_cancel_stub(wifi_request_id id, wifi_interface_handle iface,
+wifi_error wifi_rtt_range_cancel_stub(wifi_request_id id, wifi_interface_handle iface,
unsigned num_devices, mac_addr addr[]);
- wifi_error wifi_get_rtt_capabilities_stub(wifi_interface_handle iface,
+wifi_error wifi_get_rtt_capabilities_stub(wifi_interface_handle iface,
wifi_rtt_capabilities *capabilities);
- wifi_error wifi_set_nodfs_flag_stub(wifi_interface_handle iface, u32 nodfs);
- wifi_error wifi_start_logging_stub(wifi_interface_handle iface, u32 verbose_level, u32 flags,
+wifi_error wifi_set_nodfs_flag_stub(wifi_interface_handle iface, u32 nodfs);
+wifi_error wifi_start_logging_stub(wifi_interface_handle iface, u32 verbose_level, u32 flags,
u32 max_interval_sec, u32 min_data_size, char *buffer_name);
- wifi_error wifi_set_epno_list_stub(int id, wifi_interface_info *iface, int num_networks,
+wifi_error wifi_set_epno_list_stub(int id, wifi_interface_info *iface, int num_networks,
wifi_epno_network *networks, wifi_epno_handler handler);
- wifi_error wifi_set_country_code_stub(wifi_interface_handle iface, const char *code);
+wifi_error wifi_set_country_code_stub(wifi_interface_handle iface, const char *code);
+wifi_error wifi_set_epno_list_stub(int id, wifi_interface_info *iface, int num_networks,
+ wifi_epno_network *networks, wifi_epno_handler handler);
+wifi_error wifi_enable_tdls_stub(wifi_interface_handle iface, mac_addr addr,
+ wifi_tdls_params *params, wifi_tdls_handler handler);
+wifi_error wifi_disable_tdls_stub(wifi_interface_handle iface, mac_addr addr);
+wifi_error wifi_get_tdls_status_stub(wifi_interface_handle iface, mac_addr addr,
+ wifi_tdls_status *status);
+wifi_error wifi_get_tdls_capabilities_stub(wifi_interface_handle iface,
+ wifi_tdls_capabilities *capabilities);
#ifdef __cplusplus
}
#endif
diff --git a/service/lib/wifi_hal_stub.cpp b/service/lib/wifi_hal_stub.cpp
index 5ba413218..4ea4ab3ed 100644
--- a/service/lib/wifi_hal_stub.cpp
+++ b/service/lib/wifi_hal_stub.cpp
@@ -166,3 +166,22 @@ wifi_error wifi_set_epno_list_stub(int id, wifi_interface_info *iface, int num_n
wifi_error wifi_set_country_code_stub(wifi_interface_handle iface, const char *code) {
return WIFI_ERROR_NOT_SUPPORTED;
}
+
+wifi_error wifi_enable_tdls_stub(wifi_interface_handle iface, mac_addr addr,
+ wifi_tdls_params *params, wifi_tdls_handler handler) {
+ return WIFI_ERROR_NOT_SUPPORTED;
+}
+
+wifi_error wifi_disable_tdls_stub(wifi_interface_handle iface, mac_addr addr) {
+ return WIFI_ERROR_NOT_SUPPORTED;
+}
+
+wifi_error wifi_get_tdls_status_stub(wifi_interface_handle iface, mac_addr addr,
+ wifi_tdls_status *status) {
+ return WIFI_ERROR_NOT_SUPPORTED;
+}
+
+wifi_error wifi_get_tdls_capabilities_stub(wifi_interface_handle iface,
+ wifi_tdls_capabilities *capabilities) {
+ return WIFI_ERROR_NOT_SUPPORTED;
+} \ No newline at end of file