1*387f9dfdSAndroid Build Coastguard Worker /* 2*387f9dfdSAndroid Build Coastguard Worker * Copyright (c) 2020 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 #include <iostream> 20*387f9dfdSAndroid Build Coastguard Worker #include <linux/version.h> 21*387f9dfdSAndroid Build Coastguard Worker 22*387f9dfdSAndroid Build Coastguard Worker //Queue/Stack types are available only from 4.20 23*387f9dfdSAndroid Build Coastguard Worker #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0) 24*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("queue table", "[queue_table]") { 25*387f9dfdSAndroid Build Coastguard Worker const std::string BPF_PROGRAM = R"( 26*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUE(myqueue, int, 30); 27*387f9dfdSAndroid Build Coastguard Worker )"; 28*387f9dfdSAndroid Build Coastguard Worker 29*387f9dfdSAndroid Build Coastguard Worker ebpf::BPF bpf; 30*387f9dfdSAndroid Build Coastguard Worker ebpf::StatusTuple res(0); 31*387f9dfdSAndroid Build Coastguard Worker res = bpf.init(BPF_PROGRAM); 32*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 33*387f9dfdSAndroid Build Coastguard Worker 34*387f9dfdSAndroid Build Coastguard Worker ebpf::BPFQueueStackTable<int> t = bpf.get_queuestack_table<int>("myqueue"); 35*387f9dfdSAndroid Build Coastguard Worker 36*387f9dfdSAndroid Build Coastguard Worker SECTION("standard methods") { 37*387f9dfdSAndroid Build Coastguard Worker int i, val; 38*387f9dfdSAndroid Build Coastguard Worker std::string value; 39*387f9dfdSAndroid Build Coastguard Worker 40*387f9dfdSAndroid Build Coastguard Worker // insert elements 41*387f9dfdSAndroid Build Coastguard Worker for (i=0; i<30; i++) { 42*387f9dfdSAndroid Build Coastguard Worker res = t.push_value(i); 43*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 44*387f9dfdSAndroid Build Coastguard Worker } 45*387f9dfdSAndroid Build Coastguard Worker 46*387f9dfdSAndroid Build Coastguard Worker // checking head (peek) 47*387f9dfdSAndroid Build Coastguard Worker res = t.get_head(val); 48*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 49*387f9dfdSAndroid Build Coastguard Worker REQUIRE(val == 0); 50*387f9dfdSAndroid Build Coastguard Worker 51*387f9dfdSAndroid Build Coastguard Worker // retrieve elements 52*387f9dfdSAndroid Build Coastguard Worker for (i=0; i<30; i++) { 53*387f9dfdSAndroid Build Coastguard Worker res = t.pop_value(val); 54*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 55*387f9dfdSAndroid Build Coastguard Worker REQUIRE(val == i); 56*387f9dfdSAndroid Build Coastguard Worker } 57*387f9dfdSAndroid Build Coastguard Worker // get non existing element 58*387f9dfdSAndroid Build Coastguard Worker res = t.pop_value(val); 59*387f9dfdSAndroid Build Coastguard Worker REQUIRE(!res.ok()); 60*387f9dfdSAndroid Build Coastguard Worker } 61*387f9dfdSAndroid Build Coastguard Worker } 62*387f9dfdSAndroid Build Coastguard Worker 63*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("stack table", "[stack_table]") { 64*387f9dfdSAndroid Build Coastguard Worker const std::string BPF_PROGRAM = R"( 65*387f9dfdSAndroid Build Coastguard Worker BPF_STACK(mystack, int, 30); 66*387f9dfdSAndroid Build Coastguard Worker )"; 67*387f9dfdSAndroid Build Coastguard Worker 68*387f9dfdSAndroid Build Coastguard Worker ebpf::BPF bpf; 69*387f9dfdSAndroid Build Coastguard Worker ebpf::StatusTuple res(0); 70*387f9dfdSAndroid Build Coastguard Worker res = bpf.init(BPF_PROGRAM); 71*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 72*387f9dfdSAndroid Build Coastguard Worker 73*387f9dfdSAndroid Build Coastguard Worker ebpf::BPFQueueStackTable<int> t = bpf.get_queuestack_table<int>("mystack"); 74*387f9dfdSAndroid Build Coastguard Worker 75*387f9dfdSAndroid Build Coastguard Worker SECTION("standard methods") { 76*387f9dfdSAndroid Build Coastguard Worker int i, val; 77*387f9dfdSAndroid Build Coastguard Worker std::string value; 78*387f9dfdSAndroid Build Coastguard Worker 79*387f9dfdSAndroid Build Coastguard Worker // insert elements 80*387f9dfdSAndroid Build Coastguard Worker for (i=0; i<30; i++) { 81*387f9dfdSAndroid Build Coastguard Worker res = t.push_value(i); 82*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 83*387f9dfdSAndroid Build Coastguard Worker } 84*387f9dfdSAndroid Build Coastguard Worker 85*387f9dfdSAndroid Build Coastguard Worker // checking head (peek) 86*387f9dfdSAndroid Build Coastguard Worker res = t.get_head(val); 87*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 88*387f9dfdSAndroid Build Coastguard Worker REQUIRE(val == 29); 89*387f9dfdSAndroid Build Coastguard Worker 90*387f9dfdSAndroid Build Coastguard Worker // retrieve elements 91*387f9dfdSAndroid Build Coastguard Worker for (i=0; i<30; i++) { 92*387f9dfdSAndroid Build Coastguard Worker res = t.pop_value(val); 93*387f9dfdSAndroid Build Coastguard Worker REQUIRE(res.ok()); 94*387f9dfdSAndroid Build Coastguard Worker REQUIRE( val == (30 - 1 - i)); 95*387f9dfdSAndroid Build Coastguard Worker } 96*387f9dfdSAndroid Build Coastguard Worker // get non existing element 97*387f9dfdSAndroid Build Coastguard Worker res = t.pop_value(val); 98*387f9dfdSAndroid Build Coastguard Worker REQUIRE(!res.ok()); 99*387f9dfdSAndroid Build Coastguard Worker } 100*387f9dfdSAndroid Build Coastguard Worker } 101*387f9dfdSAndroid Build Coastguard Worker #endif 102