tap: implement sw_interface_tap_v2_dump filtering by sw_if_index 08/26708/10
authorPaul Vinciguerra <pvinci@vinciconsulting.com>
Mon, 27 Apr 2020 05:12:48 +0000 (01:12 -0400)
committerNeale Ranns <nranns@cisco.com>
Fri, 1 May 2020 18:08:45 +0000 (18:08 +0000)
Type: feature

Change-Id: I6f607f383dc77a71e8712124f7613b38b4ac065a
Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
src/vnet/devices/tap/FEATURE.yaml
src/vnet/devices/tap/tapv2.api
src/vnet/devices/tap/tapv2_api.c
test/test_tap.py
test/vpp_devices.py

index a143d33..5d1726d 100644 (file)
@@ -7,8 +7,5 @@ features:
   - attach to existing tap at host
 description: "Create a tap v2 device interface, which connects to a
               tap interface on the host system."
-missing:
-
-  - API dump filtering by sw_if_index
 state: production
 properties: [API, CLI, STATS, MULTITHREAD]
index 9113458..61b6720 100644 (file)
@@ -40,8 +40,8 @@ enum tap_flags {
     @param use_random_mac - let the system generate a unique mac address
     @param mac_address - mac addr to assign to the interface if use_random not set
     @param num_rx_queues - number of rx queues
-    @param tx_ring_sz - the number of entries of TX ring
-    @param rx_ring_sz - the number of entries of RX ring
+    @param tx_ring_sz - the number of entries of TX ring, optional, default is 256 entries, must be power of 2
+    @param rx_ring_sz - the number of entries of RX ring, optional, default is 256 entries, must be power of 2
     @param host_mtu_set - host MTU should be set
     @param host_mtu_size - host MTU size
     @param host_mac_addr_set - host side interface mac address should be set
@@ -57,7 +57,7 @@ enum tap_flags {
     @param tap_flags - flags for the TAP interface creation
     @param host_if_name_set - host side interface name should be set
     @param host_if_name - host side interface name
-    @param host_namespace_set - host namespece should be set
+    @param host_namespace_set - host namespace should be set
     @param host_namespace - host namespace to attach interface to
     @param host_bridge_set - host bridge should be set
     @param host_bridge - host bridge to attach interface to
@@ -71,8 +71,8 @@ define tap_create_v2
   bool use_random_mac [default=true];
   vl_api_mac_address_t mac_address;
   u8 num_rx_queues [default=1];
-  u16 tx_ring_sz; /* optional, default is 256 entries, must be power of 2 */
-  u16 rx_ring_sz; /* optional, default is 256 entries, must be power of 2 */
+  u16 tx_ring_sz [default=256];
+  u16 rx_ring_sz [default=256];
   bool host_mtu_set;
   u32 host_mtu_size;
   bool host_mac_addr_set;
@@ -120,7 +120,7 @@ autoreply define tap_delete_v2
 };
 
 /** \brief Dump tap interfaces request
-    @param sw_if_index - filter by sw_if_index UNIMPLEMENTED
+    @param sw_if_index - filter by sw_if_index
 */
 define sw_interface_tap_v2_dump
 {
index 9e09459..0567937 100644 (file)
@@ -232,8 +232,8 @@ vl_api_sw_interface_tap_v2_dump_t_handler (vl_api_sw_interface_tap_v2_dump_t *
     return;
 
   filter_sw_if_index = htonl (mp->sw_if_index);
-  if (filter_sw_if_index != ~0)
-    return;                    /* UNIMPLEMENTED */
+  if (mp->sw_if_index != ~0)
+    VALIDATE_SW_IF_INDEX (mp);
 
   rv = tap_dump_ifs (&tapifs);
   if (rv)
@@ -241,9 +241,11 @@ vl_api_sw_interface_tap_v2_dump_t_handler (vl_api_sw_interface_tap_v2_dump_t *
 
   vec_foreach (tap_if, tapifs)
   {
-    tap_send_sw_interface_details (am, reg, tap_if, mp->context);
+    if ((filter_sw_if_index == ~0)
+       || (tap_if->sw_if_index == filter_sw_if_index))
+      tap_send_sw_interface_details (am, reg, tap_if, mp->context);
   }
-
+  BAD_SW_IF_INDEX_LABEL;
   vec_free (tapifs);
 }
 
index b47b1a2..0e5b315 100644 (file)
@@ -19,6 +19,20 @@ class TestTAP(VppTestCase):
         tap0.add_vpp_config()
         self.assertTrue(tap0.query_vpp_config())
 
+    def test_tap_dump(self):
+        """ Test api dump w/ and w/o sw_if_index filtering"""
+        MAX_INSTANCES = 10
+        tap_instances = []
+        for instance in range(MAX_INSTANCES):
+            i = VppTAPInterface(self, tap_id=instance)
+            i.add_vpp_config()
+            tap_instances.append(i)
+        details = self.vapi.sw_interface_tap_v2_dump()
+        self.assertEqual(MAX_INSTANCES, len(details))
+        details = self.vapi.sw_interface_tap_v2_dump(
+            tap_instances[5].sw_if_index)
+        self.assertEqual(1, len(details))
+
 
 if __name__ == '__main__':
     unittest.main(testRunner=VppTestRunner)
index 7e18eca..9e272ca 100644 (file)
@@ -14,16 +14,14 @@ class VppTAPInterface(VppInterface):
         self._mac_addr = mac_addr
 
     def get_vpp_dump(self):
-        dump = self._test.vapi.sw_interface_tap_v2_dump()
-        for entry in dump:
-            if entry.sw_if_index == self.sw_if_index:
-                return entry
+        dump = self._test.vapi.sw_interface_tap_v2_dump(
+            sw_if_index=self.sw_if_index)
+        return dump
 
     def add_vpp_config(self):
-        use_random_mac = True if self._mac_addr else False
         reply = self._test.vapi.tap_create_v2(
             id=self._tap_id,
-            use_random_mac=use_random_mac,
+            use_random_mac=bool(self._mac_addr),
             mac_address=self._mac_addr)
         self.set_sw_if_index(reply.sw_if_index)
         self._test.registry.register(self, self.test.logger)
@@ -33,9 +31,7 @@ class VppTAPInterface(VppInterface):
 
     def query_vpp_config(self):
         dump = self.get_vpp_dump()
-        if dump:
-            return True
-        return False
+        return bool(dump)
 
     def object_id(self):
         return "tap-%s" % self._tap_id