diff options
author | Etan Cohen <etancohen@google.com> | 2016-10-05 05:20:05 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2016-10-05 05:20:05 +0000 |
commit | 8acd9c88b0e2e408e685eac3964135f40a783756 (patch) | |
tree | 19fd48fb84df8facc98d5ae2bec9a486187fbf1a /service | |
parent | 6c90568a19e32a1825e06a608e59d3f36daff9ca (diff) | |
parent | 4c172f57fbad84033ef1ef0638f360d33ec7ccf5 (diff) |
Merge "[NAN] Use NAN capability information to validate configurations"
Diffstat (limited to 'service')
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, |