Merge "Move struct {Clat*, Tether4*, TetherStats*} to connectivity module"
This commit is contained in:
@@ -37,6 +37,7 @@ java_defaults {
|
|||||||
],
|
],
|
||||||
static_libs: [
|
static_libs: [
|
||||||
"androidx.annotation_annotation",
|
"androidx.annotation_annotation",
|
||||||
|
"connectivity-net-module-utils-bpf",
|
||||||
"modules-utils-build",
|
"modules-utils-build",
|
||||||
"modules-utils-statemachine",
|
"modules-utils-statemachine",
|
||||||
"networkstack-client",
|
"networkstack-client",
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ java_defaults {
|
|||||||
"net-tests-utils",
|
"net-tests-utils",
|
||||||
"net-utils-device-common-bpf",
|
"net-utils-device-common-bpf",
|
||||||
"testables",
|
"testables",
|
||||||
|
"connectivity-net-module-utils-bpf",
|
||||||
],
|
],
|
||||||
libs: [
|
libs: [
|
||||||
"android.test.runner",
|
"android.test.runner",
|
||||||
|
|||||||
45
common/Android.bp
Normal file
45
common/Android.bp
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
//
|
||||||
|
// Copyright (C) 2022 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 {
|
||||||
|
// See: http://go/android-license-faq
|
||||||
|
default_applicable_licenses: ["Android-Apache-2.0"],
|
||||||
|
}
|
||||||
|
|
||||||
|
java_library {
|
||||||
|
name: "connectivity-net-module-utils-bpf",
|
||||||
|
srcs: [
|
||||||
|
"src/com/android/net/module/util/bpf/*.java",
|
||||||
|
],
|
||||||
|
sdk_version: "module_current",
|
||||||
|
min_sdk_version: "29",
|
||||||
|
visibility: [
|
||||||
|
// Do not add any lib. This library is only shared inside connectivity module
|
||||||
|
// and its tests.
|
||||||
|
"//packages/modules/Connectivity:__subpackages__",
|
||||||
|
],
|
||||||
|
libs: [
|
||||||
|
"androidx.annotation_annotation",
|
||||||
|
"framework-connectivity.stubs.module_lib",
|
||||||
|
],
|
||||||
|
static_libs: [
|
||||||
|
"net-utils-device-common-struct",
|
||||||
|
],
|
||||||
|
apex_available: [
|
||||||
|
"com.android.tethering",
|
||||||
|
],
|
||||||
|
lint: { strict_updatability_linting: true },
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 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 com.android.net.module.util.bpf;
|
||||||
|
|
||||||
|
import com.android.net.module.util.Struct;
|
||||||
|
import com.android.net.module.util.Struct.Field;
|
||||||
|
import com.android.net.module.util.Struct.Type;
|
||||||
|
|
||||||
|
import java.net.Inet4Address;
|
||||||
|
|
||||||
|
/** Key type for clat egress IPv4 maps. */
|
||||||
|
public class ClatEgress4Key extends Struct {
|
||||||
|
@Field(order = 0, type = Type.U32)
|
||||||
|
public final long iif; // The input interface index
|
||||||
|
|
||||||
|
@Field(order = 1, type = Type.Ipv4Address)
|
||||||
|
public final Inet4Address local4; // The source IPv4 address
|
||||||
|
|
||||||
|
public ClatEgress4Key(final long iif, final Inet4Address local4) {
|
||||||
|
this.iif = iif;
|
||||||
|
this.local4 = local4;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 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 com.android.net.module.util.bpf;
|
||||||
|
|
||||||
|
import com.android.net.module.util.Struct;
|
||||||
|
import com.android.net.module.util.Struct.Field;
|
||||||
|
import com.android.net.module.util.Struct.Type;
|
||||||
|
|
||||||
|
import java.net.Inet6Address;
|
||||||
|
|
||||||
|
/** Value type for clat egress IPv4 maps. */
|
||||||
|
public class ClatEgress4Value extends Struct {
|
||||||
|
@Field(order = 0, type = Type.U32)
|
||||||
|
public final long oif; // The output interface to redirect to
|
||||||
|
|
||||||
|
@Field(order = 1, type = Type.Ipv6Address)
|
||||||
|
public final Inet6Address local6; // The full 128-bits of the source IPv6 address
|
||||||
|
|
||||||
|
@Field(order = 2, type = Type.Ipv6Address)
|
||||||
|
public final Inet6Address pfx96; // The destination /96 nat64 prefix, bottom 32 bits must be 0
|
||||||
|
|
||||||
|
@Field(order = 3, type = Type.U8, padding = 3)
|
||||||
|
public final short oifIsEthernet; // Whether the output interface requires ethernet header
|
||||||
|
|
||||||
|
public ClatEgress4Value(final long oif, final Inet6Address local6, final Inet6Address pfx96,
|
||||||
|
final short oifIsEthernet) {
|
||||||
|
this.oif = oif;
|
||||||
|
this.local6 = local6;
|
||||||
|
this.pfx96 = pfx96;
|
||||||
|
this.oifIsEthernet = oifIsEthernet;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 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 com.android.net.module.util.bpf;
|
||||||
|
|
||||||
|
import com.android.net.module.util.Struct;
|
||||||
|
import com.android.net.module.util.Struct.Field;
|
||||||
|
import com.android.net.module.util.Struct.Type;
|
||||||
|
|
||||||
|
import java.net.Inet6Address;
|
||||||
|
|
||||||
|
/** Key type for clat ingress IPv6 maps. */
|
||||||
|
public class ClatIngress6Key extends Struct {
|
||||||
|
@Field(order = 0, type = Type.U32)
|
||||||
|
public final long iif; // The input interface index
|
||||||
|
|
||||||
|
@Field(order = 1, type = Type.Ipv6Address)
|
||||||
|
public final Inet6Address pfx96; // The source /96 nat64 prefix, bottom 32 bits must be 0
|
||||||
|
|
||||||
|
@Field(order = 2, type = Type.Ipv6Address)
|
||||||
|
public final Inet6Address local6; // The full 128-bits of the destination IPv6 address
|
||||||
|
|
||||||
|
public ClatIngress6Key(final long iif, final Inet6Address pfx96, final Inet6Address local6) {
|
||||||
|
this.iif = iif;
|
||||||
|
this.pfx96 = pfx96;
|
||||||
|
this.local6 = local6;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 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 com.android.net.module.util.bpf;
|
||||||
|
|
||||||
|
import com.android.net.module.util.Struct;
|
||||||
|
import com.android.net.module.util.Struct.Field;
|
||||||
|
import com.android.net.module.util.Struct.Type;
|
||||||
|
|
||||||
|
import java.net.Inet4Address;
|
||||||
|
|
||||||
|
/** Value type for clat ingress IPv6 maps. */
|
||||||
|
public class ClatIngress6Value extends Struct {
|
||||||
|
@Field(order = 0, type = Type.U32)
|
||||||
|
public final long oif; // The output interface to redirect to (0 means don't redirect)
|
||||||
|
|
||||||
|
@Field(order = 1, type = Type.Ipv4Address)
|
||||||
|
public final Inet4Address local4; // The destination IPv4 address
|
||||||
|
|
||||||
|
public ClatIngress6Value(final long oif, final Inet4Address local4) {
|
||||||
|
this.oif = oif;
|
||||||
|
this.local4 = local4;
|
||||||
|
}
|
||||||
|
}
|
||||||
81
common/src/com/android/net/module/util/bpf/Tether4Key.java
Normal file
81
common/src/com/android/net/module/util/bpf/Tether4Key.java
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* 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 com.android.net.module.util.bpf;
|
||||||
|
|
||||||
|
import android.net.MacAddress;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import com.android.net.module.util.Struct;
|
||||||
|
import com.android.net.module.util.Struct.Field;
|
||||||
|
import com.android.net.module.util.Struct.Type;
|
||||||
|
|
||||||
|
import java.net.Inet4Address;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/** Key type for downstream & upstream IPv4 forwarding maps. */
|
||||||
|
public class Tether4Key extends Struct {
|
||||||
|
@Field(order = 0, type = Type.U32)
|
||||||
|
public final long iif;
|
||||||
|
|
||||||
|
@Field(order = 1, type = Type.EUI48)
|
||||||
|
public final MacAddress dstMac;
|
||||||
|
|
||||||
|
@Field(order = 2, type = Type.U8, padding = 1)
|
||||||
|
public final short l4proto;
|
||||||
|
|
||||||
|
@Field(order = 3, type = Type.ByteArray, arraysize = 4)
|
||||||
|
public final byte[] src4;
|
||||||
|
|
||||||
|
@Field(order = 4, type = Type.ByteArray, arraysize = 4)
|
||||||
|
public final byte[] dst4;
|
||||||
|
|
||||||
|
@Field(order = 5, type = Type.UBE16)
|
||||||
|
public final int srcPort;
|
||||||
|
|
||||||
|
@Field(order = 6, type = Type.UBE16)
|
||||||
|
public final int dstPort;
|
||||||
|
|
||||||
|
public Tether4Key(final long iif, @NonNull final MacAddress dstMac, final short l4proto,
|
||||||
|
final byte[] src4, final byte[] dst4, final int srcPort,
|
||||||
|
final int dstPort) {
|
||||||
|
Objects.requireNonNull(dstMac);
|
||||||
|
|
||||||
|
this.iif = iif;
|
||||||
|
this.dstMac = dstMac;
|
||||||
|
this.l4proto = l4proto;
|
||||||
|
this.src4 = src4;
|
||||||
|
this.dst4 = dst4;
|
||||||
|
this.srcPort = srcPort;
|
||||||
|
this.dstPort = dstPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
try {
|
||||||
|
return String.format(
|
||||||
|
"iif: %d, dstMac: %s, l4proto: %d, src4: %s, dst4: %s, "
|
||||||
|
+ "srcPort: %d, dstPort: %d",
|
||||||
|
iif, dstMac, l4proto,
|
||||||
|
Inet4Address.getByAddress(src4), Inet4Address.getByAddress(dst4),
|
||||||
|
Short.toUnsignedInt((short) srcPort), Short.toUnsignedInt((short) dstPort));
|
||||||
|
} catch (UnknownHostException | IllegalArgumentException e) {
|
||||||
|
return String.format("Invalid IP address", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
97
common/src/com/android/net/module/util/bpf/Tether4Value.java
Normal file
97
common/src/com/android/net/module/util/bpf/Tether4Value.java
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* 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 com.android.net.module.util.bpf;
|
||||||
|
|
||||||
|
import android.net.MacAddress;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import com.android.net.module.util.Struct;
|
||||||
|
import com.android.net.module.util.Struct.Field;
|
||||||
|
import com.android.net.module.util.Struct.Type;
|
||||||
|
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/** Value type for downstream & upstream IPv4 forwarding maps. */
|
||||||
|
public class Tether4Value extends Struct {
|
||||||
|
@Field(order = 0, type = Type.U32)
|
||||||
|
public final long oif;
|
||||||
|
|
||||||
|
// The ethhdr struct which is defined in uapi/linux/if_ether.h
|
||||||
|
@Field(order = 1, type = Type.EUI48)
|
||||||
|
public final MacAddress ethDstMac;
|
||||||
|
@Field(order = 2, type = Type.EUI48)
|
||||||
|
public final MacAddress ethSrcMac;
|
||||||
|
@Field(order = 3, type = Type.UBE16)
|
||||||
|
public final int ethProto; // Packet type ID field.
|
||||||
|
|
||||||
|
@Field(order = 4, type = Type.U16)
|
||||||
|
public final int pmtu;
|
||||||
|
|
||||||
|
@Field(order = 5, type = Type.ByteArray, arraysize = 16)
|
||||||
|
public final byte[] src46;
|
||||||
|
|
||||||
|
@Field(order = 6, type = Type.ByteArray, arraysize = 16)
|
||||||
|
public final byte[] dst46;
|
||||||
|
|
||||||
|
@Field(order = 7, type = Type.UBE16)
|
||||||
|
public final int srcPort;
|
||||||
|
|
||||||
|
@Field(order = 8, type = Type.UBE16)
|
||||||
|
public final int dstPort;
|
||||||
|
|
||||||
|
// TODO: consider using U64.
|
||||||
|
@Field(order = 9, type = Type.U63)
|
||||||
|
public final long lastUsed;
|
||||||
|
|
||||||
|
public Tether4Value(final long oif, @NonNull final MacAddress ethDstMac,
|
||||||
|
@NonNull final MacAddress ethSrcMac, final int ethProto, final int pmtu,
|
||||||
|
final byte[] src46, final byte[] dst46, final int srcPort,
|
||||||
|
final int dstPort, final long lastUsed) {
|
||||||
|
Objects.requireNonNull(ethDstMac);
|
||||||
|
Objects.requireNonNull(ethSrcMac);
|
||||||
|
|
||||||
|
this.oif = oif;
|
||||||
|
this.ethDstMac = ethDstMac;
|
||||||
|
this.ethSrcMac = ethSrcMac;
|
||||||
|
this.ethProto = ethProto;
|
||||||
|
this.pmtu = pmtu;
|
||||||
|
this.src46 = src46;
|
||||||
|
this.dst46 = dst46;
|
||||||
|
this.srcPort = srcPort;
|
||||||
|
this.dstPort = dstPort;
|
||||||
|
this.lastUsed = lastUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
try {
|
||||||
|
return String.format(
|
||||||
|
"oif: %d, ethDstMac: %s, ethSrcMac: %s, ethProto: %d, pmtu: %d, "
|
||||||
|
+ "src46: %s, dst46: %s, srcPort: %d, dstPort: %d, "
|
||||||
|
+ "lastUsed: %d",
|
||||||
|
oif, ethDstMac, ethSrcMac, ethProto, pmtu,
|
||||||
|
InetAddress.getByAddress(src46), InetAddress.getByAddress(dst46),
|
||||||
|
Short.toUnsignedInt((short) srcPort), Short.toUnsignedInt((short) dstPort),
|
||||||
|
lastUsed);
|
||||||
|
} catch (UnknownHostException | IllegalArgumentException e) {
|
||||||
|
return String.format("Invalid IP address", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* 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 com.android.net.module.util.bpf;
|
||||||
|
|
||||||
|
import com.android.net.module.util.Struct;
|
||||||
|
import com.android.net.module.util.Struct.Field;
|
||||||
|
import com.android.net.module.util.Struct.Type;
|
||||||
|
|
||||||
|
/** The key of BpfMap which is used for tethering stats. */
|
||||||
|
public class TetherStatsKey extends Struct {
|
||||||
|
@Field(order = 0, type = Type.U32)
|
||||||
|
public final long ifindex; // upstream interface index
|
||||||
|
|
||||||
|
public TetherStatsKey(final long ifindex) {
|
||||||
|
this.ifindex = ifindex;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: remove equals, hashCode and toString once aosp/1536721 is merged.
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
|
||||||
|
if (!(obj instanceof TetherStatsKey)) return false;
|
||||||
|
|
||||||
|
final TetherStatsKey that = (TetherStatsKey) obj;
|
||||||
|
|
||||||
|
return ifindex == that.ifindex;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Long.hashCode(ifindex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("ifindex: %d", ifindex);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* 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 com.android.net.module.util.bpf;
|
||||||
|
|
||||||
|
import com.android.net.module.util.Struct;
|
||||||
|
import com.android.net.module.util.Struct.Field;
|
||||||
|
import com.android.net.module.util.Struct.Type;
|
||||||
|
|
||||||
|
/** The key of BpfMap which is used for tethering stats. */
|
||||||
|
public class TetherStatsValue extends Struct {
|
||||||
|
// Use the signed long variable to store the uint64 stats from stats BPF map.
|
||||||
|
// U63 is enough for each data element even at 5Gbps for ~468 years.
|
||||||
|
// 2^63 / (5 * 1000 * 1000 * 1000) * 8 / 86400 / 365 = 468.
|
||||||
|
@Field(order = 0, type = Type.U63)
|
||||||
|
public final long rxPackets;
|
||||||
|
@Field(order = 1, type = Type.U63)
|
||||||
|
public final long rxBytes;
|
||||||
|
@Field(order = 2, type = Type.U63)
|
||||||
|
public final long rxErrors;
|
||||||
|
@Field(order = 3, type = Type.U63)
|
||||||
|
public final long txPackets;
|
||||||
|
@Field(order = 4, type = Type.U63)
|
||||||
|
public final long txBytes;
|
||||||
|
@Field(order = 5, type = Type.U63)
|
||||||
|
public final long txErrors;
|
||||||
|
|
||||||
|
public TetherStatsValue(final long rxPackets, final long rxBytes, final long rxErrors,
|
||||||
|
final long txPackets, final long txBytes, final long txErrors) {
|
||||||
|
this.rxPackets = rxPackets;
|
||||||
|
this.rxBytes = rxBytes;
|
||||||
|
this.rxErrors = rxErrors;
|
||||||
|
this.txPackets = txPackets;
|
||||||
|
this.txBytes = txBytes;
|
||||||
|
this.txErrors = txErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: remove equals, hashCode and toString once aosp/1536721 is merged.
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
|
||||||
|
if (!(obj instanceof TetherStatsValue)) return false;
|
||||||
|
|
||||||
|
final TetherStatsValue that = (TetherStatsValue) obj;
|
||||||
|
|
||||||
|
return rxPackets == that.rxPackets
|
||||||
|
&& rxBytes == that.rxBytes
|
||||||
|
&& rxErrors == that.rxErrors
|
||||||
|
&& txPackets == that.txPackets
|
||||||
|
&& txBytes == that.txBytes
|
||||||
|
&& txErrors == that.txErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Long.hashCode(rxPackets) ^ Long.hashCode(rxBytes) ^ Long.hashCode(rxErrors)
|
||||||
|
^ Long.hashCode(txPackets) ^ Long.hashCode(txBytes) ^ Long.hashCode(txErrors);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("rxPackets: %s, rxBytes: %s, rxErrors: %s, txPackets: %s, "
|
||||||
|
+ "txBytes: %s, txErrors: %s", rxPackets, rxBytes, rxErrors, txPackets,
|
||||||
|
txBytes, txErrors);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -158,6 +158,7 @@ java_library {
|
|||||||
static_libs: [
|
static_libs: [
|
||||||
// Do not add libs here if they are already included
|
// Do not add libs here if they are already included
|
||||||
// in framework-connectivity
|
// in framework-connectivity
|
||||||
|
"connectivity-net-module-utils-bpf",
|
||||||
"connectivity_native_aidl_interface-lateststable-java",
|
"connectivity_native_aidl_interface-lateststable-java",
|
||||||
"dnsresolver_aidl_interface-V9-java",
|
"dnsresolver_aidl_interface-V9-java",
|
||||||
"modules-utils-shell-command-handler",
|
"modules-utils-shell-command-handler",
|
||||||
|
|||||||
Reference in New Issue
Block a user