github.com/looshlee/cilium@v1.6.12/test/bpf/unit-test.c (about) 1 // SPDX-License-Identifier: GPL-2.0 2 // Copyright (c) 2018 Authors of Cilium 3 #include <assert.h> 4 #include <stdio.h> 5 #include <string.h> 6 7 #include "lib/utils.h" 8 #include "node_config.h" 9 10 #include "lib/common.h" 11 #include "lib/ipv6.h" 12 13 #define SKIP_UNDEF_LPM_LOOKUP_FN 14 #include "lib/maps.h" 15 16 #define htonl bpf_htonl 17 #define ntohl bpf_ntohl 18 19 static void test_ipv6_addr_clear_suffix() 20 { 21 union v6addr v6; 22 23 memset(&v6, 0xff, sizeof(v6)); 24 ipv6_addr_clear_suffix(&v6, 128); 25 assert(ntohl(v6.p1) == 0xffffffff); 26 assert(ntohl(v6.p2) == 0xffffffff); 27 assert(ntohl(v6.p3) == 0xffffffff); 28 assert(ntohl(v6.p4) == 0xffffffff); 29 30 memset(&v6, 0xff, sizeof(v6)); 31 ipv6_addr_clear_suffix(&v6, 127); 32 assert(ntohl(v6.p1) == 0xffffffff); 33 assert(ntohl(v6.p2) == 0xffffffff); 34 assert(ntohl(v6.p3) == 0xffffffff); 35 assert(ntohl(v6.p4) == 0xfffffffe); 36 37 memset(&v6, 0xff, sizeof(v6)); 38 ipv6_addr_clear_suffix(&v6, 95); 39 assert(ntohl(v6.p1) == 0xffffffff); 40 assert(ntohl(v6.p2) == 0xffffffff); 41 assert(ntohl(v6.p3) == 0xfffffffe); 42 assert(ntohl(v6.p4) == 0x00000000); 43 44 memset(&v6, 0xff, sizeof(v6)); 45 ipv6_addr_clear_suffix(&v6, 1); 46 assert(ntohl(v6.p1) == 0x80000000); 47 assert(ntohl(v6.p2) == 0x00000000); 48 assert(ntohl(v6.p3) == 0x00000000); 49 assert(ntohl(v6.p4) == 0x00000000); 50 51 memset(&v6, 0xff, sizeof(v6)); 52 ipv6_addr_clear_suffix(&v6, -1); 53 assert(ntohl(v6.p1) == 0x00000000); 54 assert(ntohl(v6.p2) == 0x00000000); 55 assert(ntohl(v6.p3) == 0x00000000); 56 assert(ntohl(v6.p4) == 0x00000000); 57 } 58 59 static __be32 *dummy_map = NULL; 60 61 static __be32 match_dummy_prefix(void *map, __be32 addr, __u32 prefix) 62 { 63 return (addr & GET_PREFIX(prefix)) == *dummy_map; 64 } 65 #define PREFIX32 32, 66 #define PREFIX31 31, 67 #define PREFIX22 22, 68 #define PREFIX11 11, 69 #define PREFIX0 0, 70 LPM_LOOKUP_FN(lpm4_lookup32, __be32, PREFIX32, dummy_map, match_dummy_prefix) 71 LPM_LOOKUP_FN(lpm4_lookup31, __be32, PREFIX31, dummy_map, match_dummy_prefix) 72 LPM_LOOKUP_FN(lpm4_lookup22, __be32, PREFIX22, dummy_map, match_dummy_prefix) 73 LPM_LOOKUP_FN(lpm4_lookup11, __be32, PREFIX11, dummy_map, match_dummy_prefix) 74 LPM_LOOKUP_FN(lpm4_lookup0, __be32, PREFIX0, dummy_map, match_dummy_prefix) 75 76 static void test_lpm_lookup() 77 { 78 __be32 addr; 79 dummy_map = &addr; 80 81 addr = htonl(0xFFFFFFFF); 82 assert(__lpm4_lookup32(htonl(0xFFFFFFFF))); 83 assert(!__lpm4_lookup32(htonl(0xFFF00000))); 84 addr = htonl(0xFFFFFFFE); 85 assert(__lpm4_lookup31(htonl(0xFFFFFFFE))); 86 assert(__lpm4_lookup31(htonl(0xFFFFFFFF))); 87 assert(!__lpm4_lookup31(htonl(0xFFF00000))); 88 addr = htonl(0xFFFFFC00); 89 assert(__lpm4_lookup22(htonl(0xFFFFFC00))); 90 assert(__lpm4_lookup22(htonl(0xFFFFFFFF))); 91 assert(!__lpm4_lookup22(htonl(0xFFF00000))); 92 addr = htonl(0xFFE00000); 93 assert(__lpm4_lookup11(htonl(0xFFE00000))); 94 assert(__lpm4_lookup11(htonl(0xFFFFFFFF))); 95 assert(__lpm4_lookup11(htonl(0xFFF00000))); 96 addr = htonl(0xF0000000); 97 assert(__lpm4_lookup11(htonl(0xF0000000))); 98 addr = htonl(0x00000000); 99 assert(__lpm4_lookup0(addr)); 100 assert(__lpm4_lookup0(htonl(0xFFFFFFFF))); 101 } 102 103 int main(int argc, char *argv[]) 104 { 105 test_lpm_lookup(); 106 test_ipv6_addr_clear_suffix(); 107 108 return 0; 109 }