diff options
author | KH Shi <kenghua@google.com> | 2024-03-06 05:50:39 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2024-03-06 05:50:39 +0000 |
commit | 275967356858936dec612eab5b3b0bdb3f56fcf4 (patch) | |
tree | ebcce553743580a7e8df751ee16978833317bf91 | |
parent | 95a27a0bf515cfb7983ee56dae559140be216ae9 (diff) | |
parent | f8c7d1585091c68acdc40eba01f5ff871510989c (diff) | |
download | Connectivity-temp_319669529.tar.gz |
Add IPv6 FragmentHeader struct support am: f8c7d15850temp_319669529
Original change: https://android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/2988169
Change-Id: I5e48997648b57ade9affae0c6c5b99cc7dc738e9
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | staticlibs/device/com/android/net/module/util/structs/FragmentHeader.java | 56 | ||||
-rw-r--r-- | staticlibs/tests/unit/src/com/android/net/module/util/structs/FragmentHeaderTest.java | 76 |
2 files changed, 132 insertions, 0 deletions
diff --git a/staticlibs/device/com/android/net/module/util/structs/FragmentHeader.java b/staticlibs/device/com/android/net/module/util/structs/FragmentHeader.java new file mode 100644 index 0000000000..3da6a385d3 --- /dev/null +++ b/staticlibs/device/com/android/net/module/util/structs/FragmentHeader.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2024 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; +import com.android.net.module.util.Struct.Field; +import com.android.net.module.util.Struct.Type; + +/** + * IPv6 Fragment Extension header, as per https://tools.ietf.org/html/rfc2460. + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Next Header | Reserved | Fragment Offset |Res|M| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Identification | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ +public class FragmentHeader extends Struct { + @Field(order = 0, type = Type.U8) + public final short nextHeader; + @Field(order = 1, type = Type.S8) + public final byte reserved; + @Field(order = 2, type = Type.U16) + public final int fragmentOffset; + @Field(order = 3, type = Type.S32) + public final int identification; + + public FragmentHeader(final short nextHeader, final byte reserved, final int fragmentOffset, + final int identification) { + this.nextHeader = nextHeader; + this.reserved = reserved; + this.fragmentOffset = fragmentOffset; + this.identification = identification; + } + + public FragmentHeader(final short nextHeader, final int fragmentOffset, + final int identification) { + this(nextHeader, (byte) 0, fragmentOffset, identification); + } +} diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/structs/FragmentHeaderTest.java b/staticlibs/tests/unit/src/com/android/net/module/util/structs/FragmentHeaderTest.java new file mode 100644 index 0000000000..1a78ca5279 --- /dev/null +++ b/staticlibs/tests/unit/src/com/android/net/module/util/structs/FragmentHeaderTest.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2024 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 static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; + +@RunWith(AndroidJUnit4.class) +public class FragmentHeaderTest { + private static final byte[] HEADER_BYTES = new byte[] { + 17, /* nextHeader */ + 0, /* reserved */ + 15, 1, /* fragmentOffset */ + 1, 2, 3, 4 /* identification */ + }; + + @Test + public void testConstructor() { + FragmentHeader fragHdr = new FragmentHeader((short) 10 /* nextHeader */, + (byte) 11 /* reserved */, + 12 /* fragmentOffset */, + 13 /* identification */); + + assertEquals(10, fragHdr.nextHeader); + assertEquals(11, fragHdr.reserved); + assertEquals(12, fragHdr.fragmentOffset); + assertEquals(13, fragHdr.identification); + } + + @Test + public void testParseFragmentHeader() { + final ByteBuffer buf = ByteBuffer.wrap(HEADER_BYTES); + buf.order(ByteOrder.BIG_ENDIAN); + FragmentHeader fragHdr = FragmentHeader.parse(FragmentHeader.class, buf); + + assertEquals(17, fragHdr.nextHeader); + assertEquals(0, fragHdr.reserved); + assertEquals(0xF01, fragHdr.fragmentOffset); + assertEquals(0x1020304, fragHdr.identification); + } + + @Test + public void testWriteToBytes() { + FragmentHeader fragHdr = new FragmentHeader((short) 17 /* nextHeader */, + (byte) 0 /* reserved */, + 0xF01 /* fragmentOffset */, + 0x1020304 /* identification */); + + byte[] bytes = fragHdr.writeToBytes(ByteOrder.BIG_ENDIAN); + + assertArrayEquals("bytes = " + Arrays.toString(bytes), HEADER_BYTES, bytes); + } +} |