+ {'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,
+ mpls_label,
+ is_add=1):
+ """ BIER Table add/del """
+ return self.api(
+ self.papi.bier_table_add_del,
+ {'bt_tbl_id': {"bt_set": bti.set_id,
+ "bt_sub_domain": bti.sub_domain_id,
+ "bt_hdr_len_id": bti.hdr_len_id},
+ 'bt_label': mpls_label,
+ 'bt_is_add': is_add})
+
+ def bier_table_dump(self):
+ return self.api(self.papi.bier_table_dump, {})
+
+ def bier_route_add_del(self,
+ bti,
+ bp,
+ paths,
+ is_add=1,
+ is_replace=0):
+ """ BIER Route add/del """
+ return self.api(
+ self.papi.bier_route_add_del,
+ {
+ 'br_route': {
+ 'br_tbl_id': {"bt_set": bti.set_id,
+ "bt_sub_domain": bti.sub_domain_id,
+ "bt_hdr_len_id": bti.hdr_len_id},
+ 'br_bp': bp,
+ 'br_n_paths': len(paths),
+ 'br_paths': paths,
+ },
+ 'br_is_add': is_add,
+ 'br_is_replace': is_replace
+ })
+
+ def bier_route_dump(self, bti):
+ return self.api(
+ self.papi.bier_route_dump,
+ {'br_tbl_id': {"bt_set": bti.set_id,
+ "bt_sub_domain": bti.sub_domain_id,
+ "bt_hdr_len_id": bti.hdr_len_id}})
+
+ def bier_imp_add(self,
+ bti,
+ src,
+ ibytes,
+ is_add=1):
+ """ BIER Imposition Add """
+ return self.api(
+ self.papi.bier_imp_add,
+ {'bi_tbl_id': {"bt_set": bti.set_id,
+ "bt_sub_domain": bti.sub_domain_id,
+ "bt_hdr_len_id": bti.hdr_len_id},
+ 'bi_src': src,
+ 'bi_n_bytes': len(ibytes),
+ 'bi_bytes': ibytes})
+
+ def bier_imp_del(self, bi_index):
+ """ BIER Imposition del """
+ return self.api(
+ self.papi.bier_imp_del,
+ {'bi_index': bi_index})
+
+ def bier_imp_dump(self):
+ return self.api(self.papi.bier_imp_dump, {})
+
+ def bier_disp_table_add_del(self,
+ bdti,
+ is_add=1):
+ """ BIER Disposition Table add/del """
+ return self.api(
+ self.papi.bier_disp_table_add_del,
+ {'bdt_tbl_id': bdti,
+ 'bdt_is_add': is_add})
+
+ def bier_disp_table_dump(self):
+ return self.api(self.papi.bier_disp_table_dump, {})
+
+ def bier_disp_entry_add_del(self,
+ bdti,
+ bp,
+ payload_proto,
+ next_hop_afi,
+ next_hop,
+ next_hop_tbl_id=0,
+ next_hop_rpf_id=~0,
+ next_hop_is_ip4=1,
+ is_add=1):
+ """ BIER Route add/del """
+ lstack = []
+ while (len(lstack) < 16):
+ lstack.append({})
+ return self.api(
+ self.papi.bier_disp_entry_add_del,
+ {'bde_tbl_id': bdti,
+ 'bde_bp': bp,
+ 'bde_payload_proto': payload_proto,
+ 'bde_n_paths': 1,
+ 'bde_paths': [{'table_id': next_hop_tbl_id,
+ 'rpf_id': next_hop_rpf_id,
+ 'n_labels': 0,
+ 'label_stack': lstack}],
+ 'bde_is_add': is_add})
+
+ def bier_disp_entry_dump(self, bdti):
+ return self.api(
+ self.papi.bier_disp_entry_dump,
+ {'bde_tbl_id': bdti})
+
+ def session_enable_disable(self, is_enabled):
+ return self.api(
+ self.papi.session_enable_disable,
+ {'is_enable': is_enabled})
+
+ def ipsec_spd_add_del(self, spd_id, is_add=1):
+ """ SPD add/del - Wrapper to add or del ipsec SPD
+ Sample CLI : 'ipsec spd add 1'
+
+ :param spd_id - SPD ID to be created in the vpp . mandatory
+ :param is_add - create (1) or delete(0) SPD (Default 1 - add) .
+ optional
+ :returns: reply from the API
+ """
+ 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
+ Sample CLI : 'set interface ipsec spd GigabitEthernet0/6/0 1'
+
+ :param spd_id - SPD ID to associate with the interface . mandatory
+ :param sw_if_index - Interface Index which needs to ipsec \
+ association mandatory
+ :param is_add - add(1) or del(0) association with interface \
+ (Default 1 - add) . optional
+ :returns: reply from the API
+ """
+ return self.api(
+ self.papi.ipsec_interface_add_del_spd,
+ {'spd_id': spd_id, 'sw_if_index': sw_if_index, 'is_add': is_add})
+
+ 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,
+ integrity_key,
+ crypto_algorithm,
+ crypto_key,
+ protocol,
+ tunnel_src_address='',
+ tunnel_dst_address='',
+ flags=0,
+ salt=0,
+ is_add=1):
+ """ IPSEC SA add/del
+ :param sad_id: security association ID
+ :param spi: security param index of the SA in decimal
+ :param integrity_algorithm:
+ :param integrity_key:
+ :param crypto_algorithm:
+ :param crypto_key:
+ :param protocol: AH(0) or ESP(1) protocol
+ :param tunnel_src_address: tunnel mode outer src address
+ :param tunnel_dst_address: tunnel mode outer dst address
+ :param is_add:
+ :param is_tunnel:
+ :** reference /vpp/src/vnet/ipsec/ipsec.h file for enum values of
+ crypto and ipsec algorithms
+ """
+ return self.api(
+ 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,
+ 'salt': salt,
+ }
+ })
+
+ 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,
+ local_address_stop,
+ remote_address_start,
+ remote_address_stop,
+ local_port_start=0,
+ local_port_stop=65535,
+ remote_port_start=0,
+ remote_port_stop=65535,
+ protocol=0,
+ policy=0,
+ 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 spd_id: SPD ID for the policy
+ :param local_address_start: local-ip-range start address
+ :param local_address_stop : local-ip-range stop address
+ :param remote_address_start: remote-ip-range start address
+ :param remote_address_stop : remote-ip-range stop address
+ :param local_port_start: (Default value = 0)
+ :param local_port_stop: (Default value = 65535)
+ :param remote_port_start: (Default value = 0)
+ :param remote_port_stop: (Default value = 65535)
+ :param protocol: Any(0), AH(51) & ESP(50) protocol (Default value = 0)
+ :param sa_id: Security Association ID for mapping it to SPD
+ :param policy: bypass(0), discard(1), resolve(2) or protect(3) action
+ (Default value = 0)
+ :param priority: value for the spd action (Default value = 100)
+ :param is_outbound: flag for inbound(0) or outbound(1)
+ (Default value = 1)
+ :param is_add: (Default value = 1)
+ """
+ return self.api(
+ 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,
+ }
+ })
+
+ 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,
+ remote_crypto_key, integ_alg, local_integ_key,
+ remote_integ_key, is_add=1, esn=0, salt=0,
+ anti_replay=1, renumber=0,
+ udp_encap=0, show_instance=0):
+ return self.api(
+ self.papi.ipsec_tunnel_if_add_del,
+ {
+ 'local_ip': local_ip,
+ 'remote_ip': remote_ip,
+ 'local_spi': local_spi,
+ 'remote_spi': remote_spi,
+ 'crypto_alg': crypto_alg,
+ 'local_crypto_key_len': len(local_crypto_key),
+ 'local_crypto_key': local_crypto_key,
+ 'remote_crypto_key_len': len(remote_crypto_key),
+ 'remote_crypto_key': remote_crypto_key,
+ 'integ_alg': integ_alg,
+ 'local_integ_key_len': len(local_integ_key),
+ 'local_integ_key': local_integ_key,
+ 'remote_integ_key_len': len(remote_integ_key),
+ 'remote_integ_key': remote_integ_key,
+ 'is_add': is_add,
+ 'esn': esn,
+ 'anti_replay': anti_replay,
+ 'renumber': renumber,
+ 'show_instance': show_instance,
+ 'udp_encap': udp_encap,
+ 'salt': salt
+ })
+
+ 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,
+ 'sw_if_index': sw_if_index,
+ 'ip4_fib_id': ip4_fib_id,
+ 'ip6_fib_id': ip6_fib_id,
+ 'namespace_id': namespace_id,
+ 'namespace_id_len': len(namespace_id)})
+
+ def punt_socket_register(self, reg, pathname,
+ header_version=1):
+ """ Register punt socket """
+ return self.api(self.papi.punt_socket_register,
+ {'header_version': header_version,
+ 'punt': reg,
+ 'pathname': pathname})
+
+ def punt_socket_deregister(self, reg):
+ """ Unregister punt socket """
+ return self.api(self.papi.punt_socket_deregister,
+ {'punt': reg})
+
+ def gbp_endpoint_add(self, sw_if_index, ips, mac, sclass, 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,
+ 'sclass': sclass,
+ '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,
+ {'_no_type_conversion': True})
+
+ def gbp_endpoint_group_add(self, vnid, 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,
+ 'rd_id': rd,
+ 'vnid': vnid,
+ 'sclass': sclass,
+ 'retention': retention
+ }})
+
+ def gbp_endpoint_group_del(self, sclass):
+ """ GBP endpoint group Del """
+ return self.api(self.papi.gbp_endpoint_group_del,
+ {'sclass': sclass})
+
+ def gbp_bridge_domain_add(self, bd_id, rd_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,
+ 'rd_id': rd_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_route_domain_add(self, rd_id,
+ scope,
+ 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':
+ {
+ 'scope': scope,
+ '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_recirc_add_del(self, is_add, sw_if_index, sclass, is_ext):
+ """ GBP recirc Add/Del """
+ return self.api(self.papi.gbp_recirc_add_del,
+ {'is_add': is_add,
+ 'recirc': {
+ 'is_ext': is_ext,
+ 'sw_if_index': sw_if_index,
+ 'sclass': sclass}})
+
+ def gbp_recirc_dump(self):
+ """ GBP recirc Dump """
+ return self.api(self.papi.gbp_recirc_dump, {})
+
+ def gbp_ext_itf_add_del(self, is_add, sw_if_index, bd_id, rd_id, flags):
+ """ 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,
+ 'flags': flags}})
+
+ 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,
+ sclass=0xffff):
+ """ GBP Subnet Add/Del """
+ return self.api(self.papi.gbp_subnet_add_del,
+ {'is_add': is_add,
+ 'subnet': {
+ 'type': type,
+ 'sw_if_index': sw_if_index,
+ 'sclass': sclass,
+ 'prefix': prefix,
+ 'rd_id': rd_id}})
+
+ def gbp_subnet_dump(self):
+ """ GBP Subnet Dump """
+ return self.api(self.papi.gbp_subnet_dump,
+ {'_no_type_conversion': True})
+
+ def gbp_contract_dump(self):
+ """ GBP contract Dump """
+ return self.api(self.papi.gbp_contract_dump, {})
+
+ def gbp_vxlan_tunnel_add(self, vni, bd_rd_id, mode, src):
+ """ GBP VXLAN tunnel add """
+ return self.api(self.papi.gbp_vxlan_tunnel_add,
+ {
+ 'tunnel': {
+ 'vni': vni,
+ 'mode': mode,
+ 'bd_rd_id': bd_rd_id,
+ 'src': src
+ }
+ })
+
+ 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 igmp_enable_disable(self, sw_if_index, enable, host):
+ """ Enable/disable IGMP on a given interface """
+ return self.api(self.papi.igmp_enable_disable,
+ {'enable': enable,
+ '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
+
+ :param enable: add/del
+ :param sw_if_index: interface sw index
+ :param saddr: source ip4 addr
+ :param gaddr: group ip4 addr
+ """
+ return self.api(self.papi.igmp_listen,
+ {
+ 'group':
+ {
+ 'filter': filter,
+ 'sw_if_index': sw_if_index,
+ 'n_srcs': len(saddrs),
+ 'saddrs': saddrs,
+ 'gaddr': gaddr
+ }
+ })
+
+ def igmp_clear_interface(self, sw_if_index):
+ """ Remove all (S,G)s from specified interface
+ doesn't send IGMP report!
+ """
+ return self.api(
+ self.papi.igmp_clear_interface, {
+ 'sw_if_index': sw_if_index})
+
+ def want_igmp_events(self, enable=1):
+ return self.api(self.papi.want_igmp_events, {'enable': enable,
+ 'pid': os.getpid()})
+
+ def bond_create(
+ self,
+ mode,
+ lb,
+ numa_only,
+ use_custom_mac,
+ mac_address='',
+ interface_id=0xFFFFFFFF):
+ """
+ :param mode: mode
+ :param lb: load balance
+ :param numa_only: tx on local numa node for lacp mode
+ :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,
+ 'numa_only': numa_only,
+ 'use_custom_mac': use_custom_mac,
+ 'mac_address': mac_address,
+ 'id': interface_id
+ })
+
+ def pipe_delete(self, parent_sw_if_index):
+ return self.api(self.papi.pipe_delete,
+ {'parent_sw_if_index': parent_sw_if_index})
+
+ 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,
+ })