session: API cleanup
[vpp.git] / test / bfd.py
index 09a7681..9d44425 100644 (file)
@@ -6,9 +6,10 @@ from scapy.all import bind_layers
 from scapy.layers.inet import UDP
 from scapy.packet import Packet
 from scapy.fields import BitField, BitEnumField, XByteField, FlagsField,\
 from scapy.layers.inet import UDP
 from scapy.packet import Packet
 from scapy.fields import BitField, BitEnumField, XByteField, FlagsField,\
-        ConditionalField, StrField
+    ConditionalField, StrField
 from vpp_object import VppObject
 from util import NumericConstant
 from vpp_object import VppObject
 from util import NumericConstant
+from vpp_papi import VppEnum
 
 
 class BFDDiagCode(NumericConstant):
 
 
 class BFDDiagCode(NumericConstant):
@@ -35,9 +36,6 @@ class BFDDiagCode(NumericConstant):
         reverse_concatenated_path_down: "Reverse Concatenated Path Down",
     }
 
         reverse_concatenated_path_down: "Reverse Concatenated Path Down",
     }
 
-    def __init__(self, value):
-        NumericConstant.__init__(self, value)
-
 
 class BFDState(NumericConstant):
     """ BFD State """
 
 class BFDState(NumericConstant):
     """ BFD State """
@@ -53,9 +51,6 @@ class BFDState(NumericConstant):
         up: "Up",
     }
 
         up: "Up",
     }
 
-    def __init__(self, value):
-        NumericConstant.__init__(self, value)
-
 
 class BFDAuthType(NumericConstant):
     """ BFD Authentication Type """
 
 class BFDAuthType(NumericConstant):
     """ BFD Authentication Type """
@@ -75,9 +70,6 @@ class BFDAuthType(NumericConstant):
         meticulous_keyed_sha1: "Meticulous Keyed SHA1",
     }
 
         meticulous_keyed_sha1: "Meticulous Keyed SHA1",
     }
 
-    def __init__(self, value):
-        NumericConstant.__init__(self, value)
-
 
 def bfd_is_auth_used(pkt):
     """ is packet authenticated? """
 
 def bfd_is_auth_used(pkt):
     """ is packet authenticated? """
@@ -110,6 +102,7 @@ class BFD(Packet):
     """ BFD protocol layer for scapy """
 
     udp_dport = 3784  #: BFD destination port per RFC 5881
     """ BFD protocol layer for scapy """
 
     udp_dport = 3784  #: BFD destination port per RFC 5881
+    udp_dport_echo = 3785  # : BFD destination port for ECHO per RFC 5881
     udp_sport_min = 49152  #: BFD source port min value per RFC 5881
     udp_sport_max = 65535  #: BFD source port max value per RFC 5881
     bfd_pkt_len = 24  # : length of BFD pkt without authentication section
     udp_sport_min = 49152  #: BFD source port min value per RFC 5881
     udp_sport_max = 65535  #: BFD source port max value per RFC 5881
     bfd_pkt_len = 24  # : length of BFD pkt without authentication section
@@ -147,10 +140,33 @@ class BFD(Packet):
         return self.sprintf("BFD(my_disc=%BFD.my_discriminator%,"
                             "your_disc=%BFD.your_discriminator%)")
 
         return self.sprintf("BFD(my_disc=%BFD.my_discriminator%,"
                             "your_disc=%BFD.your_discriminator%)")
 
+
 # glue the BFD packet class to scapy parser
 bind_layers(UDP, BFD, dport=BFD.udp_dport)
 
 
 # glue the BFD packet class to scapy parser
 bind_layers(UDP, BFD, dport=BFD.udp_dport)
 
 
+class BFD_vpp_echo(Packet):
+    """ BFD echo packet as used by VPP (non-rfc, as rfc doesn't define one) """
+
+    udp_dport = 3785  #: BFD echo destination port per RFC 5881
+    name = "BFD_VPP_ECHO"
+
+    fields_desc = [
+        BitField("discriminator", 0, 32),
+        BitField("expire_time_clocks", 0, 64),
+        BitField("checksum", 0, 64)
+    ]
+
+    def mysummary(self):
+        return self.sprintf(
+            "BFD_VPP_ECHO(disc=%BFD_VPP_ECHO.discriminator%,"
+            "expire_time_clocks=%BFD_VPP_ECHO.expire_time_clocks%)")
+
+
+# glue the BFD echo packet class to scapy parser
+bind_layers(UDP, BFD_vpp_echo, dport=BFD_vpp_echo.udp_dport)
+
+
 class VppBFDAuthKey(VppObject):
     """ Represents BFD authentication key in VPP """
 
 class VppBFDAuthKey(VppObject):
     """ Represents BFD authentication key in VPP """
 
