Loading core/java/android/net/KeepalivePacketData.aidl 0 → 100644 +19 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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 KeepalivePacketData; services/core/java/com/android/server/connectivity/KeepalivePacketData.java→core/java/android/net/KeepalivePacketData.java +69 −32 Original line number Diff line number Diff line Loading @@ -14,15 +14,15 @@ * limitations under the License. */ package com.android.server.connectivity; import static android.net.util.NetworkConstants.IPV4_HEADER_MIN_LEN; import static android.net.util.NetworkConstants.UDP_HEADER_LEN; package android.net; import android.system.OsConstants; import android.net.ConnectivityManager; import android.net.NetworkUtils; import android.net.util.IpUtils; import android.os.Parcel; import android.os.Parcelable; import android.system.OsConstants; import android.util.Log; import java.net.Inet4Address; import java.net.Inet6Address; Loading @@ -38,9 +38,8 @@ import static android.net.ConnectivityManager.PacketKeepalive.*; * * @hide */ public class KeepalivePacketData { /** Protocol of the packet to send; one of the OsConstants.ETH_P_* values. */ public final int protocol; public class KeepalivePacketData implements Parcelable { private static final String TAG = "KeepalivePacketData"; /** Source IP address */ public final InetAddress srcAddress; Loading @@ -54,54 +53,57 @@ public class KeepalivePacketData { /** Destination port */ public final int dstPort; /** Destination MAC address. Can change if routing changes. */ public byte[] dstMac; /** Packet data. A raw byte string of packet data, not including the link-layer header. */ public final byte[] data; private final byte[] mPacket; private static final int IPV4_HEADER_LENGTH = 20; private static final int UDP_HEADER_LENGTH = 8; // This should only be constructed via static factory methods, such as // nattKeepalivePacket protected KeepalivePacketData(InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort, byte[] data) throws InvalidPacketException { this.srcAddress = srcAddress; this.dstAddress = dstAddress; this.srcPort = srcPort; this.dstPort = dstPort; this.data = data; this.mPacket = data; // Check we have two IP addresses of the same family. if (srcAddress == null || dstAddress == null || !srcAddress.getClass().getName().equals(dstAddress.getClass().getName())) { throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); } // Set the protocol. if (this.dstAddress instanceof Inet4Address) { this.protocol = OsConstants.ETH_P_IP; } else if (this.dstAddress instanceof Inet6Address) { this.protocol = OsConstants.ETH_P_IPV6; } else { if (srcAddress == null || dstAddress == null || !srcAddress.getClass().getName() .equals(dstAddress.getClass().getName())) { Log.e(TAG, "Invalid or mismatched InetAddresses in KeepalivePacketData"); throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); } // Check the ports. if (!IpUtils.isValidUdpOrTcpPort(srcPort) || !IpUtils.isValidUdpOrTcpPort(dstPort)) { Log.e(TAG, "Invalid ports in KeepalivePacketData"); throw new InvalidPacketException(ERROR_INVALID_PORT); } } public static class InvalidPacketException extends Exception { final public int error; public final int error; public InvalidPacketException(int error) { this.error = error; } } /** * Creates an IPsec NAT-T keepalive packet with the specified parameters. */ public byte[] getPacket() { return mPacket.clone(); } public static KeepalivePacketData nattKeepalivePacket( InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort) throws InvalidPacketException { InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort) throws InvalidPacketException { // FIXME: remove this and actually support IPv6 keepalives if (srcAddress instanceof Inet6Address && dstAddress instanceof Inet6Address) { // Optimistically returning an IPv6 Keepalive Packet with no data, // which currently only works on cellular return new KeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, new byte[0]); } if (!(srcAddress instanceof Inet4Address) || !(dstAddress instanceof Inet4Address)) { throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); Loading @@ -111,7 +113,7 @@ public class KeepalivePacketData { throw new InvalidPacketException(ERROR_INVALID_PORT); } int length = IPV4_HEADER_MIN_LEN + UDP_HEADER_LEN + 1; int length = IPV4_HEADER_LENGTH + UDP_HEADER_LENGTH + 1; ByteBuffer buf = ByteBuffer.allocate(length); buf.order(ByteOrder.BIG_ENDIAN); buf.putShort((short) 0x4500); // IP version and TOS Loading @@ -130,8 +132,43 @@ public class KeepalivePacketData { buf.putShort((short) 0); // UDP checksum buf.put((byte) 0xff); // NAT-T keepalive buf.putShort(ipChecksumOffset, IpUtils.ipChecksum(buf, 0)); buf.putShort(udpChecksumOffset, IpUtils.udpChecksum(buf, 0, IPV4_HEADER_MIN_LEN)); buf.putShort(udpChecksumOffset, IpUtils.udpChecksum(buf, 0, IPV4_HEADER_LENGTH)); return new KeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, buf.array()); } /* 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); out.writeByteArray(mPacket); } private KeepalivePacketData(Parcel in) { srcAddress = NetworkUtils.numericToInetAddress(in.readString()); dstAddress = NetworkUtils.numericToInetAddress(in.readString()); srcPort = in.readInt(); dstPort = in.readInt(); mPacket = in.createByteArray(); } /** Parcelable Creator */ public static final Parcelable.Creator<KeepalivePacketData> CREATOR = new Parcelable.Creator<KeepalivePacketData>() { public KeepalivePacketData createFromParcel(Parcel in) { return new KeepalivePacketData(in); } public KeepalivePacketData[] newArray(int size) { return new KeepalivePacketData[size]; } }; } services/net/java/android/net/util/IpUtils.java→core/java/android/net/util/IpUtils.java +0 −0 File moved. View file services/core/java/com/android/server/connectivity/KeepaliveTracker.java +3 −3 Original line number Diff line number Diff line Loading @@ -18,10 +18,10 @@ package com.android.server.connectivity; import com.android.internal.util.HexDump; import com.android.internal.util.IndentingPrintWriter; import com.android.server.connectivity.KeepalivePacketData; import com.android.server.connectivity.NetworkAgentInfo; import android.net.ConnectivityManager; import android.net.ConnectivityManager.PacketKeepalive; import android.net.KeepalivePacketData; import android.net.LinkAddress; import android.net.NetworkAgent; import android.net.NetworkUtils; Loading Loading @@ -129,7 +129,7 @@ public class KeepaliveTracker { .append("->") .append(IpUtils.addressAndPortToString(mPacket.dstAddress, mPacket.dstPort)) .append(" interval=" + mInterval) .append(" data=" + HexDump.toHexString(mPacket.data)) .append(" packetData=" + HexDump.toHexString(mPacket.getPacket())) .append(" uid=").append(mUid).append(" pid=").append(mPid) .append(" ]") .toString(); Loading Loading @@ -172,7 +172,7 @@ public class KeepaliveTracker { } private int checkInterval() { return mInterval >= 20 ? SUCCESS : ERROR_INVALID_INTERVAL; return mInterval >= 10 ? SUCCESS : ERROR_INVALID_INTERVAL; } private int isValid() { Loading telephony/java/com/android/internal/telephony/RILConstants.java +5 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,8 @@ public interface RILConstants { int DEVICE_IN_USE = 64; /* Operation cannot be performed because the device is currently in use */ int ABORTED = 65; /* Operation aborted */ int INVALID_RESPONSE = 66; /* Invalid response sent by vendor code */ // Below is list of OEM specific error codes which can by used by OEMs in case they don't want to // reveal particular replacement for Generic failure int OEM_ERROR_1 = 501; Loading Loading @@ -419,6 +421,8 @@ cat include/telephony/ril.h | \ int RIL_REQUEST_STOP_NETWORK_SCAN = 143; int RIL_REQUEST_GET_SLOT_STATUS = 144; int RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING = 145; int RIL_REQUEST_START_KEEPALIVE = 146; int RIL_REQUEST_STOP_KEEPALIVE = 147; int RIL_RESPONSE_ACKNOWLEDGEMENT = 800; Loading Loading @@ -474,4 +478,5 @@ cat include/telephony/ril.h | \ int RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION = 1048; int RIL_UNSOL_NETWORK_SCAN_RESULT = 1049; int RIL_UNSOL_ICC_SLOT_STATUS = 1050; int RIL_UNSOL_KEEPALIVE_STATUS = 1051; } Loading
core/java/android/net/KeepalivePacketData.aidl 0 → 100644 +19 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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 KeepalivePacketData;
services/core/java/com/android/server/connectivity/KeepalivePacketData.java→core/java/android/net/KeepalivePacketData.java +69 −32 Original line number Diff line number Diff line Loading @@ -14,15 +14,15 @@ * limitations under the License. */ package com.android.server.connectivity; import static android.net.util.NetworkConstants.IPV4_HEADER_MIN_LEN; import static android.net.util.NetworkConstants.UDP_HEADER_LEN; package android.net; import android.system.OsConstants; import android.net.ConnectivityManager; import android.net.NetworkUtils; import android.net.util.IpUtils; import android.os.Parcel; import android.os.Parcelable; import android.system.OsConstants; import android.util.Log; import java.net.Inet4Address; import java.net.Inet6Address; Loading @@ -38,9 +38,8 @@ import static android.net.ConnectivityManager.PacketKeepalive.*; * * @hide */ public class KeepalivePacketData { /** Protocol of the packet to send; one of the OsConstants.ETH_P_* values. */ public final int protocol; public class KeepalivePacketData implements Parcelable { private static final String TAG = "KeepalivePacketData"; /** Source IP address */ public final InetAddress srcAddress; Loading @@ -54,54 +53,57 @@ public class KeepalivePacketData { /** Destination port */ public final int dstPort; /** Destination MAC address. Can change if routing changes. */ public byte[] dstMac; /** Packet data. A raw byte string of packet data, not including the link-layer header. */ public final byte[] data; private final byte[] mPacket; private static final int IPV4_HEADER_LENGTH = 20; private static final int UDP_HEADER_LENGTH = 8; // This should only be constructed via static factory methods, such as // nattKeepalivePacket protected KeepalivePacketData(InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort, byte[] data) throws InvalidPacketException { this.srcAddress = srcAddress; this.dstAddress = dstAddress; this.srcPort = srcPort; this.dstPort = dstPort; this.data = data; this.mPacket = data; // Check we have two IP addresses of the same family. if (srcAddress == null || dstAddress == null || !srcAddress.getClass().getName().equals(dstAddress.getClass().getName())) { throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); } // Set the protocol. if (this.dstAddress instanceof Inet4Address) { this.protocol = OsConstants.ETH_P_IP; } else if (this.dstAddress instanceof Inet6Address) { this.protocol = OsConstants.ETH_P_IPV6; } else { if (srcAddress == null || dstAddress == null || !srcAddress.getClass().getName() .equals(dstAddress.getClass().getName())) { Log.e(TAG, "Invalid or mismatched InetAddresses in KeepalivePacketData"); throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); } // Check the ports. if (!IpUtils.isValidUdpOrTcpPort(srcPort) || !IpUtils.isValidUdpOrTcpPort(dstPort)) { Log.e(TAG, "Invalid ports in KeepalivePacketData"); throw new InvalidPacketException(ERROR_INVALID_PORT); } } public static class InvalidPacketException extends Exception { final public int error; public final int error; public InvalidPacketException(int error) { this.error = error; } } /** * Creates an IPsec NAT-T keepalive packet with the specified parameters. */ public byte[] getPacket() { return mPacket.clone(); } public static KeepalivePacketData nattKeepalivePacket( InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort) throws InvalidPacketException { InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort) throws InvalidPacketException { // FIXME: remove this and actually support IPv6 keepalives if (srcAddress instanceof Inet6Address && dstAddress instanceof Inet6Address) { // Optimistically returning an IPv6 Keepalive Packet with no data, // which currently only works on cellular return new KeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, new byte[0]); } if (!(srcAddress instanceof Inet4Address) || !(dstAddress instanceof Inet4Address)) { throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); Loading @@ -111,7 +113,7 @@ public class KeepalivePacketData { throw new InvalidPacketException(ERROR_INVALID_PORT); } int length = IPV4_HEADER_MIN_LEN + UDP_HEADER_LEN + 1; int length = IPV4_HEADER_LENGTH + UDP_HEADER_LENGTH + 1; ByteBuffer buf = ByteBuffer.allocate(length); buf.order(ByteOrder.BIG_ENDIAN); buf.putShort((short) 0x4500); // IP version and TOS Loading @@ -130,8 +132,43 @@ public class KeepalivePacketData { buf.putShort((short) 0); // UDP checksum buf.put((byte) 0xff); // NAT-T keepalive buf.putShort(ipChecksumOffset, IpUtils.ipChecksum(buf, 0)); buf.putShort(udpChecksumOffset, IpUtils.udpChecksum(buf, 0, IPV4_HEADER_MIN_LEN)); buf.putShort(udpChecksumOffset, IpUtils.udpChecksum(buf, 0, IPV4_HEADER_LENGTH)); return new KeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, buf.array()); } /* 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); out.writeByteArray(mPacket); } private KeepalivePacketData(Parcel in) { srcAddress = NetworkUtils.numericToInetAddress(in.readString()); dstAddress = NetworkUtils.numericToInetAddress(in.readString()); srcPort = in.readInt(); dstPort = in.readInt(); mPacket = in.createByteArray(); } /** Parcelable Creator */ public static final Parcelable.Creator<KeepalivePacketData> CREATOR = new Parcelable.Creator<KeepalivePacketData>() { public KeepalivePacketData createFromParcel(Parcel in) { return new KeepalivePacketData(in); } public KeepalivePacketData[] newArray(int size) { return new KeepalivePacketData[size]; } }; }
services/net/java/android/net/util/IpUtils.java→core/java/android/net/util/IpUtils.java +0 −0 File moved. View file
services/core/java/com/android/server/connectivity/KeepaliveTracker.java +3 −3 Original line number Diff line number Diff line Loading @@ -18,10 +18,10 @@ package com.android.server.connectivity; import com.android.internal.util.HexDump; import com.android.internal.util.IndentingPrintWriter; import com.android.server.connectivity.KeepalivePacketData; import com.android.server.connectivity.NetworkAgentInfo; import android.net.ConnectivityManager; import android.net.ConnectivityManager.PacketKeepalive; import android.net.KeepalivePacketData; import android.net.LinkAddress; import android.net.NetworkAgent; import android.net.NetworkUtils; Loading Loading @@ -129,7 +129,7 @@ public class KeepaliveTracker { .append("->") .append(IpUtils.addressAndPortToString(mPacket.dstAddress, mPacket.dstPort)) .append(" interval=" + mInterval) .append(" data=" + HexDump.toHexString(mPacket.data)) .append(" packetData=" + HexDump.toHexString(mPacket.getPacket())) .append(" uid=").append(mUid).append(" pid=").append(mPid) .append(" ]") .toString(); Loading Loading @@ -172,7 +172,7 @@ public class KeepaliveTracker { } private int checkInterval() { return mInterval >= 20 ? SUCCESS : ERROR_INVALID_INTERVAL; return mInterval >= 10 ? SUCCESS : ERROR_INVALID_INTERVAL; } private int isValid() { Loading
telephony/java/com/android/internal/telephony/RILConstants.java +5 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,8 @@ public interface RILConstants { int DEVICE_IN_USE = 64; /* Operation cannot be performed because the device is currently in use */ int ABORTED = 65; /* Operation aborted */ int INVALID_RESPONSE = 66; /* Invalid response sent by vendor code */ // Below is list of OEM specific error codes which can by used by OEMs in case they don't want to // reveal particular replacement for Generic failure int OEM_ERROR_1 = 501; Loading Loading @@ -419,6 +421,8 @@ cat include/telephony/ril.h | \ int RIL_REQUEST_STOP_NETWORK_SCAN = 143; int RIL_REQUEST_GET_SLOT_STATUS = 144; int RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING = 145; int RIL_REQUEST_START_KEEPALIVE = 146; int RIL_REQUEST_STOP_KEEPALIVE = 147; int RIL_RESPONSE_ACKNOWLEDGEMENT = 800; Loading Loading @@ -474,4 +478,5 @@ cat include/telephony/ril.h | \ int RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION = 1048; int RIL_UNSOL_NETWORK_SCAN_RESULT = 1049; int RIL_UNSOL_ICC_SLOT_STATUS = 1050; int RIL_UNSOL_KEEPALIVE_STATUS = 1051; }