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

Commit d31608e9 authored by Xiao Ma's avatar Xiao Ma
Browse files

Get RDNSS option information from kernel instead of Netd.

Refactor the current way of getting RDNSS option info from netd,
instead, just parsing the RDNSS option via netlink message from
kenernl diretly and update the corresponding LinkProperties.
Besides, update with an experiment flag to control the refactor.

Alao change the IpClientLinkObserver constructor signature, add
a new parameter: IpClient.Dependencies to control the refactor
flag on or off, which is helpful for testing.

Bug: 163492391
Test: atest NetworkStackTests NetworkStackIntegrationTests
Change-Id: I0abc8ac14638e60fdcd5a7f27158a3290f326243
parent 662f1ea1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -715,7 +715,7 @@ public class IpClient extends StateMachine {
                (ifaceUp) -> sendMessage(EVENT_NETLINK_LINKPROPERTIES_CHANGED, ifaceUp
                        ? ARG_LINKPROP_CHANGED_LINKSTATE_UP
                        : ARG_LINKPROP_CHANGED_LINKSTATE_DOWN),
                config, mLog) {
                config, mLog, mDependencies) {
            @Override
            public void onInterfaceAdded(String iface) {
                super.onInterfaceAdded(iface);
+40 −12
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.net.ip;

import static android.net.util.NetworkStackUtils.IPCLIENT_PARSE_NETLINK_EVENTS_VERSION;
import static android.system.OsConstants.AF_INET6;

import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ROUTER_ADVERTISEMENT;
@@ -37,6 +38,7 @@ import com.android.net.module.util.netlink.NduseroptMessage;
import com.android.net.module.util.netlink.NetlinkConstants;
import com.android.net.module.util.netlink.NetlinkMessage;
import com.android.net.module.util.netlink.StructNdOptPref64;
import com.android.net.module.util.netlink.StructNdOptRdnss;
import com.android.networkstack.apishim.NetworkInformationShimImpl;
import com.android.networkstack.apishim.common.NetworkInformationShim;
import com.android.server.NetworkObserver;
@@ -107,6 +109,7 @@ public class IpClientLinkObserver implements NetworkObserver {
        }
    }

    private final Context mContext;
    private final String mInterfaceName;
    private final Callback mCallback;
    private final LinkProperties mLinkProperties;
@@ -115,13 +118,15 @@ public class IpClientLinkObserver implements NetworkObserver {
    private final AlarmManager mAlarmManager;
    private final Configuration mConfig;
    private final Handler mHandler;
    private final IpClient.Dependencies mDependencies;

    private final MyNetlinkMonitor mNetlinkMonitor;

    private static final boolean DBG = false;

    public IpClientLinkObserver(Context context, Handler h, String iface, Callback callback,
            Configuration config, SharedLog log) {
            Configuration config, SharedLog log, IpClient.Dependencies deps) {
        mContext = context;
        mInterfaceName = iface;
        mTag = "NetlinkTracker/" + mInterfaceName;
        mCallback = callback;
@@ -134,6 +139,7 @@ public class IpClientLinkObserver implements NetworkObserver {
        mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        mNetlinkMonitor = new MyNetlinkMonitor(h, log, mTag);
        mHandler.post(mNetlinkMonitor::start);
        mDependencies = deps;
    }

    public void shutdown() {
@@ -153,6 +159,11 @@ public class IpClientLinkObserver implements NetworkObserver {
        }
    }

    private boolean isNetlinkEventParsingEnabled() {
        return mDependencies.isFeatureEnabled(mContext, IPCLIENT_PARSE_NETLINK_EVENTS_VERSION,
                false /* default value */);
    }

    @Override
    public void onInterfaceRemoved(String iface) {
        maybeLog("interfaceRemoved", iface);
@@ -246,8 +257,13 @@ public class IpClientLinkObserver implements NetworkObserver {

    @Override
    public void onInterfaceDnsServerInfo(String iface, long lifetime, String[] addresses) {
        if (mInterfaceName.equals(iface)) {
        if (isNetlinkEventParsingEnabled()) return;
        if (!mInterfaceName.equals(iface)) return;
        maybeLog("interfaceDnsServerInfo", Arrays.toString(addresses));
        updateInterfaceDnsServerInfo(lifetime, addresses);
    }

    private void updateInterfaceDnsServerInfo(long lifetime, final String[] addresses) {
        final boolean changed = mDnsServerRepository.addServers(lifetime, addresses);
        final boolean linkState;
        if (changed) {
@@ -258,7 +274,6 @@ public class IpClientLinkObserver implements NetworkObserver {
            mCallback.update(linkState);
        }
    }
    }

    /**
     * Returns a copy of this object's LinkProperties.
@@ -408,6 +423,15 @@ public class IpClientLinkObserver implements NetworkObserver {
            updatePref64(opt.prefix, now, expiry);
        }

        private void processRdnssOption(StructNdOptRdnss opt) {
            if (!isNetlinkEventParsingEnabled()) return;
            final String[] addresses = new String[opt.servers.length];
            for (int i = 0; i < opt.servers.length; i++) {
                addresses[i] = opt.servers[i].getHostAddress();
            }
            updateInterfaceDnsServerInfo(opt.header.lifetime, addresses);
        }

        private void processNduseroptMessage(NduseroptMessage msg, final long whenMs) {
            if (msg.family != AF_INET6 || msg.option == null || msg.ifindex != mIfindex) return;
            if (msg.icmp_type != (byte) ICMPV6_ROUTER_ADVERTISEMENT) return;
@@ -417,8 +441,12 @@ public class IpClientLinkObserver implements NetworkObserver {
                    processPref64Option((StructNdOptPref64) msg.option, whenMs);
                    break;

                case StructNdOptRdnss.TYPE:
                    processRdnssOption((StructNdOptRdnss) msg.option);
                    break;

                default:
                    // TODO: implement RDNSS and DNSSL.
                    // TODO: implement DNSSL.
                    break;
            }
        }
+7 −0
Original line number Diff line number Diff line
@@ -249,6 +249,13 @@ public class NetworkStackUtils {
    public static final String IPCLIENT_GARP_NA_ROAMING_VERSION =
            "ipclient_garp_na_roaming_version";

    /**
     * Experiment flag to enable parsing netlink events from kernel directly instead from netd aidl
     * interface.
     */
    public static final String IPCLIENT_PARSE_NETLINK_EVENTS_VERSION =
            "ipclient_parse_netlink_events_version";

    /**
     * Experiment flag to disable accept_ra parameter when IPv6 provisioning loss happens due to
     * the default route has gone.