@@ -176,6 +192,10 @@ class VppBFDAuthKey(VppObject):
         """ key data """
         return self._key
 
         """ key data """
         return self._key
 
+    @key.setter
+    def key(self, value):
+        self._key = value
+
     @property
     def conf_key_id(self):
         """ configuration key ID """
     @property
     def conf_key_id(self):
         """ configuration key ID """
@@ -183,7 +203,8 @@ class VppBFDAuthKey(VppObject):
 
     def add_vpp_config(self):
         self.test.vapi.bfd_auth_set_key(
 
     def add_vpp_config(self):
         self.test.vapi.bfd_auth_set_key(
-            self._conf_key_id, self._auth_type, self._key)
+            conf_key_id=self._conf_key_id, auth_type=self._auth_type,
+            key=self._key, key_len=len(self._key))
         self._test.registry.register(self, self.test.logger)
 
     def get_bfd_auth_keys_dump_entry(self):
         self._test.registry.register(self, self.test.logger)
 
     def get_bfd_auth_keys_dump_entry(self):
@@ -198,36 +219,35 @@ class VppBFDAuthKey(VppObject):
         return self.get_bfd_auth_keys_dump_entry() is not None
 
     def remove_vpp_config(self):
         return self.get_bfd_auth_keys_dump_entry() is not None
 
     def remove_vpp_config(self):
-        self.test.vapi.bfd_auth_del_key(self._conf_key_id)
+        self.test.vapi.bfd_auth_del_key(conf_key_id=self._conf_key_id)
 
     def object_id(self):
         return "bfd-auth-key-%s" % self._conf_key_id
 
 
     def object_id(self):
         return "bfd-auth-key-%s" % self._conf_key_id
 
-    def __str__(self):
-        return self.object_id()
-
 
 class VppBFDUDPSession(VppObject):
     """ Represents BFD UDP session in VPP """
 
     def __init__(self, test, interface, peer_addr, local_addr=None, af=AF_INET,
 
 class VppBFDUDPSession(VppObject):
     """ Represents BFD UDP session in VPP """
 
     def __init__(self, test, interface, peer_addr, local_addr=None, af=AF_INET,
-                 desired_min_tx=100000, required_min_rx=100000, detect_mult=3,
-                 sha1_key=None, bfd_key_id=None):
+                 desired_min_tx=300000, required_min_rx=300000, detect_mult=3,
+                 sha1_key=None, bfd_key_id=None, is_tunnel=False):
         self._test = test
         self._interface = interface
         self._af = af
         self._test = test
         self._interface = interface
         self._af = af
-        self._local_addr = local_addr
-        if local_addr is not None:
-            self._local_addr_n = inet_pton(af, local_addr)
+        if local_addr:
+            self._local_addr = local_addr
         else:
         else:
-            self._local_addr_n = None
+            self._local_addr = None
         self._peer_addr = peer_addr
         self._peer_addr = peer_addr
-        self._peer_addr_n = inet_pton(af, peer_addr)
         self._desired_min_tx = desired_min_tx
         self._required_min_rx = required_min_rx
         self._detect_mult = detect_mult
         self._sha1_key = sha1_key
         self._desired_min_tx = desired_min_tx
         self._required_min_rx = required_min_rx
         self._detect_mult = detect_mult
         self._sha1_key = sha1_key
-        self._bfd_key_id = bfd_key_id if bfd_key_id else randint(0, 255)
+        if bfd_key_id is not None:
+            self._bfd_key_id = bfd_key_id
+        else:
+            self._bfd_key_id = randint(0, 255)
+        self._is_tunnel = is_tunnel
 
     @property
     def test(self):
 
     @property
     def test(self):
@@ -256,28 +276,11 @@ class VppBFDUDPSession(VppObject):
                 raise Exception("Unexpected af '%s'" % self.af)
         return self._local_addr
 
                 raise Exception("Unexpected af '%s'" % self.af)
         return self._local_addr
 
-    @property
-    def local_addr_n(self):
-        """ BFD session local address (VPP address) - raw, suitable for API """
-        if self._local_addr is None:
-            if self.af == AF_INET:
-                return self._interface.local_ip4n
-            elif self.af == AF_INET6:
-                return self._interface.local_ip6n
-            else:
-                raise Exception("Unexpected af '%s'" % self.af)
-        return self._local_addr_n
-
     @property
     def peer_addr(self):
         """ BFD session peer address """
         return self._peer_addr
 
     @property
     def peer_addr(self):
         """ BFD session peer address """
         return self._peer_addr
 
