Remove unused attachEgressIgmpReportFilter
The attachEgressIgmpReportFilter is no longer called and its functionality is entirely covered by the attachEgressMulticastReportFilter.
This change removes the unused attachEgressIgmpReportFilter to simplify the codebase.
Corresponding test cases have been updated to exclusively use attachEgressMulticastReportFilter.
Bug: 406086413
Flag: EXEMPT mainline
Test: atest NetworkStackUtilsIntegrationTest
Change-Id: I122c03d54763645ea7f0c52e17a6a278e1300eef
diff --git a/jni/network_stack_utils_jni.cpp b/jni/network_stack_utils_jni.cpp
index b82f797..33f4efe 100644
--- a/jni/network_stack_utils_jni.cpp
+++ b/jni/network_stack_utils_jni.cpp
@@ -125,47 +125,6 @@
}
// fd is a "socket(AF_PACKET, SOCK_RAW, ETH_P_ALL)"
-static void network_stack_units_attachEgressIgmpReportFilter(
- JNIEnv *env, jclass clazz, jobject javaFd) {
- static sock_filter filter_code[] = {
- // Check if skb->pkt_type is PACKET_OUTGOING
- BPF_LOAD_SKB_PKTTYPE,
- BPF2_REJECT_IF_NOT_EQUAL(PACKET_OUTGOING),
-
- // Check if skb->protocol is ETH_P_IP
- BPF_LOAD_SKB_PROTOCOL,
- BPF2_REJECT_IF_NOT_EQUAL(ETH_P_IP),
-
- // Check the protocol is IGMP.
- BPF_LOAD_IPV4_U8(protocol),
- BPF2_REJECT_IF_NOT_EQUAL(IPPROTO_IGMP),
-
- // Check this is not a fragment.
- BPF_LOAD_IPV4_BE16(frag_off),
- BPF2_REJECT_IF_ANY_MASKED_BITS_SET(IP_MF | IP_OFFMASK),
-
- // Get the IP header length.
- BPF_LOADX_NET_RELATIVE_IPV4_HLEN,
-
- // Check if IGMPv2/IGMPv3 join/leave message.
- BPF_LOAD_NETX_RELATIVE_IGMP_TYPE,
- BPF2_ACCEPT_IF_EQUAL(IGMPV2_HOST_MEMBERSHIP_REPORT),
- BPF2_ACCEPT_IF_EQUAL(IGMP_HOST_LEAVE_MESSAGE),
- BPF2_ACCEPT_IF_EQUAL(IGMPV3_HOST_MEMBERSHIP_REPORT),
- BPF_REJECT,
- };
- static const sock_fprog filter = {
- sizeof(filter_code) / sizeof(filter_code[0]),
- filter_code,
- };
-
- int fd = netjniutils::GetNativeFileDescriptor(env, javaFd);
- if (setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter)) != 0) {
- jniThrowErrnoException(env, "setsockopt(SO_ATTACH_FILTER)", errno);
- }
-}
-
-// fd is a "socket(AF_PACKET, SOCK_RAW, ETH_P_ALL)"
static void network_stack_units_attachEgressMulticastReportFilter(
JNIEnv *env, jclass clazz, jobject javaFd) {
static sock_filter filter_code[] = {
@@ -339,7 +298,6 @@
{ "addArpEntry", "([B[BLjava/lang/String;Ljava/io/FileDescriptor;)V", (void*) network_stack_utils_addArpEntry },
{ "attachDhcpFilter", "(Ljava/io/FileDescriptor;)V", (void*) network_stack_utils_attachDhcpFilter },
{ "attachRaFilter", "(Ljava/io/FileDescriptor;)V", (void*) network_stack_utils_attachRaFilter },
- { "attachEgressIgmpReportFilter", "(Ljava/io/FileDescriptor;)V", (void*) network_stack_units_attachEgressIgmpReportFilter },
{ "attachEgressMulticastReportFilter", "(Ljava/io/FileDescriptor;)V", (void*) network_stack_units_attachEgressMulticastReportFilter },
{ "attachControlPacketFilter", "(Ljava/io/FileDescriptor;)V", (void*) network_stack_utils_attachControlPacketFilter },
};
diff --git a/src/com/android/networkstack/util/NetworkStackUtils.java b/src/com/android/networkstack/util/NetworkStackUtils.java
index b0252dc..79aa371 100755
--- a/src/com/android/networkstack/util/NetworkStackUtils.java
+++ b/src/com/android/networkstack/util/NetworkStackUtils.java
@@ -544,16 +544,6 @@
}
/**
- * Attaches a socket filter that accepts egress IGMPv2/IGMPv3 reports to the given socket.
- *
- * This filter doesn't include IGMPv1 report since device will not send out IGMPv1 report
- * when the device leaves a multicast address group.
- *
- * @param fd the socket's {@link FileDescriptor}.
- */
- public static native void attachEgressIgmpReportFilter(FileDescriptor fd) throws ErrnoException;
-
- /**
* Attaches a socket filter that accepts egress IGMPv2/v3, MLDv1/v2 reports to the given socket.
*
* This filter doesn't include IGMPv1 report since device will not send out IGMPv1 report
diff --git a/tests/integration/signature/android/net/util/NetworkStackUtilsIntegrationTest.kt b/tests/integration/signature/android/net/util/NetworkStackUtilsIntegrationTest.kt
index ea6f35a..a8474a1 100644
--- a/tests/integration/signature/android/net/util/NetworkStackUtilsIntegrationTest.kt
+++ b/tests/integration/signature/android/net/util/NetworkStackUtilsIntegrationTest.kt
@@ -52,6 +52,7 @@
import com.android.net.module.util.Ipv6Utils
import com.android.net.module.util.NetworkStackConstants.ETHER_ADDR_LEN
import com.android.net.module.util.NetworkStackConstants.ETHER_HEADER_LEN
+import com.android.net.module.util.NetworkStackConstants.ETHER_DST_ADDR_OFFSET
import com.android.net.module.util.NetworkStackConstants.ETHER_SRC_ADDR_OFFSET
import com.android.net.module.util.NetworkStackConstants.IPV4_ADDR_ANY
import com.android.net.module.util.NetworkStackConstants.IPV4_CHECKSUM_OFFSET
@@ -243,38 +244,12 @@
}
@Test
- fun testAttachEgressIgmpReportFilter() {
+ fun testAttachEgressMulticastReportFilterForMulticastGroupChange() {
val socket = Os.socket(AF_PACKET, SOCK_RAW or SOCK_CLOEXEC, 0)
val ifParams = InterfaceParams.getByName(iface.interfaceName)
?: fail("Could not obtain interface params for ${iface.interfaceName}")
val socketAddr = SocketUtils.makePacketSocketAddress(ETH_P_ALL, ifParams.index)
- NetworkStackUtils.attachEgressIgmpReportFilter(socket)
- Os.bind(socket, socketAddr)
- Os.setsockoptTimeval(
- socket,
- SOL_SOCKET,
- SO_RCVTIMEO,
- StructTimeval.fromMillis(TEST_TIMEOUT_MS)
- )
-
- val sendSocket = Os.socket(AF_PACKET, SOCK_RAW or SOCK_CLOEXEC, 0)
- Os.bind(sendSocket, socketAddr)
-
- testExpectedPacketsReceived(sendSocket, socket)
-
- // shorten the socket timeout to prevent waiting too long in the test
- Os.setsockoptTimeval(socket, SOL_SOCKET, SO_RCVTIMEO, StructTimeval.fromMillis(100))
-
- testExpectedPacketsNotReceived(sendSocket, socket)
- }
-
- @Test
- fun testAttachEgressIgmpReportFilterForMulticastGroupChange() {
- val socket = Os.socket(AF_PACKET, SOCK_RAW or SOCK_CLOEXEC, 0)
- val ifParams = InterfaceParams.getByName(iface.interfaceName)
- ?: fail("Could not obtain interface params for ${iface.interfaceName}")
- val socketAddr = SocketUtils.makePacketSocketAddress(ETH_P_ALL, ifParams.index)
- NetworkStackUtils.attachEgressIgmpReportFilter(socket)
+ NetworkStackUtils.attachEgressMulticastReportFilter(socket)
Os.bind(socket, socketAddr)
Os.setsockoptTimeval(
socket,
@@ -288,6 +263,8 @@
val networkInterface = NetworkInterface.getByName(iface.interfaceName)
multicastSock.joinGroup(mcastAddr, networkInterface)
+
+ val igmpv3ReportPacketFilter = { pkt: ByteArray -> isIgmpv3ReportPacket(pkt) }
// Using scapy to generate IGMPv3 membership report:
// ether = Ether(src='02:03:04:05:06:07', dst='01:00:5e:00:00:16')
// ip = IP(src='0.0.0.0', dst='224.0.0.22', id=0, flags='DF', options=[IPOption_Router_Alert()])
@@ -301,7 +278,12 @@
val expectedJoinPkt = HexDump.hexStringToByteArray(
joinReport.replace("020304050607", srcMac)
)
- assertNextPacketEquals(socket, expectedJoinPkt, "IGMPv3 join report")
+ assertUntilPacketEquals(
+ socket,
+ expectedJoinPkt,
+ "IGMPv3 join report",
+ igmpv3ReportPacketFilter
+ )
multicastSock.leaveGroup(mcastAddr, networkInterface)
// Using scapy to generate IGMPv3 membership report:
@@ -316,7 +298,12 @@
val expectedLeavePkt = HexDump.hexStringToByteArray(
leaveReport.replace("020304050607", srcMac)
)
- assertNextPacketEquals(socket, expectedLeavePkt, "IGMPv3 leave report")
+ assertUntilPacketEquals(
+ socket,
+ expectedLeavePkt,
+ "IGMPv3 leave report",
+ igmpv3ReportPacketFilter
+ )
}
@Test
@@ -528,7 +515,9 @@
private fun assertUntilPacketEquals(
socket: FileDescriptor,
expected: ByteArray,
- descr: String
+ descr: String,
+ filter: (ByteArray) -> Boolean =
+ { pkt: ByteArray -> !isTestInterfaceEgressPacket(pkt) }
) {
val buffer = ByteArray(TEST_MTU)
var readBytes: Int
@@ -537,7 +526,7 @@
.also { readBytes = it } > 0
) {
actualPkt = buffer.copyOfRange(0, readBytes)
- if (!isTestInterfaceEgressPacket(actualPkt)) break
+ if (filter(actualPkt)) break
}
assertNotNull(actualPkt, "no received packets")
@@ -549,7 +538,13 @@
)
}
- private fun assertUntilSocketReadErrno(msg: String, socket: FileDescriptor, errno: Int) {
+ private fun assertUntilSocketReadErrno(
+ msg: String,
+ socket: FileDescriptor,
+ errno: Int,
+ filter: (ByteArray) -> Boolean =
+ { pkt: ByteArray -> !isTestInterfaceEgressPacket(pkt) }
+ ) {
val buffer = ByteArray(TEST_MTU)
var readBytes: Int
var actualPkt: ByteArray? = null
@@ -558,7 +553,7 @@
.also { readBytes = it } > 0
) {
actualPkt = buffer.copyOfRange(0, readBytes)
- if (!isTestInterfaceEgressPacket(actualPkt)) break
+ if (filter(actualPkt)) break
}
fail(msg + ": " + HexDump.toHexString(actualPkt))
} catch (expected: ErrnoException) {
@@ -694,6 +689,16 @@
return srcMac.contentEquals(ifParams.macAddr.toByteArray())
}
+ // Assume only IGMPv3 reports with ether destination 01:00:5E:00:00:16
+ private fun isIgmpv3ReportPacket(packet: ByteArray): Boolean {
+ val dstMac = packet.copyOfRange(
+ ETHER_DST_ADDR_OFFSET,
+ ETHER_DST_ADDR_OFFSET + ETHER_ADDR_LEN
+ )
+
+ return dstMac.contentEquals(MacAddress.fromString("01:00:5E:00:00:16").toByteArray())
+ }
+
private fun doTestDhcpResponseWithMfBitDropped(generic: Boolean) {
val ifindex = InterfaceParams.getByName(iface.interfaceName).index
val packetSock = Os.socket(AF_PACKET, SOCK_RAW or SOCK_NONBLOCK, /*protocol=*/0)