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  }