import os
-from logging import error
+import array
from hook import Hook
do_import = True
class L2_VTR_OP:
L2_POP_1 = 3
+need_swap = True if os.sys.byteorder == 'little' else False
class VppPapiProvider(object):
"""VPP-api provider using vpp-papi
"""
- def __init__(self, name, shm_prefix):
+ def __init__(self, name, shm_prefix, test_class):
self.hook = Hook("vpp-papi-provider")
self.name = name
self.shm_prefix = shm_prefix
+ self.test_class = test_class
def register_hook(self, hook):
"""Replace hook registration with new hook
if hasattr(reply, 'retval') and reply.retval != expected_retval:
msg = "API call failed, expected retval == %d, got %s" % (
expected_retval, repr(reply))
- error(msg)
+ self.test_class.test_instance.logger.error(msg)
raise Exception(msg)
self.hook.after_api(api_fn.__name__, api_args)
return reply
self,
src_addr,
dst_addr,
+ mcast_sw_if_index=0xFFFFFFFF,
is_add=1,
is_ipv6=0,
encap_vrf_id=0,
:param is_ipv6: (Default value = 0)
:param encap_vrf_id: (Default value = 0)
:param decap_next_index: (Default value = 0xFFFFFFFF)
+ :param mcast_sw_if_index: (Default value = 0xFFFFFFFF)
:param vni: (Default value = 0)
"""
return self.api(vpp_papi.vxlan_add_del_tunnel,
- (is_add, is_ipv6, src_addr, dst_addr, encap_vrf_id,
- decap_next_index, vni))
+ (is_add, is_ipv6, src_addr, dst_addr, mcast_sw_if_index,
+ encap_vrf_id, decap_next_index, vni))
def bridge_domain_add_del(self, bd_id, flood=1, uu_flood=1, forward=1,
learn=1, arp_term=0, is_add=1):
return self.api(vpp_papi.sw_interface_set_l2_bridge,
(sw_if_index, bd_id, shg, bvi, enable))
+ def bridge_flags(self, bd_id, is_set, feature_bitmap):
+ """Enable/disable required feature of the bridge domain with defined ID.
+
+ :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:
+ - learn (1 << 0),
+ - forward (1 << 1),
+ - flood (1 << 2),
+ - uu-flood (1 << 3) or
+ - arp-term (1 << 4).
+ """
+ return self.api(vpp_papi.bridge_flags, (bd_id, is_set, feature_bitmap))
+
+ def bridge_domain_dump(self, bd_id=0):
+ """
+
+ :param int bd_id: Bridge domain ID. (Default value = 0 => dump of all
+ existing bridge domains returned)
+ :return: Dictionary of bridge domain(s) data.
+ """
+ return self.api(vpp_papi.bridge_domain_dump, (bd_id, ))
+
def sw_interface_set_l2_xconnect(self, rx_sw_if_index, tx_sw_if_index,
enable):
"""Create or delete unidirectional cross-connect from Tx interface to
next_hop_address,
next_hop_sw_if_index=0xFFFFFFFF,
table_id=0,
- resolve_attempts=0,
- classify_table_index=0xFFFFFFFF,
- next_hop_out_label=MPLS_LABEL_INVALID,
next_hop_table_id=0,
+ next_hop_weight=1,
+ next_hop_n_out_labels = 0,
+ next_hop_out_label_stack = [],
+ next_hop_via_label = MPLS_LABEL_INVALID,
create_vrf_if_needed=0,
- resolve_if_needed=0,
+ is_resolve_host=0,
+ is_resolve_attached=0,
+ classify_table_index=0xFFFFFFFF,
is_add=1,
is_drop=0,
is_unreach=0,
is_local=0,
is_classify=0,
is_multipath=0,
- is_resolve_host=0,
- is_resolve_attached=0,
- not_last=0,
- next_hop_weight=1):
+ not_last=0):
"""
:param dst_address_length:
:param next_hop_sw_if_index: (Default value = 0xFFFFFFFF)
:param vrf_id: (Default value = 0)
:param lookup_in_vrf: (Default value = 0)
- :param resolve_attempts: (Default value = 0)
:param classify_table_index: (Default value = 0xFFFFFFFF)
:param create_vrf_if_needed: (Default value = 0)
- :param resolve_if_needed: (Default value = 0)
:param is_add: (Default value = 1)
:param is_drop: (Default value = 0)
:param is_ipv6: (Default value = 0)
:param next_hop_weight: (Default value = 1)
"""
+ stack = array.array('I', next_hop_out_label_stack)
+ if need_swap:
+ stack.byteswap()
+ stack = stack.tostring()
+
return self.api(
vpp_papi.ip_add_del_route,
(next_hop_sw_if_index,
table_id,
- resolve_attempts,
classify_table_index,
- next_hop_out_label,
next_hop_table_id,
create_vrf_if_needed,
- resolve_if_needed,
is_add,
is_drop,
is_unreach,
next_hop_weight,
dst_address_length,
dst_address,
- next_hop_address))
+ next_hop_address,
+ next_hop_n_out_labels,
+ next_hop_via_label,
+ stack))
def ip_neighbor_add_del(self,
sw_if_index,
)
)
- def sw_interface_span_enable_disable(self, sw_if_index_from, sw_if_index_to, enable=1):
+ def sw_interface_span_enable_disable(
+ self, sw_if_index_from, sw_if_index_to, enable=1):
"""
:param sw_if_index_from:
dst_address,
outer_fib_id)
)
+
+ def mpls_route_add_del(
+ self,
+ label,
+ eos,
+ next_hop_proto_is_ip4,
+ next_hop_address,
+ next_hop_sw_if_index=0xFFFFFFFF,
+ table_id=0,
+ next_hop_table_id=0,
+ next_hop_weight=1,
+ next_hop_n_out_labels = 0,
+ next_hop_out_label_stack = [],
+ next_hop_via_label = MPLS_LABEL_INVALID,
+ create_vrf_if_needed=0,
+ is_resolve_host=0,
+ is_resolve_attached=0,
+ is_add=1,
+ is_drop=0,
+ is_multipath=0,
+ classify_table_index=0xFFFFFFFF,
+ is_classify=0,
+ not_last=0):
+ """
+
+ :param dst_address_length:
+ :param next_hop_sw_if_index: (Default value = 0xFFFFFFFF)
+ :param dst_address:
+ :param next_hop_address:
+ :param next_hop_sw_if_index: (Default value = 0xFFFFFFFF)
+ :param vrf_id: (Default value = 0)
+ :param lookup_in_vrf: (Default value = 0)
+ :param classify_table_index: (Default value = 0xFFFFFFFF)
+ :param create_vrf_if_needed: (Default value = 0)
+ :param is_add: (Default value = 1)
+ :param is_drop: (Default value = 0)
+ :param is_ipv6: (Default value = 0)
+ :param is_local: (Default value = 0)
+ :param is_classify: (Default value = 0)
+ :param is_multipath: (Default value = 0)
+ :param is_resolve_host: (Default value = 0)
+ :param is_resolve_attached: (Default value = 0)
+ :param not_last: (Default value = 0)
+ :param next_hop_weight: (Default value = 1)
+
+ """
+ stack = array.array('I', next_hop_out_label_stack)
+ if need_swap:
+ stack.byteswap()
+ stack = stack.tostring()
+
+ return self.api(
+ vpp_papi.mpls_route_add_del,
+ (label,
+ eos,
+ table_id,
+ classify_table_index,
+ create_vrf_if_needed,
+ is_add,
+ is_classify,
+ is_multipath,
+ is_resolve_host,
+ is_resolve_attached,
+ next_hop_proto_is_ip4,
+ next_hop_weight,
+ next_hop_address,
+ next_hop_n_out_labels,
+ next_hop_sw_if_index,
+ next_hop_table_id,
+ next_hop_via_label,
+ stack))
+
+ def mpls_ip_bind_unbind(
+ self,
+ label,
+ dst_address,
+ dst_address_length,
+ table_id=0,
+ ip_table_id=0,
+ is_ip4=1,
+ create_vrf_if_needed=0,
+ is_bind=1):
+ """
+ """
+ return self.api(
+ vpp_papi.mpls_ip_bind_unbind,
+ (table_id,
+ label,
+ ip_table_id,
+ create_vrf_if_needed,
+ is_bind,
+ is_ip4,
+ dst_address_length,
+ dst_address))
+
+ def mpls_tunnel_add_del(
+ self,
+ tun_sw_if_index,
+ next_hop_proto_is_ip4,
+ next_hop_address,
+ next_hop_sw_if_index=0xFFFFFFFF,
+ next_hop_table_id=0,
+ next_hop_weight=1,
+ next_hop_n_out_labels = 0,
+ next_hop_out_label_stack = [],
+ next_hop_via_label = MPLS_LABEL_INVALID,
+ create_vrf_if_needed=0,
+ is_add=1,
+ l2_only=0):
+ """
+
+ :param dst_address_length:
+ :param next_hop_sw_if_index: (Default value = 0xFFFFFFFF)
+ :param dst_address:
+ :param next_hop_address:
+ :param next_hop_sw_if_index: (Default value = 0xFFFFFFFF)
+ :param vrf_id: (Default value = 0)
+ :param lookup_in_vrf: (Default value = 0)
+ :param classify_table_index: (Default value = 0xFFFFFFFF)
+ :param create_vrf_if_needed: (Default value = 0)
+ :param is_add: (Default value = 1)
+ :param is_drop: (Default value = 0)
+ :param is_ipv6: (Default value = 0)
+ :param is_local: (Default value = 0)
+ :param is_classify: (Default value = 0)
+ :param is_multipath: (Default value = 0)
+ :param is_resolve_host: (Default value = 0)
+ :param is_resolve_attached: (Default value = 0)
+ :param not_last: (Default value = 0)
+ :param next_hop_weight: (Default value = 1)
+
+ """
+ stack = array.array('I', next_hop_out_label_stack)
+ if need_swap:
+ stack.byteswap()
+ stack = stack.tostring()
+
+ return self.api(
+ vpp_papi.mpls_tunnel_add_del,
+ (tun_sw_if_index,
+ is_add,
+ l2_only,
+ next_hop_proto_is_ip4,
+ next_hop_weight,
+ next_hop_address,
+ next_hop_n_out_labels,
+ next_hop_sw_if_index,
+ next_hop_table_id,
+ stack))
+
+ return self.api(vpp_papi.sw_interface_span_enable_disable,
+ (sw_if_index_from, sw_if_index_to, enable))