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

Commit 1f1881ac authored by Xiao Ma's avatar Xiao Ma Committed by Automerger Merge Worker
Browse files

Merge "Get RDNSS option information from kernel instead of Netd." am: f3dd8d71

Original change: https://android-review.googlesource.com/c/platform/packages/modules/NetworkStack/+/1737438

Change-Id: I0d13e686d98df61a66db84e177ee7c26750f93c6
parents 83b6b177 f3dd8d71
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.