231 lines
6.9 KiB
Java
231 lines
6.9 KiB
Java
/*
|
|
* Copyright (C) 2020 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;
|
|
|
|
import android.annotation.NonNull;
|
|
import android.annotation.Nullable;
|
|
import android.annotation.SystemApi;
|
|
import android.os.Parcel;
|
|
import android.os.Parcelable;
|
|
|
|
import java.net.InetAddress;
|
|
import java.util.Objects;
|
|
|
|
/**
|
|
* Represents the actual tcp keep alive packets which will be used for hardware offload.
|
|
* @hide
|
|
*/
|
|
@SystemApi
|
|
public final class TcpKeepalivePacketData extends KeepalivePacketData implements Parcelable {
|
|
private static final String TAG = "TcpKeepalivePacketData";
|
|
|
|
/**
|
|
* TCP sequence number.
|
|
* @hide
|
|
*/
|
|
public final int tcpSeq;
|
|
|
|
/**
|
|
* TCP ACK number.
|
|
* @hide
|
|
*/
|
|
public final int tcpAck;
|
|
|
|
/**
|
|
* TCP RCV window.
|
|
* @hide
|
|
*/
|
|
public final int tcpWindow;
|
|
|
|
/** TCP RCV window scale.
|
|
* @hide
|
|
*/
|
|
public final int tcpWindowScale;
|
|
|
|
/**
|
|
* IP TOS.
|
|
* @hide
|
|
*/
|
|
public final int ipTos;
|
|
|
|
/**
|
|
* IP TTL.
|
|
* @hide
|
|
*/
|
|
public final int ipTtl;
|
|
|
|
public TcpKeepalivePacketData(@NonNull final InetAddress srcAddress, int srcPort,
|
|
@NonNull final InetAddress dstAddress, int dstPort, @NonNull final byte[] data,
|
|
int tcpSeq, int tcpAck, int tcpWindow, int tcpWindowScale, int ipTos, int ipTtl)
|
|
throws InvalidPacketException {
|
|
super(srcAddress, srcPort, dstAddress, dstPort, data);
|
|
this.tcpSeq = tcpSeq;
|
|
this.tcpAck = tcpAck;
|
|
this.tcpWindow = tcpWindow;
|
|
this.tcpWindowScale = tcpWindowScale;
|
|
this.ipTos = ipTos;
|
|
this.ipTtl = ipTtl;
|
|
}
|
|
|
|
/**
|
|
* Get the TCP sequence number.
|
|
*
|
|
* See https://tools.ietf.org/html/rfc793#page-15.
|
|
*/
|
|
public int getTcpSeq() {
|
|
return tcpSeq;
|
|
}
|
|
|
|
/**
|
|
* Get the TCP ACK number.
|
|
*
|
|
* See https://tools.ietf.org/html/rfc793#page-15.
|
|
*/
|
|
public int getTcpAck() {
|
|
return tcpAck;
|
|
}
|
|
|
|
/**
|
|
* Get the TCP RCV window.
|
|
*
|
|
* See https://tools.ietf.org/html/rfc793#page-15.
|
|
*/
|
|
public int getTcpWindow() {
|
|
return tcpWindow;
|
|
}
|
|
|
|
/**
|
|
* Get the TCP RCV window scale.
|
|
*
|
|
* See https://tools.ietf.org/html/rfc793#page-15.
|
|
*/
|
|
public int getTcpWindowScale() {
|
|
return tcpWindowScale;
|
|
}
|
|
|
|
/**
|
|
* Get the IP type of service.
|
|
*/
|
|
public int getIpTos() {
|
|
return ipTos;
|
|
}
|
|
|
|
/**
|
|
* Get the IP TTL.
|
|
*/
|
|
public int getIpTtl() {
|
|
return ipTtl;
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(@Nullable final Object o) {
|
|
if (!(o instanceof TcpKeepalivePacketData)) return false;
|
|
final TcpKeepalivePacketData other = (TcpKeepalivePacketData) o;
|
|
final InetAddress srcAddress = getSrcAddress();
|
|
final InetAddress dstAddress = getDstAddress();
|
|
return srcAddress.equals(other.getSrcAddress())
|
|
&& dstAddress.equals(other.getDstAddress())
|
|
&& getSrcPort() == other.getSrcPort()
|
|
&& getDstPort() == other.getDstPort()
|
|
&& this.tcpAck == other.tcpAck
|
|
&& this.tcpSeq == other.tcpSeq
|
|
&& this.tcpWindow == other.tcpWindow
|
|
&& this.tcpWindowScale == other.tcpWindowScale
|
|
&& this.ipTos == other.ipTos
|
|
&& this.ipTtl == other.ipTtl;
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return Objects.hash(getSrcAddress(), getDstAddress(), getSrcPort(), getDstPort(),
|
|
tcpAck, tcpSeq, tcpWindow, tcpWindowScale, ipTos, ipTtl);
|
|
}
|
|
|
|
/**
|
|
* Parcelable Implementation.
|
|
* Note that this object implements parcelable (and needs to keep doing this as it inherits
|
|
* from a class that does), but should usually be parceled as a stable parcelable using
|
|
* the toStableParcelable() and fromStableParcelable() methods.
|
|
*/
|
|
@Override
|
|
public int describeContents() {
|
|
return 0;
|
|
}
|
|
|
|
/** Write to parcel. */
|
|
@Override
|
|
public void writeToParcel(@NonNull Parcel out, int flags) {
|
|
out.writeString(getSrcAddress().getHostAddress());
|
|
out.writeString(getDstAddress().getHostAddress());
|
|
out.writeInt(getSrcPort());
|
|
out.writeInt(getDstPort());
|
|
out.writeByteArray(getPacket());
|
|
out.writeInt(tcpSeq);
|
|
out.writeInt(tcpAck);
|
|
out.writeInt(tcpWindow);
|
|
out.writeInt(tcpWindowScale);
|
|
out.writeInt(ipTos);
|
|
out.writeInt(ipTtl);
|
|
}
|
|
|
|
private static TcpKeepalivePacketData readFromParcel(Parcel in) throws InvalidPacketException {
|
|
InetAddress srcAddress = InetAddresses.parseNumericAddress(in.readString());
|
|
InetAddress dstAddress = InetAddresses.parseNumericAddress(in.readString());
|
|
int srcPort = in.readInt();
|
|
int dstPort = in.readInt();
|
|
byte[] packet = in.createByteArray();
|
|
int tcpSeq = in.readInt();
|
|
int tcpAck = in.readInt();
|
|
int tcpWnd = in.readInt();
|
|
int tcpWndScale = in.readInt();
|
|
int ipTos = in.readInt();
|
|
int ipTtl = in.readInt();
|
|
return new TcpKeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, packet, tcpSeq,
|
|
tcpAck, tcpWnd, tcpWndScale, ipTos, ipTtl);
|
|
}
|
|
|
|
/** Parcelable Creator. */
|
|
public static final @NonNull Parcelable.Creator<TcpKeepalivePacketData> CREATOR =
|
|
new Parcelable.Creator<TcpKeepalivePacketData>() {
|
|
public TcpKeepalivePacketData createFromParcel(Parcel in) {
|
|
try {
|
|
return readFromParcel(in);
|
|
} catch (InvalidPacketException e) {
|
|
throw new IllegalArgumentException(
|
|
"Invalid TCP keepalive data: " + e.getError());
|
|
}
|
|
}
|
|
|
|
public TcpKeepalivePacketData[] newArray(int size) {
|
|
return new TcpKeepalivePacketData[size];
|
|
}
|
|
};
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "saddr: " + getSrcAddress()
|
|
+ " daddr: " + getDstAddress()
|
|
+ " sport: " + getSrcPort()
|
|
+ " dport: " + getDstPort()
|
|
+ " seq: " + tcpSeq
|
|
+ " ack: " + tcpAck
|
|
+ " window: " + tcpWindow
|
|
+ " windowScale: " + tcpWindowScale
|
|
+ " tos: " + ipTos
|
|
+ " ttl: " + ipTtl;
|
|
}
|
|
}
|