diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java index 37bb2ad8f6c1e..02bd787ba0bdc 100644 --- a/services/net/java/android/net/ip/IpClient.java +++ b/services/net/java/android/net/ip/IpClient.java @@ -16,6 +16,7 @@ package android.net.ip; +import com.android.internal.util.HexDump; import com.android.internal.util.MessageUtils; import com.android.internal.util.WakeupMessage; @@ -174,6 +175,12 @@ public class IpClient extends StateMachine { // Install an APF program to filter incoming packets. public void installPacketFilter(byte[] filter) {} + // Asynchronously read back the APF program & data buffer from the wifi driver. + // Due to Wifi HAL limitations, the current implementation only supports dumping the entire + // buffer. In response to this request, the driver returns the data buffer asynchronously + // by sending an IpClient#EVENT_READ_PACKET_FILTER_COMPLETE message. + public void startReadPacketFilter() {} + // If multicast filtering cannot be accomplished with APF, this function will be called to // actuate multicast filtering using another means. public void setFallbackMulticastFilter(boolean enabled) {} @@ -280,6 +287,11 @@ public class IpClient extends StateMachine { log("installPacketFilter(byte[" + filter.length + "])"); } @Override + public void startReadPacketFilter() { + mCallback.startReadPacketFilter(); + log("startReadPacketFilter()"); + } + @Override public void setFallbackMulticastFilter(boolean enabled) { mCallback.setFallbackMulticastFilter(enabled); log("setFallbackMulticastFilter(" + enabled + ")"); @@ -591,6 +603,7 @@ public class IpClient extends StateMachine { private static final int CMD_SET_MULTICAST_FILTER = 9; private static final int EVENT_PROVISIONING_TIMEOUT = 10; private static final int EVENT_DHCPACTION_TIMEOUT = 11; + private static final int EVENT_READ_PACKET_FILTER_COMPLETE = 12; private static final int MAX_LOG_RECORDS = 500; private static final int MAX_PACKET_RECORDS = 100; @@ -643,6 +656,7 @@ public class IpClient extends StateMachine { private ApfFilter mApfFilter; private boolean mMulticastFiltering; private long mStartTimeMillis; + private byte[] mApfDataSnapshot; public static class Dependencies { public INetworkManagementService getNMS() { @@ -857,6 +871,10 @@ public class IpClient extends StateMachine { sendMessage(EVENT_PRE_DHCP_ACTION_COMPLETE); } + public void readPacketFilterComplete(byte[] data) { + sendMessage(EVENT_READ_PACKET_FILTER_COMPLETE, data); + } + /** * Set the TCP buffer sizes to use. * @@ -897,6 +915,7 @@ public class IpClient extends StateMachine { final ProvisioningConfiguration provisioningConfig = mConfiguration; final ApfCapabilities apfCapabilities = (provisioningConfig != null) ? provisioningConfig.mApfCapabilities : null; + final byte[] apfDataSnapshot = mApfDataSnapshot; IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); pw.println(mTag + " APF dump:"); @@ -914,6 +933,14 @@ public class IpClient extends StateMachine { } } pw.decreaseIndent(); + pw.println(mTag + " latest APF data snapshot: "); + pw.increaseIndent(); + if (apfDataSnapshot != null) { + pw.println(HexDump.dumpHexString(apfDataSnapshot)); + } else { + pw.println("No last snapshot."); + } + pw.decreaseIndent(); pw.println(); pw.println(mTag + " current ProvisioningConfiguration:"); @@ -1710,6 +1737,11 @@ public class IpClient extends StateMachine { break; } + case EVENT_READ_PACKET_FILTER_COMPLETE: { + mApfDataSnapshot = (byte[]) msg.obj; + break; + } + case EVENT_DHCPACTION_TIMEOUT: stopDhcpAction(); break;