+
+ def ip_reassembly_enable_disable(self, sw_if_index, enable_ip4=False,
+ enable_ip6=False):
+ """ Enable/disable IP reassembly """
+ return self.api(self.papi.ip_reassembly_enable_disable,
+ {'sw_if_index': sw_if_index,
+ 'enable_ip4': 1 if enable_ip4 else 0,
+ 'enable_ip6': 1 if enable_ip6 else 0,
+ })
+
+ 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,
+ 'flags': 0,
+ '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(self, epg, bd,
+ rd, uplink_sw_if_index):
+ """ 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,
+ 'epg_id': epg
+ }})
+
+ 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):
+ """ 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,
+ '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,
+ {'is_add': is_add,
+ 'recirc': {
+ 'is_ext': is_ext,
+ 'sw_if_index': sw_if_index,
+ 'epg_id': epg}})
+
+ 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):
+ """ 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=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,
+ 'epg_id': epg_id,
+ 'prefix': prefix,
+ 'rd_id': rd_id}})
+
+ def gbp_subnet_dump(self):
+ """ GBP Subnet Dump """
+ return self.api(self.papi.gbp_subnet_dump, {})
+
+ def gbp_contract_add_del(self, is_add, src_epg, dst_epg, acl_index, rules):
+ """ 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,
+ 'n_rules': len(rules),
+ 'rules': rules}})
+
+ def gbp_contract_dump(self):
+ """ GBP contract Dump """
+ return self.api(self.papi.gbp_contract_dump, {})
+
+ def gbp_endpoint_learn_set_inactive_threshold(self, threshold):
+ """ GBP set inactive threshold """
+ return self.api(self.papi.gbp_endpoint_learn_set_inactive_threshold,
+ {'threshold': threshold})
+
+ 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,
+ {'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,
+ 'ip4_prefix_len': ip4_prefix_len,
+ 'ip4_src': ip4_src,
+ 'security_check': security_check})
+
+ def ipip_6rd_del_tunnel(self, sw_if_index):
+ """ 6RD tunnel Delete """
+ return self.api(self.papi.ipip_6rd_del_tunnel,
+ {'sw_if_index': sw_if_index})
+
+ def ipip_add_tunnel(self, src_address, dst_address, is_ipv6=1,
+ 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,
+ 'table_id': table_id,
+ 'tc_tos': tc_tos})
+
+ def ipip_del_tunnel(self, sw_if_index):
+ """ IPIP tunnel Delete """
+ return self.api(self.papi.ipip_del_tunnel,
+ {'sw_if_index': sw_if_index})
+
+ def qos_egress_map_update(self, id, outputs):
+ """ QOS egress map update """
+ return self.api(self.papi.qos_egress_map_update,
+ {'map_id': id,
+ 'rows': outputs})
+
+ def qos_egress_map_delete(self, id):
+ """ QOS egress map delete """
+ return self.api(self.papi.qos_egress_map_delete,
+ {'map_id': id})
+
+ def qos_mark_enable_disable(self, sw_if_index,
+ output_source,
+ map_id,
+ enable):
+ """ QOS Mark Enable/Disable """
+ return self.api(self.papi.qos_mark_enable_disable,
+ {'map_id': map_id,
+ 'sw_if_index': sw_if_index,
+ 'output_source': output_source,
+ 'enable': enable})
+
+ def qos_record_enable_disable(self, sw_if_index, input_source, enable):
+ """ IP QoS recording Enble/Disable """
+ return self.api(self.papi.qos_record_enable_disable,
+ {'sw_if_index': sw_if_index,
+ 'input_source': input_source,
+ 'enable': enable})
+
+ 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':
+ {
+ 'address': gaddr
+ }
+ }
+ })
+
+ def igmp_dump(self, sw_if_index=None):
+ """ Dump all (S,G) interface configurations """
+ if sw_if_index is None:
+ sw_if_index = 0xffffffff
+ return self.api(self.papi.igmp_dump,
+ {'sw_if_index': sw_if_index})
+
+ 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,
+ use_custom_mac,
+ mac_address=''):
+ """
+ :param mode: mode
+ :param lb: load balance
+ :param use_custom_mac: use custom mac
+ :param mac_address: mac address
+ """
+ return self.api(
+ self.papi.bond_create,
+ {'mode': mode,
+ 'lb': lb,
+ 'use_custom_mac': use_custom_mac,
+ 'mac_address': mac_address
+ })
+
+ def bond_delete(
+ self,
+ sw_if_index):
+ """
+ :param sw_if_index: interface the operation is applied to
+ """
+ return self.api(self.papi.bond_delete,
+ {'sw_if_index': sw_if_index})
+
+ def bond_enslave(
+ self,
+ sw_if_index,
+ bond_sw_if_index,
+ is_passive,
+ is_long_timeout):
+ """
+ :param sw_if_index: slave sw_if_index
+ :param bond_sw_if_index: bond sw_if_index
+ :param is_passive: is passive lacp speaker
+ :param is_long_time: 90 seconds timeout instead of 3 seconds timeout
+ """
+ return self.api(
+ self.papi.bond_enslave,
+ {'sw_if_index': sw_if_index,
+ 'bond_sw_if_index': bond_sw_if_index,
+ 'is_passive': is_passive,
+ 'is_long_timeout': is_long_timeout
+ })
+
+ def bond_detach_slave(
+ self,
+ sw_if_index):
+ """
+ :param sw_if_index: slave interface the operation is applied to
+ """
+ return self.api(self.papi.bond_detach_slave,
+ {'sw_if_index': sw_if_index})
+
+ def sw_interface_slave_dump(
+ self,
+ sw_if_index):
+ """
+ :param sw_if_index: bond sw_if_index
+ """
+ return self.api(self.papi.sw_interface_slave_dump,
+ {'sw_if_index': sw_if_index})
+
+ def sw_interface_bond_dump(
+ self):
+ """
+
+ """
+ return self.api(self.papi.sw_interface_bond_dump,
+ {})
+
+ def create_vhost_user_if(
+ self,
+ is_server,
+ sock_filename,
+ renumber,
+ disable_mrg_rxbuf,
+ disable_indirect_desc,
+ custom_dev_instance,
+ use_custom_mac,
+ mac_address,
+ tag=''):
+ """
+ :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 '')
+ """
+ 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,
+ 'tag': tag
+ })
+
+ def delete_vhost_user_if(
+ self,
+ sw_if_index):
+ """
+ :param sw_if_index: interface the operation is applied to
+ """
+ return self.api(self.papi.delete_vhost_user_if,
+ {'sw_if_index': sw_if_index, })
+
+ def sw_interface_vhost_user_dump(
+ self):
+ """
+
+ """
+ return self.api(self.papi.sw_interface_vhost_user_dump,
+ {})
+
+ def abf_policy_add_del(self, is_add, policy):
+ return self.api(
+ self.papi.abf_policy_add_del,
+ {'is_add': is_add,
+ 'policy': policy})
+
+ def abf_itf_attach_add_del(self, is_add, attach):
+ return self.api(
+ self.papi.abf_itf_attach_add_del,
+ {'is_add': is_add,
+ 'attach': attach})
+
+ def abf_policy_dump(self):
+ return self.api(
+ self.papi.abf_policy_dump, {})
+
+ def abf_itf_attach_dump(self):
+ return self.api(
+ self.papi.abf_itf_attach_dump, {})
+
+ def pipe_create(self, is_specified, user_instance):
+ return self.api(self.papi.pipe_create,
+ {'is_specified': is_specified,
+ 'user_instance': user_instance})
+
+ def pipe_delete(self, parent_sw_if_index):
+ return self.api(self.papi.pipe_delete,
+ {'parent_sw_if_index': parent_sw_if_index})
+
+ 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, {})
+
+ def syslog_set_sender(
+ self,
+ collector,
+ src,
+ collector_port=514,
+ vrf_id=0,
+ max_msg_size=480):
+ """Set syslog sender configuration
+
+ :param collector: colector IP address
+ :param src: source IP address
+ :param collector_port: collector UDP port (Default value = 514)
+ :param vrf_id: VRF id (Default value = 0)
+ :param max_msg_size: maximum message length (Default value = 480)
+ """
+ return self.api(self.papi.syslog_set_sender,
+ {'collector_address': {
+ 'address': collector},
+ 'src_address': {
+ 'address': src},
+ 'collector_port': collector_port,
+ 'vrf_id': vrf_id,
+ 'max_msg_size': max_msg_size})
+
+ def syslog_get_sender(self):
+ """Return syslog sender configuration"""
+ return self.api(self.papi.syslog_get_sender, {})
+
+ def syslog_set_filter(self, severity):
+ """Set syslog filter parameters
+
+ :param severity: severity filter (specified severity and greater match)
+ """
+ return self.api(self.papi.syslog_set_filter, {'severity': severity})
+
+ def syslog_get_filter(self):
+ """Return syslog filter parameters"""
+ return self.api(self.papi.syslog_get_filter, {})