summaryrefslogtreecommitdiffstats
path: root/service
diff options
context:
space:
mode:
authorPrerepa Viswanadham <dham@google.com>2015-05-01 10:20:23 -0700
committerPrerepa Viswanadham <dham@google.com>2015-05-01 10:21:52 -0700
commit7ea679c65dd903b1eca6b68019784244a5a369f4 (patch)
tree4e7ade72818040c351557c2d008b4013327af645 /service
parentf7767c9fa5cbf3c79cffbef5b23c7957c4a7cf06 (diff)
parent624b4e283031091716075e5b6fcdab0547fef83a (diff)
downloadandroid_frameworks_opt_net_wifi-7ea679c65dd903b1eca6b68019784244a5a369f4.tar.gz
android_frameworks_opt_net_wifi-7ea679c65dd903b1eca6b68019784244a5a369f4.tar.bz2
android_frameworks_opt_net_wifi-7ea679c65dd903b1eca6b68019784244a5a369f4.zip
Merge commit '624b4e2' into master_merge
Change-Id: Iaf46e8490ccb35519aaa7db6873db6abf93d48a0
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/RttService.java58
-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.h29
-rw-r--r--service/lib/wifi_hal_stub.cpp18
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;
+}