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

Commit bfb7bfa5 authored by Robert Greenwalt's avatar Robert Greenwalt
Browse files

Update Framework to support multiple dhpc ranges

Previously we only supported a single range - this was inadequate for
multiple interfaces.  Adding a second range so we can support
both usb and wifi tethering.

Also moving out of the zero-conf range as our dhcp client won't
accept ip addrs in that range (no nexus to nexus wifi action).

bug: 2537963
bug: 2533491
bug: 2538303
Change-Id: I600b421343c28c2f9839ed2076122ae3d0ff5d3d
parent 838bfef9
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -78,8 +78,9 @@ interface INetworkManagementService


    /**
    /**
     * Start tethering services with the specified dhcp server range
     * Start tethering services with the specified dhcp server range
     * arg is a set of start end pairs defining the ranges.
     */
     */
    void startTethering(String dhcpRangeStart, String dhcpRangeEnd);
    void startTethering(in String[] dhcpRanges);


    /**
    /**
     * Stop currently running tethering services
     * Stop currently running tethering services
+8 −2
Original line number Original line Diff line number Diff line
@@ -312,11 +312,17 @@ class NetworkManagementService extends INetworkManagementService.Stub {
        mConnector.doCommand(String.format("ipfwd %sable", (enable ? "en" : "dis")));
        mConnector.doCommand(String.format("ipfwd %sable", (enable ? "en" : "dis")));
    }
    }


    public void startTethering(String dhcpRangeStart, String dhcpRangeEnd)
    public void startTethering(String[] dhcpRange)
             throws IllegalStateException {
             throws IllegalStateException {
        mContext.enforceCallingOrSelfPermission(
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
                android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
        mConnector.doCommand(String.format("tether start %s %s", dhcpRangeStart, dhcpRangeEnd));
        // cmd is "tether start first_start first_stop second_start second_stop ..."
        // an odd number of addrs will fail
        String cmd = "tether start";
        for (String d : dhcpRange) {
            cmd += " " + d;
        }
        mConnector.doCommand(cmd);
    }
    }


    public void stopTethering() throws IllegalStateException {
    public void stopTethering() throws IllegalStateException {
+2 −2
Original line number Original line Diff line number Diff line
@@ -289,8 +289,8 @@ public class WifiService extends IWifiManager.Stub {
                    try {
                    try {
                        ifcg = service.getInterfaceConfig(intf);
                        ifcg = service.getInterfaceConfig(intf);
                        if (ifcg != null) {
                        if (ifcg != null) {
                            /* IP/netmask: 169.254.2.2/255.255.255.0 */
                            /* IP/netmask: 192.168.43.1/255.255.255.0 */
                            ifcg.ipAddr = (169 << 24) + (254 << 16) + (2 << 8) + 2;
                            ifcg.ipAddr = (192 << 24) + (168 << 16) + (43 << 8) + 1;
                            ifcg.netmask = (255 << 24) + (255 << 16) + (255 << 8) + 0;
                            ifcg.netmask = (255 << 24) + (255 << 16) + (255 << 8) + 0;
                            ifcg.interfaceFlags = "up";
                            ifcg.interfaceFlags = "up";


