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