Merge "Support common MacAddress Type in Struct." am: 71ed90e47b am: 359a688acb
Original change: https://android-review.googlesource.com/c/platform/frameworks/libs/net/+/1535663
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: If7fc3493e5e403c08b4e699a10f041288f650cea
diff --git a/staticlibs/device/com/android/net/module/util/Struct.java b/staticlibs/device/com/android/net/module/util/Struct.java
index bc8761a..6d8d301 100644
--- a/staticlibs/device/com/android/net/module/util/Struct.java
+++ b/staticlibs/device/com/android/net/module/util/Struct.java
@@ -17,6 +17,7 @@
package com.android.net.module.util;
import android.annotation.NonNull;
+import android.net.MacAddress;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -110,6 +111,7 @@
UBE63, // unsigned long(MSB: 0) in network order, size = 8 bytes
UBE64, // unsigned long in network order, size = 8 bytes
ByteArray, // byte array with predefined length
+ EUI48, // a 48-bits long MAC address
}
/**
@@ -179,6 +181,9 @@
+ annotation.arraysize());
}
return;
+ case EUI48:
+ if (fieldType == MacAddress.class) return;
+ break;
default:
throw new IllegalArgumentException("Unknown type" + annotation.type());
}
@@ -213,6 +218,9 @@
case ByteArray:
length = annotation.arraysize();
break;
+ case EUI48:
+ length = 6;
+ break;
default:
throw new IllegalArgumentException("Unknown type" + annotation.type());
}
@@ -373,6 +381,11 @@
buf.get(array);
value = array;
break;
+ case EUI48:
+ final byte[] macAddress = new byte[6];
+ buf.get(macAddress);
+ value = MacAddress.fromBytes(macAddress);
+ break;
default:
throw new IllegalArgumentException("Unknown type:" + fieldInfo.annotation.type());
}
@@ -442,6 +455,10 @@
case ByteArray:
output.put((byte[]) value);
break;
+ case EUI48:
+ final byte[] macAddress = ((MacAddress) value).toByteArray();
+ output.put(macAddress);
+ break;
default:
throw new IllegalArgumentException("Unknown type:" + fieldInfo.annotation.type());
}
diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/StructTest.java b/staticlibs/tests/unit/src/com/android/net/module/util/StructTest.java
index 1b03e75..47b34b9 100644
--- a/staticlibs/tests/unit/src/com/android/net/module/util/StructTest.java
+++ b/staticlibs/tests/unit/src/com/android/net/module/util/StructTest.java
@@ -23,6 +23,7 @@
import static org.junit.Assert.assertTrue;
import android.net.IpPrefix;
+import android.net.MacAddress;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -663,4 +664,37 @@
private ByteBuffer toByteBuffer(final String hexString) {
return ByteBuffer.wrap(HexDump.hexStringToByteArray(hexString));
}
+
+ static class MacAddressMessage extends Struct {
+ @Field(order = 0, type = Type.EUI48) final MacAddress mMac1;
+ @Field(order = 1, type = Type.EUI48) final MacAddress mMac2;
+
+ MacAddressMessage(final MacAddress mac1, final MacAddress mac2) {
+ this.mMac1 = mac1;
+ this.mMac2 = mac2;
+ }
+ }
+
+ @Test
+ public void testMacAddressType() {
+ final MacAddressMessage msg = doParsingMessageTest("001122334455" + "ffffffffffff",
+ MacAddressMessage.class, ByteOrder.BIG_ENDIAN);
+
+ assertEquals(MacAddress.fromString("00:11:22:33:44:55"), msg.mMac1);
+ assertEquals(MacAddress.fromString("ff:ff:ff:ff:ff:ff"), msg.mMac2);
+
+ assertEquals(12, Struct.getSize(MacAddressMessage.class));
+ assertArrayEquals(toByteBuffer("001122334455" + "ffffffffffff").array(),
+ msg.writeToBytes(ByteOrder.BIG_ENDIAN));
+ }
+
+ static class BadMacAddressType extends Struct {
+ @Field(order = 0, type = Type.EUI48) byte[] mMac;
+ }
+
+ @Test
+ public void testIncorrectType_EUI48WithByteArray() {
+ assertThrows(IllegalArgumentException.class,
+ () -> Struct.parse(BadMacAddressType.class, toByteBuffer("ffffffffffff")));
+ }
}