+26 −15
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ import android.net.InterfaceConfiguration;
import android.net.IConnectivityManager;
import android.net.IConnectivityManager;
import android.net.INetworkManagementEventObserver;
import android.net.INetworkManagementEventObserver;
import android.net.NetworkInfo;
import android.net.NetworkInfo;
import android.net.NetworkUtils;
import android.os.BatteryManager;
import android.os.BatteryManager;
import android.os.Binder;
import android.os.Binder;
import android.os.Environment;
import android.os.Environment;
@@ -80,11 +81,16 @@ public class Tethering extends INetworkManagementEventObserver.Stub {


    private BroadcastReceiver mStateReceiver;
    private BroadcastReceiver mStateReceiver;


    private static final String USB_NEAR_IFACE_ADDR      = "169.254.2.1";
    private static final String USB_NEAR_IFACE_ADDR      = "192.168.42.129";
    private static final String USB_NETMASK              = "255.255.255.0";

    // FYI - the default wifi is 192.168.43.1 and 255.255.255.0


    private String[] mDhcpRange;
    private String[] mDhcpRange;
    private static final String DHCP_DEFAULT_RANGE_START = "169.254.2.10";
    private static final String DHCP_DEFAULT_RANGE1_START = "192.168.42.2";
    private static final String DHCP_DEFAULT_RANGE_STOP  = "169.254.2.64";
    private static final String DHCP_DEFAULT_RANGE1_STOP  = "192.168.42.254";
    private static final String DHCP_DEFAULT_RANGE2_START = "192.168.43.2";
    private static final String DHCP_DEFAULT_RANGE2_STOP  = "192.168.43.254";


    private String[] mDnsServers;
    private String[] mDnsServers;
    private static final String DNS_DEFAULT_SERVER1 = "8.8.8.8";
    private static final String DNS_DEFAULT_SERVER1 = "8.8.8.8";
@@ -138,15 +144,12 @@ public class Tethering extends INetworkManagementEventObserver.Stub {


        mDhcpRange = context.getResources().getStringArray(
        mDhcpRange = context.getResources().getStringArray(
                com.android.internal.R.array.config_tether_dhcp_range);
                com.android.internal.R.array.config_tether_dhcp_range);
        if (mDhcpRange.length == 0) {
        if ((mDhcpRange.length == 0) || (mDhcpRange.length % 2 ==1)) {
            mDhcpRange = new String[2];
            mDhcpRange = new String[4];
            mDhcpRange[0] = DHCP_DEFAULT_RANGE_START;
            mDhcpRange[0] = DHCP_DEFAULT_RANGE1_START;
            mDhcpRange[1] = DHCP_DEFAULT_RANGE_STOP;
            mDhcpRange[1] = DHCP_DEFAULT_RANGE1_STOP;
        } else if(mDhcpRange.length == 1) {
            mDhcpRange[2] = DHCP_DEFAULT_RANGE2_START;
            String[] tmp = new String[2];
            mDhcpRange[3] = DHCP_DEFAULT_RANGE2_STOP;
            tmp[0] = mDhcpRange[0];
            tmp[1] = new String("");
            mDhcpRange = tmp;
        }
        }
        mDunRequired = context.getResources().getBoolean(
        mDunRequired = context.getResources().getBoolean(
                com.android.internal.R.bool.config_tether_dun_required);
                com.android.internal.R.bool.config_tether_dun_required);
@@ -504,8 +507,16 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
                try {
                try {
                    ifcg = service.getInterfaceConfig(iface);
                    ifcg = service.getInterfaceConfig(iface);
                    if (ifcg != null) {
                    if (ifcg != null) {
                        ifcg.ipAddr = (169 << 24) + (254 << 16) + (2 << 8) + 1;
                        String[] addr = USB_NEAR_IFACE_ADDR.split("\\.");
                        ifcg.netmask = (255 << 24) + (255 << 16) + (255 << 8) + 0;
                        ifcg.ipAddr = (Integer.parseInt(addr[0]) << 24) +
                                (Integer.parseInt(addr[1]) << 16) +
                                (Integer.parseInt(addr[2]) << 8) +
                                (Integer.parseInt(addr[3]));
                        addr = USB_NETMASK.split("\\.");
                        ifcg.netmask = (Integer.parseInt(addr[0]) << 24) +
                                (Integer.parseInt(addr[1]) << 16) +
                                (Integer.parseInt(addr[2]) << 8) +
                                (Integer.parseInt(addr[3]));
                        if (enabled) {
                        if (enabled) {
                            ifcg.interfaceFlags = ifcg.interfaceFlags.replace("down", "up");
                            ifcg.interfaceFlags = ifcg.interfaceFlags.replace("down", "up");
                        } else {
                        } else {
@@ -1101,7 +1112,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub {
                    return false;
                    return false;
                }
                }
                try {
                try {
                    service.startTethering(mDhcpRange[0], mDhcpRange[1]);
                    service.startTethering(mDhcpRange);
                } catch (Exception e) {
                } catch (Exception e) {
                    transitionTo(mStartTetheringErrorState);
                    transitionTo(mStartTetheringErrorState);
                    return false;
                    return false;