[Proxy] ARP tests
[vpp.git] / test / vpp_papi_provider.py
1 import os
2 import socket
3 import fnmatch
4 import time
5 from hook import Hook
6 from collections import deque
7
8 # Sphinx creates auto-generated documentation by importing the python source
9 # files and collecting the docstrings from them. The NO_VPP_PAPI flag allows
10 # the vpp_papi_provider.py file to be importable without having to build
11 # the whole vpp api if the user only wishes to generate the test documentation.
12 do_import = True
13 try:
14     no_vpp_papi = os.getenv("NO_VPP_PAPI")
15     if no_vpp_papi == "1":
16         do_import = False
17 except:
18     pass
19
20 if do_import:
21     from vpp_papi import VPP
22
23 # from vnet/vnet/mpls/mpls_types.h
24 MPLS_IETF_MAX_LABEL = 0xfffff
25 MPLS_LABEL_INVALID = MPLS_IETF_MAX_LABEL + 1
26
27
28 class L2_VTR_OP:
29     L2_POP_1 = 3
30
31
32 class VppPapiProvider(object):
33     """VPP-api provider using vpp-papi
34
35     @property hook: hook object providing before and after api/cli hooks
36     """
37
38     _zero, _negative = range(2)
39
40     def __init__(self, name, shm_prefix, test_class):
41         self.hook = Hook("vpp-papi-provider")
42         self.name = name
43         self.shm_prefix = shm_prefix
44         self.test_class = test_class
45         self._expect_api_retval = self._zero
46         self._expect_stack = []
47         jsonfiles = []
48
49         install_dir = os.getenv('VPP_TEST_INSTALL_PATH')
50         for root, dirnames, filenames in os.walk(install_dir):
51             for filename in fnmatch.filter(filenames, '*.api.json'):
52                 jsonfiles.append(os.path.join(root, filename))
53
54         self.papi = VPP(jsonfiles)
55         self._events = deque()
56
57     def __enter__(self):
58         return self
59
60     def expect_negative_api_retval(self):
61         """ Expect API failure """
62         self._expect_stack.append(self._expect_api_retval)
63         self._expect_api_retval = self._negative
64         return self
65
66     def expect_zero_api_retval(self):
67         """ Expect API success """
68         self._expect_stack.append(self._expect_api_retval)
69         self._expect_api_retval = self._zero
70         return self
71
72     def __exit__(self, exc_type, exc_value, traceback):
73         self._expect_api_retval = self._expect_stack.pop()
74
75     def register_hook(self, hook):
76         """Replace hook registration with new hook
77
78         :param hook:
79
80         """
81         self.hook = hook
82
83     def collect_events(self):
84         """ Collect all events from the internal queue and clear the queue. """
85         e = self._events
86         self._events = deque()
87         return e
88
89     def wait_for_event(self, timeout, name=None):
90         """ Wait for and return next event. """
91         if name:
92             self.test_class.logger.debug("Expecting event within %ss",
93                                          timeout)
94         else:
95             self.test_class.logger.debug("Expecting event '%s' within %ss",
96                                          name, timeout)
97         if self._events:
98             self.test_class.logger.debug("Not waiting, event already queued")
99         limit = time.time() + timeout
100         while time.time() < limit:
101             if self._events:
102                 e = self._events.popleft()
103                 if name and type(e).__name__ != name:
104                     raise Exception(
105                         "Unexpected event received: %s, expected: %s" %
106                         (type(e).__name__, name))
107                 self.test_class.logger.debug("Returning event %s:%s" %
108                                              (name, e))
109                 return e
110             time.sleep(0)  # yield
111         raise Exception("Event did not occur within timeout")
112
113     def __call__(self, name, event):
114         """ Enqueue event in the internal event queue. """
115         # FIXME use the name instead of relying on type(e).__name__ ?
116         # FIXME #2 if this throws, it is eaten silently, Ole?
117         self.test_class.logger.debug("New event: %s: %s" % (name, event))
118         self._events.append(event)
119
120     def connect(self):
121         """Connect the API to VPP"""
122         self.papi.connect(self.name, self.shm_prefix)
123         self.papi.register_event_callback(self)
124
125     def disconnect(self):
126         """Disconnect the API from VPP"""
127         self.papi.disconnect()
128
129     def api(self, api_fn, api_args, expected_retval=0):
130         """ Call API function and check it's return value.
131         Call the appropriate hooks before and after the API call
132
133         :param api_fn: API function to call
134         :param api_args: tuple of API function arguments
135         :param expected_retval: Expected return value (Default value = 0)
136         :returns: reply from the API
137
138         """
139         self.hook.before_api(api_fn.__name__, api_args)
140         reply = api_fn(**api_args)
141         if self._expect_api_retval == self._negative:
142             if hasattr(reply, 'retval') and reply.retval >= 0:
143                 msg = "API call passed unexpectedly: expected negative "\
144                     "return value instead of %d in %s" % \
145                     (reply.retval, repr(reply))
146                 self.test_class.logger.info(msg)
147                 raise Exception(msg)
148         elif self._expect_api_retval == self._zero:
149             if hasattr(reply, 'retval') and reply.retval != expected_retval:
150                 msg = "API call failed, expected zero return value instead "\
151                     "of %d in %s" % (expected_retval, repr(reply))
152                 self.test_class.logger.info(msg)
153                 raise Exception(msg)
154         else:
155             raise Exception("Internal error, unexpected value for "
156                             "self._expect_api_retval %s" %
157                             self._expect_api_retval)
158         self.hook.after_api(api_fn.__name__, api_args)
159         return reply
160
161     def cli(self, cli):
162         """ Execute a CLI, calling the before/after hooks appropriately.
163
164         :param cli: CLI to execute
165         :returns: CLI output
166
167         """
168         self.hook.before_cli(cli)
169         cli += '\n'
170         r = self.papi.cli_inband(length=len(cli), cmd=cli)
171         self.hook.after_cli(cli)
172         if hasattr(r, 'reply'):
173             return r.reply.decode().rstrip('\x00')
174
175     def ppcli(self, cli):
176         """ Helper method to print CLI command in case of info logging level.
177
178         :param cli: CLI to execute
179         :returns: CLI output
180         """
181         return cli + "\n" + str(self.cli(cli))
182
183     def _convert_mac(self, mac):
184         return int(mac.replace(":", ""), 16) << 16
185
186     def show_version(self):
187         """ """
188         return self.papi.show_version()
189
190     def pg_create_interface(self, pg_index):
191         """
192
193         :param pg_index:
194
195         """
196         return self.api(self.papi.pg_create_interface,
197                         {"interface_id": pg_index})
198
199     def sw_interface_dump(self, filter=None):
200         """
201
202         :param filter:  (Default value = None)
203
204         """
205         if filter is not None:
206             args = {"name_filter_valid": 1, "name_filter": filter}
207         else:
208             args = {}
209         return self.api(self.papi.sw_interface_dump, args)
210
211     def sw_interface_set_table(self, sw_if_index, is_ipv6, table_id):
212         """ Set the IPvX Table-id for the Interface
213
214         :param sw_if_index:
215         :param is_ipv6:
216         :param table_id:
217
218         """
219         return self.api(self.papi.sw_interface_set_table,
220                         {'sw_if_index': sw_if_index, 'is_ipv6': is_ipv6,
221                          'vrf_id': table_id})
222
223     def sw_interface_add_del_address(self, sw_if_index, addr, addr_len,
224                                      is_ipv6=0, is_add=1, del_all=0):
225         """
226
227         :param addr: param is_ipv6:  (Default value = 0)
228         :param sw_if_index:
229         :param addr_len:
230         :param is_ipv6:  (Default value = 0)
231         :param is_add:  (Default value = 1)
232         :param del_all:  (Default value = 0)
233
234         """
235         return self.api(self.papi.sw_interface_add_del_address,
236                         {'sw_if_index': sw_if_index,
237                          'is_add': is_add,
238                          'is_ipv6': is_ipv6,
239                          'del_all': del_all,
240                          'address_length': addr_len,
241                          'address': addr})
242
243     def sw_interface_set_unnumbered(self, sw_if_index, ip_sw_if_index,
244                                     is_add=1):
245         """ Set the Interface to be unnumbered
246
247         :param is_add:  (Default value = 1)
248         :param sw_if_index - interface That will be unnumbered
249         :param ip_sw_if_index - interface with an IP addres
250
251         """
252         return self.api(self.papi.sw_interface_set_unnumbered,
253                         {'sw_if_index': ip_sw_if_index,
254                          'unnumbered_sw_if_index': sw_if_index,
255                          'is_add': is_add})
256
257     def sw_interface_enable_disable_mpls(self, sw_if_index,
258                                          is_enable=1):
259         """
260         Enable/Disable MPLS on the interface
261         :param sw_if_index:
262         :param is_enable:  (Default value = 1)
263
264         """
265         return self.api(self.papi.sw_interface_set_mpls_enable,
266                         {'sw_if_index': sw_if_index,
267                          'enable': is_enable})
268
269     def sw_interface_ra_suppress(self, sw_if_index, suppress=1):
270         return self.api(self.papi.sw_interface_ip6nd_ra_config,
271                         {'sw_if_index': sw_if_index,
272                          'suppress': suppress})
273
274     def ip6_sw_interface_ra_config(self, sw_if_index,
275                                    no,
276                                    suppress,
277                                    send_unicast):
278         return self.api(self.papi.sw_interface_ip6nd_ra_config,
279                         {'sw_if_index': sw_if_index,
280                          'is_no': no,
281                          'suppress': suppress,
282                          'send_unicast': send_unicast})
283
284     def ip6_sw_interface_enable_disable(self, sw_if_index, enable):
285         """
286         Enable/Disable An interface for IPv6
287         """
288         return self.api(self.papi.sw_interface_ip6_enable_disable,
289                         {'sw_if_index': sw_if_index,
290                          'enable': enable})
291
292     def vxlan_add_del_tunnel(
293             self,
294             src_addr,
295             dst_addr,
296             mcast_sw_if_index=0xFFFFFFFF,
297             is_add=1,
298             is_ipv6=0,
299             encap_vrf_id=0,
300             decap_next_index=0xFFFFFFFF,
301             vni=0):
302         """
303
304         :param dst_addr:
305         :param src_addr:
306         :param is_add:  (Default value = 1)
307         :param is_ipv6:  (Default value = 0)
308         :param encap_vrf_id:  (Default value = 0)
309         :param decap_next_index:  (Default value = 0xFFFFFFFF)
310         :param mcast_sw_if_index:  (Default value = 0xFFFFFFFF)
311         :param vni:  (Default value = 0)
312
313         """
314         return self.api(self.papi.vxlan_add_del_tunnel,
315                         {'is_add': is_add,
316                          'is_ipv6': is_ipv6,
317                          'src_address': src_addr,
318                          'dst_address': dst_addr,
319                          'mcast_sw_if_index': mcast_sw_if_index,
320                          'encap_vrf_id': encap_vrf_id,
321                          'decap_next_index': decap_next_index,
322                          'vni': vni})
323
324     def bridge_domain_add_del(self, bd_id, flood=1, uu_flood=1, forward=1,
325                               learn=1, arp_term=0, is_add=1):
326         """Create/delete bridge domain.
327
328         :param int bd_id: Bridge domain index.
329         :param int flood: Enable/disable bcast/mcast flooding in the BD.
330             (Default value = 1)
331         :param int uu_flood: Enable/disable unknown unicast flood in the BD.
332             (Default value = 1)
333         :param int forward: Enable/disable forwarding on all interfaces in
334             the BD. (Default value = 1)
335         :param int learn: Enable/disable learning on all interfaces in the BD.
336             (Default value = 1)
337         :param int arp_term: Enable/disable arp termination in the BD.
338             (Default value = 1)
339         :param int is_add: Add or delete flag. (Default value = 1)
340         """
341         return self.api(self.papi.bridge_domain_add_del,
342                         {'bd_id': bd_id,
343                          'flood': flood,
344                          'uu_flood': uu_flood,
345                          'forward': forward,
346                          'learn': learn,
347                          'arp_term': arp_term,
348                          'is_add': is_add})
349
350     def l2fib_add_del(self, mac, bd_id, sw_if_index, is_add=1, static_mac=0,
351                       filter_mac=0, bvi_mac=0):
352         """Create/delete L2 FIB entry.
353
354         :param str mac: MAC address to create FIB entry for.
355         :param int bd_id: Bridge domain index.
356         :param int sw_if_index: Software interface index of the interface.
357         :param int is_add: Add or delete flag. (Default value = 1)
358         :param int static_mac: Set to 1 to create static MAC entry.
359             (Default value = 0)
360         :param int filter_mac: Set to 1 to drop packet that's source or
361             destination MAC address contains defined MAC address.
362             (Default value = 0)
363         :param int bvi_mac: Set to 1 to create entry that points to BVI
364             interface. (Default value = 0)
365         """
366         return self.api(self.papi.l2fib_add_del,
367                         {'mac': self._convert_mac(mac),
368                          'bd_id': bd_id,
369                          'sw_if_index': sw_if_index,
370                          'is_add': is_add,
371                          'static_mac': static_mac,
372                          'filter_mac': filter_mac,
373                          'bvi_mac': bvi_mac})
374
375     def sw_interface_set_l2_bridge(self, sw_if_index, bd_id,
376                                    shg=0, bvi=0, enable=1):
377         """Add/remove interface to/from bridge domain.
378
379         :param int sw_if_index: Software interface index of the interface.
380         :param int bd_id: Bridge domain index.
381         :param int shg: Split-horizon group index. (Default value = 0)
382         :param int bvi: Set interface as a bridge group virtual interface.
383             (Default value = 0)
384         :param int enable: Add or remove interface. (Default value = 1)
385         """
386         return self.api(self.papi.sw_interface_set_l2_bridge,
387                         {'rx_sw_if_index': sw_if_index,
388                          'bd_id': bd_id,
389                          'shg': shg,
390                          'bvi': bvi,
391                          'enable': enable})
392
393     def bridge_flags(self, bd_id, is_set, feature_bitmap):
394         """Enable/disable required feature of the bridge domain with defined ID.
395
396         :param int bd_id: Bridge domain ID.
397         :param int is_set: Set to 1 to enable, set to 0 to disable the feature.
398         :param int feature_bitmap: Bitmap value of the feature to be set:
399             - learn (1 << 0),
400             - forward (1 << 1),
401             - flood (1 << 2),
402             - uu-flood (1 << 3) or
403             - arp-term (1 << 4).
404         """
405         return self.api(self.papi.bridge_flags,
406                         {'bd_id': bd_id,
407                          'is_set': is_set,
408                          'feature_bitmap': feature_bitmap})
409
410     def bridge_domain_dump(self, bd_id=0):
411         """
412
413         :param int bd_id: Bridge domain ID. (Default value = 0 => dump of all
414             existing bridge domains returned)
415         :return: Dictionary of bridge domain(s) data.
416         """
417         return self.api(self.papi.bridge_domain_dump,
418                         {'bd_id': bd_id})
419
420     def sw_interface_set_l2_xconnect(self, rx_sw_if_index, tx_sw_if_index,
421                                      enable):
422         """Create or delete unidirectional cross-connect from Tx interface to
423         Rx interface.
424
425         :param int rx_sw_if_index: Software interface index of Rx interface.
426         :param int tx_sw_if_index: Software interface index of Tx interface.
427         :param int enable: Create cross-connect if equal to 1, delete
428             cross-connect if equal to 0.
429
430         """
431         return self.api(self.papi.sw_interface_set_l2_xconnect,
432                         {'rx_sw_if_index': rx_sw_if_index,
433                          'tx_sw_if_index': tx_sw_if_index,
434                          'enable': enable})
435
436     def sw_interface_set_l2_tag_rewrite(
437             self,
438             sw_if_index,
439             vtr_oper,
440             push=0,
441             tag1=0,
442             tag2=0):
443         """L2 interface vlan tag rewrite configure request
444         :param client_index - opaque cookie to identify the sender
445         :param context - sender context, to match reply w/ request
446         :param sw_if_index - interface the operation is applied to
447         :param vtr_op - Choose from l2_vtr_op_t enum values
448         :param push_dot1q - first pushed flag dot1q id set, else dot1ad
449         :param tag1 - Needed for any push or translate vtr op
450         :param tag2 - Needed for any push 2 or translate x-2 vtr ops
451
452         """
453         return self.api(self.papi.l2_interface_vlan_tag_rewrite,
454                         {'sw_if_index': sw_if_index,
455                          'vtr_op': vtr_oper,
456                          'push_dot1q': push,
457                          'tag1': tag1,
458                          'tag2': tag2})
459
460     def sw_interface_set_flags(self, sw_if_index, admin_up_down,
461                                link_up_down=0, deleted=0):
462         """
463
464         :param admin_up_down:
465         :param sw_if_index:
466         :param link_up_down:  (Default value = 0)
467         :param deleted:  (Default value = 0)
468
469         """
470         return self.api(self.papi.sw_interface_set_flags,
471                         {'sw_if_index': sw_if_index,
472                          'admin_up_down': admin_up_down,
473                          'link_up_down': link_up_down,
474                          'deleted': deleted})
475
476     def create_subif(self, sw_if_index, sub_id, outer_vlan, inner_vlan,
477                      no_tags=0, one_tag=0, two_tags=0, dot1ad=0, exact_match=0,
478                      default_sub=0, outer_vlan_id_any=0, inner_vlan_id_any=0):
479         """Create subinterface
480         from vpe.api: set dot1ad = 0 for dot1q, set dot1ad = 1 for dot1ad
481
482         :param sub_id: param inner_vlan:
483         :param sw_if_index:
484         :param outer_vlan:
485         :param inner_vlan:
486         :param no_tags:  (Default value = 0)
487         :param one_tag:  (Default value = 0)
488         :param two_tags:  (Default value = 0)
489         :param dot1ad:  (Default value = 0)
490         :param exact_match:  (Default value = 0)
491         :param default_sub:  (Default value = 0)
492         :param outer_vlan_id_any:  (Default value = 0)
493         :param inner_vlan_id_any:  (Default value = 0)
494
495         """
496         return self.api(
497             self.papi.create_subif,
498             {'sw_if_index': sw_if_index,
499              'sub_id': sub_id,
500              'no_tags': no_tags,
501              'one_tag': one_tag,
502              'two_tags': two_tags,
503              'dot1ad': dot1ad,
504              'exact_match': exact_match,
505              'default_sub': default_sub,
506              'outer_vlan_id_any': outer_vlan_id_any,
507              'inner_vlan_id_any': inner_vlan_id_any,
508              'outer_vlan_id': outer_vlan,
509              'inner_vlan_id': inner_vlan})
510
511     def delete_subif(self, sw_if_index):
512         """Delete subinterface
513
514         :param sw_if_index:
515         """
516         return self.api(self.papi.delete_subif,
517                         {'sw_if_index': sw_if_index})
518
519     def create_vlan_subif(self, sw_if_index, vlan):
520         """
521
522         :param vlan:
523         :param sw_if_index:
524
525         """
526         return self.api(self.papi.create_vlan_subif,
527                         {'sw_if_index': sw_if_index,
528                          'vlan_id': vlan})
529
530     def create_loopback(self, mac=''):
531         """
532
533         :param mac: (Optional)
534         """
535         return self.api(self.papi.create_loopback,
536                         {'mac_address': mac})
537
538     def delete_loopback(self, sw_if_index):
539         return self.api(self.papi.delete_loopback,
540                         {'sw_if_index': sw_if_index, })
541
542     def ip_add_del_route(
543             self,
544             dst_address,
545             dst_address_length,
546             next_hop_address,
547             next_hop_sw_if_index=0xFFFFFFFF,
548             table_id=0,
549             next_hop_table_id=0,
550             next_hop_weight=1,
551             next_hop_n_out_labels=0,
552             next_hop_out_label_stack=[],
553             next_hop_via_label=MPLS_LABEL_INVALID,
554             create_vrf_if_needed=0,
555             is_resolve_host=0,
556             is_resolve_attached=0,
557             classify_table_index=0xFFFFFFFF,
558             is_add=1,
559             is_drop=0,
560             is_unreach=0,
561             is_prohibit=0,
562             is_ipv6=0,
563             is_local=0,
564             is_classify=0,
565             is_multipath=0,
566             not_last=0):
567         """
568
569         :param dst_address_length:
570         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
571         :param dst_address:
572         :param next_hop_address:
573         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
574         :param vrf_id:  (Default value = 0)
575         :param lookup_in_vrf:  (Default value = 0)
576         :param classify_table_index:  (Default value = 0xFFFFFFFF)
577         :param create_vrf_if_needed:  (Default value = 0)
578         :param is_add:  (Default value = 1)
579         :param is_drop:  (Default value = 0)
580         :param is_ipv6:  (Default value = 0)
581         :param is_local:  (Default value = 0)
582         :param is_classify:  (Default value = 0)
583         :param is_multipath:  (Default value = 0)
584         :param is_resolve_host:  (Default value = 0)
585         :param is_resolve_attached:  (Default value = 0)
586         :param not_last:  (Default value = 0)
587         :param next_hop_weight:  (Default value = 1)
588
589         """
590
591         return self.api(
592             self.papi.ip_add_del_route,
593             {'next_hop_sw_if_index': next_hop_sw_if_index,
594              'table_id': table_id,
595              'classify_table_index': classify_table_index,
596              'next_hop_table_id': next_hop_table_id,
597              'create_vrf_if_needed': create_vrf_if_needed,
598              'is_add': is_add,
599              'is_drop': is_drop,
600              'is_unreach': is_unreach,
601              'is_prohibit': is_prohibit,
602              'is_ipv6': is_ipv6,
603              'is_local': is_local,
604              'is_classify': is_classify,
605              'is_multipath': is_multipath,
606              'is_resolve_host': is_resolve_host,
607              'is_resolve_attached': is_resolve_attached,
608              'not_last': not_last,
609              'next_hop_weight': next_hop_weight,
610              'dst_address_length': dst_address_length,
611              'dst_address': dst_address,
612              'next_hop_address': next_hop_address,
613              'next_hop_n_out_labels': next_hop_n_out_labels,
614              'next_hop_via_label': next_hop_via_label,
615              'next_hop_out_label_stack': next_hop_out_label_stack})
616
617     def ip_fib_dump(self):
618         return self.api(self.papi.ip_fib_dump, {})
619
620     def ip6_fib_dump(self):
621         return self.api(self.papi.ip6_fib_dump, {})
622
623     def ip_neighbor_add_del(self,
624                             sw_if_index,
625                             mac_address,
626                             dst_address,
627                             vrf_id=0,
628                             is_add=1,
629                             is_ipv6=0,
630                             is_static=0,
631                             ):
632         """ Add neighbor MAC to IPv4 or IPv6 address.
633
634         :param sw_if_index:
635         :param mac_address:
636         :param dst_address:
637         :param vrf_id:  (Default value = 0)
638         :param is_add:  (Default value = 1)
639         :param is_ipv6:  (Default value = 0)
640         :param is_static:  (Default value = 0)
641         """
642
643         return self.api(
644             self.papi.ip_neighbor_add_del,
645             {'vrf_id': vrf_id,
646              'sw_if_index': sw_if_index,
647              'is_add': is_add,
648              'is_ipv6': is_ipv6,
649              'is_static': is_static,
650              'mac_address': mac_address,
651              'dst_address': dst_address
652              }
653         )
654
655     def ip_neighbor_dump(self,
656                          sw_if_index,
657                          is_ipv6=0):
658         """ Return IP neighbor dump.
659
660         :param sw_if_index:
661         :param int is_ipv6: 1 for IPv6 neighbor, 0 for IPv4. (Default = 0)
662         """
663
664         return self.api(
665             self.papi.ip_neighbor_dump,
666             {'is_ipv6': is_ipv6,
667              'sw_if_index': sw_if_index
668              }
669         )
670
671     def proxy_arp_add_del(self,
672                           low_address,
673                           hi_address,
674                           vrf_id=0,
675                           is_add=1):
676         """ Config Proxy Arp Range.
677
678         :param low_address: Start address in the rnage to Proxy for
679         :param hi_address: End address in the rnage to Proxy for
680         :param vrf_id: The VRF/table in which to proxy
681         """
682
683         return self.api(
684             self.papi.proxy_arp_add_del,
685             {'vrf_id': vrf_id,
686              'is_add': is_add,
687              'low_address': low_address,
688              'hi_address': hi_address,
689              }
690         )
691
692     def proxy_arp_intfc_enable_disable(self,
693                                        sw_if_index,
694                                        is_enable=1):
695         """ Enable/Disable an interface for proxy ARP requests
696
697         :param sw_if_index: Interface
698         :param enable_disable: Enable/Disable
699         """
700
701         return self.api(
702             self.papi.proxy_arp_intfc_enable_disable,
703             {'sw_if_index': sw_if_index,
704              'enable_disable': is_enable
705              }
706         )
707
708     def reset_vrf(self,
709                   vrf_id,
710                   is_ipv6=0,
711                   ):
712         """ Reset VRF (remove all routes etc.) request.
713
714         :param int vrf_id: ID of the FIB table / VRF to reset.
715         :param int is_ipv6: 1 for IPv6 neighbor, 0 for IPv4. (Default = 0)
716         """
717
718         return self.api(
719             self.papi.reset_vrf,
720             {'vrf_id': vrf_id,
721              'is_ipv6': is_ipv6,
722              }
723         )
724
725     def reset_fib(self,
726                   vrf_id,
727                   is_ipv6=0,
728                   ):
729         """ Reset VRF (remove all routes etc.) request.
730
731         :param int vrf_id: ID of the FIB table / VRF to reset.
732         :param int is_ipv6: 1 for IPv6 neighbor, 0 for IPv4. (Default = 0)
733         """
734
735         return self.api(
736             self.papi.reset_fib,
737             {'vrf_id': vrf_id,
738              'is_ipv6': is_ipv6,
739              }
740         )
741
742     def ip_dump(self,
743                 is_ipv6=0,
744                 ):
745         """ Return IP dump.
746
747         :param int is_ipv6: 1 for IPv6 neighbor, 0 for IPv4. (Default = 0)
748         """
749
750         return self.api(
751             self.papi.ip_dump,
752             {'is_ipv6': is_ipv6,
753              }
754         )
755
756     def sw_interface_span_enable_disable(
757             self, sw_if_index_from, sw_if_index_to, state=1):
758         """
759
760         :param sw_if_index_from:
761         :param sw_if_index_to:
762         :param state:
763         """
764         return self.api(self.papi.sw_interface_span_enable_disable,
765                         {'sw_if_index_from': sw_if_index_from,
766                          'sw_if_index_to': sw_if_index_to,
767                          'state': state})
768
769     def gre_tunnel_add_del(self,
770                            src_address,
771                            dst_address,
772                            outer_fib_id=0,
773                            is_teb=0,
774                            is_add=1,
775                            is_ip6=0):
776         """ Add a GRE tunnel
777
778         :param src_address:
779         :param dst_address:
780         :param outer_fib_id:  (Default value = 0)
781         :param is_add:  (Default value = 1)
782         :param is_ipv6:  (Default value = 0)
783         :param is_teb:  (Default value = 0)
784         """
785
786         return self.api(
787             self.papi.gre_add_del_tunnel,
788             {'is_add': is_add,
789              'is_ipv6': is_ip6,
790              'teb': is_teb,
791              'src_address': src_address,
792              'dst_address': dst_address,
793              'outer_fib_id': outer_fib_id}
794         )
795
796     def mpls_fib_dump(self):
797         return self.api(self.papi.mpls_fib_dump, {})
798
799     def mpls_route_add_del(
800             self,
801             label,
802             eos,
803             next_hop_proto_is_ip4,
804             next_hop_address,
805             next_hop_sw_if_index=0xFFFFFFFF,
806             table_id=0,
807             next_hop_table_id=0,
808             next_hop_weight=1,
809             next_hop_n_out_labels=0,
810             next_hop_out_label_stack=[],
811             next_hop_via_label=MPLS_LABEL_INVALID,
812             create_vrf_if_needed=0,
813             is_resolve_host=0,
814             is_resolve_attached=0,
815             is_add=1,
816             is_drop=0,
817             is_multipath=0,
818             classify_table_index=0xFFFFFFFF,
819             is_classify=0,
820             not_last=0):
821         """
822
823         :param dst_address_length:
824         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
825         :param dst_address:
826         :param next_hop_address:
827         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
828         :param vrf_id:  (Default value = 0)
829         :param lookup_in_vrf:  (Default value = 0)
830         :param classify_table_index:  (Default value = 0xFFFFFFFF)
831         :param create_vrf_if_needed:  (Default value = 0)
832         :param is_add:  (Default value = 1)
833         :param is_drop:  (Default value = 0)
834         :param is_ipv6:  (Default value = 0)
835         :param is_local:  (Default value = 0)
836         :param is_classify:  (Default value = 0)
837         :param is_multipath:  (Default value = 0)
838         :param is_resolve_host:  (Default value = 0)
839         :param is_resolve_attached:  (Default value = 0)
840         :param not_last:  (Default value = 0)
841         :param next_hop_weight:  (Default value = 1)
842
843         """
844
845         return self.api(
846             self.papi.mpls_route_add_del,
847             {'mr_label': label,
848              'mr_eos': eos,
849              'mr_table_id': table_id,
850              'mr_classify_table_index': classify_table_index,
851              'mr_create_table_if_needed': create_vrf_if_needed,
852              'mr_is_add': is_add,
853              'mr_is_classify': is_classify,
854              'mr_is_multipath': is_multipath,
855              'mr_is_resolve_host': is_resolve_host,
856              'mr_is_resolve_attached': is_resolve_attached,
857              'mr_next_hop_proto_is_ip4': next_hop_proto_is_ip4,
858              'mr_next_hop_weight': next_hop_weight,
859              'mr_next_hop': next_hop_address,
860              'mr_next_hop_n_out_labels': next_hop_n_out_labels,
861              'mr_next_hop_sw_if_index': next_hop_sw_if_index,
862              'mr_next_hop_table_id': next_hop_table_id,
863              'mr_next_hop_via_label': next_hop_via_label,
864              'mr_next_hop_out_label_stack': next_hop_out_label_stack})
865
866     def mpls_ip_bind_unbind(
867             self,
868             label,
869             dst_address,
870             dst_address_length,
871             table_id=0,
872             ip_table_id=0,
873             is_ip4=1,
874             create_vrf_if_needed=0,
875             is_bind=1):
876         """
877         """
878         return self.api(
879             self.papi.mpls_ip_bind_unbind,
880             {'mb_mpls_table_id': table_id,
881              'mb_label': label,
882              'mb_ip_table_id': ip_table_id,
883              'mb_create_table_if_needed': create_vrf_if_needed,
884              'mb_is_bind': is_bind,
885              'mb_is_ip4': is_ip4,
886              'mb_address_length': dst_address_length,
887              'mb_address': dst_address})
888
889     def mpls_tunnel_add_del(
890             self,
891             tun_sw_if_index,
892             next_hop_proto_is_ip4,
893             next_hop_address,
894             next_hop_sw_if_index=0xFFFFFFFF,
895             next_hop_table_id=0,
896             next_hop_weight=1,
897             next_hop_n_out_labels=0,
898             next_hop_out_label_stack=[],
899             next_hop_via_label=MPLS_LABEL_INVALID,
900             create_vrf_if_needed=0,
901             is_add=1,
902             l2_only=0):
903         """
904
905         :param dst_address_length:
906         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
907         :param dst_address:
908         :param next_hop_address:
909         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
910         :param vrf_id:  (Default value = 0)
911         :param lookup_in_vrf:  (Default value = 0)
912         :param classify_table_index:  (Default value = 0xFFFFFFFF)
913         :param create_vrf_if_needed:  (Default value = 0)
914         :param is_add:  (Default value = 1)
915         :param is_drop:  (Default value = 0)
916         :param is_ipv6:  (Default value = 0)
917         :param is_local:  (Default value = 0)
918         :param is_classify:  (Default value = 0)
919         :param is_multipath:  (Default value = 0)
920         :param is_resolve_host:  (Default value = 0)
921         :param is_resolve_attached:  (Default value = 0)
922         :param not_last:  (Default value = 0)
923         :param next_hop_weight:  (Default value = 1)
924
925         """
926         return self.api(
927             self.papi.mpls_tunnel_add_del,
928             {'mt_sw_if_index': tun_sw_if_index,
929              'mt_is_add': is_add,
930              'mt_l2_only': l2_only,
931              'mt_next_hop_proto_is_ip4': next_hop_proto_is_ip4,
932              'mt_next_hop_weight': next_hop_weight,
933              'mt_next_hop': next_hop_address,
934              'mt_next_hop_n_out_labels': next_hop_n_out_labels,
935              'mt_next_hop_sw_if_index': next_hop_sw_if_index,
936              'mt_next_hop_table_id': next_hop_table_id,
937              'mt_next_hop_out_label_stack': next_hop_out_label_stack})
938
939     def snat_interface_add_del_feature(
940             self,
941             sw_if_index,
942             is_inside=1,
943             is_add=1):
944         """Enable/disable S-NAT feature on the interface
945
946         :param sw_if_index: Software index of the interface
947         :param is_inside: 1 if inside, 0 if outside (Default value = 1)
948         :param is_add: 1 if add, 0 if delete (Default value = 1)
949         """
950         return self.api(
951             self.papi.snat_interface_add_del_feature,
952             {'is_add': is_add,
953              'is_inside': is_inside,
954              'sw_if_index': sw_if_index})
955
956     def snat_add_static_mapping(
957             self,
958             local_ip,
959             external_ip=0,
960             external_sw_if_index=0xFFFFFFFF,
961             local_port=0,
962             external_port=0,
963             addr_only=1,
964             vrf_id=0,
965             protocol=0,
966             is_add=1,
967             is_ip4=1):
968         """Add/delete S-NAT static mapping
969
970         :param local_ip: Local IP address
971         :param external_ip: External IP address
972         :param external_sw_if_index: External interface instead of IP address
973         :param local_port: Local port number (Default value = 0)
974         :param external_port: External port number (Default value = 0)
975         :param addr_only: 1 if address only mapping, 0 if address and port
976         :param vrf_id: VRF ID
977         :param protocol: IP protocol (Default value = 0)
978         :param is_add: 1 if add, 0 if delete (Default value = 1)
979         :param is_ip4: 1 if address type is IPv4 (Default value = 1)
980         """
981         return self.api(
982             self.papi.snat_add_static_mapping,
983             {'is_add': is_add,
984              'is_ip4': is_ip4,
985              'addr_only': addr_only,
986              'local_ip_address': local_ip,
987              'external_ip_address': external_ip,
988              'local_port': local_port,
989              'external_port': external_port,
990              'external_sw_if_index': external_sw_if_index,
991              'vrf_id': vrf_id,
992              'protocol': protocol})
993
994     def snat_add_address_range(
995             self,
996             first_ip_address,
997             last_ip_address,
998             is_add=1,
999             is_ip4=1):
1000         """Add/del S-NAT address range
1001
1002         :param first_ip_address: First IP address
1003         :param last_ip_address: Last IP address
1004         :param is_add: 1 if add, 0 if delete (Default value = 1)
1005         :param is_ip4: 1 if address type is IPv4 (Default value = 1)
1006         """
1007         return self.api(
1008             self.papi.snat_add_address_range,
1009             {'is_ip4': is_ip4,
1010              'first_ip_address': first_ip_address,
1011              'last_ip_address': last_ip_address,
1012              'is_add': is_add})
1013
1014     def snat_address_dump(self):
1015         """Dump S-NAT addresses
1016         :return: Dictionary of S-NAT addresses
1017         """
1018         return self.api(self.papi.snat_address_dump, {})
1019
1020     def snat_interface_dump(self):
1021         """Dump interfaces with S-NAT feature
1022         :return: Dictionary of interfaces with S-NAT feature
1023         """
1024         return self.api(self.papi.snat_interface_dump, {})
1025
1026     def snat_static_mapping_dump(self):
1027         """Dump S-NAT static mappings
1028         :return: Dictionary of S-NAT static mappings
1029         """
1030         return self.api(self.papi.snat_static_mapping_dump, {})
1031
1032     def snat_show_config(self):
1033         """Show S-NAT config
1034         :return: S-NAT config parameters
1035         """
1036         return self.api(self.papi.snat_show_config, {})
1037
1038     def snat_add_interface_addr(
1039             self,
1040             sw_if_index,
1041             is_add=1):
1042         """Add/del S-NAT address from interface
1043
1044         :param sw_if_index: Software index of the interface
1045         :param is_add: 1 if add, 0 if delete (Default value = 1)
1046         """
1047         return self.api(self.papi.snat_add_del_interface_addr,
1048                         {'is_add': is_add, 'sw_if_index': sw_if_index})
1049
1050     def snat_interface_addr_dump(self):
1051         """Dump S-NAT addresses interfaces
1052         :return: Dictionary of S-NAT addresses interfaces
1053         """
1054         return self.api(self.papi.snat_interface_addr_dump, {})
1055
1056     def snat_ipfix(
1057             self,
1058             domain_id=1,
1059             src_port=4739,
1060             enable=1):
1061         """Enable/disable S-NAT IPFIX logging
1062
1063         :param domain_id: Observation domain ID (Default value = 1)
1064         :param src_port: Source port number (Default value = 4739)
1065         :param enable: 1 if enable, 0 if disable (Default value = 1)
1066         """
1067         return self.api(
1068             self.papi.snat_ipfix_enable_disable,
1069             {'domain_id': domain_id,
1070              'src_port': src_port,
1071              'enable': enable})
1072
1073     def control_ping(self):
1074         self.api(self.papi.control_ping)
1075
1076     def bfd_udp_add(self, sw_if_index, desired_min_tx, required_min_rx,
1077                     detect_mult, local_addr, peer_addr, is_ipv6=0,
1078                     bfd_key_id=None, conf_key_id=None):
1079         if bfd_key_id is None:
1080             return self.api(self.papi.bfd_udp_add,
1081                             {
1082                                 'sw_if_index': sw_if_index,
1083                                 'desired_min_tx': desired_min_tx,
1084                                 'required_min_rx': required_min_rx,
1085                                 'local_addr': local_addr,
1086                                 'peer_addr': peer_addr,
1087                                 'is_ipv6': is_ipv6,
1088                                 'detect_mult': detect_mult,
1089                             })
1090         else:
1091             return self.api(self.papi.bfd_udp_add,
1092                             {
1093                                 'sw_if_index': sw_if_index,
1094                                 'desired_min_tx': desired_min_tx,
1095                                 'required_min_rx': required_min_rx,
1096                                 'local_addr': local_addr,
1097                                 'peer_addr': peer_addr,
1098                                 'is_ipv6': is_ipv6,
1099                                 'detect_mult': detect_mult,
1100                                 'is_authenticated': 1,
1101                                 'bfd_key_id': bfd_key_id,
1102                                 'conf_key_id': conf_key_id,
1103                             })
1104
1105     def bfd_udp_mod(self, sw_if_index, desired_min_tx, required_min_rx,
1106                     detect_mult, local_addr, peer_addr, is_ipv6=0):
1107         return self.api(self.papi.bfd_udp_mod,
1108                         {
1109                             'sw_if_index': sw_if_index,
1110                             'desired_min_tx': desired_min_tx,
1111                             'required_min_rx': required_min_rx,
1112                             'local_addr': local_addr,
1113                             'peer_addr': peer_addr,
1114                             'is_ipv6': is_ipv6,
1115                             'detect_mult': detect_mult,
1116                         })
1117
1118     def bfd_udp_auth_activate(self, sw_if_index, local_addr, peer_addr,
1119                               is_ipv6=0, bfd_key_id=None, conf_key_id=None,
1120                               is_delayed=False):
1121         return self.api(self.papi.bfd_udp_auth_activate,
1122                         {
1123                             'sw_if_index': sw_if_index,
1124                             'local_addr': local_addr,
1125                             'peer_addr': peer_addr,
1126                             'is_ipv6': is_ipv6,
1127                             'is_delayed': 1 if is_delayed else 0,
1128                             'bfd_key_id': bfd_key_id,
1129                             'conf_key_id': conf_key_id,
1130                         })
1131
1132     def bfd_udp_auth_deactivate(self, sw_if_index, local_addr, peer_addr,
1133                                 is_ipv6=0, is_delayed=False):
1134         return self.api(self.papi.bfd_udp_auth_deactivate,
1135                         {
1136                             'sw_if_index': sw_if_index,
1137                             'local_addr': local_addr,
1138                             'peer_addr': peer_addr,
1139                             'is_ipv6': is_ipv6,
1140                             'is_delayed': 1 if is_delayed else 0,
1141                         })
1142
1143     def bfd_udp_del(self, sw_if_index, local_addr, peer_addr, is_ipv6=0):
1144         return self.api(self.papi.bfd_udp_del,
1145                         {
1146                             'sw_if_index': sw_if_index,
1147                             'local_addr': local_addr,
1148                             'peer_addr': peer_addr,
1149                             'is_ipv6': is_ipv6,
1150                         })
1151
1152     def bfd_udp_session_dump(self):
1153         return self.api(self.papi.bfd_udp_session_dump, {})
1154
1155     def bfd_udp_session_set_flags(self, admin_up_down, sw_if_index, local_addr,
1156                                   peer_addr, is_ipv6=0):
1157         return self.api(self.papi.bfd_udp_session_set_flags, {
1158             'admin_up_down': admin_up_down,
1159             'sw_if_index': sw_if_index,
1160             'local_addr': local_addr,
1161             'peer_addr': peer_addr,
1162             'is_ipv6': is_ipv6,
1163         })
1164
1165     def want_bfd_events(self, enable_disable=1):
1166         return self.api(self.papi.want_bfd_events, {
1167             'enable_disable': enable_disable,
1168             'pid': os.getpid(),
1169         })
1170
1171     def bfd_auth_set_key(self, conf_key_id, auth_type, key):
1172         return self.api(self.papi.bfd_auth_set_key, {
1173             'conf_key_id': conf_key_id,
1174             'auth_type': auth_type,
1175             'key': key,
1176             'key_len': len(key),
1177         })
1178
1179     def bfd_auth_del_key(self, conf_key_id):
1180         return self.api(self.papi.bfd_auth_del_key, {
1181             'conf_key_id': conf_key_id,
1182         })
1183
1184     def bfd_auth_keys_dump(self):
1185         return self.api(self.papi.bfd_auth_keys_dump, {})
1186
1187     def bfd_udp_set_echo_source(self, sw_if_index):
1188         return self.api(self.papi.bfd_udp_set_echo_source,
1189                         {'sw_if_index': sw_if_index})
1190
1191     def classify_add_del_table(
1192             self,
1193             is_add,
1194             mask,
1195             match_n_vectors=1,
1196             table_index=0xFFFFFFFF,
1197             nbuckets=2,
1198             memory_size=2097152,
1199             skip_n_vectors=0,
1200             next_table_index=0xFFFFFFFF,
1201             miss_next_index=0xFFFFFFFF,
1202             current_data_flag=0,
1203             current_data_offset=0):
1204         """
1205         :param is_add:
1206         :param mask:
1207         :param match_n_vectors: (Default value = 1)
1208         :param table_index: (Default value = 0xFFFFFFFF)
1209         :param nbuckets:  (Default value = 2)
1210         :param memory_size:  (Default value = 2097152)
1211         :param skip_n_vectors:  (Default value = 0)
1212         :param next_table_index:  (Default value = 0xFFFFFFFF)
1213         :param miss_next_index:  (Default value = 0xFFFFFFFF)
1214         :param current_data_flag:  (Default value = 0)
1215         :param current_data_offset:  (Default value = 0)
1216         """
1217
1218         return self.api(
1219             self.papi.classify_add_del_table,
1220             {'is_add': is_add,
1221              'table_index': table_index,
1222              'nbuckets': nbuckets,
1223              'memory_size': memory_size,
1224              'skip_n_vectors': skip_n_vectors,
1225              'match_n_vectors': match_n_vectors,
1226              'next_table_index': next_table_index,
1227              'miss_next_index': miss_next_index,
1228              'current_data_flag': current_data_flag,
1229              'current_data_offset': current_data_offset,
1230              'mask': mask})
1231
1232     def classify_add_del_session(
1233             self,
1234             is_add,
1235             table_index,
1236             match,
1237             opaque_index=0xFFFFFFFF,
1238             hit_next_index=0xFFFFFFFF,
1239             advance=0,
1240             action=0,
1241             metadata=0):
1242         """
1243         :param is_add:
1244         :param table_index:
1245         :param match:
1246         :param opaque_index:  (Default value = 0xFFFFFFFF)
1247         :param hit_next_index:  (Default value = 0xFFFFFFFF)
1248         :param advance:  (Default value = 0)
1249         :param action:  (Default value = 0)
1250         :param metadata:  (Default value = 0)
1251         """
1252
1253         return self.api(
1254             self.papi.classify_add_del_session,
1255             {'is_add': is_add,
1256              'table_index': table_index,
1257              'hit_next_index': hit_next_index,
1258              'opaque_index': opaque_index,
1259              'advance': advance,
1260              'action': action,
1261              'metadata': metadata,
1262              'match': match})
1263
1264     def input_acl_set_interface(
1265             self,
1266             is_add,
1267             sw_if_index,
1268             ip4_table_index=0xFFFFFFFF,
1269             ip6_table_index=0xFFFFFFFF,
1270             l2_table_index=0xFFFFFFFF):
1271         """
1272         :param is_add:
1273         :param sw_if_index:
1274         :param ip4_table_index:  (Default value = 0xFFFFFFFF)
1275         :param ip6_table_index:  (Default value = 0xFFFFFFFF)
1276         :param l2_table_index:  (Default value = 0xFFFFFFFF)
1277         """
1278
1279         return self.api(
1280             self.papi.input_acl_set_interface,
1281             {'sw_if_index': sw_if_index,
1282              'ip4_table_index': ip4_table_index,
1283              'ip6_table_index': ip6_table_index,
1284              'l2_table_index': l2_table_index,
1285              'is_add': is_add})
1286
1287     def set_ipfix_exporter(
1288             self,
1289             collector_address,
1290             src_address,
1291             path_mtu,
1292             template_interval,
1293             vrf_id=0,
1294             collector_port=4739,
1295             udp_checksum=0):
1296         return self.api(
1297             self.papi.set_ipfix_exporter,
1298             {
1299                 'collector_address': collector_address,
1300                 'collector_port': collector_port,
1301                 'src_address': src_address,
1302                 'vrf_id': vrf_id,
1303                 'path_mtu': path_mtu,
1304                 'template_interval': template_interval,
1305                 'udp_checksum': udp_checksum,
1306             })
1307
1308     def dhcp_proxy_config(self,
1309                           dhcp_server,
1310                           dhcp_src_address,
1311                           rx_table_id=0,
1312                           server_table_id=0,
1313                           is_add=1,
1314                           is_ipv6=0):
1315         return self.api(
1316             self.papi.dhcp_proxy_config,
1317             {
1318                 'rx_vrf_id': rx_table_id,
1319                 'server_vrf_id': server_table_id,
1320                 'is_ipv6': is_ipv6,
1321                 'is_add': is_add,
1322                 'dhcp_server': dhcp_server,
1323                 'dhcp_src_address': dhcp_src_address,
1324             })
1325
1326     def dhcp_proxy_set_vss(self,
1327                            table_id,
1328                            fib_id,
1329                            oui,
1330                            is_add=1,
1331                            is_ip6=0):
1332         return self.api(
1333             self.papi.dhcp_proxy_set_vss,
1334             {
1335                 'tbl_id': table_id,
1336                 'fib_id': fib_id,
1337                 'is_ipv6': is_ip6,
1338                 'is_add': is_add,
1339                 'oui': oui,
1340             })
1341
1342     def ip_mroute_add_del(self,
1343                           src_address,
1344                           grp_address,
1345                           grp_address_length,
1346                           e_flags,
1347                           next_hop_sw_if_index,
1348                           i_flags,
1349                           table_id=0,
1350                           create_vrf_if_needed=0,
1351                           is_add=1,
1352                           is_ipv6=0,
1353                           is_local=0):
1354         """
1355         """
1356         return self.api(
1357             self.papi.ip_mroute_add_del,
1358             {'next_hop_sw_if_index': next_hop_sw_if_index,
1359              'entry_flags': e_flags,
1360              'itf_flags': i_flags,
1361              'create_vrf_if_needed': create_vrf_if_needed,
1362              'is_add': is_add,
1363              'is_ipv6': is_ipv6,
1364              'is_local': is_local,
1365              'grp_address_length': grp_address_length,
1366              'grp_address': grp_address,
1367              'src_address': src_address})
1368
1369     def mfib_signal_dump(self):
1370         return self.api(self.papi.mfib_signal_dump, {})
1371
1372     def ip_mfib_dump(self):
1373         return self.api(self.papi.ip_mfib_dump, {})
1374
1375     def lisp_enable_disable(self, is_enabled):
1376         return self.api(
1377             self.papi.lisp_enable_disable,
1378             {
1379                 'is_en': is_enabled,
1380             })
1381
1382     def lisp_locator_set(self,
1383                          ls_name,
1384                          is_add=1):
1385         return self.api(
1386             self.papi.lisp_add_del_locator_set,
1387             {
1388                 'is_add': is_add,
1389                 'locator_set_name': ls_name
1390             })
1391
1392     def lisp_locator_set_dump(self):
1393         return self.api(self.papi.lisp_locator_set_dump, {})
1394
1395     def lisp_locator(self,
1396                      ls_name,
1397                      sw_if_index,
1398                      priority=1,
1399                      weight=1,
1400                      is_add=1):
1401         return self.api(
1402             self.papi.lisp_add_del_locator,
1403             {
1404                 'is_add': is_add,
1405                 'locator_set_name': ls_name,
1406                 'sw_if_index': sw_if_index,
1407                 'priority': priority,
1408                 'weight': weight
1409             })
1410
1411     def lisp_locator_dump(self, is_index_set, ls_name=None, ls_index=0):
1412         return self.api(
1413             self.papi.lisp_locator_dump,
1414             {
1415                 'is_index_set': is_index_set,
1416                 'ls_name': ls_name,
1417                 'ls_index': ls_index,
1418             })
1419
1420     def lisp_local_mapping(self,
1421                            ls_name,
1422                            eid_type,
1423                            eid,
1424                            prefix_len,
1425                            vni=0,
1426                            key_id=0,
1427                            key="",
1428                            is_add=1):
1429         return self.api(
1430             self.papi.lisp_add_del_local_eid,
1431             {
1432                 'locator_set_name': ls_name,
1433                 'is_add': is_add,
1434                 'eid_type': eid_type,
1435                 'eid': eid,
1436                 'prefix_len': prefix_len,
1437                 'vni': vni,
1438                 'key_id': key_id,
1439                 'key': key
1440             })
1441
1442     def lisp_eid_table_dump(self,
1443                             eid_set=0,
1444                             prefix_length=0,
1445                             vni=0,
1446                             eid_type=0,
1447                             eid=None,
1448                             filter_opt=0):
1449         return self.api(
1450             self.papi.lisp_eid_table_dump,
1451             {
1452                 'eid_set': eid_set,
1453                 'prefix_length': prefix_length,
1454                 'vni': vni,
1455                 'eid_type': eid_type,
1456                 'eid': eid,
1457                 'filter': filter_opt,
1458             })
1459
1460     def lisp_remote_mapping(self,
1461                             eid_type,
1462                             eid,
1463                             eid_prefix_len=0,
1464                             vni=0,
1465                             rlocs=None,
1466                             rlocs_num=0,
1467                             is_src_dst=0,
1468                             is_add=1):
1469         return self.api(
1470             self.papi.lisp_add_del_remote_mapping,
1471             {
1472                 'is_add': is_add,
1473                 'eid_type': eid_type,
1474                 'eid': eid,
1475                 'eid_len': eid_prefix_len,
1476                 'rloc_num': rlocs_num,
1477                 'rlocs': rlocs,
1478                 'vni': vni,
1479                 'is_src_dst': is_src_dst,
1480             })
1481
1482     def lisp_adjacency(self,
1483                        leid,
1484                        reid,
1485                        leid_len,
1486                        reid_len,
1487                        eid_type,
1488                        is_add=1,
1489                        vni=0):
1490         return self.api(
1491             self.papi.lisp_add_del_adjacency,
1492             {
1493                 'is_add': is_add,
1494                 'vni': vni,
1495                 'eid_type': eid_type,
1496                 'leid': leid,
1497                 'reid': reid,
1498                 'leid_len': leid_len,
1499                 'reid_len': reid_len,
1500             })
1501
1502     def lisp_adjacencies_get(self, vni=0):
1503         return self.api(
1504             self.papi.lisp_adjacencies_get,
1505             {
1506                 'vni': vni
1507             })