summaryrefslogtreecommitdiff
path: root/common/device/com/android/net/module/util/netlink/NetlinkMessage.java
diff options
context:
space:
mode:
Diffstat (limited to 'common/device/com/android/net/module/util/netlink/NetlinkMessage.java')
-rw-r--r--common/device/com/android/net/module/util/netlink/NetlinkMessage.java171
1 files changed, 0 insertions, 171 deletions
diff --git a/common/device/com/android/net/module/util/netlink/NetlinkMessage.java b/common/device/com/android/net/module/util/netlink/NetlinkMessage.java
deleted file mode 100644
index 9e1e26e7..00000000
--- a/common/device/com/android/net/module/util/netlink/NetlinkMessage.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2019 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 android.system.OsConstants;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.nio.ByteBuffer;
-
-/**
- * NetlinkMessage base class for other, more specific netlink message types.
- *
- * Classes that extend NetlinkMessage should:
- * - implement a public static parse(StructNlMsgHdr, ByteBuffer) method
- * - returning either null (parse errors) or a new object of the subclass
- * type (cast-able to NetlinkMessage)
- *
- * NetlinkMessage.parse() should be updated to know which nlmsg_type values
- * correspond with which message subclasses.
- *
- * @hide
- */
-public class NetlinkMessage {
- private static final String TAG = "NetlinkMessage";
-
- /**
- * Parsing netlink messages for reserved control message or specific netlink message. The
- * netlink family is required for parsing specific netlink message. See man-pages/netlink.
- */
- @Nullable
- public static NetlinkMessage parse(@NonNull ByteBuffer byteBuffer, int nlFamily) {
- final int startPosition = (byteBuffer != null) ? byteBuffer.position() : -1;
- final StructNlMsgHdr nlmsghdr = StructNlMsgHdr.parse(byteBuffer);
- if (nlmsghdr == null) {
- return null;
- }
-
- final int messageLength = NetlinkConstants.alignedLengthOf(nlmsghdr.nlmsg_len);
- final int payloadLength = messageLength - StructNlMsgHdr.STRUCT_SIZE;
- if (payloadLength < 0 || payloadLength > byteBuffer.remaining()) {
- // Malformed message or runt buffer. Pretend the buffer was consumed.
- byteBuffer.position(byteBuffer.limit());
- return null;
- }
-
- // Reserved control messages. The netlink family is ignored.
- // See NLMSG_MIN_TYPE in include/uapi/linux/netlink.h.
- if (nlmsghdr.nlmsg_type <= NetlinkConstants.NLMSG_MAX_RESERVED) {
- return parseCtlMessage(nlmsghdr, byteBuffer, payloadLength);
- }
-
- // Netlink family messages. The netlink family is required. Note that the reason for using
- // if-statement is that switch-case can't be used because the OsConstants.NETLINK_* are
- // not constant.
- final NetlinkMessage parsed;
- if (nlFamily == OsConstants.NETLINK_ROUTE) {
- parsed = parseRtMessage(nlmsghdr, byteBuffer);
- } else if (nlFamily == OsConstants.NETLINK_INET_DIAG) {
- parsed = parseInetDiagMessage(nlmsghdr, byteBuffer);
- } else if (nlFamily == OsConstants.NETLINK_NETFILTER) {
- parsed = parseNfMessage(nlmsghdr, byteBuffer);
- } else {
- parsed = null;
- }
-
- // Advance to the end of the message, regardless of whether the parsing code consumed
- // all of it or not.
- byteBuffer.position(startPosition + messageLength);
-
- return parsed;
- }
-
- @NonNull
- protected final StructNlMsgHdr mHeader;
-
- public NetlinkMessage(@NonNull StructNlMsgHdr nlmsghdr) {
- mHeader = nlmsghdr;
- }
-
- @NonNull
- public StructNlMsgHdr getHeader() {
- return mHeader;
- }
-
- @Override
- public String toString() {
- // The netlink family is not provided to StructNlMsgHdr#toString because NetlinkMessage
- // doesn't store the information. So the netlink message type can't be transformed into
- // a string by StructNlMsgHdr#toString and just keep as an integer. The specific message
- // which inherits NetlinkMessage could override NetlinkMessage#toString and provide the
- // specific netlink family to StructNlMsgHdr#toString.
- return "NetlinkMessage{" + mHeader.toString() + "}";
- }
-
- @NonNull
- private static NetlinkMessage parseCtlMessage(@NonNull StructNlMsgHdr nlmsghdr,
- @NonNull ByteBuffer byteBuffer, int payloadLength) {
- switch (nlmsghdr.nlmsg_type) {
- case NetlinkConstants.NLMSG_ERROR:
- return (NetlinkMessage) NetlinkErrorMessage.parse(nlmsghdr, byteBuffer);
- default: {
- // Other netlink control messages. Just parse the header for now,
- // pretending the whole message was consumed.
- byteBuffer.position(byteBuffer.position() + payloadLength);
- return new NetlinkMessage(nlmsghdr);
- }
- }
- }
-
- @Nullable
- private static NetlinkMessage parseRtMessage(@NonNull StructNlMsgHdr nlmsghdr,
- @NonNull ByteBuffer byteBuffer) {
- switch (nlmsghdr.nlmsg_type) {
- case NetlinkConstants.RTM_NEWLINK:
- case NetlinkConstants.RTM_DELLINK:
- return (NetlinkMessage) RtNetlinkLinkMessage.parse(nlmsghdr, byteBuffer);
- case NetlinkConstants.RTM_NEWADDR:
- case NetlinkConstants.RTM_DELADDR:
- return (NetlinkMessage) RtNetlinkAddressMessage.parse(nlmsghdr, byteBuffer);
- case NetlinkConstants.RTM_NEWROUTE:
- case NetlinkConstants.RTM_DELROUTE:
- return (NetlinkMessage) RtNetlinkRouteMessage.parse(nlmsghdr, byteBuffer);
- case NetlinkConstants.RTM_NEWNEIGH:
- case NetlinkConstants.RTM_DELNEIGH:
- case NetlinkConstants.RTM_GETNEIGH:
- return (NetlinkMessage) RtNetlinkNeighborMessage.parse(nlmsghdr, byteBuffer);
- case NetlinkConstants.RTM_NEWNDUSEROPT:
- return (NetlinkMessage) NduseroptMessage.parse(nlmsghdr, byteBuffer);
- default: return null;
- }
- }
-
- @Nullable
- private static NetlinkMessage parseInetDiagMessage(@NonNull StructNlMsgHdr nlmsghdr,
- @NonNull ByteBuffer byteBuffer) {
- switch (nlmsghdr.nlmsg_type) {
- case NetlinkConstants.SOCK_DIAG_BY_FAMILY:
- return (NetlinkMessage) InetDiagMessage.parse(nlmsghdr, byteBuffer);
- default: return null;
- }
- }
-
- @Nullable
- private static NetlinkMessage parseNfMessage(@NonNull StructNlMsgHdr nlmsghdr,
- @NonNull ByteBuffer byteBuffer) {
- switch (nlmsghdr.nlmsg_type) {
- case NetlinkConstants.NFNL_SUBSYS_CTNETLINK << 8
- | NetlinkConstants.IPCTNL_MSG_CT_NEW:
- case NetlinkConstants.NFNL_SUBSYS_CTNETLINK << 8
- | NetlinkConstants.IPCTNL_MSG_CT_DELETE:
- return (NetlinkMessage) ConntrackMessage.parse(nlmsghdr, byteBuffer);
- default: return null;
- }
- }
-}