1*387f9dfdSAndroid Build Coastguard Worker /* 2*387f9dfdSAndroid Build Coastguard Worker * Copyright (c) 2018 Politecnico di Torino 3*387f9dfdSAndroid Build Coastguard Worker * 4*387f9dfdSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*387f9dfdSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*387f9dfdSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*387f9dfdSAndroid Build Coastguard Worker * 8*387f9dfdSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*387f9dfdSAndroid Build Coastguard Worker * 10*387f9dfdSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*387f9dfdSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*387f9dfdSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*387f9dfdSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*387f9dfdSAndroid Build Coastguard Worker * limitations under the License. 15*387f9dfdSAndroid Build Coastguard Worker */ 16*387f9dfdSAndroid Build Coastguard Worker 17*387f9dfdSAndroid Build Coastguard Worker #include "BPF.h" 18*387f9dfdSAndroid Build Coastguard Worker #include "catch.hpp" 19*387f9dfdSAndroid Build Coastguard Worker 20*387f9dfdSAndroid Build Coastguard Worker const std::string BPF_PROGRAM1 = R"( 21*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE_SHARED("array", int, int, mysharedtable, 1024); 22*387f9dfdSAndroid Build Coastguard Worker )"; 23*387f9dfdSAndroid Build Coastguard Worker 24*387f9dfdSAndroid Build Coastguard Worker const std::string BPF_PROGRAM2 = R"( 25*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("extern", int, int, mysharedtable, 1024); 26*387f9dfdSAndroid Build Coastguard Worker )"; 27*387f9dfdSAndroid Build Coastguard Worker 28*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("test shared table", "[shared_table]") { 29*387f9dfdSAndroid Build Coastguard Worker // deploy 4 ebpf programs: _ns1_a and _ns1_b are in ns1, _ns2_a and _ns2_b in ns2 30*387f9dfdSAndroid Build Coastguard Worker ebpf::BPF bpf_ns1_a(0, nullptr, false, "ns1"); 31*387f9dfdSAndroid Build Coastguard Worker ebpf::BPF bpf_ns1_b(0, nullptr, false, "ns1"); 32*387f9dfdSAndroid Build Coastguard Worker ebpf::BPF bpf_ns2_a(0, nullptr, false, "ns2"); 33*387f9dfdSAndroid Build Coastguard Worker ebpf::BPF bpf_ns2_b(0, nullptr, false, "ns2"); 34*387f9dfdSAndroid Build Coastguard Worker 35*387f9dfdSAndroid Build Coastguard Worker ebpf::StatusTuple res(0); 36*387f9dfdSAndroid Build Coastguard Worker 37*387f9dfdSAndroid Build Coastguard Worker res = bpf_ns1_a.init(BPF_PROGRAM1); 38*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 39*387f9dfdSAndroid Build Coastguard Worker 40*387f9dfdSAndroid Build Coastguard Worker res = bpf_ns1_b.init(BPF_PROGRAM2); 41*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 42*387f9dfdSAndroid Build Coastguard Worker 43*387f9dfdSAndroid Build Coastguard Worker res = bpf_ns2_a.init(BPF_PROGRAM1); 44*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 45*387f9dfdSAndroid Build Coastguard Worker 46*387f9dfdSAndroid Build Coastguard Worker res = bpf_ns2_b.init(BPF_PROGRAM2); 47*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 48*387f9dfdSAndroid Build Coastguard Worker 49*387f9dfdSAndroid Build Coastguard Worker // get references to all tables 50*387f9dfdSAndroid Build Coastguard Worker ebpf::BPFArrayTable<int> t_ns1_a = bpf_ns1_a.get_array_table<int>("mysharedtable"); 51*387f9dfdSAndroid Build Coastguard Worker ebpf::BPFArrayTable<int> t_ns1_b = bpf_ns1_b.get_array_table<int>("mysharedtable"); 52*387f9dfdSAndroid Build Coastguard Worker ebpf::BPFArrayTable<int> t_ns2_a = bpf_ns2_a.get_array_table<int>("mysharedtable"); 53*387f9dfdSAndroid Build Coastguard Worker ebpf::BPFArrayTable<int> t_ns2_b = bpf_ns2_b.get_array_table<int>("mysharedtable"); 54*387f9dfdSAndroid Build Coastguard Worker 55*387f9dfdSAndroid Build Coastguard Worker // test that tables within the same ns are shared 56*387f9dfdSAndroid Build Coastguard Worker int v1, v2, v3; 57*387f9dfdSAndroid Build Coastguard Worker res = t_ns1_a.update_value(13, 42); 58*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 59*387f9dfdSAndroid Build Coastguard Worker 60*387f9dfdSAndroid Build Coastguard Worker res = t_ns1_b.get_value(13, v1); 61*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 62*387f9dfdSAndroid Build Coastguard Worker REQUIRE(v1 == 42); 63*387f9dfdSAndroid Build Coastguard Worker 64*387f9dfdSAndroid Build Coastguard Worker // test that tables are isolated within different ns 65*387f9dfdSAndroid Build Coastguard Worker res = t_ns2_a.update_value(13, 69); 66*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 67*387f9dfdSAndroid Build Coastguard Worker 68*387f9dfdSAndroid Build Coastguard Worker res = t_ns2_b.get_value(13, v2); 69*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 70*387f9dfdSAndroid Build Coastguard Worker REQUIRE(v2 == 69); 71*387f9dfdSAndroid Build Coastguard Worker 72*387f9dfdSAndroid Build Coastguard Worker res = t_ns1_b.get_value(13, v3); 73*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 74*387f9dfdSAndroid Build Coastguard Worker REQUIRE(v3 == 42); // value should still be 42 75*387f9dfdSAndroid Build Coastguard Worker } 76