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