virtio: add vhost sw_if_index filter for sw_interface_vhost_user_dump

The filter sw_if_index was in the API sw_interface_vhost_user_dump. But
it was never implemented in the backend. This patch is to add the backend,
vat, and custom dump support for the filter.

Type: feature

Signed-off-by: Steven Luong <sluong@cisco.com>
Change-Id: Iaa41a7e11bfbcbb4c60092375e4b0dcf0950077b
diff --git a/src/vat/api_format.c b/src/vat/api_format.c
index 60cfa50..a3a67c1 100644
--- a/src/vat/api_format.c
+++ b/src/vat/api_format.c
@@ -12675,15 +12675,28 @@
 static int
 api_sw_interface_vhost_user_dump (vat_main_t * vam)
 {
+  unformat_input_t *i = vam->input;
   vl_api_sw_interface_vhost_user_dump_t *mp;
   vl_api_control_ping_t *mp_ping;
   int ret;
+  u32 sw_if_index = ~0;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
+	;
+      else if (unformat (i, "sw_if_index %d", &sw_if_index))
+	;
+      else
+	break;
+    }
+
   print (vam->ofp,
 	 "Interface name            idx hdr_sz features server regions filename");
 
   /* Get list of vhost-user interfaces */
   M (SW_INTERFACE_VHOST_USER_DUMP, mp);
-  mp->sw_if_index = ntohl (~0);
+  mp->sw_if_index = ntohl (sw_if_index);
   S (mp);
 
   /* Use a control ping for synchronization */
@@ -20729,7 +20742,7 @@
         "<intfc> | sw_if_index <nn> socket <filename>\n"                \
         "[server] [renumber <dev_instance>] [gso] [packed]")            \
 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>")                   \
-_(sw_interface_vhost_user_dump, "")                                     \
+_(sw_interface_vhost_user_dump, "<intfc> | sw_if_index <nn>")           \
 _(show_version, "")                                                     \
 _(show_threads, "")                                                     \
 _(vxlan_gpe_add_del_tunnel,                                             \
diff --git a/src/vnet/devices/virtio/vhost_user.api b/src/vnet/devices/virtio/vhost_user.api
index 127b0a2..338fd71 100644
--- a/src/vnet/devices/virtio/vhost_user.api
+++ b/src/vnet/devices/virtio/vhost_user.api
@@ -115,7 +115,7 @@
 };
 
 /** \brief Vhost-user interface dump request
-    @param sw_if_index - filter by sw_if_index UNIMPLEMENTED
+    @param sw_if_index - filter by sw_if_index
 */
 define sw_interface_vhost_user_dump
 {
diff --git a/src/vnet/devices/virtio/vhost_user_api.c b/src/vnet/devices/virtio/vhost_user_api.c
index 6736533..80fe554 100644
--- a/src/vnet/devices/virtio/vhost_user_api.c
+++ b/src/vnet/devices/virtio/vhost_user_api.c
@@ -211,7 +211,7 @@
 
   filter_sw_if_index = htonl (mp->sw_if_index);
   if (filter_sw_if_index != ~0)
-    return;			/* UNIMPLEMENTED */
+    VALIDATE_SW_IF_INDEX (mp);
 
   rv = vhost_user_dump_ifs (vnm, vm, &ifaces);
   if (rv)
@@ -219,8 +219,11 @@
 
   vec_foreach (vuid, ifaces)
   {
-    send_sw_interface_vhost_user_details (am, reg, vuid, mp->context);
+    if ((filter_sw_if_index == ~0) ||
+	(vuid->sw_if_index == filter_sw_if_index))
+      send_sw_interface_vhost_user_details (am, reg, vuid, mp->context);
   }
+  BAD_SW_IF_INDEX_LABEL;
   vec_free (ifaces);
 }
 
diff --git a/src/vpp/api/custom_dump.c b/src/vpp/api/custom_dump.c
index f1798de..be6b094 100644
--- a/src/vpp/api/custom_dump.c
+++ b/src/vpp/api/custom_dump.c
@@ -1785,7 +1785,8 @@
   u8 *s;
 
   s = format (0, "SCRIPT: sw_interface_vhost_user_dump ");
-  s = format (s, "sw_if_index %d ", (mp->sw_if_index));
+  if (mp->sw_if_index != ~0)
+    s = format (s, "sw_if_index %d ", (mp->sw_if_index));
 
   FINISH;
 }