aboutsummaryrefslogtreecommitdiffstats
path: root/test/test_policer.py
blob: 6b15a0234a3ee560fdfc95e24ecbae7c01da6dc0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/env python3
# Copyright (c) 2021 Graphiant, Inc.

import unittest

from framework import VppTestCase, VppTestRunner
from vpp_policer import VppPolicer, PolicerAction

# Default for the tests is 10s of "Green" packets at 8Mbps, ie. 10M bytes.
# The policer helper CLI "sends" 500 byte packets, so default is 20000.

TEST_RATE = 8000    # kbps
TEST_BURST = 10000  # ms

CIR_OK = 8500       # CIR in kbps, above test rate
CIR_LOW = 7000      # CIR in kbps, below test rate
EIR_OK = 9000       # EIR in kbps, above test rate
EIR_LOW = 7500      # EIR in kbps, below test rate

NUM_PKTS = 20000

CBURST = 100000     # Committed burst in bytes
EBURST = 200000     # Excess burst in bytes


class TestPolicer(VppTestCase):
    """ Policer Test Case """

    def run_policer_test(self, type, cir, cb, eir, eb, rate=8000, burst=10000,
                         colour=0):
        """
        Configure a Policer and push traffic through it.
        """
        types = {
            '1R2C': 0,
            '1R3C': 1,
            '2R3C': 3,
        }

        pol_type = types.get(type)
        policer = VppPolicer(self, "pol1", cir, eir, cb, eb, rate_type=0,
                             type=pol_type, color_aware=colour)
        policer.add_vpp_config()

        error = self.vapi.cli(
            f"test policing index {policer.policer_index} rate {rate} "
            f"burst {burst} colour {colour}")

        stats = policer.get_stats()
        policer.remove_vpp_config()

        return stats

    def test_policer_1r2c(self):
        """ Single rate, 2 colour policer """
        stats = self.run_policer_test("1R2C", CIR_OK, CBURST, 0, 0)
        self.assertEqual(stats['conform_packets'], NUM_PKTS)

        stats = self.run_policer_test("1R2C", CIR_LOW, CBURST, 0, 0)
        self.assertLess(stats['conform_packets'], NUM_PKTS)
        self.assertEqual(stats['exceed_packets'], 0)
        self.assertGreater(stats['violate_packets'], 0)

        stats = self.run_policer_test("1R2C", CIR_LOW, CBURST, 0, 0, colour=2)
        self.assertEqual(stats['violate_packets'], NUM_PKTS)

    def test_policer_1r3c(self):
        """ Single rate, 3 colour policer """
        stats = self.run_policer_test("1R3C", CIR_OK, CBURST, 0, 0)
        self.assertEqual(stats['conform_packets'], NUM_PKTS)

        stats = self.run_policer_test("1R3C", CIR_LOW, CBURST, 0, EBURST)
        self.assertLess(stats['conform_packets'], NUM_PKTS)
        self.assertGreater(stats['exceed_packets'], 0)
        self.assertGreater(stats['violate_packets'], 0)

        stats = self.run_policer_test("1R3C", CIR_LOW, CBURST, 0, EBURST,
                                      colour=1)
        self.assertEqual(stats['conform_packets'], 0)
        self.assertGreater(stats['exceed_packets'], 0)
        self.assertGreater(stats['violate_packets'], 0)

        stats = self.run_policer_test("1R3C", CIR_LOW, CBURST, 0, EBURST,
                                      colour=2)
        self.assertEqual(stats['violate_packets'], NUM_PKTS)

    def test_policer_2r3c(self):
        """ Dual rate, 3 colour policer """
        stats = self.run_policer_test("2R3C", CIR_OK, CBURST, EIR_OK, EBURST)
        self.assertEqual(stats['conform_packets'], NUM_PKTS)

        stats = self.run_policer_test("2R3C", CIR_LOW, CBURST, EIR_OK, EBURST)
        self.assertLess(stats['conform_packets'], NUM_PKTS)
        self.assertGreater(stats['exceed_packets'], 0)
        self.assertEqual(stats['violate_packets'], 0)

        stats = self.run_policer_test("2R3C", CIR_LOW, CBURST, EIR_LOW, EBURST)
        self.assertLess(stats['conform_packets'], NUM_PKTS)
        self.assertGreater(stats['exceed_packets'], 0)
        self.assertGreater(stats['violate_packets'], 0)

        stats = self.run_policer_test("2R3C", CIR_LOW, CBURST, EIR_OK, EBURST,
                                      colour=1)
        self.assertEqual(stats['exceed_packets'], NUM_PKTS)

        stats = self.run_policer_test("2R3C", CIR_LOW, CBURST, EIR_LOW, EBURST,
                                      colour=1)
        self.assertEqual(stats['conform_packets'], 0)
        self.assertGreater(stats['exceed_packets'], 0)
        self.assertGreater(stats['violate_packets'], 0)

        stats = self.run_policer_test("2R3C", CIR_LOW, CBURST, EIR_OK, EBURST,
                                      colour=2)
        self.assertEqual(stats['violate_packets'], NUM_PKTS)

