Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a47c4019 authored by Robert Greenwalt's avatar Robert Greenwalt Committed by Android (Google) Code Review
Browse files

Merge "Add RouteInfo objects for tracking routes." into honeycomb-LTE

parents 8ab6a6d4 aa70f101
Loading
Loading
Loading
Loading
+20 −5
Original line number Original line Diff line number Diff line
@@ -22,6 +22,8 @@ import android.util.Log;
import java.net.InetAddress;
import java.net.InetAddress;
import java.net.Inet4Address;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;


/**
/**
 * A simple object for retrieving the results of a DHCP request.
 * A simple object for retrieving the results of a DHCP request.
@@ -31,7 +33,6 @@ import java.net.UnknownHostException;
public class DhcpInfoInternal {
public class DhcpInfoInternal {
    private final static String TAG = "DhcpInfoInternal";
    private final static String TAG = "DhcpInfoInternal";
    public String ipAddress;
    public String ipAddress;
    public String gateway;
    public int prefixLength;
    public int prefixLength;


    public String dns1;
    public String dns1;
@@ -40,7 +41,14 @@ public class DhcpInfoInternal {
    public String serverAddress;
    public String serverAddress;
    public int leaseDuration;
    public int leaseDuration;


    private Collection<RouteInfo> routes;

    public DhcpInfoInternal() {
    public DhcpInfoInternal() {
        routes = new ArrayList<RouteInfo>();
    }

    public void addRoute(RouteInfo routeInfo) {
        routes.add(routeInfo);
    }
    }


    private int convertToInt(String addr) {
    private int convertToInt(String addr) {
@@ -58,7 +66,12 @@ public class DhcpInfoInternal {
    public DhcpInfo makeDhcpInfo() {
    public DhcpInfo makeDhcpInfo() {
        DhcpInfo info = new DhcpInfo();
        DhcpInfo info = new DhcpInfo();
        info.ipAddress = convertToInt(ipAddress);
        info.ipAddress = convertToInt(ipAddress);
        info.gateway = convertToInt(gateway);
        for (RouteInfo route : routes) {
            if (route.isDefaultRoute()) {
                info.gateway = convertToInt(route.getGateway().getHostAddress());
                break;
            }
        }
        try {
        try {
            InetAddress inetAddress = NetworkUtils.numericToInetAddress(ipAddress);
            InetAddress inetAddress = NetworkUtils.numericToInetAddress(ipAddress);
            info.netmask = NetworkUtils.prefixLengthToNetmaskInt(prefixLength);
            info.netmask = NetworkUtils.prefixLengthToNetmaskInt(prefixLength);
@@ -81,8 +94,8 @@ public class DhcpInfoInternal {
    public LinkProperties makeLinkProperties() {
    public LinkProperties makeLinkProperties() {
        LinkProperties p = new LinkProperties();
        LinkProperties p = new LinkProperties();
        p.addLinkAddress(makeLinkAddress());
        p.addLinkAddress(makeLinkAddress());
        if (TextUtils.isEmpty(gateway) == false) {
        for (RouteInfo route : routes) {
            p.addGateway(NetworkUtils.numericToInetAddress(gateway));
            p.addRoute(route);
        }
        }
        if (TextUtils.isEmpty(dns1) == false) {
        if (TextUtils.isEmpty(dns1) == false) {
            p.addDns(NetworkUtils.numericToInetAddress(dns1));
            p.addDns(NetworkUtils.numericToInetAddress(dns1));
@@ -98,8 +111,10 @@ public class DhcpInfoInternal {
    }
    }


    public String toString() {
    public String toString() {
        String routeString = "";
        for (RouteInfo route : routes) routeString += route.toString() + " | ";
        return "addr: " + ipAddress + "/" + prefixLength +
        return "addr: " + ipAddress + "/" + prefixLength +
                " gateway: " + gateway +
                " routes: " + routeString +
                " dns: " + dns1 + "," + dns2 +
                " dns: " + dns1 + "," + dns2 +
                " dhcpServer: " + serverAddress +
                " dhcpServer: " + serverAddress +
                " leaseDuration: " + leaseDuration;
                " leaseDuration: " + leaseDuration;
+21 −23
Original line number Original line Diff line number Diff line
@@ -54,7 +54,7 @@ public class LinkProperties implements Parcelable {
    String mIfaceName;
    String mIfaceName;
    private Collection<LinkAddress> mLinkAddresses;
    private Collection<LinkAddress> mLinkAddresses;
    private Collection<InetAddress> mDnses;
    private Collection<InetAddress> mDnses;
    private Collection<InetAddress> mGateways;
    private Collection<RouteInfo> mRoutes;
    private ProxyProperties mHttpProxy;
    private ProxyProperties mHttpProxy;


    public LinkProperties() {
    public LinkProperties() {
@@ -67,7 +67,7 @@ public class LinkProperties implements Parcelable {
            mIfaceName = source.getInterfaceName();
            mIfaceName = source.getInterfaceName();
            mLinkAddresses = source.getLinkAddresses();
            mLinkAddresses = source.getLinkAddresses();
            mDnses = source.getDnses();
            mDnses = source.getDnses();
            mGateways = source.getGateways();
            mRoutes = source.getRoutes();
            mHttpProxy = new ProxyProperties(source.getHttpProxy());
            mHttpProxy = new ProxyProperties(source.getHttpProxy());
        }
        }
    }
    }
@@ -104,11 +104,11 @@ public class LinkProperties implements Parcelable {
        return Collections.unmodifiableCollection(mDnses);
        return Collections.unmodifiableCollection(mDnses);
    }
    }


    public void addGateway(InetAddress gateway) {
    public void addRoute(RouteInfo route) {
        if (gateway != null) mGateways.add(gateway);
        if (route != null) mRoutes.add(route);
    }
    }
    public Collection<InetAddress> getGateways() {
    public Collection<RouteInfo> getRoutes() {
        return Collections.unmodifiableCollection(mGateways);
        return Collections.unmodifiableCollection(mRoutes);
    }
    }


    public void setHttpProxy(ProxyProperties proxy) {
    public void setHttpProxy(ProxyProperties proxy) {
@@ -122,7 +122,7 @@ public class LinkProperties implements Parcelable {
        mIfaceName = null;
        mIfaceName = null;
        mLinkAddresses = new ArrayList<LinkAddress>();
        mLinkAddresses = new ArrayList<LinkAddress>();
        mDnses = new ArrayList<InetAddress>();
        mDnses = new ArrayList<InetAddress>();
        mGateways = new ArrayList<InetAddress>();
        mRoutes = new ArrayList<RouteInfo>();
        mHttpProxy = null;
        mHttpProxy = null;
    }
    }


@@ -146,12 +146,12 @@ public class LinkProperties implements Parcelable {
        for (InetAddress addr : mDnses) dns += addr.getHostAddress() + ",";
        for (InetAddress addr : mDnses) dns += addr.getHostAddress() + ",";
        dns += "] ";
        dns += "] ";


        String gateways = "Gateways: [";
        String routes = "Routes: [";
        for (InetAddress gw : mGateways) gateways += gw.getHostAddress() + ",";
        for (RouteInfo route : mRoutes) routes += route.toString() + ",";
        gateways += "] ";
        routes += "] ";
        String proxy = (mHttpProxy == null ? "" : "HttpProxy: " + mHttpProxy.toString() + " ");
        String proxy = (mHttpProxy == null ? "" : "HttpProxy: " + mHttpProxy.toString() + " ");


        return ifaceName + linkAddresses + gateways + dns + proxy;
        return ifaceName + linkAddresses + routes + dns + proxy;
    }
    }




@@ -177,7 +177,7 @@ public class LinkProperties implements Parcelable {


        boolean sameAddresses;
        boolean sameAddresses;
        boolean sameDnses;
        boolean sameDnses;
        boolean sameGateways;
        boolean sameRoutes;


        LinkProperties target = (LinkProperties) obj;
        LinkProperties target = (LinkProperties) obj;


@@ -190,12 +190,12 @@ public class LinkProperties implements Parcelable {
        sameDnses = (mDnses.size() == targetDnses.size()) ?
        sameDnses = (mDnses.size() == targetDnses.size()) ?
                mDnses.containsAll(targetDnses) : false;
                mDnses.containsAll(targetDnses) : false;


        Collection<InetAddress> targetGateways = target.getGateways();
        Collection<RouteInfo> targetRoutes = target.getRoutes();
        sameGateways = (mGateways.size() == targetGateways.size()) ?
        sameRoutes = (mRoutes.size() == targetRoutes.size()) ?
                mGateways.containsAll(targetGateways) : false;
                mRoutes.containsAll(targetRoutes) : false;


        return
        return
            sameAddresses && sameDnses && sameGateways
            sameAddresses && sameDnses && sameRoutes
            && TextUtils.equals(getInterfaceName(), target.getInterfaceName())
            && TextUtils.equals(getInterfaceName(), target.getInterfaceName())
            && (getHttpProxy() == null ? target.getHttpProxy() == null :
            && (getHttpProxy() == null ? target.getHttpProxy() == null :
                getHttpProxy().equals(target.getHttpProxy()));
                getHttpProxy().equals(target.getHttpProxy()));
@@ -211,7 +211,7 @@ public class LinkProperties implements Parcelable {
        return ((null == mIfaceName) ? 0 : mIfaceName.hashCode()
        return ((null == mIfaceName) ? 0 : mIfaceName.hashCode()
                + mLinkAddresses.size() * 31
                + mLinkAddresses.size() * 31
                + mDnses.size() * 37
                + mDnses.size() * 37
                + mGateways.size() * 41
                + mRoutes.size() * 41
                + ((null == mHttpProxy) ? 0 : mHttpProxy.hashCode()));
                + ((null == mHttpProxy) ? 0 : mHttpProxy.hashCode()));
    }
    }


@@ -231,9 +231,9 @@ public class LinkProperties implements Parcelable {
            dest.writeByteArray(d.getAddress());
            dest.writeByteArray(d.getAddress());
        }
        }


        dest.writeInt(mGateways.size());
        dest.writeInt(mRoutes.size());
        for(InetAddress gw : mGateways) {
        for(RouteInfo route : mRoutes) {
            dest.writeByteArray(gw.getAddress());
            dest.writeParcelable(route, flags);
        }
        }


        if (mHttpProxy != null) {
        if (mHttpProxy != null) {
@@ -272,9 +272,7 @@ public class LinkProperties implements Parcelable {
                }
                }
                addressCount = in.readInt();
                addressCount = in.readInt();
                for (int i=0; i<addressCount; i++) {
                for (int i=0; i<addressCount; i++) {
                    try {
                    netProp.addRoute((RouteInfo)in.readParcelable(null));
                        netProp.addGateway(InetAddress.getByAddress(in.createByteArray()));
                    } catch (UnknownHostException e) { }
                }
                }
                if (in.readByte() == 1) {
                if (in.readByte() == 1) {
                    netProp.setHttpProxy((ProxyProperties)in.readParcelable(null));
                    netProp.setHttpProxy((ProxyProperties)in.readParcelable(null));
+19 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2011 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 android.net;

parcelable RouteInfo;
+162 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2011 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 android.net;

import android.os.Parcel;
import android.os.Parcelable;

import java.net.UnknownHostException;
import java.net.InetAddress;
import java.net.Inet4Address;
import java.net.Inet6Address;
/**
 * A simple container for route information.
 *
 * @hide
 */
