diff options
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/nan/WifiNanNative.java | 104 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/nan/WifiNanStateManager.java | 25 | ||||
-rw-r--r-- | service/jni/com_android_server_wifi_nan_WifiNanNative.cpp | 96 | ||||
-rw-r--r-- | service/jni/wifi_hal_stub.h | 2 | ||||
-rw-r--r-- | service/lib/wifi_hal_stub.cpp | 5 |
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; |