-    @property
-    def peer_addr_n(self):
-        """ BFD session peer address - raw, suitable for API """
-        return self._peer_addr_n
-
     def get_bfd_udp_session_dump_entry(self):
         """ get the namedtuple entry from bfd udp session dump """
         result = self.test.vapi.bfd_udp_session_dump()
     def get_bfd_udp_session_dump_entry(self):
         """ get the namedtuple entry from bfd udp session dump """
         result = self.test.vapi.bfd_udp_session_dump()
@@ -285,14 +288,12 @@ class VppBFDUDPSession(VppObject):
             self.test.logger.debug("session entry: %s" % str(s))
             if s.sw_if_index == self.interface.sw_if_index:
                 if self.af == AF_INET \
             self.test.logger.debug("session entry: %s" % str(s))
             if s.sw_if_index == self.interface.sw_if_index:
                 if self.af == AF_INET \
-                        and s.is_ipv6 == 0 \
-                        and self.interface.local_ip4n == s.local_addr[:4] \
-                        and self.interface.remote_ip4n == s.peer_addr[:4]:
+                        and self.interface.local_ip4 == str(s.local_addr) \
+                        and self.interface.remote_ip4 == str(s.peer_addr):
                     return s
                 if self.af == AF_INET6 \
                     return s
                 if self.af == AF_INET6 \
-                        and s.is_ipv6 == 1 \
-                        and self.interface.local_ip6n == s.local_addr \
-                        and self.interface.remote_ip6n == s.peer_addr:
+                        and self.interface.local_ip6 == str(s.local_addr) \
+                        and self.interface.remote_ip6 == str(s.peer_addr):
                     return s
         return None
 
                     return s
         return None
 
@@ -329,32 +330,34 @@ class VppBFDUDPSession(VppObject):
         """ bfd key id in use """
         return self._bfd_key_id
 
         """ bfd key id in use """
         return self._bfd_key_id
 
+    @property
+    def is_tunnel(self):
+        return self._is_tunnel
+
     def activate_auth(self, key, bfd_key_id=None, delayed=False):
         """ activate authentication for this session """
         self._bfd_key_id = bfd_key_id if bfd_key_id else randint(0, 255)
         self._sha1_key = key
     def activate_auth(self, key, bfd_key_id=None, delayed=False):
         """ activate authentication for this session """
         self._bfd_key_id = bfd_key_id if bfd_key_id else randint(0, 255)
         self._sha1_key = key
-        is_ipv6 = 1 if AF_INET6 == self.af else 0
         conf_key_id = self._sha1_key.conf_key_id
         is_delayed = 1 if delayed else 0
         conf_key_id = self._sha1_key.conf_key_id
         is_delayed = 1 if delayed else 0
-        self.test.vapi.bfd_udp_auth_activate(self._interface.sw_if_index,
-                                             self.local_addr_n,
-                                             self.peer_addr_n,
-                                             is_ipv6=is_ipv6,
-                                             bfd_key_id=self._bfd_key_id,
-                                             conf_key_id=conf_key_id,
-                                             is_delayed=is_delayed)
+        self.test.vapi.bfd_udp_auth_activate(
+            sw_if_index=self._interface.sw_if_index,
+            local_addr=self.local_addr,
+            peer_addr=self.peer_addr,
+            bfd_key_id=self._bfd_key_id,
+            conf_key_id=conf_key_id,
+            is_delayed=is_delayed)
 
     def deactivate_auth(self, delayed=False):
         """ deactivate authentication """
         self._bfd_key_id = None
         self._sha1_key = None
         is_delayed = 1 if delayed else 0
 
     def deactivate_auth(self, delayed=False):
         """ deactivate authentication """
         self._bfd_key_id = None
         self._sha1_key = None
         is_delayed = 1 if delayed else 0
