diff options
Diffstat (limited to 'common/device/com/android/net/module/util/netlink/RtNetlinkRouteMessage.java')
-rw-r--r-- | common/device/com/android/net/module/util/netlink/RtNetlinkRouteMessage.java | 217 |
1 files changed, 0 insertions, 217 deletions
diff --git a/common/device/com/android/net/module/util/netlink/RtNetlinkRouteMessage.java b/common/device/com/android/net/module/util/netlink/RtNetlinkRouteMessage.java deleted file mode 100644 index 9acac69c..00000000 --- a/common/device/com/android/net/module/util/netlink/RtNetlinkRouteMessage.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * 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 static android.system.OsConstants.AF_INET; -import static android.system.OsConstants.AF_INET6; - -import static com.android.net.module.util.NetworkStackConstants.IPV4_ADDR_ANY; -import static com.android.net.module.util.NetworkStackConstants.IPV6_ADDR_ANY; - -import android.annotation.SuppressLint; -import android.net.IpPrefix; -import android.system.OsConstants; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; - -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.nio.ByteBuffer; - -/** - * A NetlinkMessage subclass for rtnetlink route messages. - * - * RtNetlinkRouteMessage.parse() must be called with a ByteBuffer that contains exactly one - * netlink message. - * - * see also: - * - * include/uapi/linux/rtnetlink.h - * - * @hide - */ -public class RtNetlinkRouteMessage extends NetlinkMessage { - public static final short RTA_DST = 1; - public static final short RTA_OIF = 4; - public static final short RTA_GATEWAY = 5; - public static final short RTA_CACHEINFO = 12; - - private int mIfindex; - @NonNull - private StructRtMsg mRtmsg; - @NonNull - private IpPrefix mDestination; - @Nullable - private InetAddress mGateway; - @Nullable - private StructRtaCacheInfo mRtaCacheInfo; - - private RtNetlinkRouteMessage(StructNlMsgHdr header) { - super(header); - mRtmsg = null; - mDestination = null; - mGateway = null; - mIfindex = 0; - mRtaCacheInfo = null; - } - - public int getInterfaceIndex() { - return mIfindex; - } - - @NonNull - public StructRtMsg getRtMsgHeader() { - return mRtmsg; - } - - @NonNull - public IpPrefix getDestination() { - return mDestination; - } - - @Nullable - public InetAddress getGateway() { - return mGateway; - } - - @Nullable - public StructRtaCacheInfo getRtaCacheInfo() { - return mRtaCacheInfo; - } - - /** - * Check whether the address families of destination and gateway match rtm_family in - * StructRtmsg. - * - * For example, IPv4-mapped IPv6 addresses as an IPv6 address will be always converted to IPv4 - * address, that's incorrect when upper layer creates a new {@link RouteInfo} class instance - * for IPv6 route with the converted IPv4 gateway. - */ - private static boolean matchRouteAddressFamily(@NonNull final InetAddress address, - int family) { - return ((address instanceof Inet4Address) && (family == AF_INET)) - || ((address instanceof Inet6Address) && (family == AF_INET6)); - } - - /** - * Parse rtnetlink route message from {@link ByteBuffer}. This method must be called with a - * ByteBuffer that contains exactly one netlink message. - * - * @param header netlink message header. - * @param byteBuffer the ByteBuffer instance that wraps the raw netlink message bytes. - */ - @SuppressLint("NewApi") - @Nullable - public static RtNetlinkRouteMessage parse(@NonNull final StructNlMsgHdr header, - @NonNull final ByteBuffer byteBuffer) { - final RtNetlinkRouteMessage routeMsg = new RtNetlinkRouteMessage(header); - - routeMsg.mRtmsg = StructRtMsg.parse(byteBuffer); - if (routeMsg.mRtmsg == null) return null; - int rtmFamily = routeMsg.mRtmsg.family; - - // RTA_DST - final int baseOffset = byteBuffer.position(); - StructNlAttr nlAttr = StructNlAttr.findNextAttrOfType(RTA_DST, byteBuffer); - if (nlAttr != null) { - final InetAddress destination = nlAttr.getValueAsInetAddress(); - // If the RTA_DST attribute is malformed, return null. - if (destination == null) return null; - // If the address family of destination doesn't match rtm_family, return null. - if (!matchRouteAddressFamily(destination, rtmFamily)) return null; - routeMsg.mDestination = new IpPrefix(destination, routeMsg.mRtmsg.dstLen); - } else if (rtmFamily == AF_INET) { - routeMsg.mDestination = new IpPrefix(IPV4_ADDR_ANY, 0); - } else if (rtmFamily == AF_INET6) { - routeMsg.mDestination = new IpPrefix(IPV6_ADDR_ANY, 0); - } else { - return null; - } - - // RTA_GATEWAY - byteBuffer.position(baseOffset); - nlAttr = StructNlAttr.findNextAttrOfType(RTA_GATEWAY, byteBuffer); - if (nlAttr != null) { - routeMsg.mGateway = nlAttr.getValueAsInetAddress(); - // If the RTA_GATEWAY attribute is malformed, return null. - if (routeMsg.mGateway == null) return null; - // If the address family of gateway doesn't match rtm_family, return null. - if (!matchRouteAddressFamily(routeMsg.mGateway, rtmFamily)) return null; - } - - // RTA_OIF - byteBuffer.position(baseOffset); - nlAttr = StructNlAttr.findNextAttrOfType(RTA_OIF, byteBuffer); - if (nlAttr != null) { - // Any callers that deal with interface names are responsible for converting - // the interface index to a name themselves. This may not succeed or may be - // incorrect, because the interface might have been deleted, or even deleted - // and re-added with a different index, since the netlink message was sent. - routeMsg.mIfindex = nlAttr.getValueAsInt(0 /* 0 isn't a valid ifindex */); - } - - // RTA_CACHEINFO - byteBuffer.position(baseOffset); - nlAttr = StructNlAttr.findNextAttrOfType(RTA_CACHEINFO, byteBuffer); - if (nlAttr != null) { - routeMsg.mRtaCacheInfo = StructRtaCacheInfo.parse(nlAttr.getValueAsByteBuffer()); - } - - return routeMsg; - } - - /** - * Write a rtnetlink address message to {@link ByteBuffer}. - */ - @VisibleForTesting - protected void pack(ByteBuffer byteBuffer) { - getHeader().pack(byteBuffer); - mRtmsg.pack(byteBuffer); - - final StructNlAttr destination = new StructNlAttr(RTA_DST, mDestination.getAddress()); - destination.pack(byteBuffer); - - if (mGateway != null) { - final StructNlAttr gateway = new StructNlAttr(RTA_GATEWAY, mGateway.getAddress()); - gateway.pack(byteBuffer); - } - if (mIfindex != 0) { - final StructNlAttr ifindex = new StructNlAttr(RTA_OIF, mIfindex); - ifindex.pack(byteBuffer); - } - if (mRtaCacheInfo != null) { - final StructNlAttr cacheInfo = new StructNlAttr(RTA_CACHEINFO, - mRtaCacheInfo.writeToBytes()); - cacheInfo.pack(byteBuffer); - } - } - - @Override - public String toString() { - return "RtNetlinkRouteMessage{ " - + "nlmsghdr{" + mHeader.toString(OsConstants.NETLINK_ROUTE) + "}, " - + "Rtmsg{" + mRtmsg.toString() + "}, " - + "destination{" + mDestination.getAddress().getHostAddress() + "}, " - + "gateway{" + (mGateway == null ? "" : mGateway.getHostAddress()) + "}, " - + "ifindex{" + mIfindex + "}, " - + "rta_cacheinfo{" + (mRtaCacheInfo == null ? "" : mRtaCacheInfo.toString()) + "} " - + "}"; - } -} |