diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java index 87249dfc925f2..9fdb31e11f502 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; @@ -142,6 +143,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) {} @@ -248,6 +255,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 + ")"); @@ -559,6 +571,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; @@ -611,6 +624,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() { @@ -823,6 +837,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. * @@ -863,6 +881,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:"); @@ -880,6 +899,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:"); @@ -1676,6 +1703,11 @@ public class IpClient extends StateMachine { break; } + case EVENT_READ_PACKET_FILTER_COMPLETE: { + mApfDataSnapshot = (byte[]) msg.obj; + break; + } + case EVENT_DHCPACTION_TIMEOUT: stopDhcpAction(); break;