RouteInfo.java revision 4b0f8e6fb707e19799011c1f4a5e4f54603e34b1
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2011 The Android Open Source Project 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the License for the specific language governing permissions and 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * limitations under the License. 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package android.net; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Parcel; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Parcelable; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.net.UnknownHostException; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.net.InetAddress; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.net.Inet4Address; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.net.Inet6Address; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochimport java.util.Collection; 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochimport java.util.Objects; 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Represents a network route. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <p> 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is used both to describe static network configuration and live network 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * configuration information. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A route contains three pieces of information: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <ul> 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * <li>a destination {@link IpPrefix} specifying the network destinations covered by this route. 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * If this is {@code null} it indicates a default route of the address family (IPv4 or IPv6) 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * implied by the gateway IP address. 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * <li>a gateway {@link InetAddress} indicating the next hop to use. If this is {@code null} it 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * indicates a directly-connected route. 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * <li>an interface (which may be unspecified). 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * </ul> 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Either the destination or the gateway may be {@code null}, but not both. If the 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * destination and gateway are both specified, they must be of the same address family 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * (IPv4 or IPv6). 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)public final class RouteInfo implements Parcelable { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The IP destination address for this route. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private final IpPrefix mDestination; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The gateway address for this route. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private final InetAddress mGateway; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * The interface for this route. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private final String mInterface; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** Unicast route. @hide */ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static final int RTN_UNICAST = 1; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** Unreachable route. @hide */ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static final int RTN_UNREACHABLE = 7; 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /** Throw route. @hide */ 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public static final int RTN_THROW = 9; 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /** 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The type of this route; one of the RTN_xxx constants above. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private final int mType; 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Derived data members. 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // TODO: remove these. 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private final boolean mIsHost; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private final boolean mHasGateway; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch /** 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * Constructs a RouteInfo object. 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * If destination is null, then gateway must be specified and the 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * constructed route is either the IPv4 default route <code>0.0.0.0</code> 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * if the gateway is an instance of {@link Inet4Address}, or the IPv6 default 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * route <code>::/0</code> if gateway is an instance of 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * {@link Inet6Address}. 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * <p> 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * destination and gateway may not both be null. 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * @param destination the destination prefix 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * @param gateway the IP address to route packets through 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * @param iface the interface name to send packets on 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hide 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public RouteInfo(IpPrefix destination, InetAddress gateway, String iface, int type) { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (type) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case RTN_UNICAST: 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case RTN_UNREACHABLE: 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case RTN_THROW: 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO: It would be nice to ensure that route types that don't have nexthops or 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interfaces, such as unreachable or throw, can't be created if an interface or 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // a gateway is specified. This is a bit too complicated to do at the moment 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // because: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - LinkProperties sets the interface on routes added to it, and modifies the 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interfaces of all the routes when its interface name changes. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Even when the gateway is null, we store a non-null gateway here. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For now, we just rely on the code that sets routes to do things properly. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch throw new IllegalArgumentException("Unknown route type " + type); 120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (destination == null) { 123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (gateway != null) { 124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (gateway instanceof Inet4Address) { 125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch destination = new IpPrefix(Inet4Address.ANY, 0); 126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else { 127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch destination = new IpPrefix(Inet6Address.ANY, 0); 128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else { 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // no destination, no gateway. invalid. 131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch throw new IllegalArgumentException("Invalid arguments passed in: " + gateway + "," + 132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch destination); 133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // TODO: set mGateway to null if there is no gateway. This is more correct, saves space, and 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matches the documented behaviour. Before we can do this we need to fix all callers (e.g., 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ConnectivityService) to stop doing things like r.getGateway().equals(), ... . 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (gateway == null) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (destination.getAddress() instanceof Inet4Address) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gateway = Inet4Address.ANY; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gateway = Inet6Address.ANY; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mHasGateway = (!gateway.isAnyLocalAddress()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((destination.getAddress() instanceof Inet4Address && 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (gateway instanceof Inet4Address == false)) || 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (destination.getAddress() instanceof Inet6Address && 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (gateway instanceof Inet6Address == false))) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throw new IllegalArgumentException("address family mismatch in RouteInfo constructor"); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mDestination = destination; // IpPrefix objects are immutable. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mGateway = gateway; // InetAddress objects are immutable. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mInterface = iface; // Strings are immutable. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mType = type; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mIsHost = isHost(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hide 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public RouteInfo(IpPrefix destination, InetAddress gateway, String iface) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this(destination, gateway, iface, RTN_UNICAST); 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @hide 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public RouteInfo(LinkAddress destination, InetAddress gateway, String iface) { 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this(destination == null ? null : 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new IpPrefix(destination.getAddress(), destination.getPrefixLength()), 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gateway, iface); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Constructs a {@code RouteInfo} object. 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * If destination is null, then gateway must be specified and the 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * constructed route is either the IPv4 default route <code>0.0.0.0</code> 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * if the gateway is an instance of {@link Inet4Address}, or the IPv6 default 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * route <code>::/0</code> if gateway is an instance of {@link Inet6Address}. 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * <p> 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Destination and gateway may not both be null. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param destination the destination address and prefix in an {@link IpPrefix} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param gateway the {@link InetAddress} to route packets through 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hide 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public RouteInfo(IpPrefix destination, InetAddress gateway) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this(destination, gateway, null); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @hide 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Remove this. 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public RouteInfo(LinkAddress destination, InetAddress gateway) { 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this(destination, gateway, null); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Constructs a default {@code RouteInfo} object. 20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * 20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @param gateway the {@link InetAddress} to route packets through 20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hide 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public RouteInfo(InetAddress gateway) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this((IpPrefix) null, gateway, null); 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /** 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Constructs a {@code RouteInfo} object representing a direct connected subnet. 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @param destination the {@link IpPrefix} describing the address and prefix 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * length of the subnet. 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @hide 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public RouteInfo(IpPrefix destination) { 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this(destination, null, null); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /** 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @hide 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public RouteInfo(LinkAddress destination) { 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) this(destination, null, null); 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @hide 2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu */ 2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public RouteInfo(IpPrefix destination, int type) { 2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this(destination, null, null, type); 2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu /** 2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @hide 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static RouteInfo makeHostRoute(InetAddress host, String iface) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return makeHostRoute(host, null, iface); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hide 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static RouteInfo makeHostRoute(InetAddress host, InetAddress gateway, String iface) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host == null) return null; 253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (host instanceof Inet4Address) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new RouteInfo(new IpPrefix(host, 32), gateway, iface); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new RouteInfo(new IpPrefix(host, 128), gateway, iface); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean isHost() { 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (mDestination.getAddress() instanceof Inet4Address && 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mDestination.getPrefixLength() == 32) || 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (mDestination.getAddress() instanceof Inet6Address && 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mDestination.getPrefixLength() == 128); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Retrieves the destination address and prefix length in the form of an {@link IpPrefix}. 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {@link IpPrefix} specifying the destination. This is never {@code null}. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public IpPrefix getDestination() { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mDestination; 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Convert callers to use IpPrefix and then remove. 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @hide 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public LinkAddress getDestinationLinkAddress() { 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new LinkAddress(mDestination.getAddress(), mDestination.getPrefixLength()); 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Retrieves the gateway or next hop {@link InetAddress} for this route. 2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return {@link InetAddress} specifying the gateway or next hop. This may be 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * {@code null} for a directly-connected route." 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public InetAddress getGateway() { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mGateway; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Retrieves the interface used for this route if specified, else {@code null}. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return The name of the interface used for this route. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public String getInterface() { 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return mInterface; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Retrieves the type of this route. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return The type of this route; one of the {@code RTN_xxx} constants defined in this class. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hide 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int getType() { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mType; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Indicates if this route is a default route (ie, has no destination specified). 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {@code true} if the destination has a prefix length of 0. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean isDefaultRoute() { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mType == RTN_UNICAST && mDestination.getPrefixLength() == 0; 322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Indicates if this route is an IPv4 default route. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hide 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean isIPv4Default() { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return isDefaultRoute() && mDestination.getAddress() instanceof Inet4Address; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Indicates if this route is an IPv6 default route. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hide 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean isIPv6Default() { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return isDefaultRoute() && mDestination.getAddress() instanceof Inet6Address; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /** 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Indicates if this route is a host route (ie, matches only a single host address). 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @return {@code true} if the destination has a prefix length of 32 or 128 for IPv4 or IPv6, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * respectively. 3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @hide 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean isHostRoute() { 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mIsHost; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Indicates if this route has a next hop ({@code true}) or is directly-connected 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ({@code false}). 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {@code true} if a gateway is specified 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @hide 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean hasGateway() { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mHasGateway; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Determines whether the destination and prefix of this route includes the specified 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * address. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param destination A {@link InetAddress} to test to see if it would match this route. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {@code true} if the destination and prefix length cover the given address. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean matches(InetAddress destination) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (destination == null) return false; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // match the route destination and destination with prefix length 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InetAddress dstNet = NetworkUtils.getNetworkPart(destination, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mDestination.getPrefixLength()); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mDestination.getAddress().equals(dstNet); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find the route from a Collection of routes that best matches a given address. 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * May return null if no routes are applicable. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param routes a Collection of RouteInfos to chose from 3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @param dest the InetAddress your trying to get to 3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @return the RouteInfo from the Collection that best fits the given address 3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * 3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @hide 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static RouteInfo selectBestRoute(Collection<RouteInfo> routes, InetAddress dest) { 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((routes == null) || (dest == null)) return null; 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RouteInfo bestRoute = null; 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // pick a longest prefix match under same address type 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (RouteInfo route : routes) { 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (NetworkUtils.addressTypeMatches(route.mDestination.getAddress(), dest)) { 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((bestRoute != null) && 3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (bestRoute.mDestination.getPrefixLength() >= 3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) route.mDestination.getPrefixLength())) { 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue; 3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (route.matches(dest)) bestRoute = route; 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bestRoute; 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Returns a human-readable description of this object. 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public String toString() { 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) String val = ""; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mDestination != null) val = mDestination.toString(); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mType == RTN_UNREACHABLE) { 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val += " unreachable"; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (mType == RTN_THROW) { 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val += " throw"; 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) val += " ->"; 4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (mGateway != null) val += " " + mGateway.getHostAddress(); 4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (mInterface != null) val += " " + mInterface; 4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (mType != RTN_UNICAST) { 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) val += " unknown type " + mType; 4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return val; 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compares this RouteInfo object against the specified object and indicates if they are equal. 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {@code true} if the objects are equal, {@code false} otherwise. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public boolean equals(Object obj) { 432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (this == obj) return true; 433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!(obj instanceof RouteInfo)) return false; 435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RouteInfo target = (RouteInfo) obj; 437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return Objects.equals(mDestination, target.getDestination()) && 439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Objects.equals(mGateway, target.getGateway()) && 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Objects.equals(mInterface, target.getInterface()) && 441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mType == target.getType(); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a hashcode for this <code>RouteInfo</code> object. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public int hashCode() { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (mDestination.hashCode() * 41) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) + (mGateway == null ? 0 :mGateway.hashCode() * 47) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) + (mInterface == null ? 0 :mInterface.hashCode() * 67) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) + (mType * 71); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Implement the Parcelable interface 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public int describeContents() { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Implement the Parcelable interface 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void writeToParcel(Parcel dest, int flags) { 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dest.writeParcelable(mDestination, flags); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte[] gatewayBytes = (mGateway == null) ? null : mGateway.getAddress(); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest.writeByteArray(gatewayBytes); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest.writeString(mInterface); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest.writeInt(mType); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implement the Parcelable interface. 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static final Creator<RouteInfo> CREATOR = 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new Creator<RouteInfo>() { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public RouteInfo createFromParcel(Parcel in) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IpPrefix dest = in.readParcelable(null); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InetAddress gateway = null; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte[] addr = in.createByteArray(); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gateway = InetAddress.getByAddress(addr); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } catch (UnknownHostException e) {} 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String iface = in.readString(); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type = in.readInt(); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new RouteInfo(dest, gateway, iface, type); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public RouteInfo[] newArray(int size) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new RouteInfo[size]; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)