diff options
Diffstat (limited to 'common/device/com/android/net/module/util/netlink/StructRtMsg.java')
-rw-r--r-- | common/device/com/android/net/module/util/netlink/StructRtMsg.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/common/device/com/android/net/module/util/netlink/StructRtMsg.java b/common/device/com/android/net/module/util/netlink/StructRtMsg.java new file mode 100644 index 00000000..3cd72922 --- /dev/null +++ b/common/device/com/android/net/module/util/netlink/StructRtMsg.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2021 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.netlink; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +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.nio.ByteBuffer; + +/** + * struct rtmsg + * + * see also: + * + * include/uapi/linux/rtnetlink.h + * + * @hide + */ +public class StructRtMsg extends Struct { + // Already aligned. + public static final int STRUCT_SIZE = 12; + + @Field(order = 0, type = Type.U8) + public final short family; // Address family of route. + @Field(order = 1, type = Type.U8) + public final short dstLen; // Length of destination. + @Field(order = 2, type = Type.U8) + public final short srcLen; // Length of source. + @Field(order = 3, type = Type.U8) + public final short tos; // TOS filter. + @Field(order = 4, type = Type.U8) + public final short table; // Routing table ID. + @Field(order = 5, type = Type.U8) + public final short protocol; // Routing protocol. + @Field(order = 6, type = Type.U8) + public final short scope; // distance to the destination. + @Field(order = 7, type = Type.U8) + public final short type; // route type + @Field(order = 8, type = Type.U32) + public final long flags; + + StructRtMsg(short family, short dstLen, short srcLen, short tos, short table, short protocol, + short scope, short type, long flags) { + this.family = family; + this.dstLen = dstLen; + this.srcLen = srcLen; + this.tos = tos; + this.table = table; + this.protocol = protocol; + this.scope = scope; + this.type = type; + this.flags = flags; + } + + /** + * Parse a rtmsg struct from a {@link ByteBuffer}. + * + * @param byteBuffer The buffer from which to parse the rtmsg struct. + * @return the parsed rtmsg struct, or {@code null} if the rtmsg struct could not be + * parsed successfully (for example, if it was truncated). + */ + @Nullable + public static StructRtMsg parse(@NonNull final ByteBuffer byteBuffer) { + if (byteBuffer.remaining() < STRUCT_SIZE) return null; + + // The ByteOrder must already have been set to native order. + return Struct.parse(StructRtMsg.class, byteBuffer); + } + + /** + * Write the rtmsg struct to {@link ByteBuffer}. + */ + public void pack(@NonNull final ByteBuffer byteBuffer) { + // The ByteOrder must already have been set to native order. + this.writeToByteBuffer(byteBuffer); + } +} |