public class RouteInfo implements Parcelable {
    /**
     * The IP destination address for this route.
     */
    private final LinkAddress mDestination;

    /**
     * The gateway address for this route.
     */
    private final InetAddress mGateway;

    private final boolean mIsDefault;

    public RouteInfo(LinkAddress destination, InetAddress gateway) {
        if (destination == null) {
            try {
                if ((gateway != null) && (gateway instanceof Inet4Address)) {
                    destination = new LinkAddress(InetAddress.getByName("0.0.0.0"), 32);
                } else {
                    destination = new LinkAddress(InetAddress.getByName("::0"), 128);
                }
            } catch (Exception e) {}
        }
        mDestination = destination;
        mGateway = gateway;
        mIsDefault = isDefault();
    }

    public RouteInfo(InetAddress gateway) {
        LinkAddress destination = null;
        try {
            if ((gateway != null) && (gateway instanceof Inet4Address)) {
                destination = new LinkAddress(InetAddress.getByName("0.0.0.0"), 32);
            } else {
                destination = new LinkAddress(InetAddress.getByName("::0"), 128);
            }
        } catch (Exception e) {}
        mDestination = destination;
        mGateway = gateway;
        mIsDefault = isDefault();
    }

    private boolean isDefault() {
        boolean val = false;
        if (mGateway != null) {
            if (mGateway instanceof Inet4Address) {
                val = (mDestination == null || mDestination.getNetworkPrefixLength() == 32);
            } else {
                val = (mDestination == null || mDestination.getNetworkPrefixLength() == 128);
            }
        }
        return val;
    }

