import os
-import fnmatch
import time
-from hook import Hook
from collections import deque
-# Sphinx creates auto-generated documentation by importing the python source
-# files and collecting the docstrings from them. The NO_VPP_PAPI flag allows
-# the vpp_papi_provider.py file to be importable without having to build
-# the whole vpp api if the user only wishes to generate the test documentation.
-do_import = True
-try:
- no_vpp_papi = os.getenv("NO_VPP_PAPI")
- if no_vpp_papi == "1":
- do_import = False
-except:
- pass
-
-if do_import:
- from vpp_papi import VPP
+from six import moves, iteritems
+from vpp_papi import VPP, mac_pton
+from hook import Hook
+from vpp_l2 import L2_PORT_TYPE
# from vnet/vnet/mpls/mpls_types.h
MPLS_IETF_MAX_LABEL = 0xfffff
IP = 3
+class SYSLOG_SEVERITY:
+ EMERG = 0
+ ALERT = 1
+ CRIT = 2
+ ERR = 3
+ WARN = 4
+ NOTICE = 5
+ INFO = 6
+ DBG = 7
+
+#
+# Dictionary keyed on message name to override default values for
+# named parameters
+#
+defaultmapping = {'map_add_domain': {'mtu': 1280},
+ 'syslog_set_sender': {'collector_port': 514,
+ 'max_msg_size': 480}}
+
+
class UnexpectedApiReturnValueError(Exception):
""" exception raised when the API return value is unexpected """
pass
_zero, _negative = range(2)
- def __init__(self, name, shm_prefix, test_class):
- self.hook = Hook("vpp-papi-provider")
+ def __init__(self, name, shm_prefix, test_class, read_timeout):
+ self.hook = Hook(test_class)
self.name = name
self.shm_prefix = shm_prefix
self.test_class = test_class
self._expect_api_retval = self._zero
self._expect_stack = []
- jsonfiles = []
- install_dir = os.getenv('VPP_TEST_INSTALL_PATH')
- for root, dirnames, filenames in os.walk(install_dir):
- for filename in fnmatch.filter(filenames, '*.api.json'):
- jsonfiles.append(os.path.join(root, filename))
+ install_dir = os.getenv('VPP_INSTALL_PATH')
+
+ # Vapi requires 'VPP_API_DIR', not set when run from Makefile.
+ if 'VPP_API_DIR' not in os.environ:
+ os.environ['VPP_API_DIR'] = os.getenv('VPP_INSTALL_PATH')
- self.vpp = VPP(jsonfiles, logger=test_class.logger, read_timeout=5)
+ self.vpp = VPP(logger=test_class.logger,
+ read_timeout=read_timeout)
self._events = deque()
def __enter__(self):
return self
- def expect_negative_api_retval(self):
- """ Expect API failure """
+ def assert_negative_api_retval(self):
+ """ Expect API failure - used with with, e.g.:
+ with self.vapi.assert_negative_api_retval():
+ self.vapi.<api call expected to fail>
+ """
self._expect_stack.append(self._expect_api_retval)
self._expect_api_retval = self._negative
return self
- def expect_zero_api_retval(self):
- """ Expect API success """
+ def assert_zero_api_retval(self):
+ """ Expect API success - used with with, e.g.:
+ with self.vapi.assert_negative_api_retval():
+ self.vapi.<api call expected to succeed>
+
+ note: this is useful only inside another with block
+ as success is the default expected value
+ """
self._expect_stack.append(self._expect_api_retval)
self._expect_api_retval = self._zero
return self
self.test_class.logger.debug("New event: %s: %s" % (name, event))
self._events.append(event)
+ def factory(self, name, apifn):
+ def f(*a, **ka):
+ fields = apifn._func.msg.fields
+
+ # add positional and kw arguments
+ d = ka
+ for i, o in enumerate(fields[3:]):
+ try:
+ d[o] = a[i]
+ except:
+ break
+
+ # Default override
+ if name in defaultmapping:
+ for k, v in iteritems(defaultmapping[name]):
+ if k in d:
+ continue
+ d[k] = v
+ return self.api(apifn, d)
+ return f
+
+ def __getattr__(self, name):
+ try:
+ return getattr(self, name)
+ except:
+ return self.factory(name, getattr(self.papi, name))
+
def connect(self):
"""Connect the API to VPP"""
self.vpp.connect(self.name, self.shm_prefix)
if hasattr(reply, 'retval') and reply.retval >= 0:
msg = "API call passed unexpectedly: expected negative "\
"return value instead of %d in %s" % \
- (reply.retval, repr(reply))
+ (reply.retval, moves.reprlib.repr(reply))
self.test_class.logger.info(msg)
raise UnexpectedApiReturnValueError(msg)
elif self._expect_api_retval == self._zero:
if hasattr(reply, 'retval') and reply.retval != expected_retval:
msg = "API call failed, expected %d return value instead "\
"of %d in %s" % (expected_retval, reply.retval,
- repr(reply))
+ moves.reprlib.repr(reply))
self.test_class.logger.info(msg)
raise UnexpectedApiReturnValueError(msg)
else:
"""
self.hook.before_cli(cli)
cli += '\n'
- r = self.papi.cli_inband(length=len(cli), cmd=cli)
+ r = self.papi.cli_inband(cmd=cli)
self.hook.after_cli(cli)
if hasattr(r, 'reply'):
- return r.reply.decode().rstrip('\x00')
+ return r.reply
def ppcli(self, cli):
""" Helper method to print CLI command in case of info logging level.
"""
return cli + "\n" + str(self.cli(cli))
- def _convert_mac(self, mac):
- return mac.replace(':', '').decode('hex')
-
def show_version(self):
""" """
return self.api(self.papi.show_version, {})
{'sw_if_index': sw_if_index, 'is_ipv6': is_ipv6,
'vrf_id': table_id})
+ def sw_interface_get_table(self, sw_if_index, is_ipv6):
+ """ Get the IPvX Table-id for the Interface
+
+ :param sw_if_index:
+ :param is_ipv6:
+ :return table_id
+
+ """
+ return self.api(self.papi.sw_interface_get_table,
+ {'sw_if_index': sw_if_index, 'is_ipv6': is_ipv6})
+
def sw_interface_add_del_address(self, sw_if_index, addr, addr_len,
is_ipv6=0, is_add=1, del_all=0):
"""
'address_length': addr_len,
'address': addr})
+ def ip_address_dump(self, sw_if_index, is_ipv6=0):
+ return self.api(self.papi.ip_address_dump,
+ {'sw_if_index': sw_if_index,
+ 'is_ipv6': is_ipv6})
+
def sw_interface_set_unnumbered(self, sw_if_index, ip_sw_if_index,
is_add=1):
""" Set the Interface to be unnumbered
'unnumbered_sw_if_index': sw_if_index,
'is_add': is_add})
- def sw_interface_enable_disable_mpls(self, sw_if_index,
- is_enable=1):
+ def ip_unnumbered_dump(self, sw_if_index=0xffffffff):
+ return self.api(self.papi.ip_unnumbered_dump,
+ {'sw_if_index': sw_if_index})
+
+ def sw_interface_set_mpls_enable(self, sw_if_index,
+ is_enable=1):
"""
Enable/Disable MPLS on the interface
:param sw_if_index:
{'sw_if_index': sw_if_index,
'enable': is_enable})
- def sw_interface_ra_suppress(self, sw_if_index, suppress=1):
- return self.api(self.papi.sw_interface_ip6nd_ra_config,
- {'sw_if_index': sw_if_index,
- 'suppress': suppress})
-
def set_ip_flow_hash(self,
table_id,
src=1,
'reverse': reverse,
'is_ipv6': is_ip6})
- def ip6_nd_proxy(self, address, sw_if_index, is_del=0):
+ def ip6nd_proxy_add_del(self, ip, sw_if_index, is_del=0):
return self.api(self.papi.ip6nd_proxy_add_del,
- {'address': address,
+ {'ip': ip,
'sw_if_index': sw_if_index,
'is_del': is_del})
- def ip6_sw_interface_ra_config(self, sw_if_index,
- no,
- suppress,
- send_unicast):
- return self.api(self.papi.sw_interface_ip6nd_ra_config,
- {'sw_if_index': sw_if_index,
- 'is_no': no,
- 'suppress': suppress,
- 'send_unicast': send_unicast})
-
- def ip6_sw_interface_ra_prefix(self,
- sw_if_index,
- address,
- address_length,
- use_default=0,
- no_advertise=0,
- off_link=0,
- no_autoconfig=0,
- no_onlink=0,
- is_no=0,
- val_lifetime=0xffffffff,
- pref_lifetime=0xffffffff):
+ def sw_interface_ip6nd_ra_prefix(self,
+ sw_if_index,
+ address,
+ address_length,
+ use_default=0,
+ no_advertise=0,
+ off_link=0,
+ no_autoconfig=0,
+ no_onlink=0,
+ is_no=0,
+ val_lifetime=0xffffffff,
+ pref_lifetime=0xffffffff):
return self.api(self.papi.sw_interface_ip6nd_ra_prefix,
{'sw_if_index': sw_if_index,
- 'address': address,
- 'address_length': address_length,
+ 'prefix': {
+ 'address': address,
+ 'address_length': address_length,
+ },
'use_default': use_default,
'no_advertise': no_advertise,
'off_link': off_link,
'val_lifetime': val_lifetime,
'pref_lifetime': pref_lifetime})
- def ip6_sw_interface_enable_disable(self, sw_if_index, enable):
+ def sw_interface_ip6_enable_disable(self, sw_if_index, enable):
"""
Enable/Disable An interface for IPv6
"""
return self.api(self.papi.bd_ip_mac_add_del,
{'bd_id': bd_id,
'is_add': is_add,
- 'is_ipv6': is_ipv6,
- 'ip_address': ip,
- 'mac_address': mac})
+ 'ip': ip,
+ 'mac': mac})
+
+ def bd_ip_mac_dump(self, bd_id):
+ return self.api(self.papi.bd_ip_mac_dump,
+ {'bd_id': bd_id})
- def want_ip4_arp_events(self, enable_disable=1, address=0):
+ def want_ip4_arp_events(self, enable_disable=1, ip="0.0.0.0"):
return self.api(self.papi.want_ip4_arp_events,
{'enable_disable': enable_disable,
- 'address': address,
+ 'ip': ip,
'pid': os.getpid(), })
- def want_ip6_nd_events(self, enable_disable=1, address=0):
+ def want_ip6_nd_events(self, enable_disable=1, ip="::"):
return self.api(self.papi.want_ip6_nd_events,
{'enable_disable': enable_disable,
- 'address': address,
+ 'ip': ip,
'pid': os.getpid(), })
def want_ip6_ra_events(self, enable_disable=1):
'enable': enable,
'install_default_routes': install_default_routes})
- def want_macs_learn_events(self, enable_disable=1, scan_delay=0,
- max_macs_in_event=0, learn_limit=0):
+ def want_interface_events(self, enable_disable=1):
+ return self.api(self.papi.want_interface_events,
+ {'enable_disable': enable_disable,
+ 'pid': os.getpid(), })
+
+ def want_l2_macs_events(self, enable_disable=1, scan_delay=0,
+ max_macs_in_event=0, learn_limit=0):
return self.api(self.papi.want_l2_macs_events,
{'enable_disable': enable_disable,
'scan_delay': scan_delay,
interface. (Default value = 0)
"""
return self.api(self.papi.l2fib_add_del,
- {'mac': self._convert_mac(mac),
+ {'mac': mac,
'bd_id': bd_id,
'sw_if_index': sw_if_index,
'is_add': is_add,
"""
return self.api(self.papi.l2fib_flush_all, {})
+ def l2_fib_table_dump(self, bd_id):
+ """ Dump the L2 FIB """
+ return self.api(self.papi.l2_fib_table_dump,
+ {'bd_id': bd_id})
+
def sw_interface_set_l2_bridge(self, sw_if_index, bd_id,
- shg=0, bvi=0, enable=1):
+ shg=0, port_type=L2_PORT_TYPE.NORMAL,
+ enable=1):
"""Add/remove interface to/from bridge domain.
:param int sw_if_index: Software interface index of the interface.
{'rx_sw_if_index': sw_if_index,
'bd_id': bd_id,
'shg': shg,
- 'bvi': bvi,
+ 'port_type': port_type,
'enable': enable})
def bridge_flags(self, bd_id, is_set, feature_bitmap):
:param int bd_id: Bridge domain ID.
:param int is_set: Set to 1 to enable, set to 0 to disable the feature.
- :param int feature_bitmap: Bitmap value of the feature to be set:
+ :param int flags: Bitmap value of the feature to be set:
- learn (1 << 0),
- forward (1 << 1),
- flood (1 << 2),
return self.api(self.papi.bridge_flags,
{'bd_id': bd_id,
'is_set': is_set,
- 'feature_bitmap': feature_bitmap})
+ 'flags': feature_bitmap})
def bridge_domain_dump(self, bd_id=0):
"""
'tx_sw_if_index': tx_sw_if_index,
'enable': enable})
- def sw_interface_set_l2_tag_rewrite(
+ def l2_interface_vlan_tag_rewrite(
self,
sw_if_index,
vtr_oper,
'tag1': tag1,
'tag2': tag2})
- def sw_interface_set_l2_emulation(
+ def l2_emulation(
self,
sw_if_index,
enable=1):
{'sw_if_index': sw_if_index,
'enable': enable})
+ def sw_interface_set_ip_directed_broadcast(
+ self,
+ sw_if_index,
+ enable=1):
+ """IP Directed broadcast
+ :param sw_if_index - interface the operation is applied to
+
+ """
+ return self.api(self.papi.sw_interface_set_ip_directed_broadcast,
+ {'sw_if_index': sw_if_index,
+ 'enable': enable})
+
def sw_interface_set_flags(self, sw_if_index, admin_up_down):
"""
{'sw_if_index': sw_if_index,
'mtu': mtu})
- def sw_interface_set_promiscuous(self, sw_if_index, enable):
- """
- :param sw_if_index:
- :param enable:
-
- """
- return self.api(self.papi.sw_interface_set_promiscuous,
- {'sw_if_index': sw_if_index,
- 'enable': enable})
-
def sw_interface_set_mac_address(self, sw_if_index, mac):
return self.api(self.papi.sw_interface_set_mac_address,
{'sw_if_index': sw_if_index,
'outer_vlan_id': outer_vlan,
'inner_vlan_id': inner_vlan})
- def create_p2pethernet_subif(self, sw_if_index, remote_mac, subif_id):
+ def p2p_ethernet_add(self, sw_if_index, remote_mac, subif_id):
"""Create p2p ethernet subinterface
:param sw_if_index: main (parent) interface
return self.api(self.papi.delete_subif,
{'sw_if_index': sw_if_index})
- def delete_p2pethernet_subif(self, sw_if_index, remote_mac):
+ def p2p_ethernet_del(self, sw_if_index, remote_mac):
"""Delete p2p ethernet subinterface
:param sw_if_index: main (parent) interface
def ip_neighbor_add_del(self,
sw_if_index,
mac_address,
- dst_address,
+ ip_address,
is_add=1,
- is_ipv6=0,
- is_static=0,
- is_no_adj_fib=0,
- ):
+ flags=0):
""" Add neighbor MAC to IPv4 or IPv6 address.
:param sw_if_index:
:param mac_address:
:param dst_address:
:param is_add: (Default value = 1)
- :param is_ipv6: (Default value = 0)
- :param is_static: (Default value = 0)
- :param is_no_adj_fib: (Default value = 0)
+ :param flags: (Default value = 0/NONE)
"""
-
return self.api(
self.papi.ip_neighbor_add_del,
- {'sw_if_index': sw_if_index,
- 'is_add': is_add,
- 'is_ipv6': is_ipv6,
- 'is_static': is_static,
- 'is_no_adj_fib': is_no_adj_fib,
- 'mac_address': mac_address,
- 'dst_address': dst_address
- }
+ {
+ 'is_add': is_add,
+ 'neighbor': {
+ 'sw_if_index': sw_if_index,
+ 'flags': flags,
+ 'mac_address': mac_address,
+ 'ip_address': ip_address
+ }
+ }
)
def ip_neighbor_dump(self,
)
def proxy_arp_add_del(self,
- low_address,
- hi_address,
- vrf_id=0,
+ low,
+ hi,
+ table_id=0,
is_add=1):
""" Config Proxy Arp Range.
self.papi.proxy_arp_add_del,
{'proxy':
{
- 'vrf_id': vrf_id,
- 'low_address': low_address,
- 'hi_address': hi_address,
+ 'table_id': table_id,
+ 'low': low,
+ 'hi': hi,
},
'is_add': is_add})
}
)
- def reset_vrf(self,
- vrf_id,
- is_ipv6=0,
- ):
- """ Reset VRF (remove all routes etc.) request.
-
- :param int vrf_id: ID of the FIB table / VRF to reset.
- :param int is_ipv6: 1 for IPv6 neighbor, 0 for IPv4. (Default = 0)
- """
-
- return self.api(
- self.papi.reset_vrf,
- {'vrf_id': vrf_id,
- 'is_ipv6': is_ipv6,
- }
- )
-
def reset_fib(self,
vrf_id,
is_ipv6=0,
'is_l2': is_l2,
})
- def gre_tunnel_add_del(self,
+ def gre_add_del_tunnel(self,
src_address,
dst_address,
outer_fib_id=0,
'session_id': session_id}
)
- def udp_encap_add_del(self,
- id,
- src_ip,
- dst_ip,
- src_port,
- dst_port,
- table_id=0,
- is_add=1,
- is_ip6=0):
+ def udp_encap_add(self,
+ src_ip,
+ dst_ip,
+ src_port,
+ dst_port,
+ table_id=0):
""" Add a GRE tunnel
- :param id: user provided ID
:param src_ip:
:param dst_ip:
:param src_port:
:param dst_port:
:param outer_fib_id: (Default value = 0)
- :param is_add: (Default value = 1)
- :param is_ipv6: (Default value = 0)
"""
return self.api(
- self.papi.udp_encap_add_del,
- {'id': id,
- 'is_add': is_add,
- 'is_ip6': is_ip6,
- 'src_ip': src_ip,
- 'dst_ip': dst_ip,
- 'src_port': src_port,
- 'dst_port': dst_port,
- 'table_id': table_id}
- )
+ self.papi.udp_encap_add,
+ {
+ 'udp_encap': {
+ 'src_ip': src_ip,
+ 'dst_ip': dst_ip,
+ 'src_port': src_port,
+ 'dst_port': dst_port,
+ 'table_id': table_id
+ }
+ })
+
+ def udp_encap_del(self, id):
+ return self.api(self.papi.udp_encap_del, {'id': id})
def udp_encap_dump(self):
return self.api(self.papi.udp_encap_dump, {})
- def want_udp_encap_stats(self, enable=1):
- return self.api(self.papi.want_udp_encap_stats,
- {'enable': enable,
- 'pid': os.getpid()})
-
def mpls_fib_dump(self):
return self.api(self.papi.mpls_fib_dump, {})
'mt_next_hop_n_out_labels': next_hop_n_out_labels,
'mt_next_hop_sw_if_index': next_hop_sw_if_index,
'mt_next_hop_table_id': next_hop_table_id,
+ 'mt_next_hop_via_label': next_hop_via_label,
'mt_next_hop_out_label_stack': next_hop_out_label_stack})
+ def mpls_tunnel_dump(self, sw_if_index=0xffffffff):
+ return self.api(self.papi.mpls_tunnel_dump,
+ {'sw_if_index': sw_if_index})
+
def nat44_interface_add_del_feature(
self,
sw_if_index,
"""
return self.api(self.papi.nat_show_config, {})
- def nat44_add_interface_addr(
+ def nat44_add_del_interface_addr(
self,
sw_if_index,
twice_nat=0,
"""
return self.api(self.papi.nat44_interface_addr_dump, {})
- def nat_ipfix(
+ def nat_ipfix_enable_disable(
self,
domain_id=1,
src_port=4739,
external_addr,
external_port,
protocol,
- vrf_id=0,
twice_nat=0,
self_twice_nat=0,
out2in_only=0,
tag='',
+ affinity=0,
local_num=0,
locals=[],
is_add=1):
:param twice_nat: 1 if translate external host address and port
:param tag: Opaque string tag
+ :param affinity: if 0 disabled, otherwise client IP affinity timeout
:param is_add - 1 if add, 0 if delete
"""
return self.api(
'external_addr': external_addr,
'external_port': external_port,
'protocol': protocol,
- 'vrf_id': vrf_id,
'twice_nat': twice_nat,
'self_twice_nat': self_twice_nat,
'out2in_only': out2in_only,
'tag': tag,
+ 'affinity': affinity,
'local_num': local_num,
'locals': locals})
+ def nat44_lb_static_mapping_add_del_local(
+ self,
+ external_addr,
+ external_port,
+ local_addr,
+ local_port,
+ protocol,
+ probability,
+ vrf_id=0,
+ is_add=1):
+ """Add/delete NAT44 load-balancing static mapping rule backend
+
+ :param external_addr: external IPv4 address of the servic
+ :param external_port: external L4 port number of the service
+ :param local_addr: IPv4 address of the internal node
+ :param local_port: L4 port number of the internal node
+ :param protocol: IP protocol number
+ :param probability: probability of the internal node
+ :param vrf_id: VRF id of the internal node
+ :param is_add: 1 if add, 0 if delete
+ """
+ return self.api(
+ self.papi.nat44_lb_static_mapping_add_del_local,
+ {'is_add': is_add,
+ 'external_addr': external_addr,
+ 'external_port': external_port,
+ 'local': {
+ 'addr': local_addr,
+ 'port': local_port,
+ 'probability': probability,
+ 'vrf_id': vrf_id},
+ 'protocol': protocol})
+
def nat44_lb_static_mapping_dump(self):
"""Dump NAT44 load balancing static mappings
"""
return self.api(self.papi.nat_det_map_dump, {})
- def nat_det_set_timeouts(
+ def nat_set_timeouts(
self,
udp=300,
tcp_established=7440,
tcp_transitory=240,
icmp=60):
- """Set values of timeouts for deterministic NAT (in seconds)
+ """Set values of timeouts for NAT sessions (in seconds)
:param udp - UDP timeout (Default value = 300)
:param tcp_established - TCP established timeout (Default value = 7440)
:param icmp - ICMP timeout (Default value = 60)
"""
return self.api(
- self.papi.nat_det_set_timeouts,
+ self.papi.nat_set_timeouts,
{'udp': udp,
'tcp_established': tcp_established,
'tcp_transitory': tcp_transitory,
'icmp': icmp})
- def nat_det_get_timeouts(self):
- """Get values of timeouts for deterministic NAT
+ def nat_get_timeouts(self):
+ """Get values of timeouts for NAT sessions
+
+ :return: Timeouts for NAT sessions (in seconds)
+ """
+ return self.api(self.papi.nat_get_timeouts, {})
+
+ def nat_set_addr_and_port_alloc_alg(
+ self,
+ alg=0,
+ psid_offset=0,
+ psid_length=0,
+ psid=0,
+ start_port=0,
+ end_port=0):
+ """Set address and port assignment algorithm
- :return: Timeouts for deterministic NAT (in seconds)
+ :param alg: algorithm: 0 - default, 1 - MAP-E, 2 - port range
+ :param psid_offset: number of offset bits (valid only for MAP-E alg)
+ :param psid_length: length of PSID (valid only for MAP-E alg)
+ :param psid: Port Set Identifier value (valid only for MAP-E alg)
+ :param start_port: beginning of the port range
+ :param end_port: end of the port range
"""
- return self.api(self.papi.nat_det_get_timeouts, {})
+ return self.api(
+ self.papi.nat_set_addr_and_port_alloc_alg,
+ {'alg': alg,
+ 'psid_offset': psid_offset,
+ 'psid_length': psid_length,
+ 'psid': psid,
+ 'start_port': start_port,
+ 'end_port': end_port})
+
+ def nat_get_addr_and_port_alloc_alg(self):
+ """Get address and port assignment algorithm"""
+ return self.api(self.papi.nat_get_addr_and_port_alloc_alg, {})
+
+ def nat_set_mss_clamping(self, enable=0, mss_value=1500):
+ """Set TCP MSS rewriting configuration
+
+ :param enable: disable(0)/enable(1) MSS rewriting feature
+ :param mss_value: MSS value to be used for MSS rewriting
+ """
+ return self.api(
+ self.papi.nat_set_mss_clamping,
+ {'enable': enable, 'mss_value': mss_value})
+
+ def nat_get_mss_clamping(self):
+ """Get TCP MSS rewriting configuration"""
+ return self.api(self.papi.nat_get_mss_clamping, {})
def nat_det_close_session_out(
self,
"""
return self.api(self.papi.nat64_bib_dump, {'proto': protocol})
- def nat64_set_timeouts(self, udp=300, icmp=60, tcp_trans=240, tcp_est=7440,
- tcp_incoming_syn=6):
- """Set values of timeouts for NAT64 (in seconds)
-
- :param udpi: UDP timeout (Default value = 300)
- :param icmp: ICMP timeout (Default value = 60)
- :param tcp_trans: TCP transitory timeout (Default value = 240)
- :param tcp_est: TCP established timeout (Default value = 7440)
- :param tcp_incoming_syn: TCP incoming SYN timeout (Default value = 6)
- """
- return self.api(
- self.papi.nat64_set_timeouts,
- {'udp': udp,
- 'icmp': icmp,
- 'tcp_trans': tcp_trans,
- 'tcp_est': tcp_est,
- 'tcp_incoming_syn': tcp_incoming_syn})
-
- def nat64_get_timeouts(self):
- """Get values of timeouts for NAT64
-
- :return: Timeouts for NAT64 (in seconds)
- """
- return self.api(self.papi.nat64_get_timeouts, {})
-
def nat64_st_dump(self, protocol=255):
"""Dump NAT64 session table
"""
return self.api(self.papi.nat64_prefix_dump, {})
- def nat64_add_interface_addr(
+ def nat64_add_del_interface_addr(
self,
sw_if_index,
is_add=1):
"""
return self.api(self.papi.nat66_static_mapping_dump, {})
+ def nat_ha_set_listener(self, addr, port, path_mtu=512):
+ """Set HA listener (local settings)
+
+ :param addr: local IP4 address
+ :param port: local UDP port number
+ :param path_mtu: path MTU (Default value = 512)
+ """
+ return self.api(self.papi.nat_ha_set_listener,
+ {'ip_address': addr,
+ 'port': port,
+ 'path_mtu': path_mtu})
+
+ def nat_ha_get_listener(self):
+ """Get HA listener/local configuration"""
+ return self.api(self.papi.nat_ha_get_listener, {})
+
+ def nat_ha_set_failover(self, addr, port, refresh=10):
+ """Set HA failover (remote settings)
+
+ :param addr: failover IP4 address
+ :param port: failvoer UDP port number
+ :param refresh: number of seconds after which to send session refresh
+ """
+ return self.api(self.papi.nat_ha_set_failover,
+ {'ip_address': addr,
+ 'port': port,
+ 'session_refresh_interval': refresh})
+
+ def nat_ha_get_failover(self):
+ """Get HA failover/remote settings reply"""
+ return self.api(self.papi.nat_ha_get_failover, {})
+
+ def nat_ha_flush(self):
+ """Flush the current HA data"""
+ return self.api(self.papi.nat_ha_flush, {})
+
+ def nat_ha_resync(self, want_resync_event=1):
+ """Resync HA (resend existing sessions to new failover)
+ :param want_resync_event: if non-zero resync completed event sent
+ """
+ return self.api(self.papi.nat_ha_resync,
+ {'want_resync_event': want_resync_event,
+ 'pid': os.getpid()})
+
def control_ping(self):
self.api(self.papi.control_ping)
def bfd_udp_del_echo_source(self):
return self.api(self.papi.bfd_udp_del_echo_source, {})
+ def bfd_udp_get_echo_source(self):
+ return self.api(self.papi.bfd_udp_get_echo_source, {})
+
def classify_add_del_table(
self,
is_add,
:param current_data_offset: (Default value = 0)
"""
+ mask_len = ((len(mask) - 1) / 16 + 1) * 16
+ mask = mask + '\0' * (mask_len - len(mask))
return self.api(
self.papi.classify_add_del_table,
{'is_add': is_add,
'miss_next_index': miss_next_index,
'current_data_flag': current_data_flag,
'current_data_offset': current_data_offset,
+ 'mask_len': mask_len,
'mask': mask})
def classify_add_del_session(
:param metadata: (Default value = 0)
"""
+ match_len = ((len(match) - 1) / 16 + 1) * 16
+ match = match + '\0' * (match_len - len(match))
return self.api(
self.papi.classify_add_del_session,
{'is_add': is_add,
'advance': advance,
'action': action,
'metadata': metadata,
+ 'match_len': match_len,
'match': match})
def input_acl_set_interface(
def dhcp_client_dump(self):
return self.api(self.papi.dhcp_client_dump, {})
- def dhcp_client(self,
- sw_if_index,
- hostname,
- client_id='',
- is_add=1,
- set_broadcast_flag=1,
- want_dhcp_events=0):
+ def dhcp_client_config(self,
+ sw_if_index,
+ hostname,
+ client_id='',
+ is_add=1,
+ set_broadcast_flag=1,
+ want_dhcp_events=0):
return self.api(
self.papi.dhcp_client_config,
{
'is_en': is_enabled,
})
- def lisp_locator_set(self,
- ls_name,
- is_add=1):
+ def lisp_add_del_locator_set(self,
+ ls_name,
+ is_add=1):
return self.api(
self.papi.lisp_add_del_locator_set,
{
def lisp_locator_set_dump(self):
return self.api(self.papi.lisp_locator_set_dump, {})
- def lisp_locator(self,
- ls_name,
- sw_if_index,
- priority=1,
- weight=1,
- is_add=1):
+ def lisp_add_del_locator(self,
+ ls_name,
+ sw_if_index,
+ priority=1,
+ weight=1,
+ is_add=1):
return self.api(
self.papi.lisp_add_del_locator,
{
'ls_index': ls_index,
})
- def lisp_local_mapping(self,
- ls_name,
- eid_type,
- eid,
- prefix_len,
- vni=0,
- key_id=0,
- key="",
- is_add=1):
+ def lisp_add_del_local_eid(self,
+ ls_name,
+ eid_type,
+ eid,
+ prefix_len,
+ vni=0,
+ key_id=0,
+ key="",
+ is_add=1):
return self.api(
self.papi.lisp_add_del_local_eid,
{
'filter': filter_opt,
})
- def lisp_remote_mapping(self,
- eid_type,
- eid,
- eid_prefix_len=0,
- vni=0,
- rlocs=[],
- rlocs_num=0,
- is_src_dst=0,
- is_add=1):
+ def lisp_add_del_remote_mapping(self,
+ eid_type,
+ eid,
+ eid_prefix_len=0,
+ vni=0,
+ rlocs=[],
+ rlocs_num=0,
+ is_src_dst=0,
+ is_add=1):
return self.api(
self.papi.lisp_add_del_remote_mapping,
{
'is_src_dst': is_src_dst,
})
- def lisp_adjacency(self,
- leid,
- reid,
- leid_len,
- reid_len,
- eid_type,
- is_add=1,
- vni=0):
+ def lisp_add_del_adjacency(self,
+ leid,
+ reid,
+ leid_len,
+ reid_len,
+ eid_type,
+ is_add=1,
+ vni=0):
return self.api(
self.papi.lisp_add_del_adjacency,
{
'vni': vni
})
- def map_add_domain(self,
- ip6_prefix,
- ip6_prefix_len,
- ip6_src,
- ip6_src_prefix_len,
- ip4_prefix,
- ip4_prefix_len,
- ea_bits_len=0,
- psid_offset=0,
- psid_length=0,
- is_translation=0,
- is_rfc6052=0,
- mtu=1280):
- return self.api(
- self.papi.map_add_domain,
- {
- 'ip6_prefix': ip6_prefix,
- 'ip6_prefix_len': ip6_prefix_len,
- 'ip4_prefix': ip4_prefix,
- 'ip4_prefix_len': ip4_prefix_len,
- 'ip6_src': ip6_src,
- 'ip6_src_prefix_len': ip6_src_prefix_len,
- 'ea_bits_len': ea_bits_len,
- 'psid_offset': psid_offset,
- 'psid_length': psid_length,
- 'is_translation': is_translation,
- 'is_rfc6052': is_rfc6052,
- 'mtu': mtu
- })
-
def gtpu_add_del_tunnel(
self,
src_addr,
'protocol': protocol,
'vni': vni})
+ def vxlan_gbp_tunnel_add_del(
+ self,
+ src,
+ dst,
+ mcast_sw_if_index=0xFFFFFFFF,
+ is_add=1,
+ is_ipv6=0,
+ encap_table_id=0,
+ vni=0,
+ instance=0xFFFFFFFF):
+ """
+
+ :param dst_addr:
+ :param src_addr:
+ :param is_add: (Default value = 1)
+ :param is_ipv6: (Default value = 0)
+ :param encap_table_id: (Default value = 0)
+ :param decap_next_index: (Default value = 0xFFFFFFFF)
+ :param mcast_sw_if_index: (Default value = 0xFFFFFFFF)
+ :param vni: (Default value = 0)
+ :param instance: (Default value = 0xFFFFFFFF)
+
+ """
+ return self.api(self.papi.vxlan_gbp_tunnel_add_del,
+ {'is_add': is_add,
+ 'tunnel': {
+ 'src': src,
+ 'dst': dst,
+ 'mcast_sw_if_index': mcast_sw_if_index,
+ 'encap_table_id': encap_table_id,
+ 'vni': vni,
+ 'instance': instance}})
+
+ def vxlan_gbp_tunnel_dump(self, sw_if_index=0xffffffff):
+ return self.api(self.papi.vxlan_gbp_tunnel_dump,
+ {'sw_if_index': sw_if_index,
+ '_no_type_conversion': True})
+
def pppoe_add_del_session(
self,
client_ip,
'decap_vrf_id': decap_vrf_id,
'client_mac': client_mac})
+ def sr_mpls_policy_add(self, bsid, weight, type, segments):
+ return self.api(self.papi.sr_mpls_policy_add,
+ {'bsid': bsid,
+ 'weight': weight,
+ 'type': type,
+ 'n_segments': len(segments),
+ 'segments': segments})
+
+ def sr_mpls_policy_del(self, bsid):
+ return self.api(self.papi.sr_mpls_policy_del,
+ {'bsid': bsid})
+
def sr_localsid_add_del(self,
localsid,
behavior,
def ip_punt_redirect(self,
rx_sw_if_index,
tx_sw_if_index,
- nh,
- is_ip6=0,
+ address,
is_add=1):
return self.api(self.papi.ip_punt_redirect,
- {'rx_sw_if_index': rx_sw_if_index,
- 'tx_sw_if_index': tx_sw_if_index,
- 'nh': nh,
- 'is_add': is_add,
- 'is_ip6': is_ip6})
+ {'punt': {'rx_sw_if_index': rx_sw_if_index,
+ 'tx_sw_if_index': tx_sw_if_index,
+ 'nh': address},
+ 'is_add': is_add})
+
+ def ip_punt_redirect_dump(self, sw_if_index, is_ipv6=0):
+ return self.api(self.papi.ip_punt_redirect_dump,
+ {'sw_if_index': sw_if_index,
+ 'is_ipv6': is_ipv6})
def bier_table_add_del(self,
bti,
bti,
bp,
paths,
- is_add=1):
+ is_add=1,
+ is_replace=0):
""" BIER Route add/del """
return self.api(
self.papi.bier_route_add_del,
'br_bp': bp,
'br_n_paths': len(paths),
'br_paths': paths,
- 'br_is_add': is_add})
+ 'br_is_add': is_add,
+ 'br_is_replace': is_replace})
def bier_route_dump(self, bti):
return self.api(
self.papi.ipsec_spd_add_del, {
'spd_id': spd_id, 'is_add': is_add})
+ def ipsec_spds_dump(self):
+ return self.api(self.papi.ipsec_spds_dump, {})
+
def ipsec_interface_add_del_spd(self, spd_id, sw_if_index, is_add=1):
""" IPSEC interface SPD add/del - \
Wrapper to associate/disassociate SPD to interface in VPP
self.papi.ipsec_interface_add_del_spd,
{'spd_id': spd_id, 'sw_if_index': sw_if_index, 'is_add': is_add})
- def ipsec_sad_add_del_entry(self,
+ def ipsec_spd_interface_dump(self, spd_index=None):
+ return self.api(self.papi.ipsec_spd_interface_dump,
+ {'spd_index': spd_index if spd_index else 0,
+ 'spd_index_valid': 1 if spd_index else 0})
+
+ def ipsec_sad_entry_add_del(self,
sad_id,
spi,
integrity_algorithm,
protocol,
tunnel_src_address='',
tunnel_dst_address='',
- is_tunnel=1,
- is_add=1,
- udp_encap=0):
+ flags=0,
+ is_add=1):
""" IPSEC SA add/del
:param sad_id: security association ID
:param spi: security param index of the SA in decimal
crypto and ipsec algorithms
"""
return self.api(
- self.papi.ipsec_sad_add_del_entry,
- {'sad_id': sad_id,
- 'spi': spi,
- 'tunnel_src_address': tunnel_src_address,
- 'tunnel_dst_address': tunnel_dst_address,
- 'protocol': protocol,
- 'integrity_algorithm': integrity_algorithm,
- 'integrity_key_length': len(integrity_key),
- 'integrity_key': integrity_key,
- 'crypto_algorithm': crypto_algorithm,
- 'crypto_key_length': len(crypto_key) if crypto_key is not None
- else 0,
- 'crypto_key': crypto_key,
- 'is_add': is_add,
- 'is_tunnel': is_tunnel,
- 'udp_encap': udp_encap})
+ self.papi.ipsec_sad_entry_add_del,
+ {
+ 'is_add': is_add,
+ 'entry':
+ {
+ 'sad_id': sad_id,
+ 'spi': spi,
+ 'tunnel_src': tunnel_src_address,
+ 'tunnel_dst': tunnel_dst_address,
+ 'protocol': protocol,
+ 'integrity_algorithm': integrity_algorithm,
+ 'integrity_key': {
+ 'length': len(integrity_key),
+ 'data': integrity_key,
+ },
+ 'crypto_algorithm': crypto_algorithm,
+ 'crypto_key': {
+ 'length': len(crypto_key),
+ 'data': crypto_key,
+ },
+ 'flags': flags,
+ }
+ })
- def ipsec_spd_add_del_entry(self,
+ def ipsec_sa_dump(self, sa_id=None):
+ return self.api(self.papi.ipsec_sa_dump,
+ {'sa_id': sa_id if sa_id else 0xffffffff})
+
+ def ipsec_spd_entry_add_del(self,
spd_id,
sa_id,
local_address_start,
priority=100,
is_outbound=1,
is_add=1,
+ is_ipv6=0,
is_ip_any=0):
""" IPSEC policy SPD add/del -
Wrapper to configure ipsec SPD policy entries in VPP
:param is_add: (Default value = 1)
"""
return self.api(
- self.papi.ipsec_spd_add_del_entry,
- {'spd_id': spd_id,
- 'sa_id': sa_id,
- 'local_address_start': local_address_start,
- 'local_address_stop': local_address_stop,
- 'remote_address_start': remote_address_start,
- 'remote_address_stop': remote_address_stop,
- 'local_port_start': local_port_start,
- 'local_port_stop': local_port_stop,
- 'remote_port_start': remote_port_start,
- 'remote_port_stop': remote_port_stop,
- 'is_add': is_add,
- 'protocol': protocol,
- 'policy': policy,
- 'priority': priority,
- 'is_outbound': is_outbound,
- 'is_ip_any': is_ip_any})
+ self.papi.ipsec_spd_entry_add_del,
+ {
+ 'is_add': is_add,
+ 'entry':
+ {
+ 'spd_id': spd_id,
+ 'sa_id': sa_id,
+ 'local_address_start': local_address_start,
+ 'local_address_stop': local_address_stop,
+ 'remote_address_start': remote_address_start,
+ 'remote_address_stop': remote_address_stop,
+ 'local_port_start': local_port_start,
+ 'local_port_stop': local_port_stop,
+ 'remote_port_start': remote_port_start,
+ 'remote_port_stop': remote_port_stop,
+ 'protocol': protocol,
+ 'policy': policy,
+ 'priority': priority,
+ 'is_outbound': is_outbound,
+ 'is_ip_any': is_ip_any
+ }
+ })
+
+ def ipsec_spd_dump(self, spd_id, sa_id=0xffffffff):
+ return self.api(self.papi.ipsec_spd_dump,
+ {'spd_id': spd_id,
+ 'sa_id': sa_id})
def ipsec_tunnel_if_add_del(self, local_ip, remote_ip, local_spi,
remote_spi, crypto_alg, local_crypto_key,
'show_instance': show_instance
})
- def app_namespace_add(self,
- namespace_id,
- ip4_fib_id=0,
- ip6_fib_id=0,
- sw_if_index=0xFFFFFFFF,
- secret=0):
+ def ipsec_select_backend(self, protocol, index):
+ return self.api(self.papi.ipsec_select_backend,
+ {'protocol': protocol, 'index': index})
+
+ def ipsec_backend_dump(self):
+ return self.api(self.papi.ipsec_backend_dump, {})
+
+ def app_namespace_add_del(self,
+ namespace_id,
+ ip4_fib_id=0,
+ ip6_fib_id=0,
+ sw_if_index=0xFFFFFFFF,
+ secret=0):
return self.api(
self.papi.app_namespace_add_del,
{'secret': secret,
'namespace_id': namespace_id,
'namespace_id_len': len(namespace_id)})
- def punt_socket_register(self, l4_port, pathname, header_version=1,
- is_ip4=1, l4_protocol=0x11):
- """ Punt to socket """
+ def punt_socket_register(self, port, pathname, protocol=0x11,
+ header_version=1, is_ip4=1):
+ """ Register punt socket """
return self.api(self.papi.punt_socket_register,
- {'is_ip4': is_ip4,
- 'l4_protocol': l4_protocol,
- 'l4_port': l4_port,
- 'pathname': pathname,
- 'header_version': header_version})
+ {'header_version': header_version,
+ 'punt': {'ipv': is_ip4,
+ 'l4_protocol': protocol,
+ 'l4_port': port},
+ 'pathname': pathname})
+
+ def punt_socket_deregister(self, port, protocol=0x11, is_ip4=1):
+ """ Unregister punt socket """
+ return self.api(self.papi.punt_socket_deregister,
+ {'punt': {'ipv': is_ip4,
+ 'l4_protocol': protocol,
+ 'l4_port': port}})
+
+ def punt_socket_dump(self, is_ip6=1):
+ """ Dump punt socket"""
+ return self.api(self.papi.punt_socket_dump,
+ {'is_ipv6': is_ip6})
def ip_reassembly_set(self, timeout_ms, max_reassemblies,
expire_walk_interval_ms, is_ip6=0):
'enable_ip6': 1 if enable_ip6 else 0,
})
- def gbp_endpoint_add_del(self, is_add, sw_if_index, addr, is_ip6, epg):
- """ GBP endpoint Add/Del """
- return self.api(self.papi.gbp_endpoint_add_del,
- {'is_add': is_add,
- 'endpoint': {
- 'is_ip6': is_ip6,
- 'sw_if_index': sw_if_index,
- 'address': addr,
- 'epg_id': epg}})
+ def gbp_endpoint_add(self, sw_if_index, ips, mac, epg, flags,
+ tun_src, tun_dst):
+ """ GBP endpoint Add """
+ return self.api(self.papi.gbp_endpoint_add,
+ {'endpoint': {
+ 'sw_if_index': sw_if_index,
+ 'ips': ips,
+ 'n_ips': len(ips),
+ 'mac': mac,
+ 'epg_id': epg,
+ 'flags': flags,
+ 'tun': {
+ 'src': tun_src,
+ 'dst': tun_dst,
+ }}})
+
+ def gbp_endpoint_del(self, handle):
+ """ GBP endpoint Del """
+ return self.api(self.papi.gbp_endpoint_del,
+ {'handle': handle})
def gbp_endpoint_dump(self):
""" GBP endpoint Dump """
- return self.api(self.papi.gbp_endpoint_dump, {})
-
- def gbp_endpoint_group_add_del(self, is_add, epg, bd,
- ip4_rd,
- ip6_rd,
- uplink_sw_if_index):
- """ GBP endpoint group Add/Del """
- return self.api(self.papi.gbp_endpoint_group_add_del,
- {'is_add': is_add,
- 'epg': {
+ return self.api(self.papi.gbp_endpoint_dump,
+ {'_no_type_conversion': True})
+
+ def gbp_endpoint_group_add(self, epg, sclass, bd,
+ rd, uplink_sw_if_index,
+ retention):
+ """ GBP endpoint group Add """
+ return self.api(self.papi.gbp_endpoint_group_add,
+ {'epg':
+ {
'uplink_sw_if_index': uplink_sw_if_index,
'bd_id': bd,
- 'ip4_table_id': ip4_rd,
- 'ip6_table_id': ip6_rd,
- 'epg_id': epg}})
+ 'rd_id': rd,
+ 'epg_id': epg,
+ 'sclass': sclass,
+ 'retention': retention
+ }})
+
+ def gbp_endpoint_group_del(self, epg):
+ """ GBP endpoint group Del """
+ return self.api(self.papi.gbp_endpoint_group_del,
+ {'epg_id': epg})
def gbp_endpoint_group_dump(self):
""" GBP endpoint group Dump """
return self.api(self.papi.gbp_endpoint_group_dump, {})
+ def gbp_bridge_domain_add(self, bd_id, flags,
+ bvi_sw_if_index,
+ uu_fwd_sw_if_index,
+ bm_flood_sw_if_index):
+ """ GBP bridge-domain Add """
+ return self.api(self.papi.gbp_bridge_domain_add,
+ {'bd':
+ {
+ 'flags': flags,
+ 'bvi_sw_if_index': bvi_sw_if_index,
+ 'uu_fwd_sw_if_index': uu_fwd_sw_if_index,
+ 'bm_flood_sw_if_index': bm_flood_sw_if_index,
+ 'bd_id': bd_id
+ }})
+
+ def gbp_bridge_domain_del(self, bd_id):
+ """ GBP bridge-domain Del """
+ return self.api(self.papi.gbp_bridge_domain_del,
+ {'bd_id': bd_id})
+
+ def gbp_bridge_domain_dump(self):
+ """ GBP Bridge Domain Dump """
+ return self.api(self.papi.gbp_bridge_domain_dump, {})
+
+ def gbp_route_domain_add(self, rd_id,
+ ip4_table_id,
+ ip6_table_id,
+ ip4_uu_sw_if_index,
+ ip6_uu_sw_if_index):
+ """ GBP route-domain Add """
+ return self.api(self.papi.gbp_route_domain_add,
+ {'rd':
+ {
+ 'ip4_table_id': ip4_table_id,
+ 'ip6_table_id': ip6_table_id,
+ 'ip4_uu_sw_if_index': ip4_uu_sw_if_index,
+ 'ip6_uu_sw_if_index': ip6_uu_sw_if_index,
+ 'rd_id': rd_id
+ }})
+
+ def gbp_route_domain_del(self, rd_id):
+ """ GBP route-domain Del """
+ return self.api(self.papi.gbp_route_domain_del,
+ {'rd_id': rd_id})
+
+ def gbp_route_domain_dump(self):
+ """ GBP Route Domain Dump """
+ return self.api(self.papi.gbp_route_domain_dump, {})
+
def gbp_recirc_add_del(self, is_add, sw_if_index, epg, is_ext):
""" GBP recirc Add/Del """
return self.api(self.papi.gbp_recirc_add_del,
""" GBP recirc Dump """
return self.api(self.papi.gbp_recirc_dump, {})
- def gbp_subnet_add_del(self, is_add, table_id,
- is_internal,
- addr, addr_len,
+ def gbp_ext_itf_add_del(self, is_add, sw_if_index, bd_id, rd_id):
+ """ GBP recirc Add/Del """
+ return self.api(self.papi.gbp_ext_itf_add_del,
+ {'is_add': is_add,
+ 'ext_itf': {
+ 'sw_if_index': sw_if_index,
+ 'bd_id': bd_id,
+ 'rd_id': rd_id}})
+
+ def gbp_ext_itf_dump(self):
+ """ GBP recirc Dump """
+ return self.api(self.papi.gbp_ext_itf_dump, {})
+
+ def gbp_subnet_add_del(self, is_add, rd_id,
+ prefix, type,
sw_if_index=0xffffffff,
- epg_id=0xffffffff,
- is_ip6=False):
+ epg_id=0xffff):
""" GBP Subnet Add/Del """
return self.api(self.papi.gbp_subnet_add_del,
{'is_add': is_add,
'subnet': {
- 'is_internal': is_internal,
- 'is_ip6': is_ip6,
+ 'type': type,
'sw_if_index': sw_if_index,
'epg_id': epg_id,
- 'address': addr,
- 'address_length': addr_len,
- 'table_id': table_id}})
+ 'prefix': prefix,
+ 'rd_id': rd_id}})
def gbp_subnet_dump(self):
""" GBP Subnet Dump """
- return self.api(self.papi.gbp_subnet_dump, {})
+ return self.api(self.papi.gbp_subnet_dump,
+ {'_no_type_conversion': True})
- def gbp_contract_add_del(self, is_add, src_epg, dst_epg, acl_index):
+ def gbp_contract_add_del(self, is_add, src_epg, dst_epg, acl_index,
+ rules, allowed_ethertypes):
""" GBP contract Add/Del """
return self.api(self.papi.gbp_contract_add_del,
{'is_add': is_add,
'contract': {
'acl_index': acl_index,
'src_epg': src_epg,
- 'dst_epg': dst_epg}})
+ 'dst_epg': dst_epg,
+ 'n_rules': len(rules),
+ 'rules': rules,
+ 'n_ether_types': len(allowed_ethertypes),
+ 'allowed_ethertypes': allowed_ethertypes}})
def gbp_contract_dump(self):
""" GBP contract Dump """
return self.api(self.papi.gbp_contract_dump, {})
- def ipip_6rd_add_tunnel(self, fib_index, ip6_prefix, ip6_prefix_len,
- ip4_prefix, ip4_prefix_len, ip4_src,
+ def gbp_vxlan_tunnel_add(self, vni, bd_rd_id, mode):
+ """ GBP VXLAN tunnel add """
+ return self.api(self.papi.gbp_vxlan_tunnel_add,
+ {
+ 'tunnel': {
+ 'vni': vni,
+ 'mode': mode,
+ 'bd_rd_id': bd_rd_id
+ }
+ })
+
+ def gbp_vxlan_tunnel_del(self, vni):
+ """ GBP VXLAN tunnel del """
+ return self.api(self.papi.gbp_vxlan_tunnel_del,
+ {
+ 'vni': vni,
+ })
+
+ def gbp_vxlan_tunnel_dump(self):
+ """ GBP VXLAN tunnel add/del """
+ return self.api(self.papi.gbp_vxlan_tunnel_dump, {})
+
+ def ipip_6rd_add_tunnel(self, ip6_table_id, ip6_prefix, ip6_prefix_len,
+ ip4_table_id, ip4_prefix, ip4_prefix_len, ip4_src,
security_check):
""" 6RD tunnel Add """
return self.api(self.papi.ipip_6rd_add_tunnel,
- {'fib_index': fib_index,
+ {'ip4_table_id': ip4_table_id,
+ 'ip6_table_id': ip6_table_id,
'ip6_prefix': ip6_prefix,
'ip6_prefix_len': ip6_prefix_len,
'ip4_prefix': ip4_prefix,
{'sw_if_index': sw_if_index})
def ipip_add_tunnel(self, src_address, dst_address, is_ipv6=1,
- instance=0xFFFFFFFF, fib_index=0, tc_tos=0):
+ instance=0xFFFFFFFF, table_id=0, tc_tos=0):
""" IPIP tunnel Add/Del """
return self.api(self.papi.ipip_add_tunnel,
{'is_ipv6': is_ipv6,
'instance': instance,
'src_address': src_address,
'dst_address': dst_address,
- 'fib_index': fib_index,
+ 'table_id': table_id,
'tc_tos': tc_tos})
def ipip_del_tunnel(self, sw_if_index):
'mode': host,
'sw_if_index': sw_if_index})
+ def igmp_proxy_device_add_del(self, vrf_id, sw_if_index, add):
+ """ Add/del IGMP proxy device """
+ return self.api(self.papi.igmp_proxy_device_add_del,
+ {'vrf_id': vrf_id, 'sw_if_index': sw_if_index,
+ 'add': add})
+
+ def igmp_proxy_device_add_del_interface(self, vrf_id, sw_if_index, add):
+ """ Add/del interface to/from IGMP proxy device """
+ return self.api(self.papi.igmp_proxy_device_add_del_interface,
+ {'vrf_id': vrf_id, 'sw_if_index': sw_if_index,
+ 'add': add})
+
def igmp_listen(self, filter, sw_if_index, saddrs, gaddr):
""" Listen for new (S,G) on specified interface
'sw_if_index': sw_if_index,
'n_srcs': len(saddrs),
'saddrs': saddrs,
- 'gaddr':
- {
- 'address': gaddr
- }
+ 'gaddr': gaddr
}
})
mode,
lb,
use_custom_mac,
- mac_address=''):
+ mac_address='',
+ interface_id=0xFFFFFFFF):
"""
:param mode: mode
:param lb: load balance
:param use_custom_mac: use custom mac
:param mac_address: mac address
+ :param interface_id: custom interface ID
"""
return self.api(
self.papi.bond_create,
{'mode': mode,
'lb': lb,
'use_custom_mac': use_custom_mac,
- 'mac_address': mac_address
+ 'mac_address': mac_address,
+ 'id': interface_id
})
def bond_delete(
is_server,
sock_filename,
renumber,
+ disable_mrg_rxbuf,
+ disable_indirect_desc,
custom_dev_instance,
use_custom_mac,
mac_address,
:param is_server: is server
:param sock_filename: socket name
:param renumber: renumber
+ :param disable_mrg_rxbuf: disable mergable rx buffers
+ :param disable_indirect_desc: disable indirect descriptors
:param custom_dev_instance: custom dev instance
:param use_custom_mac: use custom mac
:param mac_address: mac address
- :param tag: tag (default ''
+ :param tag: tag (default '')
"""
return self.api(
self.papi.create_vhost_user_if,
{'is_server': is_server,
'sock_filename': sock_filename,
'renumber': renumber,
+ 'disable_mrg_rxbuf': disable_mrg_rxbuf,
+ 'disable_indirect_desc': disable_indirect_desc,
'custom_dev_instance': custom_dev_instance,
'use_custom_mac': use_custom_mac,
'mac_address': mac_address,
def pipe_dump(self):
return self.api(self.papi.pipe_dump, {})
+
+ def memif_create(
+ self,
+ role,
+ mode,
+ rx_queues=None,
+ tx_queues=None,
+ _id=None,
+ socket_id=None,
+ secret=None,
+ ring_size=None,
+ buffer_size=None,
+ hw_addr=None):
+ return self.api(self.papi.memif_create,
+ {'role': role,
+ 'mode': mode,
+ 'rx_queues': rx_queues,
+ 'tx_queues': tx_queues,
+ 'id': _id,
+ 'socket_id': socket_id,
+ 'secret': secret,
+ 'ring_size': ring_size,
+ 'buffer_size': buffer_size,
+ 'hw_addr': hw_addr})
+
+ def memif_delete(self, sw_if_index):
+ return self.api(self.papi.memif_delete, {'sw_if_index': sw_if_index})
+
+ def memif_dump(self):
+ return self.api(self.papi.memif_dump, {})
+
+ def memif_socket_filename_add_del(
+ self, is_add, socket_id, socket_filename):
+ return self.api(
+ self.papi.memif_socket_filename_add_del,
+ {'is_add': is_add,
+ 'socket_id': socket_id,
+ 'socket_filename': socket_filename})
+
+ def memif_socket_filename_dump(self):
+ return self.api(self.papi.memif_socket_filename_dump, {})
+
+ def svs_table_add_del(self, af, table_id, is_add=1):
+ return self.api(self.papi.svs_table_add_del,
+ {
+ 'table_id': table_id,
+ 'is_add': is_add,
+ 'af': af,
+ })
+
+ def svs_route_add_del(self, table_id, prefix, src_table_id, is_add=1):
+ return self.api(self.papi.svs_route_add_del,
+ {
+ 'table_id': table_id,
+ 'source_table_id': src_table_id,
+ 'prefix': prefix,
+ 'is_add': is_add,
+ })
+
+ def svs_enable_disable(self, af, table_id, sw_if_index, is_enable=1):
+ return self.api(self.papi.svs_enable_disable,
+ {
+ 'af': af,
+ 'table_id': table_id,
+ 'sw_if_index': sw_if_index,
+ 'is_enable': is_enable,
+ })
+
+ def svs_dump(self):
+ return self.api(self.papi.svs_dump, {})