From 03e3ceaab1889d115136179110e1899aad6a611a Mon Sep 17 00:00:00 2001 From: Yang Sun <sunytt@google.com> Date: Sun, 10 Dec 2023 21:59:41 +0800 Subject: [PATCH] Add mif6ctl struct definition. This is used to configure interfaces for multicast routing. Test: atest NetworkStaticLibTests:com.android.net.moduletests.util.structs.StructMif6ctlTest Change-Id: Ic26cddab2d5a9f90f63b0828c3e133d830aa0db4 --- .../module/util/structs/StructMif6ctl.java | 46 ++++++++++++ .../util/structs/StructMif6ctlTest.java | 70 +++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 staticlibs/device/com/android/net/module/util/structs/StructMif6ctl.java create mode 100644 staticlibs/tests/unit/src/com/android/net/module/util/structs/StructMif6ctlTest.java diff --git a/staticlibs/device/com/android/net/module/util/structs/StructMif6ctl.java b/staticlibs/device/com/android/net/module/util/structs/StructMif6ctl.java new file mode 100644 index 0000000000..626a170126 --- /dev/null +++ b/staticlibs/device/com/android/net/module/util/structs/StructMif6ctl.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.net.module.util.structs; + +import com.android.net.module.util.Struct; + +/* + * Implements the mif6ctl structure which is used to add a multicast routing + * interface, see /usr/include/linux/mroute6.h + */ +public class StructMif6ctl extends Struct { + @Field(order = 0, type = Type.U16) + public final int mif6cMifi; // Index of MIF + @Field(order = 1, type = Type.U8) + public final short mif6cFlags; // MIFF_ flags + @Field(order = 2, type = Type.U8) + public final short vifcThreshold; // ttl limit + @Field(order = 3, type = Type.U16) + public final int mif6cPifi; //the index of the physical IF + @Field(order = 4, type = Type.U32, padding = 2) + public final long vifcRateLimit; // Rate limiter values (NI) + + public StructMif6ctl(final int mif6cMifi, final short mif6cFlags, final short vifcThreshold, + final int mif6cPifi, final long vifcRateLimit) { + this.mif6cMifi = mif6cMifi; + this.mif6cFlags = mif6cFlags; + this.vifcThreshold = vifcThreshold; + this.mif6cPifi = mif6cPifi; + this.vifcRateLimit = vifcRateLimit; + } +} + diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/structs/StructMif6ctlTest.java b/staticlibs/tests/unit/src/com/android/net/module/util/structs/StructMif6ctlTest.java new file mode 100644 index 0000000000..75196e4f78 --- /dev/null +++ b/staticlibs/tests/unit/src/com/android/net/module/util/structs/StructMif6ctlTest.java @@ -0,0 +1,70 @@ +package com.android.net.module.util.structs; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import android.util.ArraySet; +import androidx.test.runner.AndroidJUnit4; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; +import java.util.Set; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class StructMif6ctlTest { + private static final byte[] MSG_BYTES = new byte[] { + 1, 0, /* mif6cMifi */ + 0, /* mif6cFlags */ + 1, /* vifcThreshold*/ + 20, 0, /* mif6cPifi */ + 0, 0, 0, 0, /* vifcRateLimit */ + 0, 0 /* padding */ + }; + + @Test + public void testConstructor() { + StructMif6ctl mif6ctl = new StructMif6ctl(10 /* mif6cMifi */, + (short) 11 /* mif6cFlags */, + (short) 12 /* vifcThreshold */, + 13 /* mif6cPifi */, + 14L /* vifcRateLimit */); + + assertEquals(10, mif6ctl.mif6cMifi); + assertEquals(11, mif6ctl.mif6cFlags); + assertEquals(12, mif6ctl.vifcThreshold); + assertEquals(13, mif6ctl.mif6cPifi); + assertEquals(14, mif6ctl.vifcRateLimit); + } + + @Test + public void testParseMif6ctl() { + final ByteBuffer buf = ByteBuffer.wrap(MSG_BYTES); + buf.order(ByteOrder.nativeOrder()); + StructMif6ctl mif6ctl = StructMif6ctl.parse(StructMif6ctl.class, buf); + + assertEquals(1, mif6ctl.mif6cMifi); + assertEquals(0, mif6ctl.mif6cFlags); + assertEquals(1, mif6ctl.vifcThreshold); + assertEquals(20, mif6ctl.mif6cPifi); + assertEquals(0, mif6ctl.vifcRateLimit); + } + + @Test + public void testWriteToBytes() { + StructMif6ctl mif6ctl = new StructMif6ctl(1 /* mif6cMifi */, + (short) 0 /* mif6cFlags */, + (short) 1 /* vifcThreshold */, + 20 /* mif6cPifi */, + (long) 0 /* vifcRateLimit */); + + byte[] bytes = mif6ctl.writeToBytes(); + + assertArrayEquals("bytes = " + Arrays.toString(bytes), MSG_BYTES, bytes); + } +} -- GitLab