-        is_ipv6 = 1 if AF_INET6 == self.af else 0
-        self.test.vapi.bfd_udp_auth_deactivate(self._interface.sw_if_index,
-                                               self.local_addr_n,
-                                               self.peer_addr_n,
-                                               is_ipv6=is_ipv6,
-                                               is_delayed=is_delayed)
+        self.test.vapi.bfd_udp_auth_deactivate(
+            sw_if_index=self._interface.sw_if_index,
+            local_addr=self.local_addr,
+            peer_addr=self.peer_addr,
+            is_delayed=is_delayed)
 
     def modify_parameters(self,
                           detect_mult=None,
 
     def modify_parameters(self,
                           detect_mult=None,
@@ -367,28 +370,26 @@ class VppBFDUDPSession(VppObject):
             self._desired_min_tx = desired_min_tx
         if required_min_rx:
             self._required_min_rx = required_min_rx
             self._desired_min_tx = desired_min_tx
         if required_min_rx:
             self._required_min_rx = required_min_rx
-        is_ipv6 = 1 if AF_INET6 == self.af else 0
-        self.test.vapi.bfd_udp_mod(self._interface.sw_if_index,
-                                   self.desired_min_tx,
-                                   self.required_min_rx,
-                                   self.detect_mult,
-                                   self.local_addr_n,
-                                   self.peer_addr_n,
-                                   is_ipv6=is_ipv6)
+        self.test.vapi.bfd_udp_mod(sw_if_index=self._interface.sw_if_index,
+                                   desired_min_tx=self.desired_min_tx,
+                                   required_min_rx=self.required_min_rx,
+                                   detect_mult=self.detect_mult,
+                                   local_addr=self.local_addr,
+                                   peer_addr=self.peer_addr)
 
     def add_vpp_config(self):
 
     def add_vpp_config(self):
-        is_ipv6 = 1 if AF_INET6 == self.af else 0
         bfd_key_id = self._bfd_key_id if self._sha1_key else None
         conf_key_id = self._sha1_key.conf_key_id if self._sha1_key else None
         bfd_key_id = self._bfd_key_id if self._sha1_key else None
         conf_key_id = self._sha1_key.conf_key_id if self._sha1_key else None
-        self.test.vapi.bfd_udp_add(self._interface.sw_if_index,
-                                   self.desired_min_tx,
-                                   self.required_min_rx,
-                                   self.detect_mult,
-                                   self.local_addr_n,
-                                   self.peer_addr_n,
-                                   is_ipv6=is_ipv6,
+        is_authenticated = True if self._sha1_key else False
+        self.test.vapi.bfd_udp_add(sw_if_index=self._interface.sw_if_index,
+                                   desired_min_tx=self.desired_min_tx,
+                                   required_min_rx=self.required_min_rx,
+                                   detect_mult=self.detect_mult,
+                                   local_addr=self.local_addr,
+                                   peer_addr=self.peer_addr,
                                    bfd_key_id=bfd_key_id,
                                    bfd_key_id=bfd_key_id,
-                                   conf_key_id=conf_key_id)
+                                   conf_key_id=conf_key_id,
+                                   is_authenticated=is_authenticated)
         self._test.registry.register(self, self.test.logger)
 
     def query_vpp_config(self):
         self._test.registry.register(self, self.test.logger)
 
     def query_vpp_config(self):
@@ -396,11 +397,9 @@ class VppBFDUDPSession(VppObject):
         return session is not None
 
     def remove_vpp_config(self):
         return session is not None
 
     def remove_vpp_config(self):
-        is_ipv6 = 1 if AF_INET6 == self._af else 0
         self.test.vapi.bfd_udp_del(self._interface.sw_if_index,
         self.test.vapi.bfd_udp_del(self._interface.sw_if_index,
-                                   self.local_addr_n,
-                                   self.peer_addr_n,
-                                   is_ipv6=is_ipv6)
+                                   local_addr=self.local_addr,
+                                   peer_addr=self.peer_addr)
 
     def object_id(self):
         return "bfd-udp-%s-%s-%s-%s" % (self._interface.sw_if_index,
 
     def object_id(self):
         return "bfd-udp-%s-%s-%s-%s" % (self._interface.sw_if_index,
@@ -408,14 +407,17 @@ class VppBFDUDPSession(VppObject):
                                         self.peer_addr,
                                         self.af)
 
                                         self.peer_addr,
                                         self.af)
 
-    def __str__(self):
-        return self.object_id()
-
     def admin_up(self):
         """ set bfd session admin-up """
     def admin_up(self):
         """ set bfd session admin-up """
-        is_ipv6 = 1 if AF_INET6 == self._af else 0
-        self.test.vapi.bfd_udp_session_set_flags(1,
-                                                 self._interface.sw_if_index,
-                                                 self.local_addr_n,
-                                                 self.peer_addr_n,
-                                                 is_ipv6=is_ipv6)
+        self.test.vapi.bfd_udp_session_set_flags(
+            flags=VppEnum.vl_api_if_status_flags_t.IF_STATUS_API_FLAG_ADMIN_UP,
+            sw_if_index=self._interface.sw_if_index,
+            local_addr=self.local_addr,
+            peer_addr=self.peer_addr)
+
+    def admin_down(self):
+        """ set bfd session admin-down """
+        self.test.vapi.bfd_udp_session_set_flags(
+            flags=0, sw_if_index=self._interface.sw_if_index,
+            local_addr=self.local_addr,
+            peer_addr=self.peer_addr)