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