summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul McLean <pmclean@google.com>2019-08-21 08:20:24 -0600
committerPaul McLean <pmclean@google.com>2019-09-05 13:08:20 -0600
commit64aee9106ec4144f3106b177f0b925d1d7b381ad (patch)
treea1bb1f76813b68350e0543126bf094791680ab02
parentf7f61995e8963dab55138643dc922a966ddec064 (diff)
Restrict enumeration of USB Audio Interfaces
Bug: 136083296 Test: build, flash, connect USB interface, examine logs Test: No regressions for normal audio playback w/ Presonus, USB-C Headset. Note that since this ONLY modifies the interfaces enumerated in the UsbHost API, it has no effect on normal, framework access to USB Audio. Change-Id: Ib7d4c83744dfb0961360749c01b008aa9ab9baa2
-rw-r--r--services/usb/java/com/android/server/usb/descriptors/UsbConfigDescriptor.java30
-rw-r--r--services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java2
-rw-r--r--services/usb/java/com/android/server/usb/descriptors/UsbEndpointDescriptor.java14
-rw-r--r--services/usb/java/com/android/server/usb/descriptors/UsbInterfaceDescriptor.java14
4 files changed, 45 insertions, 15 deletions
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbConfigDescriptor.java b/services/usb/java/com/android/server/usb/descriptors/UsbConfigDescriptor.java
index de2dd101acfd..3f2d8c8ef47c 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbConfigDescriptor.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbConfigDescriptor.java
@@ -41,6 +41,8 @@ public final class UsbConfigDescriptor extends UsbDescriptor {
// D4..0 Reserved, set to 0.
private int mMaxPower; // 8:1 Maximum Power Consumption in 2mA units
+ private boolean mBlockAudio; // leave it off for now. We be replace with a "Developer Option"
+
private ArrayList<UsbInterfaceDescriptor> mInterfaceDescriptors =
new ArrayList<UsbInterfaceDescriptor>();
@@ -77,21 +79,35 @@ public final class UsbConfigDescriptor extends UsbDescriptor {
mInterfaceDescriptors.add(interfaceDesc);
}
+ private boolean isAudioInterface(UsbInterfaceDescriptor descriptor) {
+ return descriptor.getUsbClass() == UsbDescriptor.CLASSID_AUDIO
+ && descriptor.getUsbSubclass() == UsbDescriptor.AUDIO_AUDIOSTREAMING;
+ }
+
UsbConfiguration toAndroid(UsbDescriptorParser parser) {
if (UsbDescriptorParser.DEBUG) {
Log.d(TAG, " toAndroid()");
}
+
+ // NOTE - This code running in the server process.
+ //TODO (pmclean@) - remove this
+// int pid = android.os.Process.myPid();
+// int uid = android.os.Process.myUid();
+// Log.d(TAG, " ---- pid:" + pid + " uid:" + uid);
+
String name = parser.getDescriptorString(mConfigIndex);
UsbConfiguration config = new
UsbConfiguration(mConfigValue, name, mAttribs, mMaxPower);
- UsbInterface[] interfaces = new UsbInterface[mInterfaceDescriptors.size()];
- if (UsbDescriptorParser.DEBUG) {
- Log.d(TAG, " " + mInterfaceDescriptors.size() + " interfaces.");
- }
- for (int index = 0; index < mInterfaceDescriptors.size(); index++) {
- interfaces[index] = mInterfaceDescriptors.get(index).toAndroid(parser);
+
+ ArrayList<UsbInterface> filteredInterfaces = new ArrayList<UsbInterface>();
+ for (UsbInterfaceDescriptor descriptor : mInterfaceDescriptors) {
+ if (!mBlockAudio || !isAudioInterface(descriptor)) {
+ filteredInterfaces.add(descriptor.toAndroid(parser));
+ }
}
- config.setInterfaces(interfaces);
+ UsbInterface[] interfaceArray = new UsbInterface[0];
+ interfaceArray = filteredInterfaces.toArray(interfaceArray);
+ config.setInterfaces(interfaceArray);
return config;
}
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java
index 4f62d5a5c967..6ffbd43a7b1a 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java
@@ -26,7 +26,7 @@ import java.util.ArrayList;
*/
public final class UsbDescriptorParser {
private static final String TAG = "UsbDescriptorParser";
- public static final boolean DEBUG = false;
+ public static final boolean DEBUG = true;
private final String mDeviceAddr;
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbEndpointDescriptor.java b/services/usb/java/com/android/server/usb/descriptors/UsbEndpointDescriptor.java
index 5eb0a2f75ded..4d0cfea98630 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbEndpointDescriptor.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbEndpointDescriptor.java
@@ -31,7 +31,7 @@ public class UsbEndpointDescriptor extends UsbDescriptor {
public static final int MASK_ENDPOINT_ADDRESS = 0b000000000001111;
public static final int MASK_ENDPOINT_DIRECTION = (byte) 0b0000000010000000;
public static final int DIRECTION_OUTPUT = 0x0000;
- public static final int DIRECTION_INPUT = (byte) 0x0080;
+ public static final int DIRECTION_INPUT = 0x0080;
public static final int MASK_ATTRIBS_TRANSTYPE = 0b00000011;
public static final int TRANSTYPE_CONTROL = 0x00;
@@ -85,7 +85,7 @@ public class UsbEndpointDescriptor extends UsbDescriptor {
}
public int getEndpointAddress() {
- return mEndpointAddress;
+ return mEndpointAddress & MASK_ENDPOINT_ADDRESS;
}
public int getAttributes() {
@@ -108,6 +108,10 @@ public class UsbEndpointDescriptor extends UsbDescriptor {
return mSyncAddress;
}
+ public int getDirection() {
+ return mEndpointAddress & UsbEndpointDescriptor.MASK_ENDPOINT_DIRECTION;
+ }
+
/* package */ UsbEndpoint toAndroid(UsbDescriptorParser parser) {
if (UsbDescriptorParser.DEBUG) {
Log.d(TAG, "toAndroid() type:"
@@ -137,11 +141,9 @@ public class UsbEndpointDescriptor extends UsbDescriptor {
canvas.openList();
- int address = getEndpointAddress();
canvas.writeListItem("Address: "
- + ReportCanvas.getHexString(address & UsbEndpointDescriptor.MASK_ENDPOINT_ADDRESS)
- + ((address & UsbEndpointDescriptor.MASK_ENDPOINT_DIRECTION)
- == UsbEndpointDescriptor.DIRECTION_OUTPUT ? " [out]" : " [in]"));
+ + ReportCanvas.getHexString(getEndpointAddress())
+ + (getDirection() == UsbEndpointDescriptor.DIRECTION_OUTPUT ? " [out]" : " [in]"));
int attributes = getAttributes();
canvas.openListItem();
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbInterfaceDescriptor.java b/services/usb/java/com/android/server/usb/descriptors/UsbInterfaceDescriptor.java
index 1dc6069bbb0a..64dbd971cc67 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbInterfaceDescriptor.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbInterfaceDescriptor.java
@@ -31,7 +31,6 @@ import java.util.ArrayList;
*/
public class UsbInterfaceDescriptor extends UsbDescriptor {
private static final String TAG = "UsbInterfaceDescriptor";
-
protected int mInterfaceNumber; // 2:1 Number of Interface
protected byte mAlternateSetting; // 3:1 Value used to select alternative setting
protected byte mNumEndpoints; // 4:1 Number of Endpoints used for this interface
@@ -73,6 +72,19 @@ public class UsbInterfaceDescriptor extends UsbDescriptor {
return mNumEndpoints;
}
+ /**
+ * @param index Index of desired UsbEndpointDescriptor.
+ * @return the UsbEndpointDescriptor descriptor at the specified index, or
+ * null if an invalid index.
+ */
+ public UsbEndpointDescriptor getEndpointDescriptor(int index) {
+ if (index < 0 || index >= mEndpointDescriptors.size()) {
+ return null;
+ }
+
+ return mEndpointDescriptors.get(index);
+ }
+
public int getUsbClass() {
return mUsbClass;
}