diff options
-rw-r--r-- | service/java/com/android/server/wifi/RttService.java | 58 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/WifiNative.java | 73 | ||||
-rw-r--r-- | service/jni/com_android_server_wifi_WifiNative.cpp | 103 | ||||
-rw-r--r-- | service/jni/wifi_hal_stub.h | 29 | ||||
-rw-r--r-- | service/lib/wifi_hal_stub.cpp | 18 |
5 files changed, 255 insertions, 26 deletions
diff --git a/service/java/com/android/server/wifi/RttService.java b/service/java/com/android/server/wifi/RttService.java index 51037629a..cc7f5492a 100644 --- a/service/java/com/android/server/wifi/RttService.java +++ b/service/java/com/android/server/wifi/RttService.java @@ -28,6 +28,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.Queue; +import android.Manifest; public final class RttService extends SystemService { @@ -283,20 +284,32 @@ public final class RttService extends SystemService { transitionTo(mRequestPendingState); break; case RttManager.CMD_OP_START_RANGING: { - RttManager.ParcelableRttParams params = - (RttManager.ParcelableRttParams)msg.obj; - if (params == null) { - replyFailed(msg, - RttManager.REASON_INVALID_REQUEST, "No params"); - } else if (ci.addRttRequest(msg.arg2, params) == false) { - replyFailed(msg, - RttManager.REASON_INVALID_REQUEST, "Unspecified"); - } else { - sendMessage(CMD_ISSUE_NEXT_REQUEST); - } + //check permission + if(DBG) Log.d(TAG, "UID is: " + msg.sendingUid); + if (!enforcePermissionCheck(msg)) { + Log.e(TAG, "UID: " + msg.sendingUid + " has no" + + " LOCATION_HARDWARE Permission"); + break; + } + + RttManager.ParcelableRttParams params = + (RttManager.ParcelableRttParams)msg.obj; + if (params == null) { + replyFailed(msg, + RttManager.REASON_INVALID_REQUEST, "No params"); + } else if (ci.addRttRequest(msg.arg2, params) == false) { + replyFailed(msg, + RttManager.REASON_INVALID_REQUEST, "Unspecified"); + } else { + sendMessage(CMD_ISSUE_NEXT_REQUEST); } + } break; case RttManager.CMD_OP_STOP_RANGING: + if(!enforcePermissionCheck(msg)) { + break; + } + for (Iterator<RttRequest> it = mRequestQueue.iterator(); it.hasNext(); ) { RttRequest request = it.next(); @@ -337,9 +350,11 @@ public final class RttService extends SystemService { transitionTo(mEnabledState); } if(mOutstandingRequest != null) { - if (DBG) Log.d(TAG, "new mOutstandingRequest.key is: " + mOutstandingRequest.key); + if (DBG) Log.d(TAG, "new mOutstandingRequest.key is: " + + mOutstandingRequest.key); } else { - if (DBG) Log.d(TAG, "CMD_ISSUE_NEXT_REQUEST: mOutstandingRequest =null "); + if (DBG) Log.d(TAG, + "CMD_ISSUE_NEXT_REQUEST: mOutstandingRequest =null "); } } else { /* just wait; we'll issue next request after @@ -357,6 +372,12 @@ public final class RttService extends SystemService { sendMessage(CMD_ISSUE_NEXT_REQUEST); break; case RttManager.CMD_OP_STOP_RANGING: + if(!enforcePermissionCheck(msg)) { + Log.e(TAG, "UID: " + msg.sendingUid + " has no " + + "LOCATION_HARDWARE Permission"); + break; + } + if (mOutstandingRequest != null && msg.arg2 == mOutstandingRequest.key) { if (DBG) Log.d(TAG, "Cancelling ongoing RTT of: " + msg.arg2); @@ -410,6 +431,17 @@ public final class RttService extends SystemService { } } + boolean enforcePermissionCheck(Message msg) { + try { + mContext.enforcePermission(Manifest.permission.LOCATION_HARDWARE, + -1, msg.sendingUid, "LocationRTT"); + } catch (SecurityException e) { + replyFailed(msg,RttManager.REASON_PERMISSION_DENIED, "No params"); + return false; + } + return true; + } + private WifiNative.RttEventHandler mEventHandler = new WifiNative.RttEventHandler() { @Override public void onRttResults(RttManager.RttResult[] result) { diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java index f23dcbbb9..9b4e9f571 100644 --- a/service/java/com/android/server/wifi/WifiNative.java +++ b/service/java/com/android/server/wifi/WifiNative.java @@ -1806,6 +1806,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 99a942869..4ad82eda0 100644 --- a/service/jni/com_android_server_wifi_WifiNative.cpp +++ b/service/jni/com_android_server_wifi_WifiNative.cpp @@ -71,10 +71,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; } @@ -1379,6 +1382,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 // ---------------------------------------------------------------------------- @@ -1394,7 +1485,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); @@ -1611,7 +1702,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 158da3746..351cdc478 100644 --- a/service/jni/wifi_hal_stub.h +++ b/service/jni/wifi_hal_stub.h @@ -56,22 +56,22 @@ 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_get_firmware_memory_dump_stub( wifi_interface_handle iface, wifi_firmware_memory_dump_handler handler); wifi_error wifi_set_log_handler_stub(wifi_request_id id, wifi_interface_handle iface, @@ -87,7 +87,16 @@ wifi_error wifi_get_logger_supported_feature_set_stub(wifi_interface_handle ifac wifi_error wifi_get_ring_data_stub(wifi_interface_handle iface, char *ring_name); wifi_error wifi_get_driver_version_stub(wifi_interface_handle iface, char **buffer, int *buffer_size); +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 -#endif //__WIFI_HAL_STUB_H__
\ No newline at end of file +#endif //__WIFI_HAL_STUB_H__ diff --git a/service/lib/wifi_hal_stub.cpp b/service/lib/wifi_hal_stub.cpp index ee2f2e45c..1d8f3e4f3 100644 --- a/service/lib/wifi_hal_stub.cpp +++ b/service/lib/wifi_hal_stub.cpp @@ -189,3 +189,21 @@ wifi_error wifi_get_driver_version_stub(wifi_interface_handle iface, char **buff 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; +} |