if __name__ == '__main__':
    unittest.main(testRunner=VppTestRunner)
n>}= | 192.168.20.1 | ${tg_if2_ip4}= | 192.168.20.2 | ${raddr_ip4}= | 20.0.0.0 | ${laddr_ip4}= | 10.0.0.0 | ${addr_range}= | ${32} | ${ipsec_overhead}= | ${58} | ${n_tunnels}= | ${1} # Traffic profile: | ${traffic_profile} | trex-sl-3n-ethip4-ip4dst${n_tunnels} *** Test Cases *** | tc01-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc | | [Documentation] | | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\ | | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port. | | ... | [Ver] Find NDR for 64 Byte frames\ | | ... | using binary search start at 40GE linerate, step 100kpps. | | ... | | [Tags] | 64B | 1T1C | STHREAD | NDRDISC | | ... | | ${framesize}= | Set Variable | ${64} | | ${min_rate}= | Set Variable | ${10000} | | ${max_rate}= | Set Variable | ${s_18.75Mpps} | | ${binary_min}= | Set Variable | ${min_rate} | | ${binary_max}= | Set Variable | ${max_rate} | | ${threshold}= | Set Variable | ${min_rate} | | ${encr_alg}= | Crypto Alg AES CBC 128 | | ${auth_alg}= | Integ Alg SHA1 96 | | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology | | And Generate keys for IPSec | ${encr_alg} | ${auth_alg} | | And Add PCI devices to DUTs in 3-node single link topology | | And Add no multi seg to all DUTs | | And Add cryptodev to all DUTs | ${1} | | And Apply startup configuration on all VPP DUTs | | And Initialize IPSec in 3-node circular topology | | And VPP IPsec Create Tunnel Interfaces | | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels} | | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4} | | ... | ${raddr_ip4} | ${addr_range} | | Then Find NDR using binary search and pps | ${framesize} | | ... | ${binary_min} | ${binary_max} | ${traffic_profile} | | ... | ${min_rate} | ${max_rate} | ${threshold} | tc02-64B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-pdrdisc | | [Documentation] | | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\ | | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port. | | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\ | | ... | linerate, step 100kpps and loss tolerance of 0.5%. | | ... | | [Tags] | 64B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH | | ... | | ${framesize}= | Set Variable | ${64} | | ${min_rate}= | Set Variable | ${10000} | | ${max_rate}= | Set Variable | ${s_18.75Mpps} | | ${binary_min}= | Set Variable | ${min_rate} | | ${binary_max}= | Set Variable | ${max_rate} | | ${threshold}= | Set Variable | ${min_rate} | | ${encr_alg}= | Crypto Alg AES CBC 128 | | ${auth_alg}= | Integ Alg SHA1 96 | | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology | | And Generate keys for IPSec | ${encr_alg} | ${auth_alg} | | And Add PCI devices to DUTs in 3-node single link topology | | And Add no multi seg to all DUTs | | And Add cryptodev to all DUTs | ${1} | | And Apply startup configuration on all VPP DUTs | | And Initialize IPSec in 3-node circular topology | | And VPP IPsec Create Tunnel Interfaces | | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels} | | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4} | | ... | ${raddr_ip4} | ${addr_range} | | Then Find PDR using binary search and pps | ${framesize} | | ... | ${binary_min} | ${binary_max} | ${traffic_profile} | | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance} | | ... | ${perf_pdr_loss_acceptance_type} | tc03-1518B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc | | [Documentation] | | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\ | | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port. | | ... | [Ver] Find NDR for 1518 Byte frames\ | | ... | using binary search start at 40GE linerate, step 100kpps. | | ... | | [Tags] | 1518B | 1T1C | STHREAD | NDRDISC | | ... | | ${framesize}= | Set Variable | ${1518} | | ${min_rate}= | Set Variable | ${10000} | | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}} | | ${binary_min}= | Set Variable | ${min_rate} | | ${binary_max}= | Set Variable | ${max_rate} | | ${threshold}= | Set Variable | ${min_rate} | | ${encr_alg}= | Crypto Alg AES CBC 128 | | ${auth_alg}= | Integ Alg SHA1 96 | | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology | | And Generate keys for IPSec | ${encr_alg} | ${auth_alg} | | And Add PCI devices to DUTs in 3-node single link topology | | And Add cryptodev to all DUTs | ${1} | | And Apply startup configuration on all VPP DUTs | | And Initialize IPSec in 3-node circular topology | | And VPP IPsec Create Tunnel Interfaces | | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels} | | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4} | | ... | ${raddr_ip4} | ${addr_range} | | Then Find NDR using binary search and pps | ${framesize} | | ... | ${binary_min} | ${binary_max} | ${traffic_profile} | | ... | ${min_rate} | ${max_rate} | ${threshold} | tc04-1518B-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-pdrdisc | | [Documentation] | | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\ | | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port. | | ... | [Ver] Find PDR for 1518 Byte frames using binary search start at 40GE\ | | ... | linerate, step 100kpps and loss tolerance of 0.5%. | | ... | | [Tags] | 1518B | 1T1C | STHREAD | PDRDISC | SKIP_PATCH | | ... | | ${framesize}= | Set Variable | ${1518} | | ${min_rate}= | Set Variable | ${10000} | | ${max_rate}= | Calculate pps | ${s_24.5G} | ${framesize + ${ipsec_overhead}} | | ${binary_min}= | Set Variable | ${min_rate} | | ${binary_max}= | Set Variable | ${max_rate} | | ${threshold}= | Set Variable | ${min_rate} | | ${encr_alg}= | Crypto Alg AES CBC 128 | | ${auth_alg}= | Integ Alg SHA1 96 | | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology | | And Generate keys for IPSec | ${encr_alg} | ${auth_alg} | | And Add PCI devices to DUTs in 3-node single link topology | | And Add cryptodev to all DUTs | ${1} | | And Apply startup configuration on all VPP DUTs | | And Initialize IPSec in 3-node circular topology | | And VPP IPsec Create Tunnel Interfaces | | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels} | | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4} | | ... | ${raddr_ip4} | ${addr_range} | | Then Find PDR using binary search and pps | ${framesize} | | ... | ${binary_min} | ${binary_max} | ${traffic_profile} | | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance} | | ... | ${perf_pdr_loss_acceptance_type} | tc05-IMIX-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc | | [Documentation] | | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\ | | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port. | | ... | [Ver] Find NDR for IMIX_v4_1 frames\ | | ... | using binary search start at 40GE linerate, step 100kpps. | | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B) | | ... | | [Tags] | IMIX | 1T1C | STHREAD | NDRDISC | | ... | | ${framesize}= | Set Variable | IMIX_v4_1 | | ${imix_size}= | Get Frame Size | ${framesize} | | ${min_rate}= | Set Variable | ${10000} | | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead} | | ${binary_min}= | Set Variable | ${min_rate} | | ${binary_max}= | Set Variable | ${max_rate} | | ${threshold}= | Set Variable | ${min_rate} | | ${encr_alg}= | Crypto Alg AES CBC 128 | | ${auth_alg}= | Integ Alg SHA1 96 | | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology | | And Generate keys for IPSec | ${encr_alg} | ${auth_alg} | | And Add PCI devices to DUTs in 3-node single link topology | | And Add cryptodev to all DUTs | ${1} | | And Apply startup configuration on all VPP DUTs | | And Initialize IPSec in 3-node circular topology | | And VPP IPsec Create Tunnel Interfaces | | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels} | | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4} | | ... | ${raddr_ip4} | ${addr_range} | | Then Find NDR using binary search and pps | ${framesize} | | ... | ${binary_min} | ${binary_max} | ${traffic_profile} | | ... | ${min_rate} | ${max_rate} | ${threshold} | tc06-IMIX-1t1c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-pdrdisc | | [Documentation] | | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\ | | ... | with 1 thread, 1 phy core, 1 receive queue per NIC port. | | ... | [Ver] Find PDR for IMIX_v4_1 frames using binary search start at 40GE\ | | ... | linerate, step 100kpps and loss tolerance of 0.5%. | | ... | IMIX_v4_1 = (28x64B; 16x570B; 4x1518B) | | ... | | [Tags] | IMIX | 1T1C | STHREAD | PDRDISC | SKIP_PATCH | | ... | | ${framesize}= | Set Variable | IMIX_v4_1 | | ${imix_size}= | Get Frame Size | ${framesize} | | ${min_rate}= | Set Variable | ${10000} | | ${max_rate}= | Calculate pps | ${s_24.5G} | ${imix_size} + ${ipsec_overhead} | | ${binary_min}= | Set Variable | ${min_rate} | | ${binary_max}= | Set Variable | ${max_rate} | | ${threshold}= | Set Variable | ${min_rate} | | ${encr_alg}= | Crypto Alg AES CBC 128 | | ${auth_alg}= | Integ Alg SHA1 96 | | Given Add '1' worker threads and '1' rxqueues in 3-node single-link circular topology | | And Generate keys for IPSec | ${encr_alg} | ${auth_alg} | | And Add PCI devices to DUTs in 3-node single link topology | | And Add cryptodev to all DUTs | ${1} | | And Apply startup configuration on all VPP DUTs | | And Initialize IPSec in 3-node circular topology | | And VPP IPsec Create Tunnel Interfaces | | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels} | | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4} | | ... | ${raddr_ip4} | ${addr_range} | | Then Find PDR using binary search and pps | ${framesize} | | ... | ${binary_min} | ${binary_max} | ${traffic_profile} | | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance} | | ... | ${perf_pdr_loss_acceptance_type} | tc07-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-ndrdisc | | [Documentation] | | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\ | | ... | with 2 thread, 2 phy core, 1 receive queue per NIC port. | | ... | [Ver] Find NDR for 64 Byte frames\ | | ... | using binary search start at 40GE linerate, step 100kpps. | | ... | | [Tags] | 64B | 2T2C | MTHREAD | NDRDISC | | ... | | ${framesize}= | Set Variable | ${64} | | ${min_rate}= | Set Variable | ${10000} | | ${max_rate}= | Set Variable | ${s_18.75Mpps} | | ${binary_min}= | Set Variable | ${min_rate} | | ${binary_max}= | Set Variable | ${max_rate} | | ${threshold}= | Set Variable | ${min_rate} | | ${encr_alg}= | Crypto Alg AES CBC 128 | | ${auth_alg}= | Integ Alg SHA1 96 | | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology | | And Generate keys for IPSec | ${encr_alg} | ${auth_alg} | | And Add PCI devices to DUTs in 3-node single link topology | | And Add no multi seg to all DUTs | | And Add cryptodev to all DUTs | ${2} | | And Apply startup configuration on all VPP DUTs | | And Initialize IPSec in 3-node circular topology | | And VPP IPsec Create Tunnel Interfaces | | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels} | | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4} | | ... | ${raddr_ip4} | ${addr_range} | | Then Find NDR using binary search and pps | ${framesize} | | ... | ${binary_min} | ${binary_max} | ${traffic_profile} | | ... | ${min_rate} | ${max_rate} | ${threshold} | tc08-64B-2t2c-ethip4ipsecbasetnl-ip4base-int-cbc-sha1-pdrdisc | | [Documentation] | | ... | [Cfg] DUTs run 1 IPsec tunnel CBC-SHA1 in each direction, configured\ | | ... | with 2 thread, 2 phy core, 1 receive queue per NIC port. | | ... | [Ver] Find PDR for 64 Byte frames using binary search start at 40GE\ | | ... | linerate, step 100kpps and loss tolerance of 0.5%. | | ... | | [Tags] | 64B | 2T2C | MTHREAD | PDRDISC | SKIP_PATCH | | ... | | ${framesize}= | Set Variable | ${64} | | ${min_rate}= | Set Variable | ${10000} | | ${max_rate}= | Set Variable | ${s_18.75Mpps} | | ${binary_min}= | Set Variable | ${min_rate} | | ${binary_max}= | Set Variable | ${max_rate} | | ${threshold}= | Set Variable | ${min_rate} | | ${encr_alg}= | Crypto Alg AES CBC 128 | | ${auth_alg}= | Integ Alg SHA1 96 | | Given Add '2' worker threads and '1' rxqueues in 3-node single-link circular topology | | And Generate keys for IPSec | ${encr_alg} | ${auth_alg} | | And Add PCI devices to DUTs in 3-node single link topology | | And Add no multi seg to all DUTs | | And Add cryptodev to all DUTs | ${2} | | And Apply startup configuration on all VPP DUTs | | And Initialize IPSec in 3-node circular topology | | And VPP IPsec Create Tunnel Interfaces | | ... | ${dut1} | ${dut2} | ${dut1_if2_ip4} | ${dut2_if1_ip4} | ${n_tunnels} | | ... | ${encr_alg} | ${encr_key} | ${auth_alg} | ${auth_key} | ${laddr_ip4} | | ... | ${raddr_ip4} | ${addr_range} | | Then Find PDR using binary search and pps | ${framesize} | | ... | ${binary_min} | ${binary_max} | ${traffic_profile} | | ... | ${min_rate} | ${max_rate} | ${threshold} | ${perf_pdr_loss_acceptance} | | ... | ${perf_pdr_loss_acceptance_type}