Add reverse DNS (ip to name) resolution

Change-Id: Ic531d820b1846ff7363e5c396ac0b1176e87b401
Signed-off-by: Dave Barach <dave@barachs.net>
diff --git a/src/vnet/dns/resolver_process.c b/src/vnet/dns/resolver_process.c
index 5603371..f473422 100644
--- a/src/vnet/dns/resolver_process.c
+++ b/src/vnet/dns/resolver_process.c
@@ -44,6 +44,10 @@
 vnet_dns_response_to_reply (u8 * response,
 			    vl_api_dns_resolve_name_reply_t * rmp,
 			    u32 * min_ttlp);
+extern int
+vnet_dns_response_to_name (u8 * response,
+			   vl_api_dns_resolve_ip_reply_t * rmp,
+			   u32 * min_ttlp);
 
 static void
 resolve_event (dns_main_t * dm, f64 now, u8 * reply)
@@ -95,29 +99,47 @@
     ep->flags |= DNS_CACHE_ENTRY_FLAG_VALID;
 
   /* Most likely, send 1 message */
-  for (i = 0; i < vec_len (ep->api_clients_to_notify); i++)
+  for (i = 0; i < vec_len (ep->pending_api_requests); i++)
     {
       vl_api_registration_t *regp;
-      vl_api_dns_resolve_name_reply_t *rmp;
 
       regp = vl_api_client_index_to_registration
-	(ep->api_clients_to_notify[i]);
+	(ep->pending_api_requests[i].client_index);
 
       if (regp == 0)
 	continue;
 
-      rmp = vl_msg_api_alloc (sizeof (*rmp) + vec_len (ep->dns_response));
-      rmp->_vl_msg_id = clib_host_to_net_u16 (VL_API_DNS_RESOLVE_NAME_REPLY);
-      rmp->context = ep->api_client_contexts[i];
-      min_ttl = ~0;
-      rv = vnet_dns_response_to_reply (ep->dns_response, rmp, &min_ttl);
-      if (min_ttl != ~0)
-	ep->expiration_time = now + min_ttl;
-      rmp->retval = clib_host_to_net_u32 (rv);
-      vl_msg_api_send (regp, (u8 *) rmp);
+      if (ep->pending_api_requests[i].request_type
+	  == DNS_API_PENDING_NAME_TO_IP)
+	{
+	  vl_api_dns_resolve_name_reply_t *rmp;
+	  rmp = vl_msg_api_alloc (sizeof (*rmp));
+	  rmp->_vl_msg_id =
+	    clib_host_to_net_u16 (VL_API_DNS_RESOLVE_NAME_REPLY);
+	  rmp->context = ep->pending_api_requests[i].client_context;
+	  min_ttl = ~0;
+	  rv = vnet_dns_response_to_reply (ep->dns_response, rmp, &min_ttl);
+	  if (min_ttl != ~0)
+	    ep->expiration_time = now + min_ttl;
+	  rmp->retval = clib_host_to_net_u32 (rv);
+	  vl_msg_api_send (regp, (u8 *) rmp);
+	}
+      else
+	{
+	  vl_api_dns_resolve_ip_reply_t *rmp;
+	  rmp = vl_msg_api_alloc (sizeof (*rmp));
+	  rmp->_vl_msg_id =
+	    clib_host_to_net_u16 (VL_API_DNS_RESOLVE_IP_REPLY);
+	  rmp->context = ep->pending_api_requests[i].client_context;
+	  min_ttl = ~0;
+	  rv = vnet_dns_response_to_name (ep->dns_response, rmp, &min_ttl);
+	  if (min_ttl != ~0)
+	    ep->expiration_time = now + min_ttl;
+	  rmp->retval = clib_host_to_net_u32 (rv);
+	  vl_msg_api_send (regp, (u8 *) rmp);
+	}
     }
-  vec_free (ep->api_clients_to_notify);
-  vec_free (ep->api_client_contexts);
+  vec_free (ep->pending_api_requests);
 
   /* $$$ Add ip4/ip6 reply code */
   vec_free (ep->ip4_peers_to_notify);