ipsec: infra for selecting backends
[vpp.git] / test / test_ipsec_esp.py
1 import socket
2 import unittest
3 from scapy.layers.ipsec import ESP
4
5 from framework import VppTestRunner
6 from template_ipsec import IpsecTraTests, IpsecTunTests
7 from template_ipsec import TemplateIpsec, IpsecTcpTests
8
9
10 class TemplateIpsecEsp(TemplateIpsec):
11     """
12     Basic test for ipsec esp sanity - tunnel and transport modes.
13
14     Below 4 cases are covered as part of this test
15     1) ipsec esp v4 transport basic test  - IPv4 Transport mode
16         scenario using HMAC-SHA1-96 intergrity algo
17     2) ipsec esp v4 transport burst test
18         Above test for 257 pkts
19     3) ipsec esp 4o4 tunnel basic test    - IPv4 Tunnel mode
20         scenario using HMAC-SHA1-96 intergrity algo
21     4) ipsec esp 4o4 tunnel burst test
22         Above test for 257 pkts
23
24     TRANSPORT MODE:
25
26      ---   encrypt   ---
27     |pg2| <-------> |VPP|
28      ---   decrypt   ---
29
30     TUNNEL MODE:
31
32      ---   encrypt   ---   plain   ---
33     |pg0| <-------  |VPP| <------ |pg1|
34      ---             ---           ---
35
36      ---   decrypt   ---   plain   ---
37     |pg0| ------->  |VPP| ------> |pg1|
38      ---             ---           ---
39     """
40
41     encryption_type = ESP
42
43     @classmethod
44     def setUpClass(cls):
45         super(TemplateIpsecEsp, cls).setUpClass()
46         cls.tun_if = cls.pg0
47         cls.tra_if = cls.pg2
48         cls.logger.info(cls.vapi.ppcli("show int addr"))
49         cls.vapi.ipsec_spd_add_del(cls.tra_spd_id)
50         cls.vapi.ipsec_interface_add_del_spd(cls.tra_spd_id,
51                                              cls.tra_if.sw_if_index)
52         for _, p in cls.params.items():
53             cls.config_esp_tra(p)
54         cls.logger.info(cls.vapi.ppcli("show ipsec"))
55         cls.vapi.ipsec_spd_add_del(cls.tun_spd_id)
56         cls.vapi.ipsec_interface_add_del_spd(cls.tun_spd_id,
57                                              cls.tun_if.sw_if_index)
58         for _, p in cls.params.items():
59             cls.config_esp_tun(p)
60         cls.logger.info(cls.vapi.ppcli("show ipsec"))
61         for _, p in cls.params.items():
62             src = socket.inet_pton(p.addr_type, p.remote_tun_if_host)
63             cls.vapi.ip_add_del_route(
64                 src, p.addr_len, cls.tun_if.remote_addr_n[p.addr_type],
65                 is_ipv6=p.is_ipv6)
66
67     @classmethod
68     def config_esp_tun(cls, params):
69         addr_type = params.addr_type
70         is_ipv6 = params.is_ipv6
71         scapy_tun_sa_id = params.scapy_tun_sa_id
72         scapy_tun_spi = params.scapy_tun_spi
73         vpp_tun_sa_id = params.vpp_tun_sa_id
74         vpp_tun_spi = params.vpp_tun_spi
75         auth_algo_vpp_id = params.auth_algo_vpp_id
76         auth_key = params.auth_key
77         crypt_algo_vpp_id = params.crypt_algo_vpp_id
78         crypt_key = params.crypt_key
79         remote_tun_if_host = params.remote_tun_if_host
80         addr_any = params.addr_any
81         addr_bcast = params.addr_bcast
82         cls.vapi.ipsec_sad_add_del_entry(scapy_tun_sa_id, scapy_tun_spi,
83                                          auth_algo_vpp_id, auth_key,
84                                          crypt_algo_vpp_id, crypt_key,
85                                          cls.vpp_esp_protocol,
86                                          cls.tun_if.local_addr_n[addr_type],
87                                          cls.tun_if.remote_addr_n[addr_type],
88                                          is_tunnel=1, is_tunnel_ipv6=is_ipv6)
89         cls.vapi.ipsec_sad_add_del_entry(vpp_tun_sa_id, vpp_tun_spi,
90                                          auth_algo_vpp_id, auth_key,
91                                          crypt_algo_vpp_id, crypt_key,
92                                          cls.vpp_esp_protocol,
93                                          cls.tun_if.remote_addr_n[addr_type],
94                                          cls.tun_if.local_addr_n[addr_type],
95                                          is_tunnel=1, is_tunnel_ipv6=is_ipv6)
96         l_startaddr = r_startaddr = socket.inet_pton(addr_type, addr_any)
97         l_stopaddr = r_stopaddr = socket.inet_pton(addr_type, addr_bcast)
98         cls.vapi.ipsec_spd_add_del_entry(cls.tun_spd_id, scapy_tun_sa_id,
99                                          l_startaddr, l_stopaddr, r_startaddr,
100                                          r_stopaddr, is_ipv6=is_ipv6,
101                                          protocol=socket.IPPROTO_ESP)
102         cls.vapi.ipsec_spd_add_del_entry(cls.tun_spd_id, scapy_tun_sa_id,
103                                          l_startaddr, l_stopaddr, r_startaddr,
104                                          r_stopaddr, is_outbound=0,
105                                          protocol=socket.IPPROTO_ESP,
106                                          is_ipv6=is_ipv6)
107         l_startaddr = l_stopaddr = socket.inet_pton(addr_type,
108                                                     remote_tun_if_host)
109         r_startaddr = r_stopaddr = cls.pg1.remote_addr_n[addr_type]
110         cls.vapi.ipsec_spd_add_del_entry(cls.tun_spd_id, vpp_tun_sa_id,
111                                          l_startaddr, l_stopaddr, r_startaddr,
112                                          r_stopaddr, priority=10, policy=3,
113                                          is_ipv6=is_ipv6, is_outbound=0)
114         cls.vapi.ipsec_spd_add_del_entry(cls.tun_spd_id, scapy_tun_sa_id,
115                                          r_startaddr, r_stopaddr, l_startaddr,
116                                          l_stopaddr, priority=10, policy=3,
117                                          is_ipv6=is_ipv6)
118         l_startaddr = l_stopaddr = socket.inet_pton(addr_type,
119                                                     remote_tun_if_host)
120         r_startaddr = r_stopaddr = cls.pg0.local_addr_n[addr_type]
121         cls.vapi.ipsec_spd_add_del_entry(cls.tun_spd_id, vpp_tun_sa_id,
122                                          l_startaddr, l_stopaddr, r_startaddr,
123                                          r_stopaddr, priority=20, policy=3,
124                                          is_outbound=0, is_ipv6=is_ipv6)
125         cls.vapi.ipsec_spd_add_del_entry(cls.tun_spd_id, scapy_tun_sa_id,
126                                          r_startaddr, r_stopaddr, l_startaddr,
127                                          l_stopaddr, priority=20, policy=3,
128                                          is_ipv6=is_ipv6)
129
130     @classmethod
131     def config_esp_tra(cls, params):
132         addr_type = params.addr_type
133         is_ipv6 = params.is_ipv6
134         scapy_tra_sa_id = params.scapy_tra_sa_id
135         scapy_tra_spi = params.scapy_tra_spi
136         vpp_tra_sa_id = params.vpp_tra_sa_id
137         vpp_tra_spi = params.vpp_tra_spi
138         auth_algo_vpp_id = params.auth_algo_vpp_id
139         auth_key = params.auth_key
140         crypt_algo_vpp_id = params.crypt_algo_vpp_id
141         crypt_key = params.crypt_key
142         addr_any = params.addr_any
143         addr_bcast = params.addr_bcast
144         cls.vapi.ipsec_sad_add_del_entry(scapy_tra_sa_id, scapy_tra_spi,
145                                          auth_algo_vpp_id, auth_key,
146                                          crypt_algo_vpp_id, crypt_key,
147                                          cls.vpp_esp_protocol, is_tunnel=0)
148         cls.vapi.ipsec_sad_add_del_entry(vpp_tra_sa_id, vpp_tra_spi,
149                                          auth_algo_vpp_id, auth_key,
150                                          crypt_algo_vpp_id, crypt_key,
151                                          cls.vpp_esp_protocol, is_tunnel=0)
152         l_startaddr = r_startaddr = socket.inet_pton(addr_type, addr_any)
153         l_stopaddr = r_stopaddr = socket.inet_pton(addr_type, addr_bcast)
154         cls.vapi.ipsec_spd_add_del_entry(cls.tra_spd_id, vpp_tra_sa_id,
155                                          l_startaddr, l_stopaddr, r_startaddr,
156                                          r_stopaddr, is_ipv6=is_ipv6,
157                                          protocol=socket.IPPROTO_ESP)
158         cls.vapi.ipsec_spd_add_del_entry(cls.tra_spd_id, vpp_tra_sa_id,
159                                          l_startaddr, l_stopaddr, r_startaddr,
160                                          r_stopaddr, is_outbound=0,
161                                          is_ipv6=is_ipv6,
162                                          protocol=socket.IPPROTO_ESP)
163         l_startaddr = l_stopaddr = cls.tra_if.local_addr_n[addr_type]
164         r_startaddr = r_stopaddr = cls.tra_if.remote_addr_n[addr_type]
165         cls.vapi.ipsec_spd_add_del_entry(cls.tra_spd_id, vpp_tra_sa_id,
166                                          l_startaddr, l_stopaddr, r_startaddr,
167                                          r_stopaddr, priority=10, policy=3,
168                                          is_outbound=0, is_ipv6=is_ipv6)
169         cls.vapi.ipsec_spd_add_del_entry(cls.tra_spd_id, scapy_tra_sa_id,
170                                          l_startaddr, l_stopaddr, r_startaddr,
171                                          r_stopaddr, priority=10, policy=3,
172                                          is_ipv6=is_ipv6)
173
174
175 class TestIpsecEsp1(TemplateIpsecEsp, IpsecTraTests, IpsecTunTests):
176     """ Ipsec ESP - TUN & TRA tests """
177     tra4_encrypt_node_name = "esp4-encrypt"
178     tra4_decrypt_node_name = "esp4-decrypt"
179     tra6_encrypt_node_name = "esp6-encrypt"
180     tra6_decrypt_node_name = "esp6-decrypt"
181     tun4_encrypt_node_name = "esp4-encrypt"
182     tun4_decrypt_node_name = "esp4-decrypt"
183     tun6_encrypt_node_name = "esp6-encrypt"
184     tun6_decrypt_node_name = "esp6-decrypt"
185
186
187 class TestIpsecEsp2(TemplateIpsecEsp, IpsecTcpTests):
188     """ Ipsec ESP - TCP tests """
189     pass
190
191
192 if __name__ == '__main__':
193     unittest.main(testRunner=VppTestRunner)