GBP: Sclass to src-epg conversions
[vpp.git] / test / vpp_papi_provider.py
1 import fnmatch
2 import os
3 import time
4 from collections import deque
5
6 from six import moves
7 from vpp_papi import VPP, mac_pton
8 from hook import Hook
9 from vpp_l2 import L2_PORT_TYPE
10
11 # from vnet/vnet/mpls/mpls_types.h
12 MPLS_IETF_MAX_LABEL = 0xfffff
13 MPLS_LABEL_INVALID = MPLS_IETF_MAX_LABEL + 1
14
15
16 class L2_VTR_OP:
17     L2_DISABLED = 0
18     L2_PUSH_1 = 1
19     L2_PUSH_2 = 2
20     L2_POP_1 = 3
21     L2_POP_2 = 4
22     L2_TRANSLATE_1_1 = 5
23     L2_TRANSLATE_1_2 = 6
24     L2_TRANSLATE_2_1 = 7
25     L2_TRANSLATE_2_2 = 8
26
27
28 class QOS_SOURCE:
29     EXT = 0
30     VLAN = 1
31     MPLS = 2
32     IP = 3
33
34
35 class SYSLOG_SEVERITY:
36     EMERG = 0
37     ALERT = 1
38     CRIT = 2
39     ERR = 3
40     WARN = 4
41     NOTICE = 5
42     INFO = 6
43     DBG = 7
44
45
46 class UnexpectedApiReturnValueError(Exception):
47     """ exception raised when the API return value is unexpected """
48     pass
49
50
51 class VppPapiProvider(object):
52     """VPP-api provider using vpp-papi
53
54     @property hook: hook object providing before and after api/cli hooks
55     """
56
57     _zero, _negative = range(2)
58
59     def __init__(self, name, shm_prefix, test_class, read_timeout):
60         self.hook = Hook("vpp-papi-provider")
61         self.name = name
62         self.shm_prefix = shm_prefix
63         self.test_class = test_class
64         self._expect_api_retval = self._zero
65         self._expect_stack = []
66
67         install_dir = os.getenv('VPP_INSTALL_PATH')
68
69         # Vapi requires 'VPP_API_DIR', not set when run from Makefile.
70         if 'VPP_API_DIR' not in os.environ:
71             os.environ['VPP_API_DIR'] = os.getenv('VPP_INSTALL_PATH')
72
73         self.vpp = VPP(logger=test_class.logger,
74                        read_timeout=read_timeout)
75         self._events = deque()
76
77     def __enter__(self):
78         return self
79
80     def assert_negative_api_retval(self):
81         """ Expect API failure - used with with, e.g.:
82             with self.vapi.assert_negative_api_retval():
83                 self.vapi.<api call expected to fail>
84         """
85         self._expect_stack.append(self._expect_api_retval)
86         self._expect_api_retval = self._negative
87         return self
88
89     def assert_zero_api_retval(self):
90         """ Expect API success - used with with, e.g.:
91             with self.vapi.assert_negative_api_retval():
92                 self.vapi.<api call expected to succeed>
93
94             note: this is useful only inside another with block
95                   as success is the default expected value
96         """
97         self._expect_stack.append(self._expect_api_retval)
98         self._expect_api_retval = self._zero
99         return self
100
101     def __exit__(self, exc_type, exc_value, traceback):
102         self._expect_api_retval = self._expect_stack.pop()
103
104     def register_hook(self, hook):
105         """Replace hook registration with new hook
106
107         :param hook:
108
109         """
110         self.hook = hook
111
112     def collect_events(self):
113         """ Collect all events from the internal queue and clear the queue. """
114         e = self._events
115         self._events = deque()
116         return e
117
118     def wait_for_event(self, timeout, name=None):
119         """ Wait for and return next event. """
120         if name:
121             self.test_class.logger.debug("Expecting event '%s' within %ss",
122                                          name, timeout)
123         else:
124             self.test_class.logger.debug("Expecting event within %ss",
125                                          timeout)
126         if self._events:
127             self.test_class.logger.debug("Not waiting, event already queued")
128         limit = time.time() + timeout
129         while time.time() < limit:
130             if self._events:
131                 e = self._events.popleft()
132                 if name and type(e).__name__ != name:
133                     raise Exception(
134                         "Unexpected event received: %s, expected: %s" %
135                         (type(e).__name__, name))
136                 self.test_class.logger.debug("Returning event %s:%s" %
137                                              (name, e))
138                 return e
139             time.sleep(0)  # yield
140         raise Exception("Event did not occur within timeout")
141
142     def __call__(self, name, event):
143         """ Enqueue event in the internal event queue. """
144         # FIXME use the name instead of relying on type(e).__name__ ?
145         # FIXME #2 if this throws, it is eaten silently, Ole?
146         self.test_class.logger.debug("New event: %s: %s" % (name, event))
147         self._events.append(event)
148
149     def connect(self):
150         """Connect the API to VPP"""
151         self.vpp.connect(self.name, self.shm_prefix)
152         self.papi = self.vpp.api
153         self.vpp.register_event_callback(self)
154
155     def disconnect(self):
156         """Disconnect the API from VPP"""
157         self.vpp.disconnect()
158
159     def api(self, api_fn, api_args, expected_retval=0):
160         """ Call API function and check it's return value.
161         Call the appropriate hooks before and after the API call
162
163         :param api_fn: API function to call
164         :param api_args: tuple of API function arguments
165         :param expected_retval: Expected return value (Default value = 0)
166         :returns: reply from the API
167
168         """
169         self.hook.before_api(api_fn.__name__, api_args)
170         reply = api_fn(**api_args)
171         if self._expect_api_retval == self._negative:
172             if hasattr(reply, 'retval') and reply.retval >= 0:
173                 msg = "API call passed unexpectedly: expected negative "\
174                     "return value instead of %d in %s" % \
175                     (reply.retval, moves.reprlib.repr(reply))
176                 self.test_class.logger.info(msg)
177                 raise UnexpectedApiReturnValueError(msg)
178         elif self._expect_api_retval == self._zero:
179             if hasattr(reply, 'retval') and reply.retval != expected_retval:
180                 msg = "API call failed, expected %d return value instead "\
181                     "of %d in %s" % (expected_retval, reply.retval,
182                                      moves.reprlib.repr(reply))
183                 self.test_class.logger.info(msg)
184                 raise UnexpectedApiReturnValueError(msg)
185         else:
186             raise Exception("Internal error, unexpected value for "
187                             "self._expect_api_retval %s" %
188                             self._expect_api_retval)
189         self.hook.after_api(api_fn.__name__, api_args)
190         return reply
191
192     def cli(self, cli):
193         """ Execute a CLI, calling the before/after hooks appropriately.
194
195         :param cli: CLI to execute
196         :returns: CLI output
197
198         """
199         self.hook.before_cli(cli)
200         cli += '\n'
201         r = self.papi.cli_inband(cmd=cli)
202         self.hook.after_cli(cli)
203         if hasattr(r, 'reply'):
204             return r.reply
205
206     def ppcli(self, cli):
207         """ Helper method to print CLI command in case of info logging level.
208
209         :param cli: CLI to execute
210         :returns: CLI output
211         """
212         return cli + "\n" + str(self.cli(cli))
213
214     def show_version(self):
215         """ """
216         return self.api(self.papi.show_version, {})
217
218     def pg_create_interface(self, pg_index):
219         """
220
221         :param pg_index:
222
223         """
224         return self.api(self.papi.pg_create_interface,
225                         {"interface_id": pg_index})
226
227     def sw_interface_dump(self, filter=None):
228         """
229
230         :param filter:  (Default value = None)
231
232         """
233         if filter is not None:
234             args = {"name_filter_valid": 1, "name_filter": filter}
235         else:
236             args = {}
237         return self.api(self.papi.sw_interface_dump, args)
238
239     def sw_interface_set_table(self, sw_if_index, is_ipv6, table_id):
240         """ Set the IPvX Table-id for the Interface
241
242         :param sw_if_index:
243         :param is_ipv6:
244         :param table_id:
245
246         """
247         return self.api(self.papi.sw_interface_set_table,
248                         {'sw_if_index': sw_if_index, 'is_ipv6': is_ipv6,
249                          'vrf_id': table_id})
250
251     def sw_interface_get_table(self, sw_if_index, is_ipv6):
252         """ Get the IPvX Table-id for the Interface
253
254         :param sw_if_index:
255         :param is_ipv6:
256         :return table_id
257
258         """
259         return self.api(self.papi.sw_interface_get_table,
260                         {'sw_if_index': sw_if_index, 'is_ipv6': is_ipv6})
261
262     def sw_interface_add_del_address(self, sw_if_index, addr, addr_len,
263                                      is_ipv6=0, is_add=1, del_all=0):
264         """
265
266         :param addr: param is_ipv6:  (Default value = 0)
267         :param sw_if_index:
268         :param addr_len:
269         :param is_ipv6:  (Default value = 0)
270         :param is_add:  (Default value = 1)
271         :param del_all:  (Default value = 0)
272
273         """
274         return self.api(self.papi.sw_interface_add_del_address,
275                         {'sw_if_index': sw_if_index,
276                          'is_add': is_add,
277                          'is_ipv6': is_ipv6,
278                          'del_all': del_all,
279                          'address_length': addr_len,
280                          'address': addr})
281
282     def ip_address_dump(self, sw_if_index, is_ipv6=0):
283         return self.api(self.papi.ip_address_dump,
284                         {'sw_if_index': sw_if_index,
285                          'is_ipv6': is_ipv6})
286
287     def sw_interface_set_unnumbered(self, sw_if_index, ip_sw_if_index,
288                                     is_add=1):
289         """ Set the Interface to be unnumbered
290
291         :param is_add:  (Default value = 1)
292         :param sw_if_index - interface That will be unnumbered
293         :param ip_sw_if_index - interface with an IP addres
294
295         """
296         return self.api(self.papi.sw_interface_set_unnumbered,
297                         {'sw_if_index': ip_sw_if_index,
298                          'unnumbered_sw_if_index': sw_if_index,
299                          'is_add': is_add})
300
301     def ip_unnumbered_dump(self, sw_if_index=0xffffffff):
302         return self.api(self.papi.ip_unnumbered_dump,
303                         {'sw_if_index': sw_if_index})
304
305     def sw_interface_enable_disable_mpls(self, sw_if_index,
306                                          is_enable=1):
307         """
308         Enable/Disable MPLS on the interface
309         :param sw_if_index:
310         :param is_enable:  (Default value = 1)
311
312         """
313         return self.api(self.papi.sw_interface_set_mpls_enable,
314                         {'sw_if_index': sw_if_index,
315                          'enable': is_enable})
316
317     def sw_interface_ra_suppress(self, sw_if_index, suppress=1):
318         return self.api(self.papi.sw_interface_ip6nd_ra_config,
319                         {'sw_if_index': sw_if_index,
320                          'suppress': suppress})
321
322     def set_ip_flow_hash(self,
323                          table_id,
324                          src=1,
325                          dst=1,
326                          sport=1,
327                          dport=1,
328                          proto=1,
329                          reverse=0,
330                          is_ip6=0):
331         return self.api(self.papi.set_ip_flow_hash,
332                         {'vrf_id': table_id,
333                          'src': src,
334                          'dst': dst,
335                          'dport': dport,
336                          'sport': sport,
337                          'proto': proto,
338                          'reverse': reverse,
339                          'is_ipv6': is_ip6})
340
341     def ip6_nd_proxy(self, address, sw_if_index, is_del=0):
342         return self.api(self.papi.ip6nd_proxy_add_del,
343                         {'address': address,
344                          'sw_if_index': sw_if_index,
345                          'is_del': is_del})
346
347     def ip6_sw_interface_ra_config(self, sw_if_index,
348                                    no,
349                                    suppress,
350                                    send_unicast):
351         return self.api(self.papi.sw_interface_ip6nd_ra_config,
352                         {'sw_if_index': sw_if_index,
353                          'is_no': no,
354                          'suppress': suppress,
355                          'send_unicast': send_unicast})
356
357     def ip6_sw_interface_ra_prefix(self,
358                                    sw_if_index,
359                                    address,
360                                    address_length,
361                                    use_default=0,
362                                    no_advertise=0,
363                                    off_link=0,
364                                    no_autoconfig=0,
365                                    no_onlink=0,
366                                    is_no=0,
367                                    val_lifetime=0xffffffff,
368                                    pref_lifetime=0xffffffff):
369         return self.api(self.papi.sw_interface_ip6nd_ra_prefix,
370                         {'sw_if_index': sw_if_index,
371                          'address': address,
372                          'address_length': address_length,
373                          'use_default': use_default,
374                          'no_advertise': no_advertise,
375                          'off_link': off_link,
376                          'no_autoconfig': no_autoconfig,
377                          'no_onlink': no_onlink,
378                          'is_no': is_no,
379                          'val_lifetime': val_lifetime,
380                          'pref_lifetime': pref_lifetime})
381
382     def ip6_sw_interface_enable_disable(self, sw_if_index, enable):
383         """
384         Enable/Disable An interface for IPv6
385         """
386         return self.api(self.papi.sw_interface_ip6_enable_disable,
387                         {'sw_if_index': sw_if_index,
388                          'enable': enable})
389
390     def vxlan_add_del_tunnel(
391             self,
392             src_addr,
393             dst_addr,
394             mcast_sw_if_index=0xFFFFFFFF,
395             is_add=1,
396             is_ipv6=0,
397             encap_vrf_id=0,
398             decap_next_index=0xFFFFFFFF,
399             vni=0,
400             instance=0xFFFFFFFF):
401         """
402
403         :param dst_addr:
404         :param src_addr:
405         :param is_add:  (Default value = 1)
406         :param is_ipv6:  (Default value = 0)
407         :param encap_vrf_id:  (Default value = 0)
408         :param decap_next_index:  (Default value = 0xFFFFFFFF)
409         :param mcast_sw_if_index:  (Default value = 0xFFFFFFFF)
410         :param vni:  (Default value = 0)
411         :param instance:  (Default value = 0xFFFFFFFF)
412
413         """
414         return self.api(self.papi.vxlan_add_del_tunnel,
415                         {'is_add': is_add,
416                          'is_ipv6': is_ipv6,
417                          'src_address': src_addr,
418                          'dst_address': dst_addr,
419                          'mcast_sw_if_index': mcast_sw_if_index,
420                          'encap_vrf_id': encap_vrf_id,
421                          'decap_next_index': decap_next_index,
422                          'vni': vni,
423                          'instance': instance})
424
425     def geneve_add_del_tunnel(
426             self,
427             local_addr,
428             remote_addr,
429             mcast_sw_if_index=0xFFFFFFFF,
430             is_add=1,
431             is_ipv6=0,
432             encap_vrf_id=0,
433             decap_next_index=0xFFFFFFFF,
434             vni=0):
435         """
436
437         :param remote_addr:
438         :param local_addr:
439         :param is_add:  (Default value = 1)
440         :param is_ipv6:  (Default value = 0)
441         :param encap_vrf_id:  (Default value = 0)
442         :param decap_next_index:  (Default value = 0xFFFFFFFF)
443         :param mcast_sw_if_index:  (Default value = 0xFFFFFFFF)
444         :param vni:  (Default value = 0)
445
446         """
447         return self.api(self.papi.geneve_add_del_tunnel,
448                         {'is_add': is_add,
449                          'is_ipv6': is_ipv6,
450                          'local_address': local_addr,
451                          'remote_address': remote_addr,
452                          'mcast_sw_if_index': mcast_sw_if_index,
453                          'encap_vrf_id': encap_vrf_id,
454                          'decap_next_index': decap_next_index,
455                          'vni': vni})
456
457     def bridge_domain_add_del(self, bd_id, flood=1, uu_flood=1, forward=1,
458                               learn=1, arp_term=0, is_add=1):
459         """Create/delete bridge domain.
460
461         :param int bd_id: Bridge domain index.
462         :param int flood: Enable/disable bcast/mcast flooding in the BD.
463             (Default value = 1)
464         :param int uu_flood: Enable/disable unknown unicast flood in the BD.
465             (Default value = 1)
466         :param int forward: Enable/disable forwarding on all interfaces in
467             the BD. (Default value = 1)
468         :param int learn: Enable/disable learning on all interfaces in the BD.
469             (Default value = 1)
470         :param int arp_term: Enable/disable arp termination in the BD.
471             (Default value = 1)
472         :param int is_add: Add or delete flag. (Default value = 1)
473         """
474         return self.api(self.papi.bridge_domain_add_del,
475                         {'bd_id': bd_id,
476                          'flood': flood,
477                          'uu_flood': uu_flood,
478                          'forward': forward,
479                          'learn': learn,
480                          'arp_term': arp_term,
481                          'is_add': is_add})
482
483     def bd_ip_mac_add_del(self, bd_id, mac, ip, is_ipv6=0, is_add=1):
484         return self.api(self.papi.bd_ip_mac_add_del,
485                         {'bd_id': bd_id,
486                          'is_add': is_add,
487                          'ip': ip,
488                          'mac': mac})
489
490     def bd_ip_mac_dump(self, bd_id):
491         return self.api(self.papi.bd_ip_mac_dump,
492                         {'bd_id': bd_id})
493
494     def want_ip4_arp_events(self, enable_disable=1, address=0):
495         return self.api(self.papi.want_ip4_arp_events,
496                         {'enable_disable': enable_disable,
497                          'address': address,
498                          'pid': os.getpid(), })
499
500     def want_ip6_nd_events(self, enable_disable=1, address=0):
501         return self.api(self.papi.want_ip6_nd_events,
502                         {'enable_disable': enable_disable,
503                          'address': address,
504                          'pid': os.getpid(), })
505
506     def want_ip6_ra_events(self, enable_disable=1):
507         return self.api(self.papi.want_ip6_ra_events,
508                         {'enable_disable': enable_disable,
509                          'pid': os.getpid(), })
510
511     def ip6nd_send_router_solicitation(self, sw_if_index, irt=1, mrt=120,
512                                        mrc=0, mrd=0):
513         return self.api(self.papi.ip6nd_send_router_solicitation,
514                         {'irt': irt,
515                          'mrt': mrt,
516                          'mrc': mrc,
517                          'mrd': mrd,
518                          'sw_if_index': sw_if_index})
519
520     def ip6_nd_address_autoconfig(self, sw_if_index, enable,
521                                   install_default_routes):
522         return self.api(self.papi.ip6_nd_address_autoconfig,
523                         {'sw_if_index': sw_if_index,
524                          'enable': enable,
525                          'install_default_routes': install_default_routes})
526
527     def want_interface_events(self, enable_disable=1):
528         return self.api(self.papi.want_interface_events,
529                         {'enable_disable': enable_disable,
530                          'pid': os.getpid(), })
531
532     def want_macs_learn_events(self, enable_disable=1, scan_delay=0,
533                                max_macs_in_event=0, learn_limit=0):
534         return self.api(self.papi.want_l2_macs_events,
535                         {'enable_disable': enable_disable,
536                          'scan_delay': scan_delay,
537                          'max_macs_in_event': max_macs_in_event,
538                          'learn_limit': learn_limit,
539                          'pid': os.getpid(), })
540
541     def want_dhcp6_reply_events(self, enable_disable=1):
542         return self.api(self.papi.want_dhcp6_reply_events,
543                         {'enable_disable': enable_disable,
544                          'pid': os.getpid()})
545
546     def want_dhcp6_pd_reply_events(self, enable_disable=1):
547         return self.api(self.papi.want_dhcp6_pd_reply_events,
548                         {'enable_disable': enable_disable,
549                          'pid': os.getpid()})
550
551     def dhcp6_clients_enable_disable(self, enable=1):
552         return self.api(self.papi.dhcp6_clients_enable_disable,
553                         {'enable': enable})
554
555     def dhcp6_send_client_message(self, msg_type, sw_if_index, T1, T2,
556                                   addresses, server_index=0xFFFFFFFF,
557                                   irt=0, mrt=0, mrc=1, mrd=0, stop=0,
558                                   ):
559         return self.api(self.papi.dhcp6_send_client_message,
560                         {'sw_if_index': sw_if_index,
561                          'server_index': server_index,
562                          'irt': irt,
563                          'mrt': mrt,
564                          'mrc': mrc,
565                          'mrd': mrd,
566                          'stop': stop,
567                          'msg_type': msg_type,
568                          'T1': T1,
569                          'T2': T2,
570                          'n_addresses': len(addresses),
571                          'addresses': addresses})
572
573     def dhcp6_pd_send_client_message(self, msg_type, sw_if_index, T1, T2,
574                                      prefixes, server_index=0xFFFFFFFF,
575                                      irt=0, mrt=0, mrc=1, mrd=0, stop=0,
576                                      ):
577         return self.api(self.papi.dhcp6_pd_send_client_message,
578                         {'sw_if_index': sw_if_index,
579                          'server_index': server_index,
580                          'irt': irt,
581                          'mrt': mrt,
582                          'mrc': mrc,
583                          'mrd': mrd,
584                          'stop': stop,
585                          'msg_type': msg_type,
586                          'T1': T1,
587                          'T2': T2,
588                          'n_prefixes': len(prefixes),
589                          'prefixes': prefixes})
590
591     def dhcp6_client_enable_disable(self, sw_if_index, prefix_group='',
592                                     enable=1):
593         return self.api(self.papi.dhcp6_client_enable_disable,
594                         {'sw_if_index': sw_if_index,
595                          'enable': enable})
596
597     def dhcp6_pd_client_enable_disable(self, sw_if_index, prefix_group='',
598                                        enable=1):
599         return self.api(self.papi.dhcp6_pd_client_enable_disable,
600                         {'sw_if_index': sw_if_index,
601                          'prefix_group': prefix_group,
602                          'enable': enable})
603
604     def ip6_add_del_address_using_prefix(self, sw_if_index, address,
605                                          prefix_length, prefix_group,
606                                          is_add=1):
607         return self.api(self.papi.ip6_add_del_address_using_prefix,
608                         {'sw_if_index': sw_if_index,
609                          'prefix_group': prefix_group,
610                          'address': address,
611                          'prefix_length': prefix_length,
612                          'is_add': is_add})
613
614     def l2fib_add_del(self, mac, bd_id, sw_if_index, is_add=1, static_mac=0,
615                       filter_mac=0, bvi_mac=0):
616         """Create/delete L2 FIB entry.
617
618         :param str mac: MAC address to create FIB entry for.
619         :param int bd_id: Bridge domain index.
620         :param int sw_if_index: Software interface index of the interface.
621         :param int is_add: Add or delete flag. (Default value = 1)
622         :param int static_mac: Set to 1 to create static MAC entry.
623             (Default value = 0)
624         :param int filter_mac: Set to 1 to drop packet that's source or
625             destination MAC address contains defined MAC address.
626             (Default value = 0)
627         :param int bvi_mac: Set to 1 to create entry that points to BVI
628             interface. (Default value = 0)
629         """
630         return self.api(self.papi.l2fib_add_del,
631                         {'mac': mac,
632                          'bd_id': bd_id,
633                          'sw_if_index': sw_if_index,
634                          'is_add': is_add,
635                          'static_mac': static_mac,
636                          'filter_mac': filter_mac,
637                          'bvi_mac': bvi_mac})
638
639     def l2fib_flush_int(self, sw_if_index):
640         """Flush L2 FIB entries for sw_if_index.
641
642         :param int sw_if_index: Software interface index of the interface.
643         """
644         return self.api(self.papi.l2fib_flush_int,
645                         {'sw_if_index': sw_if_index})
646
647     def l2fib_flush_bd(self, bd_id):
648         """Flush L2 FIB entries for bd_id.
649
650         :param int sw_if_index: Bridge Domain id.
651         """
652         return self.api(self.papi.l2fib_flush_bd,
653                         {'bd_id': bd_id})
654
655     def l2fib_flush_all(self):
656         """Flush all L2 FIB.
657         """
658         return self.api(self.papi.l2fib_flush_all, {})
659
660     def l2_fib_table_dump(self, bd_id):
661         """ Dump the L2 FIB """
662         return self.api(self.papi.l2_fib_table_dump,
663                         {'bd_id': bd_id})
664
665     def sw_interface_set_l2_bridge(self, sw_if_index, bd_id,
666                                    shg=0, port_type=L2_PORT_TYPE.NORMAL,
667                                    enable=1):
668         """Add/remove interface to/from bridge domain.
669
670         :param int sw_if_index: Software interface index of the interface.
671         :param int bd_id: Bridge domain index.
672         :param int shg: Split-horizon group index. (Default value = 0)
673         :param int bvi: Set interface as a bridge group virtual interface.
674             (Default value = 0)
675         :param int enable: Add or remove interface. (Default value = 1)
676         """
677         return self.api(self.papi.sw_interface_set_l2_bridge,
678                         {'rx_sw_if_index': sw_if_index,
679                          'bd_id': bd_id,
680                          'shg': shg,
681                          'port_type': port_type,
682                          'enable': enable})
683
684     def bridge_flags(self, bd_id, is_set, feature_bitmap):
685         """Enable/disable required feature of the bridge domain with defined
686         ID.
687
688         :param int bd_id: Bridge domain ID.
689         :param int is_set: Set to 1 to enable, set to 0 to disable the feature.
690         :param int flags: Bitmap value of the feature to be set:
691             - learn (1 << 0),
692             - forward (1 << 1),
693             - flood (1 << 2),
694             - uu-flood (1 << 3) or
695             - arp-term (1 << 4).
696         """
697         return self.api(self.papi.bridge_flags,
698                         {'bd_id': bd_id,
699                          'is_set': is_set,
700                          'flags': feature_bitmap})
701
702     def bridge_domain_dump(self, bd_id=0):
703         """
704
705         :param int bd_id: Bridge domain ID. (Default value = 0 => dump of all
706             existing bridge domains returned)
707         :return: Dictionary of bridge domain(s) data.
708         """
709         return self.api(self.papi.bridge_domain_dump,
710                         {'bd_id': bd_id})
711
712     def sw_interface_set_l2_xconnect(self, rx_sw_if_index, tx_sw_if_index,
713                                      enable):
714         """Create or delete unidirectional cross-connect from Tx interface to
715         Rx interface.
716
717         :param int rx_sw_if_index: Software interface index of Rx interface.
718         :param int tx_sw_if_index: Software interface index of Tx interface.
719         :param int enable: Create cross-connect if equal to 1, delete
720             cross-connect if equal to 0.
721
722         """
723         return self.api(self.papi.sw_interface_set_l2_xconnect,
724                         {'rx_sw_if_index': rx_sw_if_index,
725                          'tx_sw_if_index': tx_sw_if_index,
726                          'enable': enable})
727
728     def sw_interface_set_l2_tag_rewrite(
729             self,
730             sw_if_index,
731             vtr_oper,
732             push=0,
733             tag1=0,
734             tag2=0):
735         """L2 interface vlan tag rewrite configure request
736         :param client_index - opaque cookie to identify the sender
737         :param context - sender context, to match reply w/ request
738         :param sw_if_index - interface the operation is applied to
739         :param vtr_op - Choose from l2_vtr_op_t enum values
740         :param push_dot1q - first pushed flag dot1q id set, else dot1ad
741         :param tag1 - Needed for any push or translate vtr op
742         :param tag2 - Needed for any push 2 or translate x-2 vtr ops
743
744         """
745         return self.api(self.papi.l2_interface_vlan_tag_rewrite,
746                         {'sw_if_index': sw_if_index,
747                          'vtr_op': vtr_oper,
748                          'push_dot1q': push,
749                          'tag1': tag1,
750                          'tag2': tag2})
751
752     def sw_interface_set_l2_emulation(
753             self,
754             sw_if_index,
755             enable=1):
756         """L2 Emulation
757         :param sw_if_index - interface the operation is applied to
758
759         """
760         return self.api(self.papi.l2_emulation,
761                         {'sw_if_index': sw_if_index,
762                          'enable': enable})
763
764     def sw_interface_set_ip_directed_broadcast(
765             self,
766             sw_if_index,
767             enable=1):
768         """IP Directed broadcast
769         :param sw_if_index - interface the operation is applied to
770
771         """
772         return self.api(self.papi.sw_interface_set_ip_directed_broadcast,
773                         {'sw_if_index': sw_if_index,
774                          'enable': enable})
775
776     def sw_interface_set_flags(self, sw_if_index, admin_up_down):
777         """
778
779         :param admin_up_down:
780         :param sw_if_index:
781
782         """
783         return self.api(self.papi.sw_interface_set_flags,
784                         {'sw_if_index': sw_if_index,
785                          'admin_up_down': admin_up_down})
786
787     def sw_interface_set_mtu(self, sw_if_index, mtu=[0, 0, 0, 0]):
788         """
789         :param sw_if_index:
790         :param mtu:
791
792         """
793         return self.api(self.papi.sw_interface_set_mtu,
794                         {'sw_if_index': sw_if_index,
795                          'mtu': mtu})
796
797     def sw_interface_set_promiscuous(self, sw_if_index, enable):
798         """
799         :param sw_if_index:
800         :param enable:
801
802         """
803         return self.api(self.papi.sw_interface_set_promiscuous,
804                         {'sw_if_index': sw_if_index,
805                          'enable': enable})
806
807     def sw_interface_set_mac_address(self, sw_if_index, mac):
808         return self.api(self.papi.sw_interface_set_mac_address,
809                         {'sw_if_index': sw_if_index,
810                          'mac_address': mac})
811
812     def create_subif(self, sw_if_index, sub_id, outer_vlan, inner_vlan,
813                      no_tags=0, one_tag=0, two_tags=0, dot1ad=0, exact_match=0,
814                      default_sub=0, outer_vlan_id_any=0, inner_vlan_id_any=0):
815         """Create subinterface
816         from vpe.api: set dot1ad = 0 for dot1q, set dot1ad = 1 for dot1ad
817
818         :param sub_id: param inner_vlan:
819         :param sw_if_index:
820         :param outer_vlan:
821         :param inner_vlan:
822         :param no_tags:  (Default value = 0)
823         :param one_tag:  (Default value = 0)
824         :param two_tags:  (Default value = 0)
825         :param dot1ad:  (Default value = 0)
826         :param exact_match:  (Default value = 0)
827         :param default_sub:  (Default value = 0)
828         :param outer_vlan_id_any:  (Default value = 0)
829         :param inner_vlan_id_any:  (Default value = 0)
830
831         """
832         return self.api(
833             self.papi.create_subif,
834             {'sw_if_index': sw_if_index,
835              'sub_id': sub_id,
836              'no_tags': no_tags,
837              'one_tag': one_tag,
838              'two_tags': two_tags,
839              'dot1ad': dot1ad,
840              'exact_match': exact_match,
841              'default_sub': default_sub,
842              'outer_vlan_id_any': outer_vlan_id_any,
843              'inner_vlan_id_any': inner_vlan_id_any,
844              'outer_vlan_id': outer_vlan,
845              'inner_vlan_id': inner_vlan})
846
847     def create_p2pethernet_subif(self, sw_if_index, remote_mac, subif_id):
848         """Create p2p ethernet subinterface
849
850         :param sw_if_index: main (parent) interface
851         :param remote_mac: client (remote) mac address
852
853         """
854         return self.api(
855             self.papi.p2p_ethernet_add,
856             {'parent_if_index': sw_if_index,
857              'remote_mac': remote_mac,
858              'subif_id': subif_id})
859
860     def delete_subif(self, sw_if_index):
861         """Delete subinterface
862
863         :param sw_if_index:
864         """
865         return self.api(self.papi.delete_subif,
866                         {'sw_if_index': sw_if_index})
867
868     def delete_p2pethernet_subif(self, sw_if_index, remote_mac):
869         """Delete p2p ethernet subinterface
870
871         :param sw_if_index: main (parent) interface
872         :param remote_mac: client (remote) mac address
873
874         """
875         return self.api(
876             self.papi.p2p_ethernet_del,
877             {'parent_if_index': sw_if_index,
878              'remote_mac': remote_mac})
879
880     def create_vlan_subif(self, sw_if_index, vlan):
881         """
882
883         :param vlan:
884         :param sw_if_index:
885
886         """
887         return self.api(self.papi.create_vlan_subif,
888                         {'sw_if_index': sw_if_index,
889                          'vlan_id': vlan})
890
891     def create_loopback(self, mac=''):
892         """
893
894         :param mac: (Optional)
895         """
896         return self.api(self.papi.create_loopback,
897                         {'mac_address': mac})
898
899     def delete_loopback(self, sw_if_index):
900         return self.api(self.papi.delete_loopback,
901                         {'sw_if_index': sw_if_index, })
902
903     def ip_table_add_del(self,
904                          table_id,
905                          is_add=1,
906                          is_ipv6=0):
907         """
908
909         :param table_id
910         :param is_add:  (Default value = 1)
911         :param is_ipv6:  (Default value = 0)
912
913         """
914
915         return self.api(
916             self.papi.ip_table_add_del,
917             {'table_id': table_id,
918              'is_add': is_add,
919              'is_ipv6': is_ipv6})
920
921     def ip_add_del_route(
922             self,
923             dst_address,
924             dst_address_length,
925             next_hop_address,
926             next_hop_sw_if_index=0xFFFFFFFF,
927             table_id=0,
928             next_hop_table_id=0,
929             next_hop_weight=1,
930             next_hop_n_out_labels=0,
931             next_hop_out_label_stack=[],
932             next_hop_via_label=MPLS_LABEL_INVALID,
933             next_hop_id=0xFFFFFFFF,
934             is_resolve_host=0,
935             is_resolve_attached=0,
936             classify_table_index=0xFFFFFFFF,
937             is_add=1,
938             is_drop=0,
939             is_unreach=0,
940             is_prohibit=0,
941             is_ipv6=0,
942             is_local=0,
943             is_classify=0,
944             is_multipath=0,
945             is_dvr=0,
946             is_udp_encap=0,
947             is_source_lookup=0):
948         """
949
950         :param dst_address_length:
951         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
952         :param dst_address:
953         :param next_hop_address:
954         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
955         :param vrf_id:  (Default value = 0)
956         :param lookup_in_vrf:  (Default value = 0)
957         :param classify_table_index:  (Default value = 0xFFFFFFFF)
958         :param is_add:  (Default value = 1)
959         :param is_drop:  (Default value = 0)
960         :param is_ipv6:  (Default value = 0)
961         :param is_local:  (Default value = 0)
962         :param is_classify:  (Default value = 0)
963         :param is_multipath:  (Default value = 0)
964         :param is_resolve_host:  (Default value = 0)
965         :param is_resolve_attached:  (Default value = 0)
966         :param is_dvr:  (Default value = 0)
967         :param is_source_lookup:  (Default value = 0)
968         :param next_hop_weight:  (Default value = 1)
969
970         """
971
972         return self.api(
973             self.papi.ip_add_del_route,
974             {'next_hop_sw_if_index': next_hop_sw_if_index,
975              'table_id': table_id,
976              'classify_table_index': classify_table_index,
977              'next_hop_table_id': next_hop_table_id,
978              'is_add': is_add,
979              'is_drop': is_drop,
980              'is_unreach': is_unreach,
981              'is_prohibit': is_prohibit,
982              'is_ipv6': is_ipv6,
983              'is_local': is_local,
984              'is_classify': is_classify,
985              'is_multipath': is_multipath,
986              'is_resolve_host': is_resolve_host,
987              'is_resolve_attached': is_resolve_attached,
988              'is_dvr': is_dvr,
989              'is_source_lookup': is_source_lookup,
990              'is_udp_encap': is_udp_encap,
991              'next_hop_weight': next_hop_weight,
992              'dst_address_length': dst_address_length,
993              'dst_address': dst_address,
994              'next_hop_id': next_hop_id,
995              'next_hop_address': next_hop_address,
996              'next_hop_n_out_labels': next_hop_n_out_labels,
997              'next_hop_via_label': next_hop_via_label,
998              'next_hop_out_label_stack': next_hop_out_label_stack})
999
1000     def ip_fib_dump(self):
1001         return self.api(self.papi.ip_fib_dump, {})
1002
1003     def ip6_fib_dump(self):
1004         return self.api(self.papi.ip6_fib_dump, {})
1005
1006     def ip_neighbor_add_del(self,
1007                             sw_if_index,
1008                             mac_address,
1009                             dst_address,
1010                             is_add=1,
1011                             is_ipv6=0,
1012                             is_static=0,
1013                             is_no_adj_fib=0,
1014                             ):
1015         """ Add neighbor MAC to IPv4 or IPv6 address.
1016
1017         :param sw_if_index:
1018         :param mac_address:
1019         :param dst_address:
1020         :param is_add:  (Default value = 1)
1021         :param is_ipv6:  (Default value = 0)
1022         :param is_static:  (Default value = 0)
1023         :param is_no_adj_fib:  (Default value = 0)
1024         """
1025         return self.api(
1026             self.papi.ip_neighbor_add_del,
1027             {'sw_if_index': sw_if_index,
1028              'is_add': is_add,
1029              'is_ipv6': is_ipv6,
1030              'is_static': is_static,
1031              'is_no_adj_fib': is_no_adj_fib,
1032              'mac_address': mac_address,
1033              'dst_address': dst_address
1034              }
1035         )
1036
1037     def ip_neighbor_dump(self,
1038                          sw_if_index,
1039                          is_ipv6=0):
1040         """ Return IP neighbor dump.
1041
1042         :param sw_if_index:
1043         :param int is_ipv6: 1 for IPv6 neighbor, 0 for IPv4. (Default = 0)
1044         """
1045
1046         return self.api(
1047             self.papi.ip_neighbor_dump,
1048             {'is_ipv6': is_ipv6,
1049              'sw_if_index': sw_if_index
1050              }
1051         )
1052
1053     def proxy_arp_add_del(self,
1054                           low_address,
1055                           hi_address,
1056                           vrf_id=0,
1057                           is_add=1):
1058         """ Config Proxy Arp Range.
1059
1060         :param low_address: Start address in the rnage to Proxy for
1061         :param hi_address: End address in the rnage to Proxy for
1062         :param vrf_id: The VRF/table in which to proxy
1063         """
1064
1065         return self.api(
1066             self.papi.proxy_arp_add_del,
1067             {'proxy':
1068              {
1069                  'vrf_id': vrf_id,
1070                  'low_address': low_address,
1071                  'hi_address': hi_address,
1072              },
1073              'is_add': is_add})
1074
1075     def proxy_arp_intfc_enable_disable(self,
1076                                        sw_if_index,
1077                                        is_enable=1):
1078         """ Enable/Disable an interface for proxy ARP requests
1079
1080         :param sw_if_index: Interface
1081         :param enable_disable: Enable/Disable
1082         """
1083
1084         return self.api(
1085             self.papi.proxy_arp_intfc_enable_disable,
1086             {'sw_if_index': sw_if_index,
1087              'enable_disable': is_enable
1088              }
1089         )
1090
1091     def reset_vrf(self,
1092                   vrf_id,
1093                   is_ipv6=0,
1094                   ):
1095         """ Reset VRF (remove all routes etc.) request.
1096
1097         :param int vrf_id: ID of the FIB table / VRF to reset.
1098         :param int is_ipv6: 1 for IPv6 neighbor, 0 for IPv4. (Default = 0)
1099         """
1100
1101         return self.api(
1102             self.papi.reset_vrf,
1103             {'vrf_id': vrf_id,
1104              'is_ipv6': is_ipv6,
1105              }
1106         )
1107
1108     def reset_fib(self,
1109                   vrf_id,
1110                   is_ipv6=0,
1111                   ):
1112         """ Reset VRF (remove all routes etc.) request.
1113
1114         :param int vrf_id: ID of the FIB table / VRF to reset.
1115         :param int is_ipv6: 1 for IPv6 neighbor, 0 for IPv4. (Default = 0)
1116         """
1117
1118         return self.api(
1119             self.papi.reset_fib,
1120             {'vrf_id': vrf_id,
1121              'is_ipv6': is_ipv6,
1122              }
1123         )
1124
1125     def ip_dump(self,
1126                 is_ipv6=0,
1127                 ):
1128         """ Return IP dump.
1129
1130         :param int is_ipv6: 1 for IPv6 neighbor, 0 for IPv4. (Default = 0)
1131         """
1132
1133         return self.api(
1134             self.papi.ip_dump,
1135             {'is_ipv6': is_ipv6,
1136              }
1137         )
1138
1139     def sw_interface_span_enable_disable(
1140             self, sw_if_index_from, sw_if_index_to, state=1, is_l2=0):
1141         """
1142
1143         :param sw_if_index_from:
1144         :param sw_if_index_to:
1145         :param state:
1146         :param is_l2:
1147         """
1148         return self.api(self.papi.sw_interface_span_enable_disable,
1149                         {'sw_if_index_from': sw_if_index_from,
1150                          'sw_if_index_to': sw_if_index_to,
1151                          'state': state,
1152                          'is_l2': is_l2,
1153                          })
1154
1155     def gre_tunnel_add_del(self,
1156                            src_address,
1157                            dst_address,
1158                            outer_fib_id=0,
1159                            tunnel_type=0,
1160                            instance=0xFFFFFFFF,
1161                            session_id=0,
1162                            is_add=1,
1163                            is_ip6=0):
1164         """ Add a GRE tunnel
1165
1166         :param src_address:
1167         :param dst_address:
1168         :param outer_fib_id:  (Default value = 0)
1169         :param tunnel_type:  (Default value = 0)
1170         :param instance:  (Default value = 0xFFFFFFFF)
1171         :param session_id: (Defalt value = 0)
1172         :param is_add:  (Default value = 1)
1173         :param is_ipv6:  (Default value = 0)
1174         """
1175
1176         return self.api(
1177             self.papi.gre_add_del_tunnel,
1178             {'is_add': is_add,
1179              'is_ipv6': is_ip6,
1180              'tunnel_type': tunnel_type,
1181              'instance': instance,
1182              'src_address': src_address,
1183              'dst_address': dst_address,
1184              'outer_fib_id': outer_fib_id,
1185              'session_id': session_id}
1186         )
1187
1188     def udp_encap_add(self,
1189                       src_ip,
1190                       dst_ip,
1191                       src_port,
1192                       dst_port,
1193                       table_id=0):
1194         """ Add a GRE tunnel
1195         :param src_ip:
1196         :param dst_ip:
1197         :param src_port:
1198         :param dst_port:
1199         :param outer_fib_id:  (Default value = 0)
1200         """
1201
1202         return self.api(
1203             self.papi.udp_encap_add,
1204             {
1205                 'udp_encap': {
1206                     'src_ip': src_ip,
1207                     'dst_ip': dst_ip,
1208                     'src_port': src_port,
1209                     'dst_port': dst_port,
1210                     'table_id': table_id
1211                 }
1212             })
1213
1214     def udp_encap_del(self, id):
1215         return self.api(self.papi.udp_encap_del, {'id': id})
1216
1217     def udp_encap_dump(self):
1218         return self.api(self.papi.udp_encap_dump, {})
1219
1220     def want_udp_encap_stats(self, enable=1):
1221         return self.api(self.papi.want_udp_encap_stats,
1222                         {'enable': enable,
1223                          'pid': os.getpid()})
1224
1225     def mpls_fib_dump(self):
1226         return self.api(self.papi.mpls_fib_dump, {})
1227
1228     def mpls_table_add_del(
1229             self,
1230             table_id,
1231             is_add=1):
1232         """
1233
1234         :param table_id
1235         :param is_add:  (Default value = 1)
1236
1237         """
1238
1239         return self.api(
1240             self.papi.mpls_table_add_del,
1241             {'mt_table_id': table_id,
1242              'mt_is_add': is_add})
1243
1244     def mpls_route_add_del(
1245             self,
1246             label,
1247             eos,
1248             next_hop_proto,
1249             next_hop_address,
1250             next_hop_sw_if_index=0xFFFFFFFF,
1251             table_id=0,
1252             next_hop_table_id=0,
1253             next_hop_weight=1,
1254             next_hop_n_out_labels=0,
1255             next_hop_out_label_stack=[],
1256             next_hop_via_label=MPLS_LABEL_INVALID,
1257             is_resolve_host=0,
1258             is_resolve_attached=0,
1259             is_interface_rx=0,
1260             is_rpf_id=0,
1261             is_multicast=0,
1262             is_add=1,
1263             is_drop=0,
1264             is_multipath=0,
1265             classify_table_index=0xFFFFFFFF,
1266             is_classify=0):
1267         """
1268
1269         :param dst_address_length:
1270         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
1271         :param dst_address:
1272         :param next_hop_address:
1273         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
1274         :param vrf_id:  (Default value = 0)
1275         :param lookup_in_vrf:  (Default value = 0)
1276         :param classify_table_index:  (Default value = 0xFFFFFFFF)
1277         :param is_add:  (Default value = 1)
1278         :param is_drop:  (Default value = 0)
1279         :param is_ipv6:  (Default value = 0)
1280         :param is_local:  (Default value = 0)
1281         :param is_classify:  (Default value = 0)
1282         :param is_multipath:  (Default value = 0)
1283         :param is_multicast:  (Default value = 0)
1284         :param is_resolve_host:  (Default value = 0)
1285         :param is_resolve_attached:  (Default value = 0)
1286         :param next_hop_weight:  (Default value = 1)
1287
1288         """
1289         return self.api(
1290             self.papi.mpls_route_add_del,
1291             {'mr_label': label,
1292              'mr_eos': eos,
1293              'mr_table_id': table_id,
1294              'mr_classify_table_index': classify_table_index,
1295              'mr_is_add': is_add,
1296              'mr_is_classify': is_classify,
1297              'mr_is_multipath': is_multipath,
1298              'mr_is_multicast': is_multicast,
1299              'mr_is_resolve_host': is_resolve_host,
1300              'mr_is_resolve_attached': is_resolve_attached,
1301              'mr_is_interface_rx': is_interface_rx,
1302              'mr_is_rpf_id': is_rpf_id,
1303              'mr_next_hop_proto': next_hop_proto,
1304              'mr_next_hop_weight': next_hop_weight,
1305              'mr_next_hop': next_hop_address,
1306              'mr_next_hop_n_out_labels': next_hop_n_out_labels,
1307              'mr_next_hop_sw_if_index': next_hop_sw_if_index,
1308              'mr_next_hop_table_id': next_hop_table_id,
1309              'mr_next_hop_via_label': next_hop_via_label,
1310              'mr_next_hop_out_label_stack': next_hop_out_label_stack})
1311
1312     def mpls_ip_bind_unbind(
1313             self,
1314             label,
1315             dst_address,
1316             dst_address_length,
1317             table_id=0,
1318             ip_table_id=0,
1319             is_ip4=1,
1320             is_bind=1):
1321         """
1322         """
1323         return self.api(
1324             self.papi.mpls_ip_bind_unbind,
1325             {'mb_mpls_table_id': table_id,
1326              'mb_label': label,
1327              'mb_ip_table_id': ip_table_id,
1328              'mb_is_bind': is_bind,
1329              'mb_is_ip4': is_ip4,
1330              'mb_address_length': dst_address_length,
1331              'mb_address': dst_address})
1332
1333     def mpls_tunnel_add_del(
1334             self,
1335             tun_sw_if_index,
1336             next_hop_proto_is_ip4,
1337             next_hop_address,
1338             next_hop_sw_if_index=0xFFFFFFFF,
1339             next_hop_table_id=0,
1340             next_hop_weight=1,
1341             next_hop_n_out_labels=0,
1342             next_hop_out_label_stack=[],
1343             next_hop_via_label=MPLS_LABEL_INVALID,
1344             is_add=1,
1345             l2_only=0,
1346             is_multicast=0):
1347         """
1348
1349         :param dst_address_length:
1350         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
1351         :param dst_address:
1352         :param next_hop_address:
1353         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
1354         :param vrf_id:  (Default value = 0)
1355         :param lookup_in_vrf:  (Default value = 0)
1356         :param classify_table_index:  (Default value = 0xFFFFFFFF)
1357         :param is_add:  (Default value = 1)
1358         :param is_drop:  (Default value = 0)
1359         :param is_ipv6:  (Default value = 0)
1360         :param is_local:  (Default value = 0)
1361         :param is_classify:  (Default value = 0)
1362         :param is_multipath:  (Default value = 0)
1363         :param is_resolve_host:  (Default value = 0)
1364         :param is_resolve_attached:  (Default value = 0)
1365         :param next_hop_weight:  (Default value = 1)
1366         :param is_multicast:  (Default value = 0)
1367
1368         """
1369         return self.api(
1370             self.papi.mpls_tunnel_add_del,
1371             {'mt_sw_if_index': tun_sw_if_index,
1372              'mt_is_add': is_add,
1373              'mt_l2_only': l2_only,
1374              'mt_is_multicast': is_multicast,
1375              'mt_next_hop_proto_is_ip4': next_hop_proto_is_ip4,
1376              'mt_next_hop_weight': next_hop_weight,
1377              'mt_next_hop': next_hop_address,
1378              'mt_next_hop_n_out_labels': next_hop_n_out_labels,
1379              'mt_next_hop_sw_if_index': next_hop_sw_if_index,
1380              'mt_next_hop_table_id': next_hop_table_id,
1381              'mt_next_hop_via_label': next_hop_via_label,
1382              'mt_next_hop_out_label_stack': next_hop_out_label_stack})
1383
1384     def mpls_tunnel_dump(self, sw_if_index=0xffffffff):
1385         return self.api(self.papi.mpls_tunnel_dump,
1386                         {'sw_if_index': sw_if_index})
1387
1388     def nat44_interface_add_del_feature(
1389             self,
1390             sw_if_index,
1391             is_inside=1,
1392             is_add=1):
1393         """Enable/disable NAT44 feature on the interface
1394
1395         :param sw_if_index: Software index of the interface
1396         :param is_inside: 1 if inside, 0 if outside (Default value = 1)
1397         :param is_add: 1 if add, 0 if delete (Default value = 1)
1398         """
1399         return self.api(
1400             self.papi.nat44_interface_add_del_feature,
1401             {'is_add': is_add,
1402              'is_inside': is_inside,
1403              'sw_if_index': sw_if_index})
1404
1405     def nat44_interface_add_del_output_feature(
1406             self,
1407             sw_if_index,
1408             is_inside=1,
1409             is_add=1):
1410         """Enable/disable NAT44 output feature on the interface
1411
1412         :param sw_if_index: Software index of the interface
1413         :param is_inside: 1 if inside, 0 if outside (Default value = 1)
1414         :param is_add: 1 if add, 0 if delete (Default value = 1)
1415         """
1416         return self.api(
1417             self.papi.nat44_interface_add_del_output_feature,
1418             {'is_add': is_add,
1419              'is_inside': is_inside,
1420              'sw_if_index': sw_if_index})
1421
1422     def nat44_add_del_static_mapping(
1423             self,
1424             local_ip,
1425             external_ip=0,
1426             external_sw_if_index=0xFFFFFFFF,
1427             local_port=0,
1428             external_port=0,
1429             addr_only=1,
1430             vrf_id=0,
1431             protocol=0,
1432             twice_nat=0,
1433             self_twice_nat=0,
1434             out2in_only=0,
1435             tag="",
1436             is_add=1):
1437         """Add/delete NAT44 static mapping
1438
1439         :param local_ip: Local IP address
1440         :param external_ip: External IP address
1441         :param external_sw_if_index: External interface instead of IP address
1442         :param local_port: Local port number (Default value = 0)
1443         :param external_port: External port number (Default value = 0)
1444         :param addr_only: 1 if address only mapping, 0 if address and port
1445         :param vrf_id: VRF ID
1446         :param protocol: IP protocol (Default value = 0)
1447         :param twice_nat: 1 if translate external host address and port
1448         :param self_twice_nat: 1 if translate external host address and port
1449                                whenever external host address equals
1450                                local address of internal host
1451         :param out2in_only: if 1 rule is matching only out2in direction
1452         :param tag: Opaque string tag
1453         :param is_add: 1 if add, 0 if delete (Default value = 1)
1454         """
1455         return self.api(
1456             self.papi.nat44_add_del_static_mapping,
1457             {'is_add': is_add,
1458              'addr_only': addr_only,
1459              'local_ip_address': local_ip,
1460              'external_ip_address': external_ip,
1461              'local_port': local_port,
1462              'external_port': external_port,
1463              'external_sw_if_index': external_sw_if_index,
1464              'vrf_id': vrf_id,
1465              'protocol': protocol,
1466              'twice_nat': twice_nat,
1467              'self_twice_nat': self_twice_nat,
1468              'out2in_only': out2in_only,
1469              'tag': tag})
1470
1471     def nat44_add_del_identity_mapping(
1472             self,
1473             ip='0',
1474             sw_if_index=0xFFFFFFFF,
1475             port=0,
1476             addr_only=1,
1477             vrf_id=0,
1478             protocol=0,
1479             tag='',
1480             is_add=1):
1481         """Add/delete NAT44 identity mapping
1482
1483         :param ip: IP address (Default value = 0)
1484         :param sw_if_index: Interface instead of IP address
1485         :param port: Port number (Default value = 0)
1486         :param addr_only: 1 if address only mapping, 0 if address and port
1487         :param vrf_id: VRF ID
1488         :param protocol: IP protocol (Default value = 0)
1489         :param tag: Opaque string tag
1490         :param is_add: 1 if add, 0 if delete (Default value = 1)
1491         """
1492         return self.api(
1493             self.papi.nat44_add_del_identity_mapping,
1494             {'is_add': is_add,
1495              'addr_only': addr_only,
1496              'ip_address': ip,
1497              'port': port,
1498              'sw_if_index': sw_if_index,
1499              'vrf_id': vrf_id,
1500              'tag': tag,
1501              'protocol': protocol})
1502
1503     def nat44_add_del_address_range(
1504             self,
1505             first_ip_address,
1506             last_ip_address,
1507             is_add=1,
1508             vrf_id=0xFFFFFFFF,
1509             twice_nat=0):
1510         """Add/del NAT44 address range
1511
1512         :param first_ip_address: First IP address
1513         :param last_ip_address: Last IP address
1514         :param vrf_id: VRF id for the address range
1515         :param twice_nat: twice NAT address for extenal hosts
1516         :param is_add: 1 if add, 0 if delete (Default value = 1)
1517         """
1518         return self.api(
1519             self.papi.nat44_add_del_address_range,
1520             {'first_ip_address': first_ip_address,
1521              'last_ip_address': last_ip_address,
1522              'vrf_id': vrf_id,
1523              'twice_nat': twice_nat,
1524              'is_add': is_add})
1525
1526     def nat44_address_dump(self):
1527         """Dump NAT44 addresses
1528         :return: Dictionary of NAT44 addresses
1529         """
1530         return self.api(self.papi.nat44_address_dump, {})
1531
1532     def nat44_interface_dump(self):
1533         """Dump interfaces with NAT44 feature
1534         :return: Dictionary of interfaces with NAT44 feature
1535         """
1536         return self.api(self.papi.nat44_interface_dump, {})
1537
1538     def nat44_interface_output_feature_dump(self):
1539         """Dump interfaces with NAT44 output feature
1540         :return: Dictionary of interfaces with NAT44 output feature
1541         """
1542         return self.api(self.papi.nat44_interface_output_feature_dump, {})
1543
1544     def nat44_static_mapping_dump(self):
1545         """Dump NAT44 static mappings
1546         :return: Dictionary of NAT44 static mappings
1547         """
1548         return self.api(self.papi.nat44_static_mapping_dump, {})
1549
1550     def nat44_identity_mapping_dump(self):
1551         """Dump NAT44 identity mappings
1552         :return: Dictionary of NAT44 identity mappings
1553         """
1554         return self.api(self.papi.nat44_identity_mapping_dump, {})
1555
1556     def nat_show_config(self):
1557         """Show NAT plugin config
1558         :return: NAT plugin config parameters
1559         """
1560         return self.api(self.papi.nat_show_config, {})
1561
1562     def nat44_add_interface_addr(
1563             self,
1564             sw_if_index,
1565             twice_nat=0,
1566             is_add=1):
1567         """Add/del NAT44 address from interface
1568
1569         :param sw_if_index: Software index of the interface
1570         :param twice_nat: twice NAT address for extenal hosts
1571         :param is_add: 1 if add, 0 if delete (Default value = 1)
1572         """
1573         return self.api(
1574             self.papi.nat44_add_del_interface_addr,
1575             {'is_add': is_add,
1576              'sw_if_index': sw_if_index,
1577              'twice_nat': twice_nat})
1578
1579     def nat44_interface_addr_dump(self):
1580         """Dump NAT44 addresses interfaces
1581         :return: Dictionary of NAT44 addresses interfaces
1582         """
1583         return self.api(self.papi.nat44_interface_addr_dump, {})
1584
1585     def nat_ipfix(
1586             self,
1587             domain_id=1,
1588             src_port=4739,
1589             enable=1):
1590         """Enable/disable NAT IPFIX logging
1591
1592         :param domain_id: Observation domain ID (Default value = 1)
1593         :param src_port: Source port number (Default value = 4739)
1594         :param enable: 1 if enable, 0 if disable (Default value = 1)
1595         """
1596         return self.api(
1597             self.papi.nat_ipfix_enable_disable,
1598             {'domain_id': domain_id,
1599              'src_port': src_port,
1600              'enable': enable})
1601
1602     def nat44_user_session_dump(
1603             self,
1604             ip_address,
1605             vrf_id):
1606         """Dump NAT44 user's sessions
1607
1608         :param ip_address: ip adress of the user to be dumped
1609         :param cpu_index: cpu_index on which the user is
1610         :param vrf_id: VRF ID
1611         :return: Dictionary of S-NAT sessions
1612         """
1613         return self.api(
1614             self.papi.nat44_user_session_dump,
1615             {'ip_address': ip_address,
1616              'vrf_id': vrf_id})
1617
1618     def nat44_user_dump(self):
1619         """Dump NAT44 users
1620
1621         :return: Dictionary of NAT44 users
1622         """
1623         return self.api(self.papi.nat44_user_dump, {})
1624
1625     def nat44_add_del_lb_static_mapping(
1626             self,
1627             external_addr,
1628             external_port,
1629             protocol,
1630             twice_nat=0,
1631             self_twice_nat=0,
1632             out2in_only=0,
1633             tag='',
1634             affinity=0,
1635             local_num=0,
1636             locals=[],
1637             is_add=1):
1638         """Add/delete NAT44 load balancing static mapping
1639
1640         :param twice_nat: 1 if translate external host address and port
1641         :param tag: Opaque string tag
1642         :param affinity: if 0 disabled, otherwise client IP affinity timeout
1643         :param is_add - 1 if add, 0 if delete
1644         """
1645         return self.api(
1646             self.papi.nat44_add_del_lb_static_mapping,
1647             {'is_add': is_add,
1648              'external_addr': external_addr,
1649              'external_port': external_port,
1650              'protocol': protocol,
1651              'twice_nat': twice_nat,
1652              'self_twice_nat': self_twice_nat,
1653              'out2in_only': out2in_only,
1654              'tag': tag,
1655              'affinity': affinity,
1656              'local_num': local_num,
1657              'locals': locals})
1658
1659     def nat44_lb_static_mapping_add_del_local(
1660            self,
1661            external_addr,
1662            external_port,
1663            local_addr,
1664            local_port,
1665            protocol,
1666            probability,
1667            vrf_id=0,
1668            is_add=1):
1669         """Add/delete NAT44 load-balancing static mapping rule backend
1670
1671         :param external_addr: external IPv4 address of the servic
1672         :param external_port: external L4 port number of the service
1673         :param local_addr: IPv4 address of the internal node
1674         :param local_port: L4 port number of the internal node
1675         :param protocol: IP protocol number
1676         :param probability: probability of the internal node
1677         :param vrf_id: VRF id of the internal node
1678         :param is_add: 1 if add, 0 if delete
1679         """
1680         return self.api(
1681             self.papi.nat44_lb_static_mapping_add_del_local,
1682             {'is_add': is_add,
1683              'external_addr': external_addr,
1684              'external_port': external_port,
1685              'local': {
1686                  'addr': local_addr,
1687                  'port': local_port,
1688                  'probability': probability,
1689                  'vrf_id': vrf_id},
1690              'protocol': protocol})
1691
1692     def nat44_lb_static_mapping_dump(self):
1693         """Dump NAT44 load balancing static mappings
1694
1695         :return: Dictionary of NAT44 load balancing static mapping
1696         """
1697         return self.api(self.papi.nat44_lb_static_mapping_dump, {})
1698
1699     def nat44_del_session(
1700             self,
1701             addr,
1702             port,
1703             protocol,
1704             vrf_id=0,
1705             is_in=1,
1706             ext_host_address=None,
1707             ext_host_port=0):
1708         """Delete NAT44 session
1709
1710         :param addr: IPv4 address
1711         :param por: port number
1712         :param protocol: IP protocol number
1713         :param vrf_id: VRF ID
1714         :param is_in: 1 if inside network addres and port pari, 0 if outside
1715         :param ext_host_address: external host IPv4 address
1716         :param ext_host_port: external host port
1717         """
1718         if ext_host_address is None:
1719             return self.api(
1720                 self.papi.nat44_del_session,
1721                 {'address': addr,
1722                  'port': port,
1723                  'protocol': protocol,
1724                  'vrf_id': vrf_id,
1725                  'is_in': is_in})
1726         else:
1727             return self.api(
1728                 self.papi.nat44_del_session,
1729                 {'address': addr,
1730                  'port': port,
1731                  'protocol': protocol,
1732                  'vrf_id': vrf_id,
1733                  'is_in': is_in,
1734                  'ext_host_valid': 1,
1735                  'ext_host_address': ext_host_address,
1736                  'ext_host_port': ext_host_port})
1737
1738     def nat44_forwarding_enable_disable(
1739             self,
1740             enable):
1741         """Enable/disable forwarding for NAT44
1742
1743         :param enable: 1 for enable, 0 for disable
1744         """
1745         return self.api(
1746             self.papi.nat44_forwarding_enable_disable,
1747             {'enable': enable})
1748
1749     def nat_set_reass(
1750             self,
1751             timeout=2,
1752             max_reass=1024,
1753             max_frag=5,
1754             drop_frag=0,
1755             is_ip6=0):
1756         """Set NAT virtual fragmentation reassembly
1757
1758         :param timeout: reassembly timeout (Default 2sec)
1759         :param max_reass: maximum concurrent reassemblies (Default 1024)
1760         :param max_frag: maximum fragmets per reassembly (Default 5)
1761         :param drop_frag: if 0 translate fragments, otherwise drop fragments
1762         :param is_ip6: 1 if IPv6, 0 if IPv4
1763         """
1764         return self.api(
1765             self.papi.nat_set_reass,
1766             {'timeout': timeout,
1767              'max_reass': max_reass,
1768              'max_frag': max_frag,
1769              'drop_frag': drop_frag,
1770              'is_ip6': is_ip6})
1771
1772     def nat_get_reass(self):
1773         """Get NAT virtual fragmentation reassembly configuration
1774
1775         :return: NAT virtual fragmentation reassembly configuration
1776         """
1777         return self.api(self.papi.nat_get_reass, {})
1778
1779     def nat_reass_dump(self):
1780         """Dump NAT virtual fragmentation reassemblies
1781
1782         :return: Dictionary of NAT virtual fragmentation reassemblies
1783         """
1784         return self.api(self.papi.nat_reass_dump, {})
1785
1786     def nat_det_add_del_map(
1787             self,
1788             in_addr,
1789             in_plen,
1790             out_addr,
1791             out_plen,
1792             is_add=1):
1793         """Add/delete deterministic NAT mapping
1794
1795         :param is_add - 1 if add, 0 if delete
1796         :param in_addr - inside IP address
1797         :param in_plen - inside IP address prefix length
1798         :param out_addr - outside IP address
1799         :param out_plen - outside IP address prefix length
1800         """
1801         return self.api(
1802             self.papi.nat_det_add_del_map,
1803             {'is_add': is_add,
1804              'is_nat44': 1,
1805              'in_addr': in_addr,
1806              'in_plen': in_plen,
1807              'out_addr': out_addr,
1808              'out_plen': out_plen})
1809
1810     def nat_det_forward(
1811             self,
1812             in_addr):
1813         """Get outside address and port range from inside address
1814
1815         :param in_addr - inside IP address
1816         """
1817         return self.api(
1818             self.papi.nat_det_forward,
1819             {'in_addr': in_addr,
1820              'is_nat44': 1})
1821
1822     def nat_det_reverse(
1823             self,
1824             out_addr,
1825             out_port):
1826         """Get inside address from outside address and port
1827
1828         :param out_addr - outside IP address
1829         :param out_port - outside port
1830         """
1831         return self.api(
1832             self.papi.nat_det_reverse,
1833             {'out_addr': out_addr,
1834              'out_port': out_port})
1835
1836     def nat_det_map_dump(self):
1837         """Dump deterministic NAT mappings
1838
1839         :return: Dictionary of deterministic NAT mappings
1840         """
1841         return self.api(self.papi.nat_det_map_dump, {})
1842
1843     def nat_set_timeouts(
1844             self,
1845             udp=300,
1846             tcp_established=7440,
1847             tcp_transitory=240,
1848             icmp=60):
1849         """Set values of timeouts for NAT sessions (in seconds)
1850
1851         :param udp - UDP timeout (Default value = 300)
1852         :param tcp_established - TCP established timeout (Default value = 7440)
1853         :param tcp_transitory - TCP transitory timeout (Default value = 240)
1854         :param icmp - ICMP timeout (Default value = 60)
1855         """
1856         return self.api(
1857             self.papi.nat_set_timeouts,
1858             {'udp': udp,
1859              'tcp_established': tcp_established,
1860              'tcp_transitory': tcp_transitory,
1861              'icmp': icmp})
1862
1863     def nat_get_timeouts(self):
1864         """Get values of timeouts for NAT sessions
1865
1866         :return: Timeouts for NAT sessions (in seconds)
1867         """
1868         return self.api(self.papi.nat_get_timeouts, {})
1869
1870     def nat_set_addr_and_port_alloc_alg(
1871             self,
1872             alg=0,
1873             psid_offset=0,
1874             psid_length=0,
1875             psid=0,
1876             start_port=0,
1877             end_port=0):
1878         """Set address and port assignment algorithm
1879
1880         :param alg: algorithm: 0 - default, 1 - MAP-E, 2 - port range
1881         :param psid_offset: number of offset bits (valid only for MAP-E alg)
1882         :param psid_length: length of PSID (valid only for MAP-E alg)
1883         :param psid: Port Set Identifier value (valid only for MAP-E alg)
1884         :param start_port: beginning of the port range
1885         :param end_port: end of the port range
1886         """
1887         return self.api(
1888             self.papi.nat_set_addr_and_port_alloc_alg,
1889             {'alg': alg,
1890              'psid_offset': psid_offset,
1891              'psid_length': psid_length,
1892              'psid': psid,
1893              'start_port': start_port,
1894              'end_port': end_port})
1895
1896     def nat_get_addr_and_port_alloc_alg(self):
1897         """Get address and port assignment algorithm"""
1898         return self.api(self.papi.nat_get_addr_and_port_alloc_alg, {})
1899
1900     def nat_set_mss_clamping(self, enable=0, mss_value=1500):
1901         """Set TCP MSS rewriting configuration
1902
1903         :param enable: disable(0)/enable(1) MSS rewriting feature
1904         :param mss_value: MSS value to be used for MSS rewriting
1905         """
1906         return self.api(
1907             self.papi.nat_set_mss_clamping,
1908             {'enable': enable, 'mss_value': mss_value})
1909
1910     def nat_get_mss_clamping(self):
1911         """Get TCP MSS rewriting configuration"""
1912         return self.api(self.papi.nat_get_mss_clamping, {})
1913
1914     def nat_det_close_session_out(
1915             self,
1916             out_addr,
1917             out_port,
1918             ext_addr,
1919             ext_port):
1920         """Close deterministic NAT session using outside address and port
1921
1922         :param out_addr - outside IP address
1923         :param out_port - outside port
1924         :param ext_addr - external host IP address
1925         :param ext_port - external host port
1926         """
1927         return self.api(
1928             self.papi.nat_det_close_session_out,
1929             {'out_addr': out_addr,
1930              'out_port': out_port,
1931              'ext_addr': ext_addr,
1932              'ext_port': ext_port})
1933
1934     def nat_det_close_session_in(
1935             self,
1936             in_addr,
1937             in_port,
1938             ext_addr,
1939             ext_port):
1940         """Close deterministic NAT session using inside address and port
1941
1942         :param in_addr - inside IP address
1943         :param in_port - inside port
1944         :param ext_addr - external host IP address
1945         :param ext_port - external host port
1946         """
1947         return self.api(
1948             self.papi.nat_det_close_session_in,
1949             {'in_addr': in_addr,
1950              'in_port': in_port,
1951              'ext_addr': ext_addr,
1952              'ext_port': ext_port,
1953              'is_nat44': 1})
1954
1955     def nat_det_session_dump(
1956             self,
1957             user_addr):
1958         """Dump deterministic NAT sessions belonging to a user
1959
1960         :param user_addr - inside IP address of the user
1961         :return: Dictionary of deterministic NAT sessions
1962         """
1963         return self.api(
1964             self.papi.nat_det_session_dump,
1965             {'is_nat44': 1,
1966              'user_addr': user_addr})
1967
1968     def nat64_add_del_pool_addr_range(
1969             self,
1970             start_addr,
1971             end_addr,
1972             vrf_id=0xFFFFFFFF,
1973             is_add=1):
1974         """Add/del address range to NAT64 pool
1975
1976         :param start_addr: First IP address
1977         :param end_addr: Last IP address
1978         :param vrf_id: VRF id for the address range
1979         :param is_add: 1 if add, 0 if delete (Default value = 1)
1980         """
1981         return self.api(
1982             self.papi.nat64_add_del_pool_addr_range,
1983             {'start_addr': start_addr,
1984              'end_addr': end_addr,
1985              'vrf_id': vrf_id,
1986              'is_add': is_add})
1987
1988     def nat64_pool_addr_dump(self):
1989         """Dump NAT64 pool addresses
1990         :return: Dictionary of NAT64 pool addresses
1991         """
1992         return self.api(self.papi.nat64_pool_addr_dump, {})
1993
1994     def nat64_add_del_interface(
1995             self,
1996             sw_if_index,
1997             is_inside=1,
1998             is_add=1):
1999         """Enable/disable NAT64 feature on the interface
2000            :param sw_if_index: Index of the interface
2001            :param is_inside: 1 if inside, 0 if outside (Default value = 1)
2002            :param is_add: 1 if add, 0 if delete (Default value = 1)
2003         """
2004         return self.api(
2005             self.papi.nat64_add_del_interface,
2006             {'sw_if_index': sw_if_index,
2007              'is_inside': is_inside,
2008              'is_add': is_add})
2009
2010     def nat64_interface_dump(self):
2011         """Dump interfaces with NAT64 feature
2012         :return: Dictionary of interfaces with NAT64 feature
2013         """
2014         return self.api(self.papi.nat64_interface_dump, {})
2015
2016     def nat64_add_del_static_bib(
2017             self,
2018             in_ip,
2019             out_ip,
2020             in_port,
2021             out_port,
2022             protocol,
2023             vrf_id=0,
2024             is_add=1):
2025         """Add/delete S-NAT static BIB entry
2026
2027         :param in_ip: Inside IPv6 address
2028         :param out_ip: Outside IPv4 address
2029         :param in_port: Inside port number
2030         :param out_port: Outside port number
2031         :param protocol: IP protocol
2032         :param vrf_id: VRF ID (Default value = 0)
2033         :param is_add: 1 if add, 0 if delete (Default value = 1)
2034         """
2035         return self.api(
2036             self.papi.nat64_add_del_static_bib,
2037             {'i_addr': in_ip,
2038              'o_addr': out_ip,
2039              'i_port': in_port,
2040              'o_port': out_port,
2041              'vrf_id': vrf_id,
2042              'proto': protocol,
2043              'is_add': is_add})
2044
2045     def nat64_bib_dump(self, protocol=255):
2046         """Dump NAT64 BIB
2047
2048         :param protocol: IP protocol (Default value = 255, all BIBs)
2049         :returns: Dictionary of NAT64 BIB entries
2050         """
2051         return self.api(self.papi.nat64_bib_dump, {'proto': protocol})
2052
2053     def nat64_set_timeouts(self, udp=300, icmp=60, tcp_trans=240, tcp_est=7440,
2054                            tcp_incoming_syn=6):
2055         """Set values of timeouts for NAT64 (in seconds)
2056
2057         :param udpi: UDP timeout (Default value = 300)
2058         :param icmp: ICMP timeout (Default value = 60)
2059         :param tcp_trans: TCP transitory timeout (Default value = 240)
2060         :param tcp_est: TCP established timeout (Default value = 7440)
2061         :param tcp_incoming_syn: TCP incoming SYN timeout (Default value = 6)
2062         """
2063         return self.api(
2064             self.papi.nat64_set_timeouts,
2065             {'udp': udp,
2066              'icmp': icmp,
2067              'tcp_trans': tcp_trans,
2068              'tcp_est': tcp_est,
2069              'tcp_incoming_syn': tcp_incoming_syn})
2070
2071     def nat64_get_timeouts(self):
2072         """Get values of timeouts for NAT64
2073
2074         :return: Timeouts for NAT64 (in seconds)
2075         """
2076         return self.api(self.papi.nat64_get_timeouts, {})
2077
2078     def nat64_st_dump(self, protocol=255):
2079         """Dump NAT64 session table
2080
2081         :param protocol: IP protocol (Default value = 255, all STs)
2082         :returns: Dictionary of NAT64 sesstion table entries
2083         """
2084         return self.api(self.papi.nat64_st_dump, {'proto': protocol})
2085
2086     def nat64_add_del_prefix(self, prefix, plen, vrf_id=0, is_add=1):
2087         """Add/del NAT64 prefix
2088
2089         :param prefix: NAT64 prefix
2090         :param plen: NAT64 prefix length
2091         :param vrf_id: VRF id of tenant (Default 0)
2092         :param is_add: 1 if add, 0 if delete (Default value = 1)
2093         """
2094         return self.api(
2095             self.papi.nat64_add_del_prefix,
2096             {'prefix': prefix,
2097              'prefix_len': plen,
2098              'vrf_id': vrf_id,
2099              'is_add': is_add})
2100
2101     def nat64_prefix_dump(self):
2102         """Dump NAT64 prefix
2103
2104         :returns: Dictionary of NAT64 prefixes
2105         """
2106         return self.api(self.papi.nat64_prefix_dump, {})
2107
2108     def nat64_add_interface_addr(
2109             self,
2110             sw_if_index,
2111             is_add=1):
2112         """Add/del NAT64 address from interface
2113
2114         :param sw_if_index: Software index of the interface
2115         :param is_add: 1 if add, 0 if delete (Default value = 1)
2116         """
2117         return self.api(self.papi.nat64_add_del_interface_addr,
2118                         {'is_add': is_add, 'sw_if_index': sw_if_index})
2119
2120     def dslite_set_aftr_addr(self, ip6, ip4):
2121         """Set DS-Lite AFTR addresses
2122
2123         :param ip4: IPv4 address
2124         :param ip6: IPv6 address
2125         """
2126         return self.api(
2127             self.papi.dslite_set_aftr_addr,
2128             {'ip4_addr': ip4,
2129              'ip6_addr': ip6})
2130
2131     def dslite_set_b4_addr(self, ip6, ip4):
2132         """Set DS-Lite B4 IPv6 address
2133
2134         :param ip4: IPv4 address
2135         :param ip6: IPv6 address
2136         """
2137         return self.api(
2138             self.papi.dslite_set_b4_addr,
2139             {'ip4_addr': ip4,
2140              'ip6_addr': ip6})
2141
2142     def dslite_add_del_pool_addr_range(
2143             self,
2144             start_addr,
2145             end_addr,
2146             is_add=1):
2147         """Add/del address range to DS-Lite pool
2148
2149         :param start_addr: First IP address
2150         :param end_addr: Last IP address
2151         :param is_add: 1 if add, 0 if delete (Default value = 1)
2152         """
2153         return self.api(
2154             self.papi.dslite_add_del_pool_addr_range,
2155             {'start_addr': start_addr,
2156              'end_addr': end_addr,
2157              'is_add': is_add})
2158
2159     def nat66_add_del_interface(
2160             self,
2161             sw_if_index,
2162             is_inside=1,
2163             is_add=1):
2164         """Enable/disable NAT66 feature on the interface
2165            :param sw_if_index: Index of the interface
2166            :param is_inside: 1 if inside, 0 if outside (Default value = 1)
2167            :param is_add: 1 if add, 0 if delete (Default value = 1)
2168         """
2169         return self.api(
2170             self.papi.nat66_add_del_interface,
2171             {'sw_if_index': sw_if_index,
2172              'is_inside': is_inside,
2173              'is_add': is_add})
2174
2175     def nat66_add_del_static_mapping(
2176             self,
2177             in_ip,
2178             out_ip,
2179             vrf_id=0,
2180             is_add=1):
2181         """Add/delete NAT66 static mapping
2182
2183         :param in_ip: Inside IPv6 address
2184         :param out_ip: Outside IPv6 address
2185         :param vrf_id: VRF ID (Default value = 0)
2186         :param is_add: 1 if add, 0 if delete (Default value = 1)
2187         """
2188         return self.api(
2189             self.papi.nat66_add_del_static_mapping,
2190             {'local_ip_address': in_ip,
2191              'external_ip_address': out_ip,
2192              'vrf_id': vrf_id,
2193              'is_add': is_add})
2194
2195     def nat66_interface_dump(self):
2196         """Dump interfaces with NAT66 feature
2197         :return: Dictionary of interfaces with NAT66 feature
2198         """
2199         return self.api(self.papi.nat66_interface_dump, {})
2200
2201     def nat66_static_mapping_dump(self):
2202         """Dump NAT66 static mappings
2203         :return: Dictionary of NAT66 static mappings
2204         """
2205         return self.api(self.papi.nat66_static_mapping_dump, {})
2206
2207     def control_ping(self):
2208         self.api(self.papi.control_ping)
2209
2210     def bfd_udp_add(self, sw_if_index, desired_min_tx, required_min_rx,
2211                     detect_mult, local_addr, peer_addr, is_ipv6=0,
2212                     bfd_key_id=None, conf_key_id=None):
2213         if bfd_key_id is None:
2214             return self.api(self.papi.bfd_udp_add,
2215                             {
2216                                 'sw_if_index': sw_if_index,
2217                                 'desired_min_tx': desired_min_tx,
2218                                 'required_min_rx': required_min_rx,
2219                                 'local_addr': local_addr,
2220                                 'peer_addr': peer_addr,
2221                                 'is_ipv6': is_ipv6,
2222                                 'detect_mult': detect_mult,
2223                             })
2224         else:
2225             return self.api(self.papi.bfd_udp_add,
2226                             {
2227                                 'sw_if_index': sw_if_index,
2228                                 'desired_min_tx': desired_min_tx,
2229                                 'required_min_rx': required_min_rx,
2230                                 'local_addr': local_addr,
2231                                 'peer_addr': peer_addr,
2232                                 'is_ipv6': is_ipv6,
2233                                 'detect_mult': detect_mult,
2234                                 'is_authenticated': 1,
2235                                 'bfd_key_id': bfd_key_id,
2236                                 'conf_key_id': conf_key_id,
2237                             })
2238
2239     def bfd_udp_mod(self, sw_if_index, desired_min_tx, required_min_rx,
2240                     detect_mult, local_addr, peer_addr, is_ipv6=0):
2241         return self.api(self.papi.bfd_udp_mod,
2242                         {
2243                             'sw_if_index': sw_if_index,
2244                             'desired_min_tx': desired_min_tx,
2245                             'required_min_rx': required_min_rx,
2246                             'local_addr': local_addr,
2247                             'peer_addr': peer_addr,
2248                             'is_ipv6': is_ipv6,
2249                             'detect_mult': detect_mult,
2250                         })
2251
2252     def bfd_udp_auth_activate(self, sw_if_index, local_addr, peer_addr,
2253                               is_ipv6=0, bfd_key_id=None, conf_key_id=None,
2254                               is_delayed=False):
2255         return self.api(self.papi.bfd_udp_auth_activate,
2256                         {
2257                             'sw_if_index': sw_if_index,
2258                             'local_addr': local_addr,
2259                             'peer_addr': peer_addr,
2260                             'is_ipv6': is_ipv6,
2261                             'is_delayed': 1 if is_delayed else 0,
2262                             'bfd_key_id': bfd_key_id,
2263                             'conf_key_id': conf_key_id,
2264                         })
2265
2266     def bfd_udp_auth_deactivate(self, sw_if_index, local_addr, peer_addr,
2267                                 is_ipv6=0, is_delayed=False):
2268         return self.api(self.papi.bfd_udp_auth_deactivate,
2269                         {
2270                             'sw_if_index': sw_if_index,
2271                             'local_addr': local_addr,
2272                             'peer_addr': peer_addr,
2273                             'is_ipv6': is_ipv6,
2274                             'is_delayed': 1 if is_delayed else 0,
2275                         })
2276
2277     def bfd_udp_del(self, sw_if_index, local_addr, peer_addr, is_ipv6=0):
2278         return self.api(self.papi.bfd_udp_del,
2279                         {
2280                             'sw_if_index': sw_if_index,
2281                             'local_addr': local_addr,
2282                             'peer_addr': peer_addr,
2283                             'is_ipv6': is_ipv6,
2284                         })
2285
2286     def bfd_udp_session_dump(self):
2287         return self.api(self.papi.bfd_udp_session_dump, {})
2288
2289     def bfd_udp_session_set_flags(self, admin_up_down, sw_if_index, local_addr,
2290                                   peer_addr, is_ipv6=0):
2291         return self.api(self.papi.bfd_udp_session_set_flags, {
2292             'admin_up_down': admin_up_down,
2293             'sw_if_index': sw_if_index,
2294             'local_addr': local_addr,
2295             'peer_addr': peer_addr,
2296             'is_ipv6': is_ipv6,
2297         })
2298
2299     def want_bfd_events(self, enable_disable=1):
2300         return self.api(self.papi.want_bfd_events, {
2301             'enable_disable': enable_disable,
2302             'pid': os.getpid(),
2303         })
2304
2305     def bfd_auth_set_key(self, conf_key_id, auth_type, key):
2306         return self.api(self.papi.bfd_auth_set_key, {
2307             'conf_key_id': conf_key_id,
2308             'auth_type': auth_type,
2309             'key': key,
2310             'key_len': len(key),
2311         })
2312
2313     def bfd_auth_del_key(self, conf_key_id):
2314         return self.api(self.papi.bfd_auth_del_key, {
2315             'conf_key_id': conf_key_id,
2316         })
2317
2318     def bfd_auth_keys_dump(self):
2319         return self.api(self.papi.bfd_auth_keys_dump, {})
2320
2321     def bfd_udp_set_echo_source(self, sw_if_index):
2322         return self.api(self.papi.bfd_udp_set_echo_source,
2323                         {'sw_if_index': sw_if_index})
2324
2325     def bfd_udp_del_echo_source(self):
2326         return self.api(self.papi.bfd_udp_del_echo_source, {})
2327
2328     def bfd_udp_get_echo_source(self):
2329         return self.api(self.papi.bfd_udp_get_echo_source, {})
2330
2331     def classify_add_del_table(
2332             self,
2333             is_add,
2334             mask,
2335             match_n_vectors=1,
2336             table_index=0xFFFFFFFF,
2337             nbuckets=2,
2338             memory_size=2097152,
2339             skip_n_vectors=0,
2340             next_table_index=0xFFFFFFFF,
2341             miss_next_index=0xFFFFFFFF,
2342             current_data_flag=0,
2343             current_data_offset=0):
2344         """
2345         :param is_add:
2346         :param mask:
2347         :param match_n_vectors: (Default value = 1)
2348         :param table_index: (Default value = 0xFFFFFFFF)
2349         :param nbuckets:  (Default value = 2)
2350         :param memory_size:  (Default value = 2097152)
2351         :param skip_n_vectors:  (Default value = 0)
2352         :param next_table_index:  (Default value = 0xFFFFFFFF)
2353         :param miss_next_index:  (Default value = 0xFFFFFFFF)
2354         :param current_data_flag:  (Default value = 0)
2355         :param current_data_offset:  (Default value = 0)
2356         """
2357
2358         mask_len = ((len(mask) - 1) / 16 + 1) * 16
2359         mask = mask + '\0' * (mask_len - len(mask))
2360         return self.api(
2361             self.papi.classify_add_del_table,
2362             {'is_add': is_add,
2363              'table_index': table_index,
2364              'nbuckets': nbuckets,
2365              'memory_size': memory_size,
2366              'skip_n_vectors': skip_n_vectors,
2367              'match_n_vectors': match_n_vectors,
2368              'next_table_index': next_table_index,
2369              'miss_next_index': miss_next_index,
2370              'current_data_flag': current_data_flag,
2371              'current_data_offset': current_data_offset,
2372              'mask_len': mask_len,
2373              'mask': mask})
2374
2375     def classify_add_del_session(
2376             self,
2377             is_add,
2378             table_index,
2379             match,
2380             opaque_index=0xFFFFFFFF,
2381             hit_next_index=0xFFFFFFFF,
2382             advance=0,
2383             action=0,
2384             metadata=0):
2385         """
2386         :param is_add:
2387         :param table_index:
2388         :param match:
2389         :param opaque_index:  (Default value = 0xFFFFFFFF)
2390         :param hit_next_index:  (Default value = 0xFFFFFFFF)
2391         :param advance:  (Default value = 0)
2392         :param action:  (Default value = 0)
2393         :param metadata:  (Default value = 0)
2394         """
2395
2396         match_len = ((len(match) - 1) / 16 + 1) * 16
2397         match = match + '\0' * (match_len - len(match))
2398         return self.api(
2399             self.papi.classify_add_del_session,
2400             {'is_add': is_add,
2401              'table_index': table_index,
2402              'hit_next_index': hit_next_index,
2403              'opaque_index': opaque_index,
2404              'advance': advance,
2405              'action': action,
2406              'metadata': metadata,
2407              'match_len': match_len,
2408              'match': match})
2409
2410     def input_acl_set_interface(
2411             self,
2412             is_add,
2413             sw_if_index,
2414             ip4_table_index=0xFFFFFFFF,
2415             ip6_table_index=0xFFFFFFFF,
2416             l2_table_index=0xFFFFFFFF):
2417         """
2418         :param is_add:
2419         :param sw_if_index:
2420         :param ip4_table_index:  (Default value = 0xFFFFFFFF)
2421         :param ip6_table_index:  (Default value = 0xFFFFFFFF)
2422         :param l2_table_index:  (Default value = 0xFFFFFFFF)
2423         """
2424
2425         return self.api(
2426             self.papi.input_acl_set_interface,
2427             {'sw_if_index': sw_if_index,
2428              'ip4_table_index': ip4_table_index,
2429              'ip6_table_index': ip6_table_index,
2430              'l2_table_index': l2_table_index,
2431              'is_add': is_add})
2432
2433     def output_acl_set_interface(
2434             self,
2435             is_add,
2436             sw_if_index,
2437             ip4_table_index=0xFFFFFFFF,
2438             ip6_table_index=0xFFFFFFFF,
2439             l2_table_index=0xFFFFFFFF):
2440         """
2441         :param is_add:
2442         :param sw_if_index:
2443         :param ip4_table_index:  (Default value = 0xFFFFFFFF)
2444         :param ip6_table_index:  (Default value = 0xFFFFFFFF)
2445         :param l2_table_index:  (Default value = 0xFFFFFFFF)
2446         """
2447
2448         return self.api(
2449             self.papi.output_acl_set_interface,
2450             {'sw_if_index': sw_if_index,
2451              'ip4_table_index': ip4_table_index,
2452              'ip6_table_index': ip6_table_index,
2453              'l2_table_index': l2_table_index,
2454              'is_add': is_add})
2455
2456     def set_ipfix_exporter(
2457             self,
2458             collector_address,
2459             src_address,
2460             path_mtu,
2461             template_interval,
2462             vrf_id=0,
2463             collector_port=4739,
2464             udp_checksum=0):
2465         return self.api(
2466             self.papi.set_ipfix_exporter,
2467             {
2468                 'collector_address': collector_address,
2469                 'collector_port': collector_port,
2470                 'src_address': src_address,
2471                 'vrf_id': vrf_id,
2472                 'path_mtu': path_mtu,
2473                 'template_interval': template_interval,
2474                 'udp_checksum': udp_checksum,
2475             })
2476
2477     def dhcp_proxy_config(self,
2478                           dhcp_server,
2479                           dhcp_src_address,
2480                           rx_table_id=0,
2481                           server_table_id=0,
2482                           is_add=1,
2483                           is_ipv6=0):
2484         return self.api(
2485             self.papi.dhcp_proxy_config,
2486             {
2487                 'rx_vrf_id': rx_table_id,
2488                 'server_vrf_id': server_table_id,
2489                 'is_ipv6': is_ipv6,
2490                 'is_add': is_add,
2491                 'dhcp_server': dhcp_server,
2492                 'dhcp_src_address': dhcp_src_address,
2493             })
2494
2495     def dhcp_proxy_set_vss(self,
2496                            table_id,
2497                            vss_type=255,
2498                            vpn_ascii_id="",
2499                            oui=0,
2500                            vpn_index=0,
2501                            is_add=1,
2502                            is_ip6=0):
2503         return self.api(
2504             self.papi.dhcp_proxy_set_vss,
2505             {
2506                 'tbl_id': table_id,
2507                 'vss_type': vss_type,
2508                 'vpn_ascii_id': vpn_ascii_id,
2509                 'oui': oui,
2510                 'vpn_index': vpn_index,
2511                 'is_add': is_add,
2512                 'is_ipv6': is_ip6,
2513             })
2514
2515     def dhcp_client_dump(self):
2516         return self.api(self.papi.dhcp_client_dump, {})
2517
2518     def dhcp_client(self,
2519                     sw_if_index,
2520                     hostname,
2521                     client_id='',
2522                     is_add=1,
2523                     set_broadcast_flag=1,
2524                     want_dhcp_events=0):
2525         return self.api(
2526             self.papi.dhcp_client_config,
2527             {
2528                 'is_add': is_add,
2529                 'client': {
2530                     'sw_if_index': sw_if_index,
2531                     'hostname': hostname,
2532                     'id': client_id,
2533                     'want_dhcp_event': want_dhcp_events,
2534                     'set_broadcast_flag': set_broadcast_flag,
2535                     'pid': os.getpid()}
2536             })
2537
2538     def ip_mroute_add_del(self,
2539                           src_address,
2540                           grp_address,
2541                           grp_address_length,
2542                           e_flags,
2543                           next_hop_afi,
2544                           next_hop_sw_if_index,
2545                           next_hop_address,
2546                           i_flags,
2547                           bier_imp=0,
2548                           rpf_id=0,
2549                           table_id=0,
2550                           is_add=1,
2551                           is_ipv6=0,
2552                           is_local=0):
2553         """
2554         IP Multicast Route add/del
2555         """
2556         return self.api(
2557             self.papi.ip_mroute_add_del,
2558             {'next_hop_sw_if_index': next_hop_sw_if_index,
2559              'entry_flags': e_flags,
2560              'itf_flags': i_flags,
2561              'table_id': table_id,
2562              'rpf_id': rpf_id,
2563              'is_add': is_add,
2564              'is_ipv6': is_ipv6,
2565              'is_local': is_local,
2566              'bier_imp': bier_imp,
2567              'next_hop_afi': next_hop_afi,
2568              'grp_address_length': grp_address_length,
2569              'grp_address': grp_address,
2570              'src_address': src_address,
2571              'nh_address': next_hop_address})
2572
2573     def mfib_signal_dump(self):
2574         return self.api(self.papi.mfib_signal_dump, {})
2575
2576     def ip_mfib_dump(self):
2577         return self.api(self.papi.ip_mfib_dump, {})
2578
2579     def ip6_mfib_dump(self):
2580         return self.api(self.papi.ip6_mfib_dump, {})
2581
2582     def lisp_enable_disable(self, is_enabled):
2583         return self.api(
2584             self.papi.lisp_enable_disable,
2585             {
2586                 'is_en': is_enabled,
2587             })
2588
2589     def lisp_locator_set(self,
2590                          ls_name,
2591                          is_add=1):
2592         return self.api(
2593             self.papi.lisp_add_del_locator_set,
2594             {
2595                 'is_add': is_add,
2596                 'locator_set_name': ls_name
2597             })
2598
2599     def lisp_locator_set_dump(self):
2600         return self.api(self.papi.lisp_locator_set_dump, {})
2601
2602     def lisp_locator(self,
2603                      ls_name,
2604                      sw_if_index,
2605                      priority=1,
2606                      weight=1,
2607                      is_add=1):
2608         return self.api(
2609             self.papi.lisp_add_del_locator,
2610             {
2611                 'is_add': is_add,
2612                 'locator_set_name': ls_name,
2613                 'sw_if_index': sw_if_index,
2614                 'priority': priority,
2615                 'weight': weight
2616             })
2617
2618     def lisp_locator_dump(self, is_index_set, ls_name=None, ls_index=0):
2619         return self.api(
2620             self.papi.lisp_locator_dump,
2621             {
2622                 'is_index_set': is_index_set,
2623                 'ls_name': ls_name,
2624                 'ls_index': ls_index,
2625             })
2626
2627     def lisp_local_mapping(self,
2628                            ls_name,
2629                            eid_type,
2630                            eid,
2631                            prefix_len,
2632                            vni=0,
2633                            key_id=0,
2634                            key="",
2635                            is_add=1):
2636         return self.api(
2637             self.papi.lisp_add_del_local_eid,
2638             {
2639                 'locator_set_name': ls_name,
2640                 'is_add': is_add,
2641                 'eid_type': eid_type,
2642                 'eid': eid,
2643                 'prefix_len': prefix_len,
2644                 'vni': vni,
2645                 'key_id': key_id,
2646                 'key': key
2647             })
2648
2649     def lisp_eid_table_dump(self,
2650                             eid_set=0,
2651                             prefix_length=0,
2652                             vni=0,
2653                             eid_type=0,
2654                             eid=None,
2655                             filter_opt=0):
2656         return self.api(
2657             self.papi.lisp_eid_table_dump,
2658             {
2659                 'eid_set': eid_set,
2660                 'prefix_length': prefix_length,
2661                 'vni': vni,
2662                 'eid_type': eid_type,
2663                 'eid': eid,
2664                 'filter': filter_opt,
2665             })
2666
2667     def lisp_remote_mapping(self,
2668                             eid_type,
2669                             eid,
2670                             eid_prefix_len=0,
2671                             vni=0,
2672                             rlocs=[],
2673                             rlocs_num=0,
2674                             is_src_dst=0,
2675                             is_add=1):
2676         return self.api(
2677             self.papi.lisp_add_del_remote_mapping,
2678             {
2679                 'is_add': is_add,
2680                 'eid_type': eid_type,
2681                 'eid': eid,
2682                 'eid_len': eid_prefix_len,
2683                 'rloc_num': rlocs_num,
2684                 'rlocs': rlocs,
2685                 'vni': vni,
2686                 'is_src_dst': is_src_dst,
2687             })
2688
2689     def lisp_adjacency(self,
2690                        leid,
2691                        reid,
2692                        leid_len,
2693                        reid_len,
2694                        eid_type,
2695                        is_add=1,
2696                        vni=0):
2697         return self.api(
2698             self.papi.lisp_add_del_adjacency,
2699             {
2700                 'is_add': is_add,
2701                 'vni': vni,
2702                 'eid_type': eid_type,
2703                 'leid': leid,
2704                 'reid': reid,
2705                 'leid_len': leid_len,
2706                 'reid_len': reid_len,
2707             })
2708
2709     def lisp_adjacencies_get(self, vni=0):
2710         return self.api(
2711             self.papi.lisp_adjacencies_get,
2712             {
2713                 'vni': vni
2714             })
2715
2716     def map_add_domain(self,
2717                        ip6_prefix,
2718                        ip6_src,
2719                        ip4_prefix,
2720                        ea_bits_len=0,
2721                        psid_offset=0,
2722                        psid_length=0,
2723                        mtu=1280):
2724
2725         return self.api(
2726             self.papi.map_add_domain,
2727             {
2728                 'ip6_prefix': ip6_prefix,
2729                 'ip4_prefix': ip4_prefix,
2730                 'ip6_src': ip6_src,
2731                 'ea_bits_len': ea_bits_len,
2732                 'psid_offset': psid_offset,
2733                 'psid_length': psid_length,
2734                 'mtu': mtu
2735             })
2736
2737     def map_if_enable_disable(self, is_enable, sw_if_index, is_translation):
2738         return self.api(
2739             self.papi.map_if_enable_disable,
2740             {
2741                 'is_enable': is_enable,
2742                 'sw_if_index': sw_if_index,
2743                 'is_translation': is_translation,
2744             })
2745
2746     def map_param_set_tcp(self, tcp_mss):
2747         return self.api(
2748             self.papi.map_param_set_tcp,
2749             {
2750                 'tcp_mss': tcp_mss,
2751             })
2752
2753     def gtpu_add_del_tunnel(
2754             self,
2755             src_addr,
2756             dst_addr,
2757             is_add=1,
2758             is_ipv6=0,
2759             mcast_sw_if_index=0xFFFFFFFF,
2760             encap_vrf_id=0,
2761             decap_next_index=0xFFFFFFFF,
2762             teid=0):
2763         """
2764
2765         :param is_add:  (Default value = 1)
2766         :param is_ipv6:  (Default value = 0)
2767         :param src_addr:
2768         :param dst_addr:
2769         :param mcast_sw_if_index:  (Default value = 0xFFFFFFFF)
2770         :param encap_vrf_id:  (Default value = 0)
2771         :param decap_next_index:  (Default value = 0xFFFFFFFF)
2772         :param teid:  (Default value = 0)
2773
2774         """
2775         return self.api(self.papi.gtpu_add_del_tunnel,
2776                         {'is_add': is_add,
2777                          'is_ipv6': is_ipv6,
2778                          'src_address': src_addr,
2779                          'dst_address': dst_addr,
2780                          'mcast_sw_if_index': mcast_sw_if_index,
2781                          'encap_vrf_id': encap_vrf_id,
2782                          'decap_next_index': decap_next_index,
2783                          'teid': teid})
2784
2785     def vxlan_gpe_add_del_tunnel(
2786             self,
2787             src_addr,
2788             dst_addr,
2789             mcast_sw_if_index=0xFFFFFFFF,
2790             is_add=1,
2791             is_ipv6=0,
2792             encap_vrf_id=0,
2793             decap_vrf_id=0,
2794             protocol=3,
2795             vni=0):
2796         """
2797
2798         :param local:
2799         :param remote:
2800         :param is_add:  (Default value = 1)
2801         :param is_ipv6:  (Default value = 0)
2802         :param encap_vrf_id:  (Default value = 0)
2803         :param decap_vrf_id:  (Default value = 0)
2804         :param mcast_sw_if_index:  (Default value = 0xFFFFFFFF)
2805         :param protocol:  (Default value = 3)
2806         :param vni:  (Default value = 0)
2807
2808         """
2809         return self.api(self.papi.vxlan_gpe_add_del_tunnel,
2810                         {'is_add': is_add,
2811                          'is_ipv6': is_ipv6,
2812                          'local': src_addr,
2813                          'remote': dst_addr,
2814                          'mcast_sw_if_index': mcast_sw_if_index,
2815                          'encap_vrf_id': encap_vrf_id,
2816                          'decap_vrf_id': decap_vrf_id,
2817                          'protocol': protocol,
2818                          'vni': vni})
2819
2820     def vxlan_gbp_tunnel_add_del(
2821             self,
2822             src,
2823             dst,
2824             mcast_sw_if_index=0xFFFFFFFF,
2825             is_add=1,
2826             is_ipv6=0,
2827             encap_table_id=0,
2828             vni=0,
2829             instance=0xFFFFFFFF):
2830         """
2831
2832         :param dst_addr:
2833         :param src_addr:
2834         :param is_add:  (Default value = 1)
2835         :param is_ipv6:  (Default value = 0)
2836         :param encap_table_id:  (Default value = 0)
2837         :param decap_next_index:  (Default value = 0xFFFFFFFF)
2838         :param mcast_sw_if_index:  (Default value = 0xFFFFFFFF)
2839         :param vni:  (Default value = 0)
2840         :param instance:  (Default value = 0xFFFFFFFF)
2841
2842         """
2843         return self.api(self.papi.vxlan_gbp_tunnel_add_del,
2844                         {'is_add': is_add,
2845                          'tunnel': {
2846                              'src': src,
2847                              'dst': dst,
2848                              'mcast_sw_if_index': mcast_sw_if_index,
2849                              'encap_table_id': encap_table_id,
2850                              'vni': vni,
2851                              'instance': instance}})
2852
2853     def vxlan_gbp_tunnel_dump(self, sw_if_index=0xffffffff):
2854         return self.api(self.papi.vxlan_gbp_tunnel_dump,
2855                         {'sw_if_index': sw_if_index,
2856                          '_no_type_conversion': True})
2857
2858     def pppoe_add_del_session(
2859             self,
2860             client_ip,
2861             client_mac,
2862             session_id=0,
2863             is_add=1,
2864             is_ipv6=0,
2865             decap_vrf_id=0):
2866         """
2867
2868         :param is_add:  (Default value = 1)
2869         :param is_ipv6:  (Default value = 0)
2870         :param client_ip:
2871         :param session_id:  (Default value = 0)
2872         :param client_mac:
2873         :param decap_vrf_id:  (Default value = 0)
2874
2875         """
2876         return self.api(self.papi.pppoe_add_del_session,
2877                         {'is_add': is_add,
2878                          'is_ipv6': is_ipv6,
2879                          'session_id': session_id,
2880                          'client_ip': client_ip,
2881                          'decap_vrf_id': decap_vrf_id,
2882                          'client_mac': client_mac})
2883
2884     def sr_mpls_policy_add(self, bsid, weight, type, segments):
2885         return self.api(self.papi.sr_mpls_policy_add,
2886                         {'bsid': bsid,
2887                          'weight': weight,
2888                          'type': type,
2889                          'n_segments': len(segments),
2890                          'segments': segments})
2891
2892     def sr_mpls_policy_del(self, bsid):
2893         return self.api(self.papi.sr_mpls_policy_del,
2894                         {'bsid': bsid})
2895
2896     def sr_localsid_add_del(self,
2897                             localsid,
2898                             behavior,
2899                             nh_addr4,
2900                             nh_addr6,
2901                             is_del=0,
2902                             end_psp=0,
2903                             sw_if_index=0xFFFFFFFF,
2904                             vlan_index=0,
2905                             fib_table=0,
2906                             ):
2907         """ Add/del IPv6 SR local-SID.
2908
2909         :param localsid:
2910         :param behavior: END=1; END.X=2; END.DX2=4; END.DX6=5;
2911         :param behavior: END.DX4=6; END.DT6=7; END.DT4=8
2912         :param nh_addr4:
2913         :param nh_addr6:
2914         :param is_del:  (Default value = 0)
2915         :param end_psp: (Default value = 0)
2916         :param sw_if_index: (Default value = 0xFFFFFFFF)
2917         :param vlan_index:  (Default value = 0)
2918         :param fib_table:   (Default value = 0)
2919         """
2920         return self.api(
2921             self.papi.sr_localsid_add_del,
2922             {'is_del': is_del,
2923              'localsid': localsid,
2924              'end_psp': end_psp,
2925              'behavior': behavior,
2926              'sw_if_index': sw_if_index,
2927              'vlan_index': vlan_index,
2928              'fib_table': fib_table,
2929              'nh_addr4': nh_addr4,
2930              'nh_addr6': nh_addr6
2931              }
2932         )
2933
2934     def sr_policy_add(
2935             self,
2936             bsid_addr,
2937             weight=1,
2938             is_encap=1,
2939             type=0,
2940             fib_table=0,
2941             n_segments=0,
2942             segments=[]):
2943         """
2944         :param bsid_addr: bindingSID of the SR Policy
2945         :param weight: weight of the sid list. optional. (default: 1)
2946         :param is_encap: (bool) whether SR policy should Encap or SRH insert \
2947             (default: Encap)
2948         :param type: type/behavior of the SR policy. (default or spray) \
2949             (default: default)
2950         :param fib_table: VRF where to install the FIB entry for the BSID \
2951             (default: 0)
2952         :param n_segments: number of segments \
2953             (default: 0)
2954         :param segments: a vector of IPv6 address composing the segment list \
2955             (default: [])
2956         """
2957         return self.api(
2958             self.papi.sr_policy_add,
2959             {'bsid_addr': bsid_addr,
2960              'weight': weight,
2961              'is_encap': is_encap,
2962              'type': type,
2963              'fib_table': fib_table,
2964              'n_segments': n_segments,
2965              'segments': segments
2966              }
2967         )
2968
2969     def sr_policy_del(
2970             self,
2971             bsid_addr,
2972             sr_policy_index=0):
2973         """
2974         :param bsid: bindingSID of the SR Policy
2975         :param sr_policy_index: index of the sr policy (default: 0)
2976         """
2977         return self.api(
2978             self.papi.sr_policy_del,
2979             {'bsid_addr': bsid_addr,
2980              'sr_policy_index': sr_policy_index
2981              })
2982
2983     def sr_steering_add_del(
2984             self,
2985             is_del,
2986             bsid_addr,
2987             sr_policy_index,
2988             table_id,
2989             prefix_addr,
2990             mask_width,
2991             sw_if_index,
2992             traffic_type):
2993         """
2994         Steer traffic L2 and L3 traffic through a given SR policy
2995
2996         :param is_del: delete or add
2997         :param bsid_addr: bindingSID of the SR Policy (alt to sr_policy_index)
2998         :param sr_policy: is the index of the SR Policy (alt to bsid)
2999         :param table_id: is the VRF where to install the FIB entry for the BSID
3000         :param prefix_addr: is the IPv4/v6 address for L3 traffic type
3001         :param mask_width: is the mask for L3 traffic type
3002         :param sw_if_index: is the incoming interface for L2 traffic
3003         :param traffic_type: type of traffic (IPv4: 4, IPv6: 6, L2: 2)
3004         """
3005         return self.api(
3006             self.papi.sr_steering_add_del,
3007             {'is_del': is_del,
3008              'bsid_addr': bsid_addr,
3009              'sr_policy_index': sr_policy_index,
3010              'table_id': table_id,
3011              'prefix_addr': prefix_addr,
3012              'mask_width': mask_width,
3013              'sw_if_index': sw_if_index,
3014              'traffic_type': traffic_type
3015              })
3016
3017     def acl_add_replace(self, acl_index, r, tag='',
3018                         expected_retval=0):
3019         """Add/replace an ACL
3020         :param int acl_index: ACL index to replace, 2^32-1 to create new ACL.
3021         :param acl_rule r: ACL rules array.
3022         :param str tag: symbolic tag (description) for this ACL.
3023         :param int count: number of rules.
3024         """
3025         return self.api(self.papi.acl_add_replace,
3026                         {'acl_index': acl_index,
3027                          'r': r,
3028                          'count': len(r),
3029                          'tag': tag},
3030                         expected_retval=expected_retval)
3031
3032     def acl_del(self, acl_index, expected_retval=0):
3033         """
3034
3035         :param acl_index:
3036         :return:
3037         """
3038         return self.api(self.papi.acl_del,
3039                         {'acl_index': acl_index},
3040                         expected_retval=expected_retval)
3041
3042     def acl_interface_set_acl_list(self, sw_if_index, n_input, acls,
3043                                    expected_retval=0):
3044         return self.api(self.papi.acl_interface_set_acl_list,
3045                         {'sw_if_index': sw_if_index,
3046                          'count': len(acls),
3047                          'n_input': n_input,
3048                          'acls': acls},
3049                         expected_retval=expected_retval)
3050
3051     def acl_interface_set_etype_whitelist(self, sw_if_index,
3052                                           n_input, whitelist,
3053                                           expected_retval=0):
3054         return self.api(self.papi.acl_interface_set_etype_whitelist,
3055                         {'sw_if_index': sw_if_index,
3056                          'count': len(whitelist),
3057                          'n_input': n_input,
3058                          'whitelist': whitelist},
3059                         expected_retval=expected_retval)
3060
3061     def acl_interface_add_del(self,
3062                               sw_if_index,
3063                               acl_index,
3064                               is_add=1):
3065         """ Add/Delete ACL to/from interface
3066
3067         :param sw_if_index:
3068         :param acl_index:
3069         :param is_add:  (Default value = 1)
3070         """
3071
3072         return self.api(self.papi.acl_interface_add_del,
3073                         {'is_add': is_add,
3074                          'is_input': 1,
3075                          'sw_if_index': sw_if_index,
3076                          'acl_index': acl_index})
3077
3078     def acl_dump(self, acl_index, expected_retval=0):
3079         return self.api(self.papi.acl_dump,
3080                         {'acl_index': acl_index},
3081                         expected_retval=expected_retval)
3082
3083     def acl_interface_list_dump(self, sw_if_index=0xFFFFFFFF,
3084                                 expected_retval=0):
3085         return self.api(self.papi.acl_interface_list_dump,
3086                         {'sw_if_index': sw_if_index},
3087                         expected_retval=expected_retval)
3088
3089     def macip_acl_add(self, rules, tag=""):
3090         """ Add MACIP acl
3091
3092         :param rules: list of rules for given acl
3093         :param tag: acl tag
3094         """
3095
3096         return self.api(self.papi.macip_acl_add,
3097                         {'r': rules,
3098                          'count': len(rules),
3099                          'tag': tag})
3100
3101     def macip_acl_add_replace(self, rules, acl_index=0xFFFFFFFF, tag=""):
3102         """ Add MACIP acl
3103
3104         :param rules: list of rules for given acl
3105         :param tag: acl tag
3106         """
3107
3108         return self.api(self.papi.macip_acl_add_replace,
3109                         {'acl_index': acl_index,
3110                          'r': rules,
3111                          'count': len(rules),
3112                          'tag': tag})
3113
3114     def macip_acl_del(self, acl_index):
3115         """
3116
3117         :param acl_index:
3118         :return:
3119         """
3120         return self.api(self.papi.macip_acl_del,
3121                         {'acl_index': acl_index})
3122
3123     def macip_acl_interface_add_del(self,
3124                                     sw_if_index,
3125                                     acl_index,
3126                                     is_add=1):
3127         """ Add MACIP acl to interface
3128
3129         :param sw_if_index:
3130         :param acl_index:
3131         :param is_add:  (Default value = 1)
3132         """
3133
3134         return self.api(self.papi.macip_acl_interface_add_del,
3135                         {'is_add': is_add,
3136                          'sw_if_index': sw_if_index,
3137                          'acl_index': acl_index})
3138
3139     def macip_acl_interface_get(self):
3140         """ Return interface acls dump
3141         """
3142         return self.api(
3143             self.papi.macip_acl_interface_get, {})
3144
3145     def macip_acl_dump(self, acl_index=4294967295):
3146         """ Return MACIP acl dump
3147         """
3148
3149         return self.api(
3150             self.papi.macip_acl_dump, {'acl_index': acl_index})
3151
3152     def policer_add_del(self,
3153                         name,
3154                         cir,
3155                         eir,
3156                         cb,
3157                         eb,
3158                         is_add=1,
3159                         rate_type=0,
3160                         round_type=0,
3161                         ptype=0,
3162                         color_aware=0,
3163                         conform_action_type=1,
3164                         conform_dscp=0,
3165                         exceed_action_type=0,
3166                         exceed_dscp=0,
3167                         violate_action_type=0,
3168                         violate_dscp=0):
3169         return self.api(self.papi.policer_add_del,
3170                         {'name': name,
3171                          'cir': cir,
3172                          'eir': eir,
3173                          'cb': cb,
3174                          'eb': eb,
3175                          'is_add': is_add,
3176                          'rate_type': rate_type,
3177                          'round_type': round_type,
3178                          'type': ptype,
3179                          'color_aware': color_aware,
3180                          'conform_action_type': conform_action_type,
3181                          'conform_dscp': conform_dscp,
3182                          'exceed_action_type': exceed_action_type,
3183                          'exceed_dscp': exceed_dscp,
3184                          'violate_action_type': violate_action_type,
3185                          'violate_dscp': violate_dscp})
3186
3187     def ip_punt_police(self,
3188                        policer_index,
3189                        is_ip6=0,
3190                        is_add=1):
3191         return self.api(self.papi.ip_punt_police,
3192                         {'policer_index': policer_index,
3193                          'is_add': is_add,
3194                          'is_ip6': is_ip6})
3195
3196     def ip_punt_redirect(self,
3197                          rx_sw_if_index,
3198                          tx_sw_if_index,
3199                          address,
3200                          is_add=1):
3201         return self.api(self.papi.ip_punt_redirect,
3202                         {'punt': {'rx_sw_if_index': rx_sw_if_index,
3203                                   'tx_sw_if_index': tx_sw_if_index,
3204                                   'nh': address},
3205                          'is_add': is_add})
3206
3207     def ip_punt_redirect_dump(self, sw_if_index, is_ipv6=0):
3208         return self.api(self.papi.ip_punt_redirect_dump,
3209                         {'sw_if_index': sw_if_index,
3210                          'is_ipv6': is_ipv6})
3211
3212     def bier_table_add_del(self,
3213                            bti,
3214                            mpls_label,
3215                            is_add=1):
3216         """ BIER Table add/del """
3217         return self.api(
3218             self.papi.bier_table_add_del,
3219             {'bt_tbl_id': {"bt_set": bti.set_id,
3220                            "bt_sub_domain": bti.sub_domain_id,
3221                            "bt_hdr_len_id": bti.hdr_len_id},
3222              'bt_label': mpls_label,
3223              'bt_is_add': is_add})
3224
3225     def bier_table_dump(self):
3226         return self.api(self.papi.bier_table_dump, {})
3227
3228     def bier_route_add_del(self,
3229                            bti,
3230                            bp,
3231                            paths,
3232                            is_add=1,
3233                            is_replace=0):
3234         """ BIER Route add/del """
3235         return self.api(
3236             self.papi.bier_route_add_del,
3237             {'br_tbl_id': {"bt_set": bti.set_id,
3238                            "bt_sub_domain": bti.sub_domain_id,
3239                            "bt_hdr_len_id": bti.hdr_len_id},
3240              'br_bp': bp,
3241              'br_n_paths': len(paths),
3242              'br_paths': paths,
3243              'br_is_add': is_add,
3244              'br_is_replace': is_replace})
3245
3246     def bier_route_dump(self, bti):
3247         return self.api(
3248             self.papi.bier_route_dump,
3249             {'br_tbl_id': {"bt_set": bti.set_id,
3250                            "bt_sub_domain": bti.sub_domain_id,
3251                            "bt_hdr_len_id": bti.hdr_len_id}})
3252
3253     def bier_imp_add(self,
3254                      bti,
3255                      src,
3256                      ibytes,
3257                      is_add=1):
3258         """ BIER Imposition Add """
3259         return self.api(
3260             self.papi.bier_imp_add,
3261             {'bi_tbl_id': {"bt_set": bti.set_id,
3262                            "bt_sub_domain": bti.sub_domain_id,
3263                            "bt_hdr_len_id": bti.hdr_len_id},
3264              'bi_src': src,
3265              'bi_n_bytes': len(ibytes),
3266              'bi_bytes': ibytes})
3267
3268     def bier_imp_del(self, bi_index):
3269         """ BIER Imposition del """
3270         return self.api(
3271             self.papi.bier_imp_del,
3272             {'bi_index': bi_index})
3273
3274     def bier_imp_dump(self):
3275         return self.api(self.papi.bier_imp_dump, {})
3276
3277     def bier_disp_table_add_del(self,
3278                                 bdti,
3279                                 is_add=1):
3280         """ BIER Disposition Table add/del """
3281         return self.api(
3282             self.papi.bier_disp_table_add_del,
3283             {'bdt_tbl_id': bdti,
3284              'bdt_is_add': is_add})
3285
3286     def bier_disp_table_dump(self):
3287         return self.api(self.papi.bier_disp_table_dump, {})
3288
3289     def bier_disp_entry_add_del(self,
3290                                 bdti,
3291                                 bp,
3292                                 payload_proto,
3293                                 next_hop_afi,
3294                                 next_hop,
3295                                 next_hop_tbl_id=0,
3296                                 next_hop_rpf_id=~0,
3297                                 next_hop_is_ip4=1,
3298                                 is_add=1):
3299         """ BIER Route add/del """
3300         lstack = []
3301         while (len(lstack) < 16):
3302             lstack.append({})
3303         return self.api(
3304             self.papi.bier_disp_entry_add_del,
3305             {'bde_tbl_id': bdti,
3306              'bde_bp': bp,
3307              'bde_payload_proto': payload_proto,
3308              'bde_n_paths': 1,
3309              'bde_paths': [{'next_hop': next_hop,
3310                             'table_id': next_hop_tbl_id,
3311                             'afi': next_hop_afi,
3312                             'rpf_id': next_hop_rpf_id,
3313                             'n_labels': 0,
3314                             'label_stack': lstack}],
3315              'bde_is_add': is_add})
3316
3317     def bier_disp_entry_dump(self, bdti):
3318         return self.api(
3319             self.papi.bier_disp_entry_dump,
3320             {'bde_tbl_id': bdti})
3321
3322     def add_node_next(self, node_name, next_name):
3323         """ Set the next node for a given node request
3324
3325         :param node_name:
3326         :param next_name:
3327         """
3328         return self.api(self.papi.add_node_next,
3329                         {'node_name': node_name,
3330                          'next_name': next_name})
3331
3332     def session_enable_disable(self, is_enabled):
3333         return self.api(
3334             self.papi.session_enable_disable,
3335             {'is_enable': is_enabled})
3336
3337     def ipsec_spd_add_del(self, spd_id, is_add=1):
3338         """ SPD add/del - Wrapper to add or del ipsec SPD
3339         Sample CLI : 'ipsec spd add 1'
3340
3341         :param spd_id - SPD ID to be created in the vpp . mandatory
3342         :param is_add - create (1) or delete(0) SPD (Default 1 - add) .
3343               optional
3344         :returns: reply from the API
3345         """
3346         return self.api(
3347             self.papi.ipsec_spd_add_del, {
3348                 'spd_id': spd_id, 'is_add': is_add})
3349
3350     def ipsec_interface_add_del_spd(self, spd_id, sw_if_index, is_add=1):
3351         """ IPSEC interface SPD add/del - \
3352              Wrapper to associate/disassociate SPD to interface in VPP
3353         Sample CLI : 'set interface ipsec spd GigabitEthernet0/6/0 1'
3354
3355         :param spd_id - SPD ID to associate with the interface . mandatory
3356         :param sw_if_index - Interface Index which needs to ipsec \
3357             association mandatory
3358         :param is_add - add(1) or del(0) association with interface \
3359                 (Default 1 - add) . optional
3360         :returns: reply from the API
3361         """
3362         return self.api(
3363             self.papi.ipsec_interface_add_del_spd,
3364             {'spd_id': spd_id, 'sw_if_index': sw_if_index, 'is_add': is_add})
3365
3366     def ipsec_sad_add_del_entry(self,
3367                                 sad_id,
3368                                 spi,
3369                                 integrity_algorithm,
3370                                 integrity_key,
3371                                 crypto_algorithm,
3372                                 crypto_key,
3373                                 protocol,
3374                                 tunnel_src_address='',
3375                                 tunnel_dst_address='',
3376                                 is_tunnel=1,
3377                                 is_tunnel_ipv6=0,
3378                                 is_add=1,
3379                                 udp_encap=0,
3380                                 use_anti_replay=0,
3381                                 use_extended_sequence_number=0):
3382         """ IPSEC SA add/del
3383         :param sad_id: security association ID
3384         :param spi: security param index of the SA in decimal
3385         :param integrity_algorithm:
3386         :param integrity_key:
3387         :param crypto_algorithm:
3388         :param crypto_key:
3389         :param protocol: AH(0) or ESP(1) protocol
3390         :param tunnel_src_address: tunnel mode outer src address
3391         :param tunnel_dst_address: tunnel mode outer dst address
3392         :param is_add:
3393         :param is_tunnel:
3394         :** reference /vpp/src/vnet/ipsec/ipsec.h file for enum values of
3395              crypto and ipsec algorithms
3396         """
3397         return self.api(
3398             self.papi.ipsec_sad_add_del_entry,
3399             {'sad_id': sad_id,
3400              'spi': spi,
3401              'tunnel_src_address': tunnel_src_address,
3402              'tunnel_dst_address': tunnel_dst_address,
3403              'protocol': protocol,
3404              'integrity_algorithm': integrity_algorithm,
3405              'integrity_key_length': len(integrity_key),
3406              'integrity_key': integrity_key,
3407              'crypto_algorithm': crypto_algorithm,
3408              'crypto_key_length': len(crypto_key) if crypto_key is not None
3409              else 0,
3410              'crypto_key': crypto_key,
3411              'is_add': is_add,
3412              'is_tunnel': is_tunnel,
3413              'is_tunnel_ipv6': is_tunnel_ipv6,
3414              'udp_encap': udp_encap,
3415              'use_extended_sequence_number': use_extended_sequence_number,
3416              'use_anti_replay': use_anti_replay})
3417
3418     def ipsec_spd_add_del_entry(self,
3419                                 spd_id,
3420                                 sa_id,
3421                                 local_address_start,
3422                                 local_address_stop,
3423                                 remote_address_start,
3424                                 remote_address_stop,
3425                                 local_port_start=0,
3426                                 local_port_stop=65535,
3427                                 remote_port_start=0,
3428                                 remote_port_stop=65535,
3429                                 protocol=0,
3430                                 policy=0,
3431                                 priority=100,
3432                                 is_outbound=1,
3433                                 is_add=1,
3434                                 is_ipv6=0,
3435                                 is_ip_any=0):
3436         """ IPSEC policy SPD add/del   -
3437                     Wrapper to configure ipsec SPD policy entries in VPP
3438         :param spd_id: SPD ID for the policy
3439         :param local_address_start: local-ip-range start address
3440         :param local_address_stop : local-ip-range stop address
3441         :param remote_address_start: remote-ip-range start address
3442         :param remote_address_stop : remote-ip-range stop address
3443         :param local_port_start: (Default value = 0)
3444         :param local_port_stop: (Default value = 65535)
3445         :param remote_port_start: (Default value = 0)
3446         :param remote_port_stop: (Default value = 65535)
3447         :param protocol: Any(0), AH(51) & ESP(50) protocol (Default value = 0)
3448         :param sa_id: Security Association ID for mapping it to SPD
3449         :param policy: bypass(0), discard(1), resolve(2) or protect(3) action
3450                (Default value = 0)
3451         :param priority: value for the spd action (Default value = 100)
3452         :param is_outbound: flag for inbound(0) or outbound(1)
3453                (Default value = 1)
3454         :param is_add: (Default value = 1)
3455         """
3456         return self.api(
3457             self.papi.ipsec_spd_add_del_entry,
3458             {'spd_id': spd_id,
3459              'sa_id': sa_id,
3460              'local_address_start': local_address_start,
3461              'local_address_stop': local_address_stop,
3462              'remote_address_start': remote_address_start,
3463              'remote_address_stop': remote_address_stop,
3464              'local_port_start': local_port_start,
3465              'local_port_stop': local_port_stop,
3466              'remote_port_start': remote_port_start,
3467              'remote_port_stop': remote_port_stop,
3468              'is_add': is_add,
3469              'protocol': protocol,
3470              'policy': policy,
3471              'priority': priority,
3472              'is_outbound': is_outbound,
3473              'is_ipv6': is_ipv6,
3474              'is_ip_any': is_ip_any})
3475
3476     def ipsec_tunnel_if_add_del(self, local_ip, remote_ip, local_spi,
3477                                 remote_spi, crypto_alg, local_crypto_key,
3478                                 remote_crypto_key, integ_alg, local_integ_key,
3479                                 remote_integ_key, is_add=1, esn=0,
3480                                 anti_replay=1, renumber=0, show_instance=0):
3481         return self.api(
3482             self.papi.ipsec_tunnel_if_add_del,
3483             {'local_ip': local_ip, 'remote_ip': remote_ip,
3484              'local_spi': local_spi, 'remote_spi': remote_spi,
3485              'crypto_alg': crypto_alg,
3486              'local_crypto_key_len': len(local_crypto_key),
3487              'local_crypto_key': local_crypto_key,
3488              'remote_crypto_key_len': len(remote_crypto_key),
3489              'remote_crypto_key': remote_crypto_key, 'integ_alg': integ_alg,
3490              'local_integ_key_len': len(local_integ_key),
3491              'local_integ_key': local_integ_key,
3492              'remote_integ_key_len': len(remote_integ_key),
3493              'remote_integ_key': remote_integ_key, 'is_add': is_add,
3494              'esn': esn, 'anti_replay': anti_replay, 'renumber': renumber,
3495              'show_instance': show_instance
3496              })
3497
3498     def ipsec_select_backend(self, protocol, index):
3499         return self.api(self.papi.ipsec_select_backend,
3500                         {'protocol': protocol, 'index': index})
3501
3502     def ipsec_backend_dump(self):
3503         return self.api(self.papi.ipsec_backend_dump, {})
3504
3505     def app_namespace_add(self,
3506                           namespace_id,
3507                           ip4_fib_id=0,
3508                           ip6_fib_id=0,
3509                           sw_if_index=0xFFFFFFFF,
3510                           secret=0):
3511         return self.api(
3512             self.papi.app_namespace_add_del,
3513             {'secret': secret,
3514              'sw_if_index': sw_if_index,
3515              'ip4_fib_id': ip4_fib_id,
3516              'ip6_fib_id': ip6_fib_id,
3517              'namespace_id': namespace_id,
3518              'namespace_id_len': len(namespace_id)})
3519
3520     def punt_socket_register(self, port, pathname, protocol=0x11,
3521                              header_version=1, is_ip4=1):
3522         """ Register punt socket """
3523         return self.api(self.papi.punt_socket_register,
3524                         {'header_version': header_version,
3525                          'punt': {'ipv': is_ip4,
3526                                   'l4_protocol': protocol,
3527                                   'l4_port': port},
3528                          'pathname': pathname})
3529
3530     def punt_socket_deregister(self, port, protocol=0x11, is_ip4=1):
3531         """ Unregister punt socket """
3532         return self.api(self.papi.punt_socket_deregister,
3533                         {'punt': {'ipv': is_ip4,
3534                                   'l4_protocol': protocol,
3535                                   'l4_port': port}})
3536
3537     def punt_socket_dump(self, is_ip6=1):
3538         """ Dump punt socket"""
3539         return self.api(self.papi.punt_socket_dump,
3540                         {'is_ipv6': is_ip6})
3541
3542     def ip_reassembly_set(self, timeout_ms, max_reassemblies,
3543                           expire_walk_interval_ms, is_ip6=0):
3544         """ Set IP reassembly parameters """
3545         return self.api(self.papi.ip_reassembly_set,
3546                         {'is_ip6': is_ip6,
3547                          'timeout_ms': timeout_ms,
3548                          'expire_walk_interval_ms': expire_walk_interval_ms,
3549                          'max_reassemblies': max_reassemblies})
3550
3551     def ip_reassembly_get(self, is_ip6=0):
3552         """ Get IP reassembly parameters """
3553         return self.api(self.papi.ip_reassembly_get, {'is_ip6': is_ip6})
3554
3555     def ip_reassembly_enable_disable(self, sw_if_index, enable_ip4=False,
3556                                      enable_ip6=False):
3557         """ Enable/disable IP reassembly """
3558         return self.api(self.papi.ip_reassembly_enable_disable,
3559                         {'sw_if_index': sw_if_index,
3560                          'enable_ip4': 1 if enable_ip4 else 0,
3561                          'enable_ip6': 1 if enable_ip6 else 0,
3562                          })
3563
3564     def gbp_endpoint_add(self, sw_if_index, ips, mac, epg, flags,
3565                          tun_src, tun_dst):
3566         """ GBP endpoint Add """
3567         return self.api(self.papi.gbp_endpoint_add,
3568                         {'endpoint': {
3569                             'sw_if_index': sw_if_index,
3570                             'ips': ips,
3571                             'n_ips': len(ips),
3572                             'mac': mac,
3573                             'epg_id': epg,
3574                             'flags': flags,
3575                             'tun': {
3576                                 'src': tun_src,
3577                                 'dst': tun_dst,
3578                             }}})
3579
3580     def gbp_endpoint_del(self, handle):
3581         """ GBP endpoint Del """
3582         return self.api(self.papi.gbp_endpoint_del,
3583                         {'handle': handle})
3584
3585     def gbp_endpoint_dump(self):
3586         """ GBP endpoint Dump """
3587         return self.api(self.papi.gbp_endpoint_dump,
3588                         {'_no_type_conversion': True})
3589
3590     def gbp_endpoint_group_add(self, epg, sclass, bd,
3591                                rd, uplink_sw_if_index):
3592         """ GBP endpoint group Add """
3593         return self.api(self.papi.gbp_endpoint_group_add,
3594                         {'epg':
3595                          {
3596                              'uplink_sw_if_index': uplink_sw_if_index,
3597                              'bd_id': bd,
3598                              'rd_id': rd,
3599                              'epg_id': epg,
3600                              'sclass': sclass
3601                          }})
3602
3603     def gbp_endpoint_group_del(self, epg):
3604         """ GBP endpoint group Del """
3605         return self.api(self.papi.gbp_endpoint_group_del,
3606                         {'epg_id': epg})
3607
3608     def gbp_endpoint_group_dump(self):
3609         """ GBP endpoint group Dump """
3610         return self.api(self.papi.gbp_endpoint_group_dump, {})
3611
3612     def gbp_bridge_domain_add(self, bd_id, flags,
3613                               bvi_sw_if_index,
3614                               uu_fwd_sw_if_index,
3615                               bm_flood_sw_if_index):
3616         """ GBP bridge-domain Add """
3617         return self.api(self.papi.gbp_bridge_domain_add,
3618                         {'bd':
3619                          {
3620                              'flags': flags,
3621                              'bvi_sw_if_index': bvi_sw_if_index,
3622                              'uu_fwd_sw_if_index': uu_fwd_sw_if_index,
3623                              'bm_flood_sw_if_index': bm_flood_sw_if_index,
3624                              'bd_id': bd_id
3625                          }})
3626
3627     def gbp_bridge_domain_del(self, bd_id):
3628         """ GBP bridge-domain Del """
3629         return self.api(self.papi.gbp_bridge_domain_del,
3630                         {'bd_id': bd_id})
3631
3632     def gbp_bridge_domain_dump(self):
3633         """ GBP Bridge Domain Dump """
3634         return self.api(self.papi.gbp_bridge_domain_dump, {})
3635
3636     def gbp_route_domain_add(self, rd_id,
3637                              ip4_table_id,
3638                              ip6_table_id,
3639                              ip4_uu_sw_if_index,
3640                              ip6_uu_sw_if_index):
3641         """ GBP route-domain Add """
3642         return self.api(self.papi.gbp_route_domain_add,
3643                         {'rd':
3644                          {
3645                              'ip4_table_id': ip4_table_id,
3646                              'ip6_table_id': ip6_table_id,
3647                              'ip4_uu_sw_if_index': ip4_uu_sw_if_index,
3648                              'ip6_uu_sw_if_index': ip6_uu_sw_if_index,
3649                              'rd_id': rd_id
3650                          }})
3651
3652     def gbp_route_domain_del(self, rd_id):
3653         """ GBP route-domain Del """
3654         return self.api(self.papi.gbp_route_domain_del,
3655                         {'rd_id': rd_id})
3656
3657     def gbp_route_domain_dump(self):
3658         """ GBP Route Domain Dump """
3659         return self.api(self.papi.gbp_route_domain_dump, {})
3660
3661     def gbp_recirc_add_del(self, is_add, sw_if_index, epg, is_ext):
3662         """ GBP recirc Add/Del """
3663         return self.api(self.papi.gbp_recirc_add_del,
3664                         {'is_add': is_add,
3665                          'recirc': {
3666                              'is_ext': is_ext,
3667                              'sw_if_index': sw_if_index,
3668                              'epg_id': epg}})
3669
3670     def gbp_recirc_dump(self):
3671         """ GBP recirc Dump """
3672         return self.api(self.papi.gbp_recirc_dump, {})
3673
3674     def gbp_ext_itf_add_del(self, is_add, sw_if_index, bd_id, rd_id):
3675         """ GBP recirc Add/Del """
3676         return self.api(self.papi.gbp_ext_itf_add_del,
3677                         {'is_add': is_add,
3678                          'ext_itf': {
3679                              'sw_if_index': sw_if_index,
3680                              'bd_id': bd_id,
3681                              'rd_id': rd_id}})
3682
3683     def gbp_ext_itf_dump(self):
3684         """ GBP recirc Dump """
3685         return self.api(self.papi.gbp_ext_itf_dump, {})
3686
3687     def gbp_subnet_add_del(self, is_add, rd_id,
3688                            prefix, type,
3689                            sw_if_index=0xffffffff,
3690                            epg_id=0xffff):
3691         """ GBP Subnet Add/Del """
3692         return self.api(self.papi.gbp_subnet_add_del,
3693                         {'is_add': is_add,
3694                          'subnet': {
3695                              'type': type,
3696                              'sw_if_index': sw_if_index,
3697                              'epg_id': epg_id,
3698                              'prefix': prefix,
3699                              'rd_id': rd_id}})
3700
3701     def gbp_subnet_dump(self):
3702         """ GBP Subnet Dump """
3703         return self.api(self.papi.gbp_subnet_dump,
3704                         {'_no_type_conversion': True})
3705
3706     def gbp_contract_add_del(self, is_add, src_epg, dst_epg, acl_index,
3707                              rules, allowed_ethertypes):
3708         """ GBP contract Add/Del """
3709         return self.api(self.papi.gbp_contract_add_del,
3710                         {'is_add': is_add,
3711                          'contract': {
3712                              'acl_index': acl_index,
3713                              'src_epg': src_epg,
3714                              'dst_epg': dst_epg,
3715                              'n_rules': len(rules),
3716                              'rules': rules,
3717                              'n_ether_types': len(allowed_ethertypes),
3718                              'allowed_ethertypes': allowed_ethertypes}})
3719
3720     def gbp_contract_dump(self):
3721         """ GBP contract Dump """
3722         return self.api(self.papi.gbp_contract_dump, {})
3723
3724     def gbp_endpoint_learn_set_inactive_threshold(self, threshold):
3725         """ GBP set inactive threshold """
3726         return self.api(self.papi.gbp_endpoint_learn_set_inactive_threshold,
3727                         {'threshold': threshold})
3728
3729     def gbp_vxlan_tunnel_add(self, vni, bd_rd_id, mode):
3730         """ GBP VXLAN tunnel add """
3731         return self.api(self.papi.gbp_vxlan_tunnel_add,
3732                         {
3733                             'tunnel': {
3734                                 'vni': vni,
3735                                 'mode': mode,
3736                                 'bd_rd_id': bd_rd_id
3737                             }
3738                         })
3739
3740     def gbp_vxlan_tunnel_del(self, vni):
3741         """ GBP VXLAN tunnel del """
3742         return self.api(self.papi.gbp_vxlan_tunnel_del,
3743                         {
3744                             'vni': vni,
3745                         })
3746
3747     def gbp_vxlan_tunnel_dump(self):
3748         """ GBP VXLAN tunnel add/del """
3749         return self.api(self.papi.gbp_vxlan_tunnel_dump, {})
3750
3751     def ipip_6rd_add_tunnel(self, ip6_table_id, ip6_prefix, ip6_prefix_len,
3752                             ip4_table_id, ip4_prefix, ip4_prefix_len, ip4_src,
3753                             security_check):
3754         """ 6RD tunnel Add """
3755         return self.api(self.papi.ipip_6rd_add_tunnel,
3756                         {'ip4_table_id': ip4_table_id,
3757                          'ip6_table_id': ip6_table_id,
3758                          'ip6_prefix': ip6_prefix,
3759                          'ip6_prefix_len': ip6_prefix_len,
3760                          'ip4_prefix': ip4_prefix,
3761                          'ip4_prefix_len': ip4_prefix_len,
3762                          'ip4_src': ip4_src,
3763                          'security_check': security_check})
3764
3765     def ipip_6rd_del_tunnel(self, sw_if_index):
3766         """ 6RD tunnel Delete """
3767         return self.api(self.papi.ipip_6rd_del_tunnel,
3768                         {'sw_if_index': sw_if_index})
3769
3770     def ipip_add_tunnel(self, src_address, dst_address, is_ipv6=1,
3771                         instance=0xFFFFFFFF, table_id=0, tc_tos=0):
3772         """ IPIP tunnel Add/Del """
3773         return self.api(self.papi.ipip_add_tunnel,
3774                         {'is_ipv6': is_ipv6,
3775                          'instance': instance,
3776                          'src_address': src_address,
3777                          'dst_address': dst_address,
3778                          'table_id': table_id,
3779                          'tc_tos': tc_tos})
3780
3781     def ipip_del_tunnel(self, sw_if_index):
3782         """ IPIP tunnel Delete """
3783         return self.api(self.papi.ipip_del_tunnel,
3784                         {'sw_if_index': sw_if_index})
3785
3786     def qos_egress_map_update(self, id, outputs):
3787         """ QOS egress map update """
3788         return self.api(self.papi.qos_egress_map_update,
3789                         {'map_id': id,
3790                          'rows': outputs})
3791
3792     def qos_egress_map_delete(self, id):
3793         """ QOS egress map delete """
3794         return self.api(self.papi.qos_egress_map_delete,
3795                         {'map_id': id})
3796
3797     def qos_mark_enable_disable(self, sw_if_index,
3798                                 output_source,
3799                                 map_id,
3800                                 enable):
3801         """ QOS Mark Enable/Disable """
3802         return self.api(self.papi.qos_mark_enable_disable,
3803                         {'map_id': map_id,
3804                          'sw_if_index': sw_if_index,
3805                          'output_source': output_source,
3806                          'enable': enable})
3807
3808     def qos_record_enable_disable(self, sw_if_index, input_source, enable):
3809         """ IP QoS recording Enble/Disable """
3810         return self.api(self.papi.qos_record_enable_disable,
3811                         {'sw_if_index': sw_if_index,
3812                          'input_source': input_source,
3813                          'enable': enable})
3814
3815     def igmp_enable_disable(self, sw_if_index, enable, host):
3816         """ Enable/disable IGMP on a given interface """
3817         return self.api(self.papi.igmp_enable_disable,
3818                         {'enable': enable,
3819                          'mode': host,
3820                          'sw_if_index': sw_if_index})
3821
3822     def igmp_proxy_device_add_del(self, vrf_id, sw_if_index, add):
3823         """ Add/del IGMP proxy device """
3824         return self.api(self.papi.igmp_proxy_device_add_del,
3825                         {'vrf_id': vrf_id, 'sw_if_index': sw_if_index,
3826                          'add': add})
3827
3828     def igmp_proxy_device_add_del_interface(self, vrf_id, sw_if_index, add):
3829         """ Add/del interface to/from IGMP proxy device """
3830         return self.api(self.papi.igmp_proxy_device_add_del_interface,
3831                         {'vrf_id': vrf_id, 'sw_if_index': sw_if_index,
3832                          'add': add})
3833
3834     def igmp_listen(self, filter, sw_if_index, saddrs, gaddr):
3835         """ Listen for new (S,G) on specified interface
3836
3837         :param enable: add/del
3838         :param sw_if_index: interface sw index
3839         :param saddr: source ip4 addr
3840         :param gaddr: group ip4 addr
3841         """
3842         return self.api(self.papi.igmp_listen,
3843                         {
3844                             'group':
3845                             {
3846                                 'filter': filter,
3847                                 'sw_if_index': sw_if_index,
3848                                 'n_srcs': len(saddrs),
3849                                 'saddrs': saddrs,
3850                                 'gaddr':  gaddr
3851                             }
3852                         })
3853
3854     def igmp_dump(self, sw_if_index=None):
3855         """ Dump all (S,G) interface configurations """
3856         if sw_if_index is None:
3857             sw_if_index = 0xffffffff
3858         return self.api(self.papi.igmp_dump,
3859                         {'sw_if_index': sw_if_index})
3860
3861     def igmp_clear_interface(self, sw_if_index):
3862         """ Remove all (S,G)s from specified interface
3863             doesn't send IGMP report!
3864         """
3865         return self.api(
3866             self.papi.igmp_clear_interface, {
3867                 'sw_if_index': sw_if_index})
3868
3869     def want_igmp_events(self, enable=1):
3870         return self.api(self.papi.want_igmp_events, {'enable': enable,
3871                                                      'pid': os.getpid()})
3872
3873     def bond_create(
3874             self,
3875             mode,
3876             lb,
3877             use_custom_mac,
3878             mac_address='',
3879             interface_id=0xFFFFFFFF):
3880         """
3881         :param mode: mode
3882         :param lb: load balance
3883         :param use_custom_mac: use custom mac
3884         :param mac_address: mac address
3885         :param interface_id: custom interface ID
3886         """
3887         return self.api(
3888             self.papi.bond_create,
3889             {'mode': mode,
3890              'lb': lb,
3891              'use_custom_mac': use_custom_mac,
3892              'mac_address': mac_address,
3893              'id': interface_id
3894              })
3895
3896     def bond_delete(
3897             self,
3898             sw_if_index):
3899         """
3900         :param sw_if_index: interface the operation is applied to
3901         """
3902         return self.api(self.papi.bond_delete,
3903                         {'sw_if_index': sw_if_index})
3904
3905     def bond_enslave(
3906             self,
3907             sw_if_index,
3908             bond_sw_if_index,
3909             is_passive,
3910             is_long_timeout):
3911         """
3912         :param sw_if_index: slave sw_if_index
3913         :param bond_sw_if_index: bond sw_if_index
3914         :param is_passive: is passive lacp speaker
3915         :param is_long_time: 90 seconds timeout instead of 3 seconds timeout
3916         """
3917         return self.api(
3918             self.papi.bond_enslave,
3919             {'sw_if_index': sw_if_index,
3920              'bond_sw_if_index': bond_sw_if_index,
3921              'is_passive': is_passive,
3922              'is_long_timeout': is_long_timeout
3923              })
3924
3925     def bond_detach_slave(
3926             self,
3927             sw_if_index):
3928         """
3929         :param sw_if_index: slave interface the operation is applied to
3930         """
3931         return self.api(self.papi.bond_detach_slave,
3932                         {'sw_if_index': sw_if_index})
3933
3934     def sw_interface_slave_dump(
3935             self,
3936             sw_if_index):
3937         """
3938         :param sw_if_index: bond sw_if_index
3939         """
3940         return self.api(self.papi.sw_interface_slave_dump,
3941                         {'sw_if_index': sw_if_index})
3942
3943     def sw_interface_bond_dump(
3944             self):
3945         """
3946
3947         """
3948         return self.api(self.papi.sw_interface_bond_dump,
3949                         {})
3950
3951     def create_vhost_user_if(
3952             self,
3953             is_server,
3954             sock_filename,
3955             renumber,
3956             disable_mrg_rxbuf,
3957             disable_indirect_desc,
3958             custom_dev_instance,
3959             use_custom_mac,
3960             mac_address,
3961             tag=''):
3962         """
3963         :param is_server: is server
3964         :param sock_filename: socket name
3965         :param renumber: renumber
3966         :param disable_mrg_rxbuf: disable mergable rx buffers
3967         :param disable_indirect_desc: disable indirect descriptors
3968         :param custom_dev_instance: custom dev instance
3969         :param use_custom_mac: use custom mac
3970         :param mac_address: mac address
3971         :param tag: tag (default '')
3972         """
3973         return self.api(
3974             self.papi.create_vhost_user_if,
3975             {'is_server': is_server,
3976              'sock_filename': sock_filename,
3977              'renumber': renumber,
3978              'disable_mrg_rxbuf': disable_mrg_rxbuf,
3979              'disable_indirect_desc': disable_indirect_desc,
3980              'custom_dev_instance': custom_dev_instance,
3981              'use_custom_mac': use_custom_mac,
3982              'mac_address': mac_address,
3983              'tag': tag
3984              })
3985
3986     def delete_vhost_user_if(
3987             self,
3988             sw_if_index):
3989         """
3990         :param sw_if_index: interface the operation is applied to
3991         """
3992         return self.api(self.papi.delete_vhost_user_if,
3993                         {'sw_if_index': sw_if_index, })
3994
3995     def sw_interface_vhost_user_dump(
3996             self):
3997         """
3998
3999         """
4000         return self.api(self.papi.sw_interface_vhost_user_dump,
4001                         {})
4002
4003     def abf_policy_add_del(self, is_add, policy):
4004         return self.api(
4005             self.papi.abf_policy_add_del,
4006             {'is_add': is_add,
4007              'policy': policy})
4008
4009     def abf_itf_attach_add_del(self, is_add, attach):
4010         return self.api(
4011             self.papi.abf_itf_attach_add_del,
4012             {'is_add': is_add,
4013              'attach': attach})
4014
4015     def abf_policy_dump(self):
4016         return self.api(
4017             self.papi.abf_policy_dump, {})
4018
4019     def abf_itf_attach_dump(self):
4020         return self.api(
4021             self.papi.abf_itf_attach_dump, {})
4022
4023     def pipe_create(self, is_specified, user_instance):
4024         return self.api(self.papi.pipe_create,
4025                         {'is_specified': is_specified,
4026                          'user_instance': user_instance})
4027
4028     def pipe_delete(self, parent_sw_if_index):
4029         return self.api(self.papi.pipe_delete,
4030                         {'parent_sw_if_index': parent_sw_if_index})
4031
4032     def pipe_dump(self):
4033         return self.api(self.papi.pipe_dump, {})
4034
4035     def memif_create(
4036             self,
4037             role,
4038             mode,
4039             rx_queues=None,
4040             tx_queues=None,
4041             _id=None,
4042             socket_id=None,
4043             secret=None,
4044             ring_size=None,
4045             buffer_size=None,
4046             hw_addr=None):
4047         return self.api(self.papi.memif_create,
4048                         {'role': role,
4049                          'mode': mode,
4050                          'rx_queues': rx_queues,
4051                          'tx_queues': tx_queues,
4052                          'id': _id,
4053                          'socket_id': socket_id,
4054                          'secret': secret,
4055                          'ring_size': ring_size,
4056                          'buffer_size': buffer_size,
4057                          'hw_addr': hw_addr})
4058
4059     def memif_delete(self, sw_if_index):
4060         return self.api(self.papi.memif_delete, {'sw_if_index': sw_if_index})
4061
4062     def memif_dump(self):
4063         return self.api(self.papi.memif_dump, {})
4064
4065     def memif_socket_filename_add_del(
4066             self, is_add, socket_id, socket_filename):
4067         return self.api(
4068             self.papi.memif_socket_filename_add_del,
4069             {'is_add': is_add,
4070              'socket_id': socket_id,
4071              'socket_filename': socket_filename})
4072
4073     def memif_socket_filename_dump(self):
4074         return self.api(self.papi.memif_socket_filename_dump, {})
4075
4076     def svs_table_add_del(self, af, table_id, is_add=1):
4077         return self.api(self.papi.svs_table_add_del,
4078                         {
4079                             'table_id': table_id,
4080                             'is_add': is_add,
4081                             'af': af,
4082                         })
4083
4084     def svs_route_add_del(self, table_id, prefix, src_table_id, is_add=1):
4085         return self.api(self.papi.svs_route_add_del,
4086                         {
4087                             'table_id': table_id,
4088                             'source_table_id': src_table_id,
4089                             'prefix': prefix,
4090                             'is_add': is_add,
4091                         })
4092
4093     def svs_enable_disable(self, af, table_id, sw_if_index, is_enable=1):
4094         return self.api(self.papi.svs_enable_disable,
4095                         {
4096                             'af': af,
4097                             'table_id': table_id,
4098                             'sw_if_index': sw_if_index,
4099                             'is_enable': is_enable,
4100                         })
4101
4102     def svs_dump(self):
4103         return self.api(self.papi.svs_dump, {})
4104
4105     def syslog_set_sender(
4106             self,
4107             collector,
4108             src,
4109             collector_port=514,
4110             vrf_id=0,
4111             max_msg_size=480):
4112         """Set syslog sender configuration
4113
4114         :param collector: colector IP address
4115         :param src: source IP address
4116         :param collector_port: collector UDP port (Default value = 514)
4117         :param vrf_id: VRF id (Default value = 0)
4118         :param max_msg_size: maximum message length (Default value = 480)
4119         """
4120         return self.api(self.papi.syslog_set_sender,
4121                         {'collector_address': collector,
4122                          'src_address': src,
4123                          'collector_port': collector_port,
4124                          'vrf_id': vrf_id,
4125                          'max_msg_size': max_msg_size})
4126
4127     def syslog_get_sender(self):
4128         """Return syslog sender configuration"""
4129         return self.api(self.papi.syslog_get_sender, {})
4130
4131     def syslog_set_filter(self, severity):
4132         """Set syslog filter parameters
4133
4134         :param severity: severity filter (specified severity and greater match)
4135         """
4136         return self.api(self.papi.syslog_set_filter, {'severity': severity})
4137
4138     def syslog_get_filter(self):
4139         """Return syslog filter parameters"""
4140         return self.api(self.papi.syslog_get_filter, {})