Add sw_if_index to the ip_neighbor_details_t response.

When a DUMP with sw_if_index == ~0 is used to get all Neighbor
entries for all interfaces, it is unclear in the details to
which interface the neighbor belongs.

Clear that up by returning the associated sw_if_index as well.

Change-Id: Ib584a57138f7faceffed64d7c1854f7af92e0e42
Signed-off-by: Jon Loeliger <jdl@netgate.com>
diff --git a/src/vnet/ip/ip.api b/src/vnet/ip/ip.api
index e9c9f55..9398ad5 100644
--- a/src/vnet/ip/ip.api
+++ b/src/vnet/ip/ip.api
@@ -127,7 +127,7 @@
 /** \brief Dump IP neighboors
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
-    @param sw_if_index - the interface to dump neighboors
+    @param sw_if_index - the interface to dump neighboors, ~0 == all
     @param is_ipv6 - [1|0] to indicate if address family is ipv[6|4]
 */
 define ip_neighbor_dump
@@ -140,11 +140,13 @@
 
 /** \brief IP neighboors dump response
     @param context - sender context which was passed in the request
+    @param sw_if_index - The interface used to reach the neighbor
     @param is_static - [1|0] to indicate if neighbor is statically configured
     @param is_ipv6 - [1|0] to indicate if address family is ipv[6|4]
 */
 define ip_neighbor_details {
     u32 context;
+    u32 sw_if_index;
     u8  is_static;
     u8  is_ipv6;
     u8  mac_address[6];
diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c
index 0fdb167..222bc82 100644
--- a/src/vnet/ip/ip_api.c
+++ b/src/vnet/ip/ip_api.c
@@ -86,7 +86,8 @@
 extern void stats_dsunlock (void);
 
 static void
-send_ip_neighbor_details (u8 is_ipv6,
+send_ip_neighbor_details (u32 sw_if_index,
+			  u8 is_ipv6,
 			  u8 is_static,
 			  u8 * mac_address,
 			  u8 * ip_address,
@@ -98,6 +99,7 @@
   memset (mp, 0, sizeof (*mp));
   mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_DETAILS);
   mp->context = context;
+  mp->sw_if_index = htonl (sw_if_index);
   mp->is_ipv6 = is_ipv6;
   mp->is_static = is_static;
   memcpy (mp->mac_address, mac_address, 6);
@@ -126,7 +128,8 @@
       vec_foreach (n, ns)
       {
         send_ip_neighbor_details
-          (mp->is_ipv6, ((n->flags & IP6_NEIGHBOR_FLAG_STATIC) ? 1 : 0),
+          (sw_if_index, mp->is_ipv6,
+	   ((n->flags & IP6_NEIGHBOR_FLAG_STATIC) ? 1 : 0),
            (u8 *) n->link_layer_address,
            (u8 *) & (n->key.ip6_address.as_u8),
            q, mp->context);
@@ -142,7 +145,7 @@
       /* *INDENT-OFF* */
       vec_foreach (n, ns)
       {
-        send_ip_neighbor_details (mp->is_ipv6,
+        send_ip_neighbor_details (sw_if_index, mp->is_ipv6,
           ((n->flags & ETHERNET_ARP_IP4_ENTRY_FLAG_STATIC) ? 1 : 0),
           (u8*) n->ethernet_address,
           (u8*) & (n->ip4_address.as_u8),