summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorEtan Cohen <etancohen@google.com>2016-02-03 14:58:44 -0800
committerEtan Cohen <etancohen@google.com>2016-02-05 18:27:22 +0000
commite36f5903f5d236a29dc94c8bdb215807ae75f5a1 (patch)
tree38421c5fc6533831831a92cfc89cb0a85056bca2 /service
parenta40a871604177637c12f190cbbfbf71752c490bd (diff)
NAN: Add NAN HAL capability
Query NAN HAL for its capabilities and propagate to WifiNanStateManager for storage (usage is TBD). BUG=26564631 Change-Id: Icb4223c5a03cb65fba1781d0ebe78d70110d3a86
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/nan/WifiNanNative.java104
-rw-r--r--service/java/com/android/server/wifi/nan/WifiNanStateManager.java25
-rw-r--r--service/jni/com_android_server_wifi_nan_WifiNanNative.cpp96
-rw-r--r--service/jni/wifi_hal_stub.h2
-rw-r--r--service/lib/wifi_hal_stub.cpp5
5 files changed, 199 insertions, 33 deletions
diff --git a/service/java/com/android/server/wifi/nan/WifiNanNative.java b/service/java/com/android/server/wifi/nan/WifiNanNative.java
index f43040046..73f0826f9 100644
--- a/service/java/com/android/server/wifi/nan/WifiNanNative.java
+++ b/service/java/com/android/server/wifi/nan/WifiNanNative.java
@@ -66,7 +66,36 @@ public class WifiNanNative {
return sWifiNanNativeSingleton;
}
- public static native int initNanHandlersNative(Object cls, int iface);
+ public static class Capabilities {
+ public int maxConcurrentNanClusters;
+ public int maxPublishes;
+ public int maxSubscribes;
+ public int maxServiceNameLen;
+ public int maxMatchFilterLen;
+ public int maxTotalMatchFilterLen;
+ public int maxServiceSpecificInfoLen;
+ public int maxVsaDataLen;
+ public int maxMeshDataLen;
+ public int maxNdiInterfaces;
+ public int maxNdpSessions;
+ public int maxAppInfoLen;
+
+ @Override
+ public String toString() {
+ return "Capabilities [maxConcurrentNanClusters=" + maxConcurrentNanClusters
+ + ", maxPublishes=" + maxPublishes + ", maxSubscribes=" + maxSubscribes
+ + ", maxServiceNameLen=" + maxServiceNameLen + ", maxMatchFilterLen="
+ + maxMatchFilterLen + ", maxTotalMatchFilterLen=" + maxTotalMatchFilterLen
+ + ", maxServiceSpecificInfoLen=" + maxServiceSpecificInfoLen
+ + ", maxVsaDataLen=" + maxVsaDataLen + ", maxMeshDataLen=" + maxMeshDataLen
+ + ", maxNdiInterfaces=" + maxNdiInterfaces + ", maxNdpSessions="
+ + maxNdpSessions + ", maxAppInfoLen=" + maxAppInfoLen + "]";
+ }
+ }
+
+ /* package */ static native int initNanHandlersNative(Object cls, int iface);
+
+ private static native int getCapabilitiesNative(short transactionId, Object cls, int iface);
private boolean isNanInit(boolean tryToInit) {
if (!tryToInit || sNanNativeInit) {
@@ -83,6 +112,15 @@ public class WifiNanNative {
int ret = initNanHandlersNative(WifiNative.class, WifiNative.sWlan0Index);
if (DBG) Log.d(TAG, "initNanHandlersNative: res=" + ret);
sNanNativeInit = ret == WIFI_SUCCESS;
+
+ if (sNanNativeInit) {
+ ret = getCapabilitiesNative(
+ WifiNanStateManager.getInstance().createNextTransactionId(),
+ WifiNative.class,
+ WifiNative.sWlan0Index);
+ if (DBG) Log.d(TAG, "getCapabilitiesNative: res=" + ret);
+ }
+
return sNanNativeInit;
} else {
Log.w(TAG, "isNanInit: HAL not initialized");
@@ -289,6 +327,7 @@ public class WifiNanNative {
public static final int NAN_RESPONSE_TRANSMIT_FOLLOWUP = 4;
public static final int NAN_RESPONSE_SUBSCRIBE = 5;
public static final int NAN_RESPONSE_SUBSCRIBE_CANCEL = 6;
+ public static final int NAN_RESPONSE_GET_CAPABILITIES = 12;
// direct copy from wifi_nan.h: need to keep in sync
public static final int NAN_STATUS_SUCCESS = 0;
@@ -418,12 +457,11 @@ public class WifiNanNative {
// callback from native
private static void onNanNotifyResponse(short transactionId, int responseType, int status,
- int value, int pubSubId) {
+ int value) {
if (VDBG) {
Log.v(TAG,
"onNanNotifyResponse: transactionId=" + transactionId + ", responseType="
- + responseType + ", status=" + status + ", value=" + value
- + ", pubSubId=" + pubSubId);
+ + responseType + ", status=" + status + ", value=" + value);
}
switch (responseType) {
@@ -435,25 +473,48 @@ public class WifiNanNative {
translateHalStatusToPublicStatus(status));
}
break;
- case NAN_RESPONSE_PUBLISH:
+ case NAN_RESPONSE_PUBLISH_CANCEL:
+ if (status != NAN_STATUS_SUCCESS) {
+ Log.e(TAG, "onNanNotifyResponse: NAN_RESPONSE_PUBLISH_CANCEL error - status="
+ + status + ", value=" + value);
+ }
+ break;
+ case NAN_RESPONSE_TRANSMIT_FOLLOWUP:
if (status == NAN_STATUS_SUCCESS) {
- WifiNanStateManager.getInstance().onPublishSuccess(transactionId, pubSubId);
+ WifiNanStateManager.getInstance().onMessageSendSuccess(transactionId);
} else {
- WifiNanStateManager.getInstance().onPublishFail(transactionId,
+ WifiNanStateManager.getInstance().onMessageSendFail(transactionId,
translateHalStatusToPublicStatus(status));
}
break;
- case NAN_RESPONSE_PUBLISH_CANCEL:
+ case NAN_RESPONSE_SUBSCRIBE_CANCEL:
if (status != NAN_STATUS_SUCCESS) {
Log.e(TAG, "onNanNotifyResponse: NAN_RESPONSE_PUBLISH_CANCEL error - status="
+ status + ", value=" + value);
}
break;
- case NAN_RESPONSE_TRANSMIT_FOLLOWUP:
+ default:
+ WifiNanStateManager.getInstance().onUnknownTransaction(responseType, transactionId,
+ translateHalStatusToPublicStatus(status));
+ break;
+ }
+ }
+
+ private static void onNanNotifyResponsePublishSubscribe(short transactionId, int responseType,
+ int status, int value, int pubSubId) {
+ if (VDBG) {
+ Log.v(TAG,
+ "onNanNotifyResponsePublishSubscribe: transactionId=" + transactionId
+ + ", responseType=" + responseType + ", status=" + status + ", value="
+ + value + ", pubSubId=" + pubSubId);
+ }
+
+ switch (responseType) {
+ case NAN_RESPONSE_PUBLISH:
if (status == NAN_STATUS_SUCCESS) {
- WifiNanStateManager.getInstance().onMessageSendSuccess(transactionId);
+ WifiNanStateManager.getInstance().onPublishSuccess(transactionId, pubSubId);
} else {
- WifiNanStateManager.getInstance().onMessageSendFail(transactionId,
+ WifiNanStateManager.getInstance().onPublishFail(transactionId,
translateHalStatusToPublicStatus(status));
}
break;
@@ -465,12 +526,6 @@ public class WifiNanNative {
translateHalStatusToPublicStatus(status));
}
break;
- case NAN_RESPONSE_SUBSCRIBE_CANCEL:
- if (status != NAN_STATUS_SUCCESS) {
- Log.e(TAG, "onNanNotifyResponse: NAN_RESPONSE_PUBLISH_CANCEL error - status="
- + status + ", value=" + value);
- }
- break;
default:
WifiNanStateManager.getInstance().onUnknownTransaction(responseType, transactionId,
translateHalStatusToPublicStatus(status));
@@ -478,6 +533,21 @@ public class WifiNanNative {
}
}
+ private static void onNanNotifyResponseCapabilities(short transactionId, int status, int value,
+ Capabilities capabilities) {
+ if (VDBG) {
+ Log.v(TAG, "onNanNotifyResponsePublishSubscribe: transactionId=" + transactionId
+ + ", status=" + status + ", value=" + value + ", capabilities=" + capabilities);
+ }
+
+ if (status == NAN_STATUS_SUCCESS) {
+ WifiNanStateManager.getInstance().onCapabilitiesUpdate(transactionId, capabilities);
+ } else {
+ Log.e(TAG,
+ "onNanNotifyResponseCapabilities: error status=" + status + ", value=" + value);
+ }
+ }
+
public static final int NAN_EVENT_ID_DISC_MAC_ADDR = 0;
public static final int NAN_EVENT_ID_STARTED_CLUSTER = 1;
public static final int NAN_EVENT_ID_JOINED_CLUSTER = 2;
diff --git a/service/java/com/android/server/wifi/nan/WifiNanStateManager.java b/service/java/com/android/server/wifi/nan/WifiNanStateManager.java
index ce32827f9..d25336329 100644
--- a/service/java/com/android/server/wifi/nan/WifiNanStateManager.java
+++ b/service/java/com/android/server/wifi/nan/WifiNanStateManager.java
@@ -69,6 +69,7 @@ public class WifiNanStateManager {
private static final int MESSAGE_ON_UNKNOWN_TRANSACTION = 24;
private static final int MESSAGE_ON_MATCH = 25;
private static final int MESSAGE_ON_MESSAGE_RECEIVED = 26;
+ private static final int MESSAGE_ON_CAPABILITIES_UPDATED = 27;
private static final String MESSAGE_BUNDLE_KEY_SESSION_ID = "session_id";
private static final String MESSAGE_BUNDLE_KEY_EVENTS = "events";
@@ -88,6 +89,8 @@ public class WifiNanStateManager {
private static final String MESSAGE_BUNDLE_KEY_MESSAGE_DATA = "message_data";
private static final String MESSAGE_BUNDLE_KEY_MESSAGE_LENGTH = "message_length";
+ private WifiNanNative.Capabilities mCapabilities;
+
private WifiNanStateHandler mHandler;
// no synchronization necessary: only access through Handler
@@ -202,6 +205,13 @@ public class WifiNanStateManager {
mHandler.sendMessage(msg);
}
+ public void onCapabilitiesUpdate(short transactionId, WifiNanNative.Capabilities capabilities) {
+ Message msg = mHandler.obtainMessage(MESSAGE_ON_CAPABILITIES_UPDATED);
+ msg.arg1 = transactionId;
+ msg.obj = capabilities;
+ mHandler.sendMessage(msg);
+ }
+
public void onConfigCompleted(short transactionId) {
Message msg = mHandler.obtainMessage(MESSAGE_ON_CONFIG_COMPLETED);
msg.arg1 = transactionId;
@@ -427,6 +437,10 @@ public class WifiNanStateManager {
stopSessionLocal(msg.arg1, msg.arg2);
break;
}
+ case MESSAGE_ON_CAPABILITIES_UPDATED:
+ onCapabilitiesUpdatedLocal((short) msg.arg1,
+ (WifiNanNative.Capabilities) msg.obj);
+ break;
case MESSAGE_ON_CONFIG_COMPLETED:
onConfigCompletedLocal((short) msg.arg1);
break;
@@ -774,6 +788,16 @@ public class WifiNanStateManager {
* Callbacks (calls from HAL/Native to service)
*/
+ private void onCapabilitiesUpdatedLocal(short transactionId,
+ WifiNanNative.Capabilities capabilities) {
+ if (VDBG) {
+ Log.v(TAG, "onCapabilitiesUpdatedLocal: transactionId=" + transactionId
+ + ", capabilites=" + capabilities);
+ }
+
+ mCapabilities = capabilities;
+ }
+
private void onConfigCompletedLocal(short transactionId) {
if (VDBG) {
Log.v(TAG, "onConfigCompleted: transactionId=" + transactionId);
@@ -1139,6 +1163,7 @@ public class WifiNanStateManager {
pw.println("NanStateManager:");
pw.println(" mClients: [" + mClients + "]");
pw.println(" mPendingResponses: [" + mPendingResponses + "]");
+ pw.println(" mCapabilities: [" + mCapabilities + "]");
pw.println(" mNextTransactionId: " + mNextTransactionId);
for (int i = 0; i < mClients.size(); ++i) {
mClients.valueAt(i).dump(fd, pw, args);
diff --git a/service/jni/com_android_server_wifi_nan_WifiNanNative.cpp b/service/jni/com_android_server_wifi_nan_WifiNanNative.cpp
index f342632df..7efc356a3 100644
--- a/service/jni/com_android_server_wifi_nan_WifiNanNative.cpp
+++ b/service/jni/com_android_server_wifi_nan_WifiNanNative.cpp
@@ -46,23 +46,73 @@ extern wifi_hal_fn hal_fn;
// Start NAN functions
static void OnNanNotifyResponse(transaction_id id, NanResponseMsg* msg) {
- ALOGD("OnNanNotifyResponse: transaction_id=%d, status=%d, value=%d, response_type=%d",
- id, msg->status, msg->value, msg->response_type);
-
- int pub_sub_id = 0;
- if (msg->response_type == NAN_RESPONSE_PUBLISH) {
- pub_sub_id = msg->body.publish_response.publish_id;
- } else if (msg->response_type == NAN_RESPONSE_SUBSCRIBE) {
- pub_sub_id = msg->body.subscribe_response.subscribe_id;
+ ALOGD(
+ "OnNanNotifyResponse: transaction_id=%d, status=%d, value=%d, response_type=%d",
+ id, msg->status, msg->value, msg->response_type);
+
+ JNIHelper helper(mVM);
+ switch (msg->response_type) {
+ case NAN_RESPONSE_PUBLISH:
+ helper.reportEvent(mCls, "onNanNotifyResponsePublishSubscribe",
+ "(SIIII)V", (short) id, (int) msg->response_type,
+ (int) msg->status, (int) msg->value,
+ msg->body.publish_response.publish_id);
+ break;
+ case NAN_RESPONSE_SUBSCRIBE:
+ helper.reportEvent(mCls, "onNanNotifyResponsePublishSubscribe",
+ "(SIIII)V", (short) id, (int) msg->response_type,
+ (int) msg->status, (int) msg->value,
+ msg->body.subscribe_response.subscribe_id);
+ break;
+ case NAN_GET_CAPABILITIES: {
+ JNIObject<jobject> data = helper.createObject(
+ "com/android/server/wifi/nan/WifiNanNative$Capabilities");
+ if (data == NULL) {
+ ALOGE(
+ "Error in allocating WifiNanNative.Capabilities OnNanNotifyResponse");
+ return;
+ }
+
+ helper.setIntField(
+ data, "maxConcurrentNanClusters",
+ (int) msg->body.nan_capabilities.max_concurrent_nan_clusters);
+ helper.setIntField(data, "maxPublishes",
+ (int) msg->body.nan_capabilities.max_publishes);
+ helper.setIntField(data, "maxSubscribes",
+ (int) msg->body.nan_capabilities.max_subscribes);
+ helper.setIntField(data, "maxServiceNameLen",
+ (int) msg->body.nan_capabilities.max_service_name_len);
+ helper.setIntField(data, "maxMatchFilterLen",
+ (int) msg->body.nan_capabilities.max_match_filter_len);
+ helper.setIntField(
+ data, "maxTotalMatchFilterLen",
+ (int) msg->body.nan_capabilities.max_total_match_filter_len);
+ helper.setIntField(
+ data, "maxServiceSpecificInfoLen",
+ (int) msg->body.nan_capabilities.max_service_specific_info_len);
+ helper.setIntField(data, "maxVsaDataLen",
+ (int) msg->body.nan_capabilities.max_vsa_data_len);
+ helper.setIntField(data, "maxMeshDataLen",
+ (int) msg->body.nan_capabilities.max_mesh_data_len);
+ helper.setIntField(data, "maxNdiInterfaces",
+ (int) msg->body.nan_capabilities.max_ndi_interfaces);
+ helper.setIntField(data, "maxNdpSessions",
+ (int) msg->body.nan_capabilities.max_ndp_sessions);
+ helper.setIntField(data, "maxAppInfoLen",
+ (int) msg->body.nan_capabilities.max_app_info_len);
+
+ helper.reportEvent(
+ mCls, "onNanNotifyResponseCapabilities",
+ "(SIILcom/android/server/wifi/nan/WifiNanNative$Capabilities;)V",
+ (short) id, (int) msg->status, (int) msg->value, data.get());
+ break;
}
-
- JNIHelper helper(mVM);
- helper.reportEvent(mCls, "onNanNotifyResponse", "(SIIII)V",
- (short) id,
- (int) msg->response_type,
- (int) msg->status,
- (int) msg->value,
- pub_sub_id);
+ default:
+ helper.reportEvent(mCls, "onNanNotifyResponse", "(SIII)V", (short) id,
+ (int) msg->response_type, (int) msg->status,
+ (int) msg->value);
+ break;
+ }
}
static void OnNanEventPublishTerminated(NanPublishTerminatedInd* event) {
@@ -212,6 +262,19 @@ static jint android_net_wifi_nan_enable_request(JNIEnv *env, jclass cls,
return hal_fn.wifi_nan_enable_request(transaction_id, handle, &msg);
}
+static jint android_net_wifi_nan_get_capabilities(JNIEnv *env, jclass cls,
+ jshort transaction_id,
+ jclass wifi_native_cls,
+ jint iface) {
+ JNIHelper helper(env);
+ wifi_interface_handle handle = getIfaceHandle(helper, wifi_native_cls, iface);
+
+ ALOGD("android_net_wifi_nan_get_capabilities handle=%p, id=%d", handle,
+ transaction_id);
+
+ return hal_fn.wifi_nan_get_capabilities(transaction_id, handle);
+}
+
static jint android_net_wifi_nan_disable_request(JNIEnv *env, jclass cls,
jshort transaction_id,
jclass wifi_native_cls,
@@ -442,6 +505,7 @@ static JNINativeMethod gWifiNanMethods[] = {
/* name, signature, funcPtr */
{"initNanHandlersNative", "(Ljava/lang/Object;I)I", (void*)android_net_wifi_nan_register_handler },
+ {"getCapabilitiesNative", "(SLjava/lang/Object;I)I", (void*)android_net_wifi_nan_get_capabilities },
{"enableAndConfigureNative", "(SLjava/lang/Object;ILandroid/net/wifi/nan/ConfigRequest;)I", (void*)android_net_wifi_nan_enable_request },
{"disableNative", "(SLjava/lang/Object;I)I", (void*)android_net_wifi_nan_disable_request },
{"publishNative", "(SILjava/lang/Object;ILandroid/net/wifi/nan/PublishData;Landroid/net/wifi/nan/PublishSettings;)I", (void*)android_net_wifi_nan_publish },
diff --git a/service/jni/wifi_hal_stub.h b/service/jni/wifi_hal_stub.h
index 3034689e2..c879ed1cd 100644
--- a/service/jni/wifi_hal_stub.h
+++ b/service/jni/wifi_hal_stub.h
@@ -148,6 +148,8 @@ wifi_error wifi_nan_register_handler_stub(wifi_interface_handle iface,
NanCallbackHandler handlers);
wifi_error wifi_nan_get_version_stub(wifi_handle handle,
NanVersion* version);
+wifi_error wifi_nan_get_capabilities_stub(transaction_id id,
+ wifi_interface_handle iface);
wifi_error wifi_get_packet_filter_capabilities_stub(wifi_interface_handle handle,
u32 *version, u32 *max_len);
wifi_error wifi_set_packet_filter_stub(wifi_interface_handle handle,
diff --git a/service/lib/wifi_hal_stub.cpp b/service/lib/wifi_hal_stub.cpp
index 8bde6e087..d9370e96f 100644
--- a/service/lib/wifi_hal_stub.cpp
+++ b/service/lib/wifi_hal_stub.cpp
@@ -336,6 +336,11 @@ wifi_error wifi_nan_get_version_stub(wifi_handle handle,
return WIFI_ERROR_NOT_SUPPORTED;
}
+wifi_error wifi_nan_get_capabilities_stub(transaction_id id,
+ wifi_interface_handle iface) {
+ return WIFI_ERROR_NOT_SUPPORTED;
+}
+
wifi_error wifi_get_packet_filter_capabilities_stub(wifi_interface_handle handle,
u32 *version, u32 *max_len) {
return WIFI_ERROR_NOT_SUPPORTED;