# Copyright (c) 2021 Cisco and/or its affiliates.
+# Copyright (c) 2021 PANTHEON.tech s.r.o.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
from enum import Enum, IntEnum
from io import open
+from ipaddress import ip_network, ip_address
from random import choice
from string import ascii_letters
-from ipaddress import ip_network, ip_address
-
from resources.libraries.python.Constants import Constants
+from resources.libraries.python.IncrementUtil import ObjIncrement
from resources.libraries.python.InterfaceUtil import InterfaceUtil, \
InterfaceStatusFlags
from resources.libraries.python.IPAddress import IPAddress
-from resources.libraries.python.IPUtil import IPUtil, IpDscp, MPLS_LABEL_INVALID
+from resources.libraries.python.IPUtil import IPUtil, IpDscp, \
+ MPLS_LABEL_INVALID, NetworkIncrement
from resources.libraries.python.PapiExecutor import PapiSocketExecutor
from resources.libraries.python.ssh import scp_node
-from resources.libraries.python.topology import Topology
+from resources.libraries.python.topology import Topology, NodeType
from resources.libraries.python.VatExecutor import VatExecutor
+from resources.libraries.python.VPPUtil import VPPUtil
IPSEC_UDP_PORT_NONE = 0xffff
self.policy_name = policy_name
self.policy_int_repr = policy_int_repr
+ def __str__(self):
+ return self.policy_name
+
+ def __int__(self):
+ return self.policy_int_repr
+
class CryptoAlg(Enum):
"""Encryption algorithms."""
class IPsecSadFlags(IntEnum):
"""IPsec Security Association Database flags."""
- IPSEC_API_SAD_FLAG_NONE = 0,
+ IPSEC_API_SAD_FLAG_NONE = 0
# Enable extended sequence numbers
- IPSEC_API_SAD_FLAG_USE_ESN = 0x01,
+ IPSEC_API_SAD_FLAG_USE_ESN = 0x01
# Enable Anti - replay
- IPSEC_API_SAD_FLAG_USE_ANTI_REPLAY = 0x02,
+ IPSEC_API_SAD_FLAG_USE_ANTI_REPLAY = 0x02
# IPsec tunnel mode if non-zero, else transport mode
- IPSEC_API_SAD_FLAG_IS_TUNNEL = 0x04,
+ IPSEC_API_SAD_FLAG_IS_TUNNEL = 0x04
# IPsec tunnel mode is IPv6 if non-zero, else IPv4 tunnel
# only valid if is_tunnel is non-zero
- IPSEC_API_SAD_FLAG_IS_TUNNEL_V6 = 0x08,
+ IPSEC_API_SAD_FLAG_IS_TUNNEL_V6 = 0x08
# Enable UDP encapsulation for NAT traversal
- IPSEC_API_SAD_FLAG_UDP_ENCAP = 0x10,
+ IPSEC_API_SAD_FLAG_UDP_ENCAP = 0x10
# IPsec SA is or inbound traffic
IPSEC_API_SAD_FLAG_IS_INBOUND = 0x40
@staticmethod
def vpp_ipsec_crypto_sw_scheduler_set_worker(
- node, worker_index, crypto_enable=False):
+ node, workers, crypto_enable=False):
"""Enable or disable crypto on specific vpp worker threads.
:param node: VPP node to enable or disable crypto for worker threads.
- :param worker_index: VPP worker thread index.
+ :param workers: List of VPP thread numbers.
:param crypto_enable: Disable or enable crypto work.
:type node: dict
- :type worker_index: int
+ :type workers: Iterable[int]
:type crypto_enable: bool
:raises RuntimeError: If failed to enable or disable crypto for worker
thread or if no API reply received.
"""
- cmd = u"crypto_sw_scheduler_set_worker"
- err_msg = f"Failed to disable/enable crypto for worker thread " \
- f"on host {node[u'host']}"
- args = dict(
- worker_index=worker_index,
- crypto_enable=crypto_enable
- )
- with PapiSocketExecutor(node) as papi_exec:
- papi_exec.add(cmd, **args).get_reply(err_msg)
+ for worker in workers:
+ cmd = u"crypto_sw_scheduler_set_worker"
+ err_msg = f"Failed to disable/enable crypto for worker thread " \
+ f"on host {node[u'host']}"
+ args = dict(
+ worker_index=worker - 1,
+ crypto_enable=crypto_enable
+ )
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
+
+ @staticmethod
+ def vpp_ipsec_crypto_sw_scheduler_set_worker_on_all_duts(
+ nodes, workers, crypto_enable=False):
+ """Enable or disable crypto on specific vpp worker threads.
+
+ :param node: VPP node to enable or disable crypto for worker threads.
+ :param workers: List of VPP thread numbers.
+ :param crypto_enable: Disable or enable crypto work.
+ :type node: dict
+ :type workers: Iterable[int]
+ :type crypto_enable: bool
+ :raises RuntimeError: If failed to enable or disable crypto for worker
+ thread or if no API reply received.
+ """
+ for node in nodes.values():
+ if node[u"type"] == NodeType.DUT:
+ thread_data = VPPUtil.vpp_show_threads(node)
+ worker_cnt = len(thread_data) - 1
+ if not worker_cnt:
+ return None
+ worker_ids = list()
+ for item in thread_data:
+ if str(item.cpu_id) in workers.split(u","):
+ worker_ids.append(item.id)
+
+ IPsecUtil.vpp_ipsec_crypto_sw_scheduler_set_worker(
+ node, workers=worker_ids, crypto_enable=crypto_enable
+ )
@staticmethod
def vpp_ipsec_add_sad_entry(
src_addr = u""
dst_addr = u""
- cmd = u"ipsec_sad_entry_add_del_v2"
+ cmd = u"ipsec_sad_entry_add_del_v3"
err_msg = f"Failed to add Security Association Database entry " \
f"on host {node[u'host']}"
sad_entry = dict(
integrity_algorithm=integ_alg.alg_int_repr if integ_alg else 0,
integrity_key=ikey,
flags=flags,
- tunnel_src=str(src_addr),
- tunnel_dst=str(dst_addr),
- tunnel_flags=int(
- TunnelEncpaDecapFlags.TUNNEL_API_ENCAP_DECAP_FLAG_NONE
+ tunnel=dict(
+ src=str(src_addr),
+ dst=str(dst_addr),
+ table_id=0,
+ encap_decap_flags=int(
+ TunnelEncpaDecapFlags.TUNNEL_API_ENCAP_DECAP_FLAG_NONE
+ ),
+ dscp=int(IpDscp.IP_API_DSCP_CS0),
),
- dscp=int(IpDscp.IP_API_DSCP_CS0),
protocol=int(IPsecProto.IPSEC_API_PROTO_ESP),
udp_src_port=4500, # default value in api
udp_dst_port=4500 # default value in api
IPsecSadFlags.IPSEC_API_SAD_FLAG_IS_TUNNEL_V6
)
- cmd = u"ipsec_sad_entry_add_del_v2"
+ cmd = u"ipsec_sad_entry_add_del_v3"
err_msg = f"Failed to add Security Association Database entry " \
f"on host {node[u'host']}"
integrity_algorithm=integ_alg.alg_int_repr if integ_alg else 0,
integrity_key=ikey,
flags=flags,
- tunnel_src=str(src_addr),
- tunnel_dst=str(dst_addr),
- tunnel_flags=int(
- TunnelEncpaDecapFlags.TUNNEL_API_ENCAP_DECAP_FLAG_NONE
+ tunnel=dict(
+ src=str(src_addr),
+ dst=str(dst_addr),
+ table_id=0,
+ encap_decap_flags=int(
+ TunnelEncpaDecapFlags.TUNNEL_API_ENCAP_DECAP_FLAG_NONE
+ ),
+ dscp=int(IpDscp.IP_API_DSCP_CS0),
),
- dscp=int(IpDscp.IP_API_DSCP_CS0),
protocol=int(IPsecProto.IPSEC_API_PROTO_ESP),
udp_src_port=4500, # default value in api
udp_dst_port=4500 # default value in api
for i in range(n_entries):
args[u"entry"][u"sad_id"] = int(sad_id) + i
args[u"entry"][u"spi"] = int(spi) + i
- args[u"entry"][u"tunnel_src"] = str(src_addr + i * addr_incr) \
+ args[u"entry"][u"tunnel"][u"src"] = (
+ str(src_addr + i * addr_incr)
if tunnel_src and tunnel_dst else src_addr
- args[u"entry"][u"tunnel_dst"] = str(dst_addr + i * addr_incr) \
+ )
+ args[u"entry"][u"tunnel"][u"dst"] = (
+ str(dst_addr + i * addr_incr)
if tunnel_src and tunnel_dst else dst_addr
+ )
history = bool(not 1 < i < n_entries - 2)
papi_exec.add(cmd, history=history, **args)
papi_exec.get_replies(err_msg)
:param raddr_range: Mask specifying range of Policy selector Remote IP
addresses. Valid values are from 1 to 32 in case of IPv4 and to 128
in case of IPv6.
+ :param dst_mac: The MAC address of destination tunnels.
:type node: dict
:type n_tunnels: int
:type tunnel_src: str
:type tunnel_dst: str
:type interface: str
:type raddr_range: int
+ :type dst_mac: str
"""
tunnel_src = ip_address(tunnel_src)
tunnel_dst = ip_address(tunnel_dst)
papi_exec.add(cmd, **args).get_reply(err_msg)
@staticmethod
- def vpp_ipsec_policy_add(
+ def vpp_ipsec_create_spds_match_nth_entry(
+ node, dir1_interface, dir2_interface, entry_amount,
+ local_addr_range, remote_addr_range, action=PolicyAction.BYPASS,
+ inbound=False, bidirectional=True):
+ """Create one matching SPD entry for inbound or outbound traffic on
+ a DUT for each traffic direction and also create entry_amount - 1
+ non-matching SPD entries. Create a Security Policy Database on each
+ outbound interface where these entries will be configured.
+ The matching SPD entry will have the lowest priority, input action and
+ will be configured to match the IP flow. The non-matching entries will
+ be the same, except with higher priority and non-matching IP flows.
+
+ Action Protect is currently not supported.
+
+ :param node: VPP node to configured the SPDs and their entries.
+ :param dir1_interface: The interface in direction 1 where the entries
+ will be checked.
+ :param dir2_interface: The interface in direction 2 where the entries
+ will be checked.
+ :param entry_amount: The number of SPD entries to configure. If
+ entry_amount == 1, no non-matching entries will be configured.
+ :param local_addr_range: Matching local address range in direction 1
+ in format IP/prefix or IP/mask. If no mask is provided, it's
+ considered to be /32.
+ :param remote_addr_range: Matching remote address range in
+ direction 1 in format IP/prefix or IP/mask. If no mask is
+ provided, it's considered to be /32.
+ :param action: Policy action.
+ :param inbound: If True policy is for inbound traffic, otherwise
+ outbound.
+ :param bidirectional: When True, will create SPDs in both directions
+ of traffic. When False, only in one direction.
+ :type node: dict
+ :type dir1_interface: Union[string, int]
+ :type dir2_interface: Union[string, int]
+ :type entry_amount: int
+ :type local_addr_range:
+ Union[string, ipaddress.IPv4Address, ipaddress.IPv6Address]
+ :type remote_addr_range:
+ Union[string, ipaddress.IPv4Address, ipaddress.IPv6Address]
+ :type action: IPsecUtil.PolicyAction
+ :type inbound: bool
+ :type bidirectional: bool
+ :raises NotImplementedError: When the action is PolicyAction.PROTECT.
+ """
+
+ if action == PolicyAction.PROTECT:
+ raise NotImplementedError('Policy action PROTECT is not supported.')
+
+ spd_id_dir1 = 1
+ spd_id_dir2 = 2
+ matching_priority = 1
+
+ IPsecUtil.vpp_ipsec_add_spd(node, spd_id_dir1)
+ IPsecUtil.vpp_ipsec_spd_add_if(node, spd_id_dir1, dir1_interface)
+ # matching entry direction 1
+ IPsecUtil.vpp_ipsec_add_spd_entry(
+ node, spd_id_dir1, matching_priority, action,
+ inbound=inbound, laddr_range=local_addr_range,
+ raddr_range=remote_addr_range
+ )
+
+ if bidirectional:
+ IPsecUtil.vpp_ipsec_add_spd(node, spd_id_dir2)
+ IPsecUtil.vpp_ipsec_spd_add_if(node, spd_id_dir2, dir2_interface)
+
+ # matching entry direction 2, the address ranges are switched
+ IPsecUtil.vpp_ipsec_add_spd_entry(
+ node, spd_id_dir2, matching_priority, action,
+ inbound=inbound, laddr_range=remote_addr_range,
+ raddr_range=local_addr_range
+ )
+
+ # non-matching entries
+ no_match_entry_amount = entry_amount - 1
+ if no_match_entry_amount > 0:
+ # create a NetworkIncrement representation of the network,
+ # then skip the matching network
+ no_match_local_addr_range = NetworkIncrement(
+ ip_network(local_addr_range)
+ )
+ next(no_match_local_addr_range)
+
+ no_match_remote_addr_range = NetworkIncrement(
+ ip_network(remote_addr_range)
+ )
+ next(no_match_remote_addr_range)
+
+ # non-matching entries direction 1
+ IPsecUtil.vpp_ipsec_add_spd_entries(
+ node, no_match_entry_amount, spd_id_dir1,
+ ObjIncrement(matching_priority + 1, 1), action,
+ inbound=inbound, laddr_range=no_match_local_addr_range,
+ raddr_range=no_match_remote_addr_range
+ )
+
+ if bidirectional:
+ # reset the networks so that we're using a unified config
+ # the address ranges are switched
+ no_match_remote_addr_range = NetworkIncrement(
+ ip_network(local_addr_range)
+ )
+ next(no_match_remote_addr_range)
+
+ no_match_local_addr_range = NetworkIncrement(
+ ip_network(remote_addr_range)
+ )
+ next(no_match_local_addr_range)
+ # non-matching entries direction 2
+ IPsecUtil.vpp_ipsec_add_spd_entries(
+ node, no_match_entry_amount, spd_id_dir2,
+ ObjIncrement(matching_priority + 1, 1), action,
+ inbound=inbound, laddr_range=no_match_local_addr_range,
+ raddr_range=no_match_remote_addr_range
+ )
+
+ IPsecUtil.vpp_ipsec_show_all(node)
+
+ @staticmethod
+ def vpp_ipsec_add_spd_entry(
node, spd_id, priority, action, inbound=True, sa_id=None,
- laddr_range=None, raddr_range=None, proto=None, lport_range=None,
+ proto=None, laddr_range=None, raddr_range=None, lport_range=None,
rport_range=None, is_ipv6=False):
"""Create Security Policy Database entry on the VPP node.
:param action: Policy action.
:param inbound: If True policy is for inbound traffic, otherwise
outbound.
- :param sa_id: SAD entry ID for protect action.
- :param laddr_range: Policy selector local IPv4 or IPv6 address range in
- format IP/prefix or IP/mask. If no mask is provided,
+ :param sa_id: SAD entry ID for action PolicyAction.PROTECT.
+ :param proto: Policy selector next layer protocol number.
+ :param laddr_range: Policy selector local IPv4 or IPv6 address range
+ in format IP/prefix or IP/mask. If no mask is provided,
it's considered to be /32.
- :param raddr_range: Policy selector remote IPv4 or IPv6 address range in
- format IP/prefix or IP/mask. If no mask is provided,
+ :param raddr_range: Policy selector remote IPv4 or IPv6 address range
+ in format IP/prefix or IP/mask. If no mask is provided,
it's considered to be /32.
- :param proto: Policy selector next layer protocol number.
:param lport_range: Policy selector local TCP/UDP port range in format
<port_start>-<port_end>.
:param rport_range: Policy selector remote TCP/UDP port range in format
:type node: dict
:type spd_id: int
:type priority: int
- :type action: PolicyAction
+ :type action: IPsecUtil.PolicyAction
:type inbound: bool
:type sa_id: int
+ :type proto: int
:type laddr_range: string
:type raddr_range: string
- :type proto: int
:type lport_range: string
:type rport_range: string
:type is_ipv6: bool
if raddr_range is None:
raddr_range = u"::/0" if is_ipv6 else u"0.0.0.0/0"
+ local_net = ip_network(laddr_range, strict=False)
+ remote_net = ip_network(raddr_range, strict=False)
+
cmd = u"ipsec_spd_entry_add_del"
- err_msg = f"Failed to add entry to Security Policy Database {spd_id} " \
- f"on host {node[u'host']}"
+ err_msg = f"Failed to add entry to Security Policy Database " \
+ f"{spd_id} on host {node[u'host']}"
spd_entry = dict(
spd_id=int(spd_id),
priority=int(priority),
is_outbound=not inbound,
sa_id=int(sa_id) if sa_id else 0,
- policy=action.policy_int_repr,
+ policy=int(action),
protocol=int(proto) if proto else 0,
remote_address_start=IPAddress.create_ip_address_object(
- ip_network(raddr_range, strict=False).network_address
+ remote_net.network_address
),
remote_address_stop=IPAddress.create_ip_address_object(
- ip_network(raddr_range, strict=False).broadcast_address
+ remote_net.broadcast_address
),
local_address_start=IPAddress.create_ip_address_object(
- ip_network(laddr_range, strict=False).network_address
+ local_net.network_address
),
local_address_stop=IPAddress.create_ip_address_object(
- ip_network(laddr_range, strict=False).broadcast_address
+ local_net.broadcast_address
),
remote_port_start=int(rport_range.split(u"-")[0]) if rport_range
else 0,
papi_exec.add(cmd, **args).get_reply(err_msg)
@staticmethod
- def vpp_ipsec_spd_add_entries(
- node, n_entries, spd_id, priority, inbound, sa_id, raddr_ip,
- raddr_range=0):
+ def vpp_ipsec_add_spd_entries(
+ node, n_entries, spd_id, priority, action, inbound, sa_id=None,
+ proto=None, laddr_range=None, raddr_range=None, lport_range=None,
+ rport_range=None, is_ipv6=False):
"""Create multiple Security Policy Database entries on the VPP node.
:param node: VPP node to add SPD entries on.
:param n_entries: Number of SPD entries to be added.
:param spd_id: SPD ID to add entries on.
:param priority: SPD entries priority, higher number = higher priority.
+ :param action: Policy action.
:param inbound: If True policy is for inbound traffic, otherwise
outbound.
- :param sa_id: SAD entry ID for first entry. Each subsequent entry will
- SAD entry ID incremented by 1.
- :param raddr_ip: Policy selector remote IPv4 start address for the first
- entry. Remote IPv4 end address will be calculated depending on
- raddr_range parameter. Each subsequent entry will have start address
- next after IPv4 end address of previous entry.
- :param raddr_range: Required IP addres range.
+ :param sa_id: SAD entry ID for action PolicyAction.PROTECT.
+ :param proto: Policy selector next layer protocol number.
+ :param laddr_range: Policy selector local IPv4 or IPv6 address range
+ in format IP/prefix or IP/mask. If no mask is provided,
+ it's considered to be /32.
+ :param raddr_range: Policy selector remote IPv4 or IPv6 address range
+ in format IP/prefix or IP/mask. If no mask is provided,
+ it's considered to be /32.
+ :param lport_range: Policy selector local TCP/UDP port range in format
+ <port_start>-<port_end>.
+ :param rport_range: Policy selector remote TCP/UDP port range in format
+ <port_start>-<port_end>.
+ :param is_ipv6: True in case of IPv6 policy when IPv6 address range is
+ not defined so it will default to address ::/0, otherwise False.
:type node: dict
:type n_entries: int
:type spd_id: int
- :type priority: int
+ :type priority: IPsecUtil.ObjIncrement
+ :type action: IPsecUtil.PolicyAction
:type inbound: bool
- :type sa_id: int
- :type raddr_ip: str
- :type raddr_range: int
+ :type sa_id: IPsecUtil.ObjIncrement
+ :type proto: int
+ :type laddr_range: IPsecUtil.NetworkIncrement
+ :type raddr_range: IPsecUtil.NetworkIncrement
+ :type lport_range: string
+ :type rport_range: string
+ :type is_ipv6: bool
"""
- raddr_ip = ip_address(raddr_ip)
+ if laddr_range is None:
+ laddr_range = u"::/0" if is_ipv6 else u"0.0.0.0/0"
+ laddr_range = NetworkIncrement(ip_network(laddr_range), 0)
+
+ if raddr_range is None:
+ raddr_range = u"::/0" if is_ipv6 else u"0.0.0.0/0"
+ raddr_range = NetworkIncrement(ip_network(raddr_range), 0)
+
+ lport_range_start = 0
+ lport_range_stop = 65535
+ if lport_range:
+ lport_range_start, lport_range_stop = lport_range.split('-')
+
+ rport_range_start = 0
+ rport_range_stop = 65535
+ if rport_range:
+ rport_range_start, rport_range_stop = rport_range.split('-')
+
if int(n_entries) > 10:
- tmp_filename = f"/tmp/ipsec_spd_{sa_id}_add_del_entry.script"
+ tmp_filename = f"/tmp/ipsec_spd_{spd_id}_add_del_entry.script"
with open(tmp_filename, 'w') as tmp_file:
- for i in range(n_entries):
+ for _ in range(n_entries):
direction = u'inbound' if inbound else u'outbound'
- tunnel = f"exec ipsec policy add spd {spd_id} " \
- f"priority {priority} {direction} " \
- f"action protect sa {sa_id+i} " \
- f"remote-ip-range {raddr_ip + i * (raddr_range + 1)} " \
- f"- {raddr_ip + (i + 1) * raddr_range + i} " \
- f"local-ip-range 0.0.0.0 - 255.255.255.255\n"
- tmp_file.write(tunnel)
+ sa = f' sa {sa_id.inc_fmt()}' if sa_id is not None else ''
+ protocol = f' protocol {protocol}' if proto else ''
+ local_port_range = f' local-port-range ' \
+ f'{lport_range_start} - {lport_range_stop}' \
+ if lport_range else ''
+ remote_port_range = f' remote-port-range ' \
+ f'{rport_range_start} - {rport_range_stop}' \
+ if rport_range else ''
+
+ spd_cfg = f"exec ipsec policy add spd {spd_id} " \
+ f"priority {priority.inc_fmt()} {direction}" \
+ f"{protocol} action {action}{sa} " \
+ f"local-ip-range {laddr_range.inc_fmt()} " \
+ f"remote-ip-range {raddr_range.inc_fmt()}" \
+ f"{local_port_range}{remote_port_range}\n"
+
+ tmp_file.write(spd_cfg)
+
VatExecutor().execute_script(
tmp_filename, node, timeout=300, json_out=False,
copy_on_execute=True
os.remove(tmp_filename)
return
- laddr_range = u"::/0" if raddr_ip.version == 6 else u"0.0.0.0/0"
-
- cmd = u"ipsec_spd_entry_add_del"
- err_msg = f"ailed to add entry to Security Policy Database '{spd_id} " \
- f"on host {node[u'host']}"
-
- spd_entry = dict(
- spd_id=int(spd_id),
- priority=int(priority),
- is_outbound=not inbound,
- sa_id=int(sa_id) if sa_id else 0,
- policy=getattr(PolicyAction.PROTECT, u"policy_int_repr"),
- protocol=0,
- remote_address_start=IPAddress.create_ip_address_object(raddr_ip),
- remote_address_stop=IPAddress.create_ip_address_object(raddr_ip),
- local_address_start=IPAddress.create_ip_address_object(
- ip_network(laddr_range, strict=False).network_address
- ),
- local_address_stop=IPAddress.create_ip_address_object(
- ip_network(laddr_range, strict=False).broadcast_address
- ),
- remote_port_start=0,
- remote_port_stop=65535,
- local_port_start=0,
- local_port_stop=65535
- )
- args = dict(
- is_add=True,
- entry=spd_entry
- )
-
- with PapiSocketExecutor(node) as papi_exec:
- for i in range(n_entries):
- args[u"entry"][u"remote_address_start"][u"un"] = \
- IPAddress.union_addr(raddr_ip + i)
- args[u"entry"][u"remote_address_stop"][u"un"] = \
- IPAddress.union_addr(raddr_ip + i)
- history = bool(not 1 < i < n_entries - 2)
- papi_exec.add(cmd, history=history, **args)
- papi_exec.get_replies(err_msg)
+ for _ in range(n_entries):
+ IPsecUtil.vpp_ipsec_add_spd_entry(
+ node, spd_id, next(priority), action, inbound,
+ next(sa_id) if sa_id is not None else sa_id,
+ proto, next(laddr_range), next(raddr_range), lport_range,
+ rport_range, is_ipv6
+ )
@staticmethod
def _ipsec_create_tunnel_interfaces_dut1_vat(
# Configure IPSec SAD entries
ckeys = [bytes()] * existing_tunnels
ikeys = [bytes()] * existing_tunnels
- cmd = u"ipsec_sad_entry_add_del_v2"
+ cmd = u"ipsec_sad_entry_add_del_v3"
c_key = dict(
length=0,
data=None
integrity_algorithm=integ_alg.alg_int_repr if integ_alg else 0,
integrity_key=i_key,
flags=None,
- tunnel_src=0,
- tunnel_dst=0,
- tunnel_flags=int(
- TunnelEncpaDecapFlags.TUNNEL_API_ENCAP_DECAP_FLAG_NONE
+ tunnel=dict(
+ src=0,
+ dst=0,
+ table_id=0,
+ encap_decap_flags=int(
+ TunnelEncpaDecapFlags.TUNNEL_API_ENCAP_DECAP_FLAG_NONE
+ ),
+ dscp=int(IpDscp.IP_API_DSCP_CS0),
),
- dscp=int(IpDscp.IP_API_DSCP_CS0),
- table_id=0,
salt=0,
udp_src_port=IPSEC_UDP_PORT_NONE,
- udp_dst_port=IPSEC_UDP_PORT_NONE
+ udp_dst_port=IPSEC_UDP_PORT_NONE,
)
args = dict(
is_add=True,
]
)
# Configure IPSec SAD entries
- cmd = u"ipsec_sad_entry_add_del_v2"
+ cmd = u"ipsec_sad_entry_add_del_v3"
c_key = dict(
length=0,
data=None
sad_id=None,
spi=None,
protocol=int(IPsecProto.IPSEC_API_PROTO_ESP),
-
crypto_algorithm=crypto_alg.alg_int_repr,
crypto_key=c_key,
integrity_algorithm=integ_alg.alg_int_repr if integ_alg else 0,
integrity_key=i_key,
-
flags=None,
- tunnel_src=0,
- tunnel_dst=0,
- tunnel_flags=int(
- TunnelEncpaDecapFlags.TUNNEL_API_ENCAP_DECAP_FLAG_NONE
+ tunnel=dict(
+ src=0,
+ dst=0,
+ table_id=0,
+ encap_decap_flags=int(
+ TunnelEncpaDecapFlags.TUNNEL_API_ENCAP_DECAP_FLAG_NONE
+ ),
+ dscp=int(IpDscp.IP_API_DSCP_CS0),
),
- dscp=int(IpDscp.IP_API_DSCP_CS0),
- table_id=0,
salt=0,
udp_src_port=IPSEC_UDP_PORT_NONE,
- udp_dst_port=IPSEC_UDP_PORT_NONE
+ udp_dst_port=IPSEC_UDP_PORT_NONE,
)
args = dict(
is_add=True,
IPsecUtil.vpp_ipsec_add_spd(nodes[u"DUT1"], spd_id)
IPsecUtil.vpp_ipsec_spd_add_if(nodes[u"DUT1"], spd_id, interface1)
- IPsecUtil.vpp_ipsec_policy_add(
+ IPsecUtil.vpp_ipsec_add_spd_entry(
nodes[u"DUT1"], spd_id, p_hi, PolicyAction.BYPASS, inbound=False,
proto=50, laddr_range=u"100.0.0.0/8", raddr_range=u"100.0.0.0/8"
)
- IPsecUtil.vpp_ipsec_policy_add(
+ IPsecUtil.vpp_ipsec_add_spd_entry(
nodes[u"DUT1"], spd_id, p_hi, PolicyAction.BYPASS, inbound=True,
proto=50, laddr_range=u"100.0.0.0/8", raddr_range=u"100.0.0.0/8"
)
nodes[u"DUT1"], n_tunnels, sa_id_1, spi_1, crypto_alg, crypto_key,
integ_alg, integ_key, tunnel_ip1, tunnel_ip2
)
- IPsecUtil.vpp_ipsec_spd_add_entries(
- nodes[u"DUT1"], n_tunnels, spd_id, p_lo, False, sa_id_1, raddr_ip2
+
+ IPsecUtil.vpp_ipsec_add_spd_entries(
+ nodes[u"DUT1"], n_tunnels, spd_id, priority=ObjIncrement(p_lo, 0),
+ action=PolicyAction.PROTECT, inbound=False,
+ sa_id=ObjIncrement(sa_id_1, 1),
+ raddr_range=NetworkIncrement(ip_network(raddr_ip2))
)
IPsecUtil.vpp_ipsec_add_sad_entries(
nodes[u"DUT1"], n_tunnels, sa_id_2, spi_2, crypto_alg, crypto_key,
integ_alg, integ_key, tunnel_ip2, tunnel_ip1
)
- IPsecUtil.vpp_ipsec_spd_add_entries(
- nodes[u"DUT1"], n_tunnels, spd_id, p_lo, True, sa_id_2, raddr_ip1
+ IPsecUtil.vpp_ipsec_add_spd_entries(
+ nodes[u"DUT1"], n_tunnels, spd_id, priority=ObjIncrement(p_lo, 0),
+ action=PolicyAction.PROTECT, inbound=True,
+ sa_id=ObjIncrement(sa_id_2, 1),
+ raddr_range=NetworkIncrement(ip_network(raddr_ip1))
)
if u"DUT2" in nodes.keys():
IPsecUtil.vpp_ipsec_add_spd(nodes[u"DUT2"], spd_id)
IPsecUtil.vpp_ipsec_spd_add_if(nodes[u"DUT2"], spd_id, interface2)
- IPsecUtil.vpp_ipsec_policy_add(
+ IPsecUtil.vpp_ipsec_add_spd_entry(
nodes[u"DUT2"], spd_id, p_hi, PolicyAction.BYPASS,
inbound=False, proto=50, laddr_range=u"100.0.0.0/8",
raddr_range=u"100.0.0.0/8"
)
- IPsecUtil.vpp_ipsec_policy_add(
+ IPsecUtil.vpp_ipsec_add_spd_entry(
nodes[u"DUT2"], spd_id, p_hi, PolicyAction.BYPASS,
inbound=True, proto=50, laddr_range=u"100.0.0.0/8",
raddr_range=u"100.0.0.0/8"
nodes[u"DUT2"], n_tunnels, sa_id_1, spi_1, crypto_alg,
crypto_key, integ_alg, integ_key, tunnel_ip1, tunnel_ip2
)
- IPsecUtil.vpp_ipsec_spd_add_entries(
- nodes[u"DUT2"], n_tunnels, spd_id, p_lo, True, sa_id_1,
- raddr_ip2
+ IPsecUtil.vpp_ipsec_add_spd_entries(
+ nodes[u"DUT2"], n_tunnels, spd_id,
+ priority=ObjIncrement(p_lo, 0),
+ action=PolicyAction.PROTECT, inbound=True,
+ sa_id=ObjIncrement(sa_id_1, 1),
+ raddr_range=NetworkIncrement(ip_network(raddr_ip2))
)
IPsecUtil.vpp_ipsec_add_sad_entries(
nodes[u"DUT2"], n_tunnels, sa_id_2, spi_2, crypto_alg,
crypto_key, integ_alg, integ_key, tunnel_ip2, tunnel_ip1
)
- IPsecUtil.vpp_ipsec_spd_add_entries(
- nodes[u"DUT2"], n_tunnels, spd_id, p_lo, False, sa_id_2,
- raddr_ip1
+ IPsecUtil.vpp_ipsec_add_spd_entries(
+ nodes[u"DUT2"], n_tunnels, spd_id,
+ priority=ObjIncrement(p_lo, 0),
+ action=PolicyAction.PROTECT, inbound=False,
+ sa_id=ObjIncrement(sa_id_2, 1),
+ raddr_range=NetworkIncrement(ip_network(raddr_ip1))
)
-
@staticmethod
- def vpp_ipsec_show(node):
- """Run "show ipsec" debug CLI command.
+ def vpp_ipsec_show_all(node):
+ """Run "show ipsec all" debug CLI command.
:param node: Node to run command on.
:type node: dict
"""
- PapiSocketExecutor.run_cli_cmd(node, u"show ipsec")
+ PapiSocketExecutor.run_cli_cmd(node, u"show ipsec all")
@staticmethod
def show_ipsec_security_association(node):
:type node: dict
"""
cmds = [
- u"ipsec_sa_v2_dump"
+ u"ipsec_sa_v3_dump"
]
PapiSocketExecutor.dump_and_log(node, cmds)