xref: /aosp_15_r20/external/bcc/tests/python/test_lpm_trie.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) 2017 Facebook, Inc.
3*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License")
4*387f9dfdSAndroid Build Coastguard Worker
5*387f9dfdSAndroid Build Coastguard Workerimport ctypes as ct
6*387f9dfdSAndroid Build Coastguard Workerimport os
7*387f9dfdSAndroid Build Coastguard Workerfrom unittest import main, skipUnless, TestCase
8*387f9dfdSAndroid Build Coastguard Workerfrom utils import kernel_version_ge
9*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF
10*387f9dfdSAndroid Build Coastguard Workerfrom netaddr import IPAddress
11*387f9dfdSAndroid Build Coastguard Worker
12*387f9dfdSAndroid Build Coastguard Workerclass KeyV4(ct.Structure):
13*387f9dfdSAndroid Build Coastguard Worker    _fields_ = [("prefixlen", ct.c_uint),
14*387f9dfdSAndroid Build Coastguard Worker                ("data", ct.c_ubyte * 4)]
15*387f9dfdSAndroid Build Coastguard Worker
16*387f9dfdSAndroid Build Coastguard Workerclass KeyV6(ct.Structure):
17*387f9dfdSAndroid Build Coastguard Worker    _fields_ = [("prefixlen", ct.c_uint),
18*387f9dfdSAndroid Build Coastguard Worker                ("data", ct.c_ushort * 8)]
19*387f9dfdSAndroid Build Coastguard Worker
20*387f9dfdSAndroid Build Coastguard Worker@skipUnless(kernel_version_ge(4, 11), "requires kernel >= 4.11")
21*387f9dfdSAndroid Build Coastguard Workerclass TestLpmTrie(TestCase):
22*387f9dfdSAndroid Build Coastguard Worker    def test_lpm_trie_v4(self):
23*387f9dfdSAndroid Build Coastguard Worker        test_prog1 = b"""
24*387f9dfdSAndroid Build Coastguard Worker        struct key_v4 {
25*387f9dfdSAndroid Build Coastguard Worker            u32 prefixlen;
26*387f9dfdSAndroid Build Coastguard Worker            u32 data[4];
27*387f9dfdSAndroid Build Coastguard Worker        };
28*387f9dfdSAndroid Build Coastguard Worker        BPF_LPM_TRIE(trie, struct key_v4, int, 16);
29*387f9dfdSAndroid Build Coastguard Worker        """
30*387f9dfdSAndroid Build Coastguard Worker        b = BPF(text=test_prog1)
31*387f9dfdSAndroid Build Coastguard Worker        t = b[b"trie"]
32*387f9dfdSAndroid Build Coastguard Worker
33*387f9dfdSAndroid Build Coastguard Worker        k1 = KeyV4(24, (192, 168, 0, 0))
34*387f9dfdSAndroid Build Coastguard Worker        v1 = ct.c_int(24)
35*387f9dfdSAndroid Build Coastguard Worker        t[k1] = v1
36*387f9dfdSAndroid Build Coastguard Worker
37*387f9dfdSAndroid Build Coastguard Worker        k2 = KeyV4(28, (192, 168, 0, 0))
38*387f9dfdSAndroid Build Coastguard Worker        v2 = ct.c_int(28)
39*387f9dfdSAndroid Build Coastguard Worker        t[k2] = v2
40*387f9dfdSAndroid Build Coastguard Worker
41*387f9dfdSAndroid Build Coastguard Worker        k = KeyV4(32, (192, 168, 0, 15))
42*387f9dfdSAndroid Build Coastguard Worker        self.assertEqual(t[k].value, 28)
43*387f9dfdSAndroid Build Coastguard Worker
44*387f9dfdSAndroid Build Coastguard Worker        k = KeyV4(32, (192, 168, 0, 127))
45*387f9dfdSAndroid Build Coastguard Worker        self.assertEqual(t[k].value, 24)
46*387f9dfdSAndroid Build Coastguard Worker
47*387f9dfdSAndroid Build Coastguard Worker        with self.assertRaises(KeyError):
48*387f9dfdSAndroid Build Coastguard Worker            k = KeyV4(32, (172, 16, 1, 127))
49*387f9dfdSAndroid Build Coastguard Worker            v = t[k]
50*387f9dfdSAndroid Build Coastguard Worker
51*387f9dfdSAndroid Build Coastguard Worker    def test_lpm_trie_v6(self):
52*387f9dfdSAndroid Build Coastguard Worker        test_prog1 = b"""
53*387f9dfdSAndroid Build Coastguard Worker        struct key_v6 {
54*387f9dfdSAndroid Build Coastguard Worker            u32 prefixlen;
55*387f9dfdSAndroid Build Coastguard Worker            u32 data[4];
56*387f9dfdSAndroid Build Coastguard Worker        };
57*387f9dfdSAndroid Build Coastguard Worker        BPF_LPM_TRIE(trie, struct key_v6, int, 16);
58*387f9dfdSAndroid Build Coastguard Worker        """
59*387f9dfdSAndroid Build Coastguard Worker        b = BPF(text=test_prog1)
60*387f9dfdSAndroid Build Coastguard Worker        t = b[b"trie"]
61*387f9dfdSAndroid Build Coastguard Worker
62*387f9dfdSAndroid Build Coastguard Worker        k1 = KeyV6(64, IPAddress('2a00:1450:4001:814:200e::').words)
63*387f9dfdSAndroid Build Coastguard Worker        v1 = ct.c_int(64)
64*387f9dfdSAndroid Build Coastguard Worker        t[k1] = v1
65*387f9dfdSAndroid Build Coastguard Worker
66*387f9dfdSAndroid Build Coastguard Worker        k2 = KeyV6(96, IPAddress('2a00:1450:4001:814::200e').words)
67*387f9dfdSAndroid Build Coastguard Worker        v2 = ct.c_int(96)
68*387f9dfdSAndroid Build Coastguard Worker        t[k2] = v2
69*387f9dfdSAndroid Build Coastguard Worker
70*387f9dfdSAndroid Build Coastguard Worker        k = KeyV6(128, IPAddress('2a00:1450:4001:814::1024').words)
71*387f9dfdSAndroid Build Coastguard Worker        self.assertEqual(t[k].value, 96)
72*387f9dfdSAndroid Build Coastguard Worker
73*387f9dfdSAndroid Build Coastguard Worker        k = KeyV6(128, IPAddress('2a00:1450:4001:814:2046::').words)
74*387f9dfdSAndroid Build Coastguard Worker        self.assertEqual(t[k].value, 64)
75*387f9dfdSAndroid Build Coastguard Worker
76*387f9dfdSAndroid Build Coastguard Worker        with self.assertRaises(KeyError):
77*387f9dfdSAndroid Build Coastguard Worker            k = KeyV6(128, IPAddress('2a00:ffff::').words)
78*387f9dfdSAndroid Build Coastguard Worker            v = t[k]
79*387f9dfdSAndroid Build Coastguard Worker
80*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__":
81*387f9dfdSAndroid Build Coastguard Worker    main()
82