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