Refactor Tether4Key to use Inet4Address

Change the type of src4 and dst4 from byte[] to Inet4Address in the
Tether4Key class. This simplifies the code by removing the need for
conversions between byte arrays and Inet4Address objects.

Bug: 392509494
Test: atest TetheringTests
Flag: EXEMPT refactor
Change-Id: I3072a8520c93042a25d1f60aa41bdfa5485062f6
This commit is contained in:
Sarup Dalwani 2025-08-29 17:52:53 +00:00
commit f7adba65b3
4 changed files with 30 additions and 38 deletions

View file

@ -1066,7 +1066,7 @@ public class BpfCoordinator {
// Find the rules which are related with the given client.
mBpfCoordinatorShim.tetherOffloadRuleForEach(UPSTREAM, (k, v) -> {
if (Arrays.equals(k.src4, clientAddr.getAddress())) {
if (Objects.equals(k.src4, clientAddr)) {
deleteUpstreamRuleKeys.add(k);
}
});
@ -1560,9 +1560,9 @@ public class BpfCoordinator {
final String src4, public4, dst4;
final int publicPort;
try {
src4 = InetAddress.getByAddress(key.src4).getHostAddress();
src4 = key.src4.getHostAddress();
if (downstream) {
public4 = InetAddress.getByAddress(key.dst4).getHostAddress();
public4 = key.dst4.getHostAddress();
publicPort = key.dstPort;
} else {
public4 = InetAddress.getByAddress(value.src46).getHostAddress();
@ -2120,16 +2120,16 @@ public class BpfCoordinator {
private Tether4Key makeTetherUpstream4Key(
@NonNull ConntrackEvent e, @NonNull ClientInfo c) {
return new Tether4Key(c.downstreamIfindex, c.downstreamMac,
e.tupleOrig.protoNum, e.tupleOrig.srcIp.getAddress(),
e.tupleOrig.dstIp.getAddress(), e.tupleOrig.srcPort, e.tupleOrig.dstPort);
e.tupleOrig.protoNum, e.tupleOrig.srcIp, e.tupleOrig.dstIp,
e.tupleOrig.srcPort, e.tupleOrig.dstPort);
}
@NonNull
private Tether4Key makeTetherDownstream4Key(
@NonNull ConntrackEvent e, @NonNull ClientInfo c, int upstreamIndex) {
return new Tether4Key(upstreamIndex, NULL_MAC_ADDRESS /* dstMac (rawip) */,
e.tupleReply.protoNum, e.tupleReply.srcIp.getAddress(),
e.tupleReply.dstIp.getAddress(), e.tupleReply.srcPort, e.tupleReply.dstPort);
e.tupleReply.protoNum, e.tupleReply.srcIp, e.tupleReply.dstIp,
e.tupleReply.srcPort, e.tupleReply.dstPort);
}
@NonNull
@ -2541,9 +2541,8 @@ public class BpfCoordinator {
// both directions for TCP.
mBpfCoordinatorShim.tetherOffloadRuleForEach(UPSTREAM, (k, v) -> {
if ((now - v.lastUsed) / 1_000_000 < CONNTRACK_TIMEOUT_UPDATE_INTERVAL_MS) {
updateConntrackTimeout((byte) k.l4proto,
parseIPv4Address(k.src4), (short) k.srcPort,
parseIPv4Address(k.dst4), (short) k.dstPort);
updateConntrackTimeout((byte) k.l4proto, k.src4, (short) k.srcPort, k.dst4,
(short) k.dstPort);
}
});

View file

@ -1020,9 +1020,9 @@ public class EthernetTetheringTest extends EthernetTetheringTestBase {
final Tether4Key upstream4Key = rule.getKey();
assertEquals(IPPROTO_UDP, upstream4Key.l4proto);
assertTrue(Arrays.equals(tethered.ipv4Addr.getAddress(), upstream4Key.src4));
assertEquals(tethered.ipv4Addr, upstream4Key.src4);
assertEquals(LOCAL_PORT, upstream4Key.srcPort);
assertTrue(Arrays.equals(REMOTE_IP4_ADDR.getAddress(), upstream4Key.dst4));
assertEquals(REMOTE_IP4_ADDR, upstream4Key.dst4);
assertEquals(REMOTE_PORT, upstream4Key.dstPort);
final Tether4Value upstream4Value = rule.getValue();

View file

@ -301,8 +301,8 @@ public class BpfCoordinatorTest {
private int mIif = DOWNSTREAM_IFINDEX;
private MacAddress mDstMac = DOWNSTREAM_MAC;
private short mL4proto = (short) IPPROTO_TCP;
private byte[] mSrc4 = PRIVATE_ADDR.getAddress();
private byte[] mDst4 = REMOTE_ADDR.getAddress();
private Inet4Address mSrc4 = PRIVATE_ADDR;
private Inet4Address mDst4 = REMOTE_ADDR;
private int mSrcPort = PRIVATE_PORT;
private int mDstPort = REMOTE_PORT;
@ -325,8 +325,8 @@ public class BpfCoordinatorTest {
private int mIif = UPSTREAM_IFINDEX;
private MacAddress mDstMac = MacAddress.ALL_ZEROS_ADDRESS /* dstMac (rawip) */;
private short mL4proto = (short) IPPROTO_TCP;
private byte[] mSrc4 = REMOTE_ADDR.getAddress();
private byte[] mDst4 = PUBLIC_ADDR.getAddress();
private Inet4Address mSrc4 = REMOTE_ADDR;
private Inet4Address mDst4 = PUBLIC_ADDR;
private int mSrcPort = REMOTE_PORT;
private int mDstPort = PUBLIC_PORT;
@ -2430,15 +2430,14 @@ public class BpfCoordinatorTest {
private static Tether4Key makeUpstream4Key(final int downstreamIfindex,
@NonNull final MacAddress downstreamMac, @NonNull final Inet4Address privateAddr,
final short privatePort) {
return new Tether4Key(downstreamIfindex, downstreamMac, (short) IPPROTO_TCP,
privateAddr.getAddress(), REMOTE_ADDR.getAddress(), privatePort, REMOTE_PORT);
return new Tether4Key(downstreamIfindex, downstreamMac, (short) IPPROTO_TCP, privateAddr,
REMOTE_ADDR, privatePort, REMOTE_PORT);
}
@NonNull
private static Tether4Key makeDownstream4Key(final short publicPort) {
return new Tether4Key(UPSTREAM_IFINDEX, MacAddress.ALL_ZEROS_ADDRESS /* dstMac (rawip) */,
(short) IPPROTO_TCP, REMOTE_ADDR.getAddress(), PUBLIC_ADDR.getAddress(),
REMOTE_PORT, publicPort);
(short) IPPROTO_TCP, REMOTE_ADDR, PUBLIC_ADDR, REMOTE_PORT, publicPort);
}
@NonNull

View file

@ -21,11 +21,8 @@ import android.net.MacAddress;
import androidx.annotation.NonNull;
import com.android.net.module.util.Struct;
import com.android.net.module.util.Struct.Field;
import com.android.net.module.util.Struct.Type;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.Objects;
/** Key type for downstream & upstream IPv4 forwarding maps. */
@ -39,11 +36,11 @@ public class Tether4Key extends Struct {
@Field(order = 2, type = Type.U8, padding = 1)
public final short l4proto;
@Field(order = 3, type = Type.ByteArray, arraysize = 4)
public final byte[] src4;
@Field(order = 3, type = Type.Ipv4Address)
public final Inet4Address src4;
@Field(order = 4, type = Type.ByteArray, arraysize = 4)
public final byte[] dst4;
@Field(order = 4, type = Type.Ipv4Address)
public final Inet4Address dst4;
@Field(order = 5, type = Type.UBE16)
public final int srcPort;
@ -52,9 +49,11 @@ public class Tether4Key extends Struct {
public final int dstPort;
public Tether4Key(final int iif, @NonNull final MacAddress dstMac, final short l4proto,
final byte[] src4, final byte[] dst4, final int srcPort,
@NonNull final Inet4Address src4, @NonNull final Inet4Address dst4, final int srcPort,
final int dstPort) {
Objects.requireNonNull(dstMac);
Objects.requireNonNull(src4);
Objects.requireNonNull(dst4);
this.iif = iif;
this.dstMac = dstMac;
@ -67,15 +66,10 @@ public class Tether4Key extends Struct {
@Override
public String toString() {
try {
return String.format(
"iif: %d, dstMac: %s, l4proto: %d, src4: %s, dst4: %s, "
+ "srcPort: %d, dstPort: %d",
iif, dstMac, l4proto,
Inet4Address.getByAddress(src4), Inet4Address.getByAddress(dst4),
Short.toUnsignedInt((short) srcPort), Short.toUnsignedInt((short) dstPort));
} catch (UnknownHostException | IllegalArgumentException e) {
return "Invalid IP address" + e;
}
return String.format(
"iif: %d, dstMac: %s, l4proto: %d, src4: %s, dst4: %s, "
+ "srcPort: %d, dstPort: %d",
iif, dstMac, l4proto, src4, dst4,
Short.toUnsignedInt((short) srcPort), Short.toUnsignedInt((short) dstPort));
}
}