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

Commit 931ec8ef authored by junyulai's avatar junyulai
Browse files

Fix cannot create Nat-T keepalive on mobile data

Currently phone process fail to unparcel NattKeepalivePacketData
since it is not in framework. Moves NattKeepalivePacketData to
framework to make it can be utilized by telephony.

This change also removes the error feedback triggered by calling
add keepalive packet filter to an unsupported network agent. This
is misinterpreted by KeepaliveTracker that start keepalive is
failing.

Bug: 134048171
Test: 1. atest android.net.cts.ConnectivityManagerTest#testSocketKeepaliveLimitTelephony
      2. atest android.net.cts.ConnectivityManagerTest
      3. atest FrameworksNetTests
      4. atest FrameworksTelephonyTests

Merged-In: If630d5b339aa722717258c721daa8ead8c431e2d
Change-Id: Ic0f168be6f5a6263a5e0565b6381dcb5c645660f
(cherry picked from commit 9ede677b)
parent 02d9b9c3
Loading
Loading
Loading
Loading
+36 −13
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 * Copyright (C) 2019 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.
@@ -19,9 +19,9 @@ package android.net;
import static android.net.SocketKeepalive.ERROR_INVALID_IP_ADDRESS;
import static android.net.SocketKeepalive.ERROR_INVALID_PORT;

import android.annotation.NonNull;
import android.net.SocketKeepalive.InvalidPacketException;
import android.net.util.IpUtils;
import android.os.Parcel;
import android.os.Parcelable;
import android.system.OsConstants;

@@ -79,17 +79,40 @@ public final class NattKeepalivePacketData extends KeepalivePacketData implement
        return new NattKeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, buf.array());
    }

     /**
     * Convert this NattKeepalivePacketData to a NattKeepalivePacketDataParcelable.
     */
    @NonNull
    public NattKeepalivePacketDataParcelable toStableParcelable() {
        final NattKeepalivePacketDataParcelable parcel = new NattKeepalivePacketDataParcelable();
    /** Parcelable Implementation */
    public int describeContents() {
        return 0;
    }

    /** Write to parcel */
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(srcAddress.getHostAddress());
        out.writeString(dstAddress.getHostAddress());
        out.writeInt(srcPort);
        out.writeInt(dstPort);
    }

    /** Parcelable Creator */
    public static final Parcelable.Creator<NattKeepalivePacketData> CREATOR =
            new Parcelable.Creator<NattKeepalivePacketData>() {
                public NattKeepalivePacketData createFromParcel(Parcel in) {
                    final InetAddress srcAddress =
                            InetAddresses.parseNumericAddress(in.readString());
                    final InetAddress dstAddress =
                            InetAddresses.parseNumericAddress(in.readString());
                    final int srcPort = in.readInt();
                    final int dstPort = in.readInt();
                    try {
                        return NattKeepalivePacketData.nattKeepalivePacket(srcAddress, srcPort,
                                    dstAddress, dstPort);
                    } catch (InvalidPacketException e) {
                        throw new IllegalArgumentException(
                                "Invalid NAT-T keepalive data: " + e.error);
                    }
                }

        parcel.srcAddress = srcAddress.getAddress();
        parcel.srcPort = srcPort;
        parcel.dstAddress = dstAddress.getAddress();
        parcel.dstPort = dstPort;
        return parcel;
                public NattKeepalivePacketData[] newArray(int size) {
                    return new NattKeepalivePacketData[size];
                }
            };
}
+0 −2
Original line number Diff line number Diff line
@@ -511,7 +511,6 @@ public abstract class NetworkAgent extends Handler {
     * override this method.
     */
    protected void addKeepalivePacketFilter(Message msg) {
        onSocketKeepaliveEvent(msg.arg1, SocketKeepalive.ERROR_UNSUPPORTED);
    }

    /**
@@ -520,7 +519,6 @@ public abstract class NetworkAgent extends Handler {
     * must override this method.
     */
    protected void removeKeepalivePacketFilter(Message msg) {
        onSocketKeepaliveEvent(msg.arg1, SocketKeepalive.ERROR_UNSUPPORTED);
    }

    /**
+1 −0
Original line number Diff line number Diff line
@@ -216,6 +216,7 @@ public class KeepaliveTracker {

        public String toString() {
            return "KeepaliveInfo ["
                    + " type=" + mType
                    + " network=" + mNai.network
                    + " startedState=" + startedStateString(mStartedState)
                    + " "
+3 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.net.NattKeepalivePacketData;
import android.net.ProxyInfo;
import android.net.TcpKeepalivePacketData;
import android.net.shared.ProvisioningConfiguration;
import android.net.util.KeepalivePacketDataUtil;
import android.os.Binder;
import android.os.RemoteException;
import android.util.Log;
@@ -229,7 +230,8 @@ public class IpClientManager {
    public boolean addKeepalivePacketFilter(int slot, NattKeepalivePacketData pkt) {
        final long token = Binder.clearCallingIdentity();
        try {
            mIpClient.addNattKeepalivePacketFilter(slot, pkt.toStableParcelable());
            mIpClient.addNattKeepalivePacketFilter(
                    slot, KeepalivePacketDataUtil.toStableParcelable(pkt));
            return true;
        } catch (RemoteException e) {
            log("Error adding Keepalive Packet Filter ", e);
+39 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.util;

import android.annotation.NonNull;
import android.net.NattKeepalivePacketData;
import android.net.NattKeepalivePacketDataParcelable;

/** @hide */
public final class KeepalivePacketDataUtil {
     /**
     * Convert this NattKeepalivePacketData to a NattKeepalivePacketDataParcelable.
     */
    @NonNull
    public static NattKeepalivePacketDataParcelable toStableParcelable(
            NattKeepalivePacketData pkt) {
        final NattKeepalivePacketDataParcelable parcel = new NattKeepalivePacketDataParcelable();

        parcel.srcAddress = pkt.srcAddress.getAddress();
        parcel.srcPort = pkt.srcPort;
        parcel.dstAddress = pkt.dstAddress.getAddress();
        parcel.dstPort = pkt.dstPort;
        return parcel;
    }
}