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 19*387f9dfdSAndroid Build Coastguard Worker #include "catch.hpp" 20*387f9dfdSAndroid Build Coastguard Worker 21*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("test prog table", "[prog_table]") { 22*387f9dfdSAndroid Build Coastguard Worker const std::string BPF_PROGRAM = R"( 23*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("prog", int, int, myprog, 16); 24*387f9dfdSAndroid Build Coastguard Worker )"; 25*387f9dfdSAndroid Build Coastguard Worker 26*387f9dfdSAndroid Build Coastguard Worker const std::string BPF_PROGRAM2 = R"( 27*387f9dfdSAndroid Build Coastguard Worker int hello(struct __sk_buff *skb) { 28*387f9dfdSAndroid Build Coastguard Worker return 1; 29*387f9dfdSAndroid Build Coastguard Worker } 30*387f9dfdSAndroid Build Coastguard Worker )"; 31*387f9dfdSAndroid Build Coastguard Worker 32*387f9dfdSAndroid Build Coastguard Worker ebpf::StatusTuple res(0); 33*387f9dfdSAndroid Build Coastguard Worker 34*387f9dfdSAndroid Build Coastguard Worker ebpf::BPF bpf; 35*387f9dfdSAndroid Build Coastguard Worker res = bpf.init(BPF_PROGRAM); 36*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 37*387f9dfdSAndroid Build Coastguard Worker 38*387f9dfdSAndroid Build Coastguard Worker ebpf::BPFProgTable t = bpf.get_prog_table("myprog"); 39*387f9dfdSAndroid Build Coastguard Worker 40*387f9dfdSAndroid Build Coastguard Worker ebpf::BPF bpf2; 41*387f9dfdSAndroid Build Coastguard Worker res = bpf2.init(BPF_PROGRAM2); 42*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 43*387f9dfdSAndroid Build Coastguard Worker 44*387f9dfdSAndroid Build Coastguard Worker int fd; 45*387f9dfdSAndroid Build Coastguard Worker res = bpf2.load_func("hello", BPF_PROG_TYPE_SCHED_CLS, fd); 46*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 47*387f9dfdSAndroid Build Coastguard Worker 48*387f9dfdSAndroid Build Coastguard Worker SECTION("update and remove") { 49*387f9dfdSAndroid Build Coastguard Worker // update element 50*387f9dfdSAndroid Build Coastguard Worker res = t.update_value(0, fd); 51*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 52*387f9dfdSAndroid Build Coastguard Worker 53*387f9dfdSAndroid Build Coastguard Worker // remove element 54*387f9dfdSAndroid Build Coastguard Worker res = t.remove_value(0); 55*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 56*387f9dfdSAndroid Build Coastguard Worker 57*387f9dfdSAndroid Build Coastguard Worker // update out of range element 58*387f9dfdSAndroid Build Coastguard Worker res = t.update_value(17, fd); 59*387f9dfdSAndroid Build Coastguard Worker REQUIRE(!res.ok()); 60*387f9dfdSAndroid Build Coastguard Worker 61*387f9dfdSAndroid Build Coastguard Worker // remove out of range element 62*387f9dfdSAndroid Build Coastguard Worker res = t.remove_value(17); 63*387f9dfdSAndroid Build Coastguard Worker REQUIRE(!res.ok()); 64*387f9dfdSAndroid Build Coastguard Worker } 65*387f9dfdSAndroid Build Coastguard Worker } 66