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