@staticmethod
def vpp_ipsec_set_ip_route(
node, n_tunnels, tunnel_src, traffic_addr, tunnel_dst, interface,
- raddr_range):
+ raddr_range, dst_mac=None):
"""Set IP address and route on interface.
:param node: VPP node to add config on.
: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)
f"exec ip route add {traffic_addr + i}/" \
f"{128 if traffic_addr.version == 6 else 32} " \
f"via {tunnel_dst + i * addr_incr} {if_name}\n"
+ if dst_mac:
+ conf = f"{conf}exec set ip neighbor {if_name} " \
+ f"{tunnel_dst + i * addr_incr} {dst_mac}\n"
tmp_file.write(conf)
+
VatExecutor().execute_script(
tmp_filename, node, timeout=300, json_out=False,
copy_on_execute=True
is_multipath=0,
route=None
)
- err_msg = f"Failed to configure IP addresses and IP routes " \
- f"on interface {interface} on host {node[u'host']}"
+ cmd3 = u"ip_neighbor_add_del"
+ args3 = dict(
+ is_add=True,
+ neighbor=dict(
+ sw_if_index=Topology.get_interface_sw_index(node, interface),
+ flags=0,
+ mac_address=str(dst_mac),
+ ip_address=None
+ )
+ )
+ err_msg = f"Failed to configure IP addresses, IP routes and " \
+ f"IP neighbor on interface {interface} on host {node[u'host']}" \
+ if dst_mac \
+ else f"Failed to configure IP addresses and IP routes " \
+ f"on interface {interface} on host {node[u'host']}"
with PapiSocketExecutor(node) as papi_exec:
for i in range(n_tunnels):
history = bool(not 1 < i < n_tunnels - 2)
papi_exec.add(cmd1, history=history, **args1).\
add(cmd2, history=history, **args2)
+ if dst_mac:
+ args3[u"neighbor"][u"ip_address"] = ip_address(
+ tunnel_dst + i * addr_incr
+ )
+ papi_exec.add(cmd3, history=history, **args3)
papi_exec.get_replies(err_msg)
@staticmethod
IPsecUtil.get_integ_alg_key_len(integ_alg)
).decode() if integ_alg else u""
+ rmac = Topology.get_interface_mac(nodes[u"DUT2"], interface2) \
+ if u"DUT2" in nodes.keys() \
+ else Topology.get_interface_mac(nodes[u"TG"], interface2)
IPsecUtil.vpp_ipsec_set_ip_route(
nodes[u"DUT1"], n_tunnels, tunnel_ip1, raddr_ip2, tunnel_ip2,
- interface1, raddr_range)
- IPsecUtil.vpp_ipsec_set_ip_route(
- nodes[u"DUT2"], n_tunnels, tunnel_ip2, raddr_ip1, tunnel_ip1,
- interface2, raddr_range)
+ interface1, raddr_range, rmac)
IPsecUtil.vpp_ipsec_add_spd(nodes[u"DUT1"], spd_id)
IPsecUtil.vpp_ipsec_spd_add_if(nodes[u"DUT1"], spd_id, interface1)
proto=50, laddr_range=u"100.0.0.0/8", raddr_range=u"100.0.0.0/8"
)
- 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(
- 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(
- 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"
- )
-
IPsecUtil.vpp_ipsec_add_sad_entries(
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_add_sad_entries(
- nodes[u"DUT2"], n_tunnels, sa_id_1, spi_1, crypto_alg, crypto_key,
- integ_alg, integ_key, tunnel_ip1, tunnel_ip2
+ 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"DUT2"], n_tunnels, spd_id, p_lo, True, sa_id_1, raddr_ip2
+ nodes[u"DUT1"], n_tunnels, spd_id, p_lo, True, sa_id_2, raddr_ip1
)
- 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
- )
+ if u"DUT2" in nodes.keys():
+ IPsecUtil.vpp_ipsec_set_ip_route(
+ nodes[u"DUT2"], n_tunnels, tunnel_ip2, raddr_ip1, tunnel_ip1,
+ interface2, raddr_range)
+
+ 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(
+ 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(
+ 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"
+ )
- 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_sad_entries(
+ 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_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_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_spd_add_entries(
- nodes[u"DUT1"], n_tunnels, spd_id, p_lo, True, sa_id_2, raddr_ip1
- )
@staticmethod
def vpp_ipsec_show(node):