    public LinkAddress getDestination() {
        return mDestination;
    }

    public InetAddress getGateway() {
        return mGateway;
    }

    public boolean isDefaultRoute() {
        return mIsDefault;
    }

    public String toString() {
        String val = "";
        if (mDestination != null) val = mDestination.toString();
        if (mGateway != null) val += " -> " + mGateway.getHostAddress();
        return val;
    }

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags) {
        if (mDestination == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeByteArray(mDestination.getAddress().getAddress());
            dest.writeInt(mDestination.getNetworkPrefixLength());
        }

        if (mGateway == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeByteArray(mGateway.getAddress());
        }
    }

    public static final Creator<RouteInfo> CREATOR =
        new Creator<RouteInfo>() {
        public RouteInfo createFromParcel(Parcel in) {
            InetAddress destAddr = null;
            int prefix = 0;
            InetAddress gateway = null;

            if (in.readByte() == 1) {
                byte[] addr = in.createByteArray();
                prefix = in.readInt();

                try {
                    destAddr = InetAddress.getByAddress(addr);
                } catch (UnknownHostException e) {}
            }

            if (in.readByte() == 1) {
                byte[] addr = in.createByteArray();

                try {
                    gateway = InetAddress.getByAddress(addr);
                } catch (UnknownHostException e) {}
            }

            LinkAddress dest = null;

            if (destAddr != null) {
                dest = new LinkAddress(destAddr, prefix);
            }

            return new RouteInfo(dest, gateway);
        }

        public RouteInfo[] newArray(int size) {
            return new RouteInfo[size];
        }
    };
}
+24 −3
Original line number Original line Diff line number Diff line
@@ -68,7 +68,6 @@ static struct fieldIds {
    jclass dhcpInfoInternalClass;
    jclass dhcpInfoInternalClass;
    jmethodID constructorId;
    jmethodID constructorId;
    jfieldID ipaddress;
    jfieldID ipaddress;
    jfieldID gateway;
    jfieldID prefixLength;
    jfieldID prefixLength;
    jfieldID dns1;
    jfieldID dns1;
    jfieldID dns2;
    jfieldID dns2;
@@ -182,7 +181,30 @@ static jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstr
    env->ReleaseStringUTFChars(ifname, nameStr);
    env->ReleaseStringUTFChars(ifname, nameStr);
    if (result == 0 && dhcpInfoInternalFieldIds.dhcpInfoInternalClass != NULL) {
    if (result == 0 && dhcpInfoInternalFieldIds.dhcpInfoInternalClass != NULL) {
        env->SetObjectField(info, dhcpInfoInternalFieldIds.ipaddress, env->NewStringUTF(ipaddr));
        env->SetObjectField(info, dhcpInfoInternalFieldIds.ipaddress, env->NewStringUTF(ipaddr));
        env->SetObjectField(info, dhcpInfoInternalFieldIds.gateway, env->NewStringUTF(gateway));

        // set the gateway
        jclass cls = env->FindClass("java/net/InetAddress");
        jmethodID method = env->GetStaticMethodID(cls, "getByName",
                "(Ljava/lang/String;)Ljava/net/InetAddress;");
        jvalue args[1];
        args[0].l = env->NewStringUTF(gateway);
        jobject inetAddressObject = env->CallStaticObjectMethodA(cls, method, args);

        if (!env->ExceptionOccurred()) {
            cls = env->FindClass("android/net/RouteInfo");
            method = env->GetMethodID(cls, "<init>", "(Ljava/net/InetAddress;)V");
            args[0].l = inetAddressObject;
            jobject routeInfoObject = env->NewObjectA(cls, method, args);

            cls = env->FindClass("android/net/DhcpInfoInternal");
            method = env->GetMethodID(cls, "addRoute", "(Landroid/net/RouteInfo;)V");
            args[0].l = routeInfoObject;
            env->CallVoidMethodA(info, method, args);
        } else {
            // if we have an exception (host not found perhaps), just don't add the route
            env->ExceptionClear();
        }

        env->SetIntField(info, dhcpInfoInternalFieldIds.prefixLength, prefixLength);
        env->SetIntField(info, dhcpInfoInternalFieldIds.prefixLength, prefixLength);
        env->SetObjectField(info, dhcpInfoInternalFieldIds.dns1, env->NewStringUTF(dns1));
        env->SetObjectField(info, dhcpInfoInternalFieldIds.dns1, env->NewStringUTF(dns1));
        env->SetObjectField(info, dhcpInfoInternalFieldIds.dns2, env->NewStringUTF(dns2));
        env->SetObjectField(info, dhcpInfoInternalFieldIds.dns2, env->NewStringUTF(dns2));
@@ -262,7 +284,6 @@ int register_android_net_NetworkUtils(JNIEnv* env)
    if (dhcpInfoInternalFieldIds.dhcpInfoInternalClass != NULL) {
    if (dhcpInfoInternalFieldIds.dhcpInfoInternalClass != NULL) {
        dhcpInfoInternalFieldIds.constructorId = env->GetMethodID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "<init>", "()V");
        dhcpInfoInternalFieldIds.constructorId = env->GetMethodID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "<init>", "()V");
        dhcpInfoInternalFieldIds.ipaddress = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "ipAddress", "Ljava/lang/String;");
        dhcpInfoInternalFieldIds.ipaddress = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "ipAddress", "Ljava/lang/String;");
        dhcpInfoInternalFieldIds.gateway = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "gateway", "Ljava/lang/String;");
        dhcpInfoInternalFieldIds.prefixLength = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "prefixLength", "I");
        dhcpInfoInternalFieldIds.prefixLength = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "prefixLength", "I");
        dhcpInfoInternalFieldIds.dns1 = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "dns1", "Ljava/lang/String;");
        dhcpInfoInternalFieldIds.dns1 = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "dns1", "Ljava/lang/String;");
        dhcpInfoInternalFieldIds.dns2 = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "dns2", "Ljava/lang/String;");
        dhcpInfoInternalFieldIds.dns2 = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "dns2", "Ljava/lang/String;");
Loading