blob: c518f5795362bfe671f31a54995c62d9ad8c88ea [file] [log] [blame]
Patrick Rohrbdafd742022-02-23 19:29:52 +01001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
Maciej Żenczykowski9da72b02024-06-06 22:00:15 +000018#include <unistd.h>
19
Patrick Rohrbdafd742022-02-23 19:29:52 +010020#include <gtest/gtest.h>
21#include <vintf/VintfObject.h>
22
23#include <fstream>
24#include <string>
25
Maciej Żenczykowski099e1962023-05-04 11:16:26 +000026#include "bpf/KernelUtils.h"
27
Patrick Rohrbdafd742022-02-23 19:29:52 +010028namespace android {
29namespace net {
30
31namespace {
32
33using ::android::vintf::RuntimeInfo;
34using ::android::vintf::VintfObject;
35
36class KernelConfigVerifier final {
37 public:
38 KernelConfigVerifier() : mRuntimeInfo(VintfObject::GetRuntimeInfo()) {}
39
40 bool hasOption(const std::string& option) const {
41 const auto& configMap = mRuntimeInfo->kernelConfigs();
42 auto it = configMap.find(option);
43 if (it != configMap.cend()) {
44 return it->second == "y";
45 }
46 return false;
47 }
48
Maciej Żenczykowski7cfbac52023-10-12 19:52:36 +000049 bool hasModule(const std::string& option) const {
50 const auto& configMap = mRuntimeInfo->kernelConfigs();
51 auto it = configMap.find(option);
52 if (it != configMap.cend()) {
53 return (it->second == "y") || (it->second == "m");
54 }
55 return false;
56 }
57
Patrick Rohrbdafd742022-02-23 19:29:52 +010058 private:
59 std::shared_ptr<const RuntimeInfo> mRuntimeInfo;
60};
61
62} // namespace
63
64/**
65 * If this test fails, enable the following kernel modules in your kernel config:
66 * CONFIG_NET_CLS_MATCHALL=y
67 * CONFIG_NET_ACT_POLICE=y
68 * CONFIG_NET_ACT_BPF=y
Maciej Żenczykowskib5f98e62022-12-16 20:29:31 +000069 * CONFIG_BPF_JIT=y
Patrick Rohrbdafd742022-02-23 19:29:52 +010070 */
71TEST(KernelTest, TestRateLimitingSupport) {
Patrick Rohrbdafd742022-02-23 19:29:52 +010072 KernelConfigVerifier configVerifier;
Maciej Żenczykowski8f14e5b2023-10-17 15:45:28 +000073 EXPECT_TRUE(configVerifier.hasOption("CONFIG_NET_CLS_MATCHALL"));
74 EXPECT_TRUE(configVerifier.hasOption("CONFIG_NET_ACT_POLICE"));
75 EXPECT_TRUE(configVerifier.hasOption("CONFIG_NET_ACT_BPF"));
76 EXPECT_TRUE(configVerifier.hasOption("CONFIG_BPF_JIT"));
Patrick Rohrbdafd742022-02-23 19:29:52 +010077}
78
Maciej Żenczykowski40722a72024-03-15 08:08:59 +000079TEST(KernelTest, TestRequireBpfUnprivDefaultOn) {
80 KernelConfigVerifier configVerifier;
81 EXPECT_FALSE(configVerifier.hasOption("CONFIG_BPF_UNPRIV_DEFAULT_OFF"));
82}
83
Maciej Żenczykowski099e1962023-05-04 11:16:26 +000084TEST(KernelTest, TestBpfJitAlwaysOn) {
85 // 32-bit arm & x86 kernels aren't capable of JIT-ing all of our BPF code,
86 if (bpf::isKernel32Bit()) GTEST_SKIP() << "Exempt on 32-bit kernel.";
87 KernelConfigVerifier configVerifier;
88 ASSERT_TRUE(configVerifier.hasOption("CONFIG_BPF_JIT_ALWAYS_ON"));
89}
90
Maciej Żenczykowski997e3b32024-08-22 21:08:58 +000091TEST(KernelTest, TestHaveEfficientUnalignedAccess) {
92 // Turns out the bpf verifier is stricter if you don't have this option.
93 // At least *some* of our bpf code fails to verify without it.
94 KernelConfigVerifier configVerifier;
95 ASSERT_TRUE(configVerifier.hasOption("CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS"));
96}
97
Maciej Żenczykowski099e1962023-05-04 11:16:26 +000098/* Android 14/U should only launch on 64-bit kernels
99 * T launches on 5.10/5.15
100 * U launches on 5.15/6.1
101 * So >=5.16 implies isKernel64Bit()
102 */
103TEST(KernelTest, TestKernel64Bit) {
104 if (!bpf::isAtLeastKernelVersion(5, 16, 0)) GTEST_SKIP() << "Exempt on < 5.16 kernel.";
105 ASSERT_TRUE(bpf::isKernel64Bit());
106}
107
Maciej Żenczykowskib75cc342024-02-17 00:04:27 +0000108// Android V requires x86 kernels to be 64-bit, as among other things
109// 32-bit x86 kernels have subtly different structure layouts for XFRM
110TEST(KernelTest, TestX86Kernel64Bit) {
111 if (!bpf::isX86()) GTEST_SKIP() << "Exempt on non-x86 architecture.";
112 ASSERT_TRUE(bpf::isKernel64Bit());
113}
114
Maciej Żenczykowski863804d2023-08-09 21:59:43 +0000115// Android V requires 4.19+
116TEST(KernelTest, TestKernel419) {
117 ASSERT_TRUE(bpf::isAtLeastKernelVersion(4, 19, 0));
118}
119
Maciej Żenczykowski36cba152024-05-15 11:50:17 +0000120// RiscV is not yet supported: make it fail VTS.
121TEST(KernelTest, TestNotRiscV) {
122 ASSERT_TRUE(!bpf::isRiscV());
123}
124
Maciej Żenczykowski653bbf02024-02-28 20:32:21 +0000125TEST(KernelTest, TestIsLTS) {
Maciej Żenczykowskiddf2f2c2024-04-25 14:30:22 -0700126 ASSERT_TRUE(bpf::isLtsKernel());
Maciej Żenczykowski653bbf02024-02-28 20:32:21 +0000127}
128
Maciej Żenczykowski9da72b02024-06-06 22:00:15 +0000129static bool exists(const char* filename) {
130 return !access(filename, F_OK);
131}
132
Maciej Żenczykowski7e612742024-03-27 14:06:42 -0700133static bool isGSI() {
134 // From //system/gsid/libgsi.cpp IsGsiRunning()
Maciej Żenczykowski9da72b02024-06-06 22:00:15 +0000135 return exists("/metadata/gsi/dsu/booted");
Maciej Żenczykowski7e612742024-03-27 14:06:42 -0700136}
137
Maciej Żenczykowski07d13892024-03-01 20:47:07 -0800138#define ifIsKernelThenMinLTS(major, minor, sub) do { \
Maciej Żenczykowski7e612742024-03-27 14:06:42 -0700139 if (isGSI()) GTEST_SKIP() << "Test is meaningless on GSI."; \
Maciej Żenczykowskiddf2f2c2024-04-25 14:30:22 -0700140 if (!bpf::isKernelVersion((major), (minor))) GTEST_SKIP() << "Not for this LTS ver."; \
Maciej Żenczykowski7e612742024-03-27 14:06:42 -0700141 ASSERT_TRUE(bpf::isAtLeastKernelVersion((major), (minor), (sub))); \
Maciej Żenczykowski07d13892024-03-01 20:47:07 -0800142} while (0)
Maciej Żenczykowski653bbf02024-02-28 20:32:21 +0000143
Maciej Żenczykowski07d13892024-03-01 20:47:07 -0800144TEST(KernelTest, TestMinRequiredLTS_4_19) { ifIsKernelThenMinLTS(4, 19, 236); }
145TEST(KernelTest, TestMinRequiredLTS_5_4) { ifIsKernelThenMinLTS(5, 4, 186); }
146TEST(KernelTest, TestMinRequiredLTS_5_10) { ifIsKernelThenMinLTS(5, 10, 199); }
147TEST(KernelTest, TestMinRequiredLTS_5_15) { ifIsKernelThenMinLTS(5, 15, 136); }
148TEST(KernelTest, TestMinRequiredLTS_6_1) { ifIsKernelThenMinLTS(6, 1, 57); }
149TEST(KernelTest, TestMinRequiredLTS_6_6) { ifIsKernelThenMinLTS(6, 6, 0); }
Maciej Żenczykowski653bbf02024-02-28 20:32:21 +0000150
Maciej Żenczykowski9da72b02024-06-06 22:00:15 +0000151TEST(KernelTest, TestSupportsAcceptRaMinLft) {
152 if (isGSI()) GTEST_SKIP() << "Meaningless on GSI due to ancient kernels.";
153 if (!bpf::isAtLeastKernelVersion(5, 10, 0)) GTEST_SKIP() << "Too old base kernel.";
154 ASSERT_TRUE(exists("/proc/sys/net/ipv6/conf/default/accept_ra_min_lft"));
155}
156
Maciej Żenczykowski7cfbac52023-10-12 19:52:36 +0000157TEST(KernelTest, TestSupportsCommonUsbEthernetDongles) {
158 KernelConfigVerifier configVerifier;
159 if (!configVerifier.hasModule("CONFIG_USB")) GTEST_SKIP() << "Exempt without USB support.";
Maciej Żenczykowski8f14e5b2023-10-17 15:45:28 +0000160 EXPECT_TRUE(configVerifier.hasModule("CONFIG_USB_NET_AX8817X"));
161 EXPECT_TRUE(configVerifier.hasModule("CONFIG_USB_NET_AX88179_178A"));
162 EXPECT_TRUE(configVerifier.hasModule("CONFIG_USB_NET_CDCETHER"));
163 EXPECT_TRUE(configVerifier.hasModule("CONFIG_USB_NET_CDC_EEM"));
164 EXPECT_TRUE(configVerifier.hasModule("CONFIG_USB_NET_CDC_NCM"));
Maciej Żenczykowski99dc5da2023-10-12 23:22:02 +0000165 if (bpf::isAtLeastKernelVersion(5, 4, 0))
Maciej Żenczykowski8f14e5b2023-10-17 15:45:28 +0000166 EXPECT_TRUE(configVerifier.hasModule("CONFIG_USB_NET_AQC111"));
Maciej Żenczykowski99dc5da2023-10-12 23:22:02 +0000167
Maciej Żenczykowski8f14e5b2023-10-17 15:45:28 +0000168 EXPECT_TRUE(configVerifier.hasModule("CONFIG_USB_RTL8152"));
169 EXPECT_TRUE(configVerifier.hasModule("CONFIG_USB_RTL8150"));
Maciej Żenczykowski72a83862023-10-16 18:18:56 +0000170 if (bpf::isAtLeastKernelVersion(5, 15, 0)) {
Maciej Żenczykowski8f14e5b2023-10-17 15:45:28 +0000171 EXPECT_TRUE(configVerifier.hasModule("CONFIG_USB_RTL8153_ECM"));
172 EXPECT_TRUE(configVerifier.hasModule("CONFIG_AX88796B_PHY"));
Maciej Żenczykowski72a83862023-10-16 18:18:56 +0000173 }
Maciej Żenczykowski7cfbac52023-10-12 19:52:36 +0000174}
175
Patrick Rohrbdafd742022-02-23 19:29:52 +0100176} // namespace net
177} // namespace android