summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorEtan Cohen <etancohen@google.com>2016-10-05 05:20:05 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2016-10-05 05:20:05 +0000
commit8acd9c88b0e2e408e685eac3964135f40a783756 (patch)
tree19fd48fb84df8facc98d5ae2bec9a486187fbf1a /service
parent6c90568a19e32a1825e06a608e59d3f36daff9ca (diff)
parent4c172f57fbad84033ef1ef0638f360d33ec7ccf5 (diff)
Merge "[NAN] Use NAN capability information to validate configurations"
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/nan/WifiNanDataPathStateManager.java4
-rw-r--r--service/java/com/android/server/wifi/nan/WifiNanNative.java15
-rw-r--r--service/java/com/android/server/wifi/nan/WifiNanServiceImpl.java13
-rw-r--r--service/java/com/android/server/wifi/nan/WifiNanStateManager.java27
4 files changed, 50 insertions, 9 deletions
diff --git a/service/java/com/android/server/wifi/nan/WifiNanDataPathStateManager.java b/service/java/com/android/server/wifi/nan/WifiNanDataPathStateManager.java
index d624d9008..4bcfd1546 100644
--- a/service/java/com/android/server/wifi/nan/WifiNanDataPathStateManager.java
+++ b/service/java/com/android/server/wifi/nan/WifiNanDataPathStateManager.java
@@ -150,12 +150,12 @@ public class WifiNanDataPathStateManager {
public void createAllInterfaces() {
if (VDBG) Log.v(TAG, "createAllInterfaces");
- if (mMgr.mCapabilities == null) {
+ if (mMgr.getCapabilities() == null) {
Log.e(TAG, "createAllInterfaces: capabilities aren't initialized yet!");
return;
}
- for (int i = 0; i < mMgr.mCapabilities.maxNdiInterfaces; ++i) {
+ for (int i = 0; i < mMgr.getCapabilities().maxNdiInterfaces; ++i) {
String name = NAN_INTERFACE_PREFIX + i;
if (mInterfaces.contains(name)) {
Log.e(TAG, "createAllInterfaces(): interface already up, " + name
diff --git a/service/java/com/android/server/wifi/nan/WifiNanNative.java b/service/java/com/android/server/wifi/nan/WifiNanNative.java
index 630bcdc97..ba65d40e5 100644
--- a/service/java/com/android/server/wifi/nan/WifiNanNative.java
+++ b/service/java/com/android/server/wifi/nan/WifiNanNative.java
@@ -19,7 +19,9 @@ package com.android.server.wifi.nan;
import android.net.wifi.nan.ConfigRequest;
import android.net.wifi.nan.PublishConfig;
import android.net.wifi.nan.SubscribeConfig;
+import android.net.wifi.nan.WifiNanCharacteristics;
import android.net.wifi.nan.WifiNanDiscoverySessionCallback;
+import android.os.Bundle;
import android.util.Log;
import com.android.server.wifi.WifiNative;
@@ -89,6 +91,19 @@ public class WifiNanNative {
public int maxAppInfoLen;
public int maxQueuedTransmitMessages;
+ /**
+ * Converts the internal capabilities to a parcelable & potentially app-facing
+ * characteristics bundle. Only some of the information is exposed.
+ */
+ public WifiNanCharacteristics toPublicCharacteristics() {
+ Bundle bundle = new Bundle();
+ bundle.putInt(WifiNanCharacteristics.KEY_MAX_SERVICE_NAME_LENGTH, maxServiceNameLen);
+ bundle.putInt(WifiNanCharacteristics.KEY_MAX_SERVICE_SPECIFIC_INFO_LENGTH,
+ maxServiceSpecificInfoLen);
+ bundle.putInt(WifiNanCharacteristics.KEY_MAX_MATCH_FILTER_LENGTH, maxMatchFilterLen);
+ return new WifiNanCharacteristics(bundle);
+ }
+
@Override
public String toString() {
return "Capabilities [maxConcurrentNanClusters=" + maxConcurrentNanClusters
diff --git a/service/java/com/android/server/wifi/nan/WifiNanServiceImpl.java b/service/java/com/android/server/wifi/nan/WifiNanServiceImpl.java
index f84eb5b5a..fe8f919fb 100644
--- a/service/java/com/android/server/wifi/nan/WifiNanServiceImpl.java
+++ b/service/java/com/android/server/wifi/nan/WifiNanServiceImpl.java
@@ -252,7 +252,7 @@ public class WifiNanServiceImpl extends IWifiNanManager.Stub {
if (publishConfig == null) {
throw new IllegalArgumentException("PublishConfig must not be null");
}
- publishConfig.validate();
+ publishConfig.assertValid(mStateManager.getCharacteristics());
int uid = getMockableCallingUid();
enforceClientValidity(uid, clientId);
@@ -272,7 +272,7 @@ public class WifiNanServiceImpl extends IWifiNanManager.Stub {
if (publishConfig == null) {
throw new IllegalArgumentException("PublishConfig must not be null");
}
- publishConfig.validate();
+ publishConfig.assertValid(mStateManager.getCharacteristics());
int uid = getMockableCallingUid();
enforceClientValidity(uid, clientId);
@@ -296,7 +296,7 @@ public class WifiNanServiceImpl extends IWifiNanManager.Stub {
if (subscribeConfig == null) {
throw new IllegalArgumentException("SubscribeConfig must not be null");
}
- subscribeConfig.validate();
+ subscribeConfig.assertValid(mStateManager.getCharacteristics());
int uid = getMockableCallingUid();
enforceClientValidity(uid, clientId);
@@ -316,7 +316,7 @@ public class WifiNanServiceImpl extends IWifiNanManager.Stub {
if (subscribeConfig == null) {
throw new IllegalArgumentException("SubscribeConfig must not be null");
}
- subscribeConfig.validate();
+ subscribeConfig.assertValid(mStateManager.getCharacteristics());
int uid = getMockableCallingUid();
enforceClientValidity(uid, clientId);
@@ -334,6 +334,11 @@ public class WifiNanServiceImpl extends IWifiNanManager.Stub {
enforceAccessPermission();
enforceChangePermission();
+ if (message != null
+ && message.length > mStateManager.getCharacteristics().getMaxServiceNameLength()) {
+ throw new IllegalArgumentException(
+ "Message length longer than supported by device characteristics");
+ }
if (retryCount < 0 || retryCount > WifiNanDiscoveryBaseSession.getMaxSendRetryCount()) {
throw new IllegalArgumentException("Invalid 'retryCount' must be non-negative "
+ "and <= WifiNanDiscoveryBaseSession.MAX_SEND_RETRY_COUNT");
diff --git a/service/java/com/android/server/wifi/nan/WifiNanStateManager.java b/service/java/com/android/server/wifi/nan/WifiNanStateManager.java
index 28095c832..b6bd6a788 100644
--- a/service/java/com/android/server/wifi/nan/WifiNanStateManager.java
+++ b/service/java/com/android/server/wifi/nan/WifiNanStateManager.java
@@ -24,6 +24,7 @@ import android.net.wifi.nan.IWifiNanDiscoverySessionCallback;
import android.net.wifi.nan.IWifiNanEventCallback;
import android.net.wifi.nan.PublishConfig;
import android.net.wifi.nan.SubscribeConfig;
+import android.net.wifi.nan.WifiNanCharacteristics;
import android.net.wifi.nan.WifiNanManager;
import android.os.Bundle;
import android.os.Looper;
@@ -179,7 +180,8 @@ public class WifiNanStateManager {
* handler thread: no need to use a lock.
*/
private Context mContext;
- /* package */ WifiNanNative.Capabilities mCapabilities;
+ private volatile WifiNanNative.Capabilities mCapabilities;
+ private volatile WifiNanCharacteristics mCharacteristics = null;
private WifiNanStateMachine mSm;
private WifiNanRttStateManager mRtt;
private WifiNanDataPathStateManager mDataPathMgr;
@@ -241,6 +243,24 @@ public class WifiNanStateManager {
return mClients.get(clientId);
}
+ /**
+ * Get the capabilities.
+ */
+ public WifiNanNative.Capabilities getCapabilities() {
+ return mCapabilities;
+ }
+
+ /**
+ * Get the public characteristics derived from the capabilities. Use lazy initialization.
+ */
+ public WifiNanCharacteristics getCharacteristics() {
+ if (mCharacteristics == null && mCapabilities != null) {
+ mCharacteristics = mCapabilities.toPublicCharacteristics();
+ }
+
+ return mCharacteristics;
+ }
+
/*
* COMMANDS
*/
@@ -404,7 +424,7 @@ public class WifiNanStateManager {
/**
* Get the capabilities of the current NAN firmware.
*/
- public void getCapabilities() {
+ public void queryCapabilities() {
Message msg = mSm.obtainMessage(MESSAGE_TYPE_COMMAND);
msg.arg1 = COMMAND_TYPE_GET_CAPABILITIES;
mSm.sendMessage(msg);
@@ -1941,7 +1961,7 @@ public class WifiNanStateManager {
WifiNanNative.getInstance().deInitNan(); // force a re-init of NAN HAL
mUsageEnabled = true;
- getCapabilities();
+ queryCapabilities();
createAllDataPathInterfaces();
sendNanStateChangedBroadcast(true);
}
@@ -2282,6 +2302,7 @@ public class WifiNanStateManager {
}
mCapabilities = capabilities;
+ mCharacteristics = null;
}
private void onCreateDataPathInterfaceResponseLocal(Message command, boolean success,