+static void send_vxlan_tunnel_details
+(vxlan_tunnel_t * t, unix_shared_memory_queue_t * q)
+{
+ vl_api_vxlan_tunnel_details_t * rmp;
+ ip4_main_t * im = &ip4_main;
+
+ rmp = vl_msg_api_alloc (sizeof (*rmp));
+ memset (rmp, 0, sizeof (*rmp));
+ rmp->_vl_msg_id = ntohs(VL_API_VXLAN_TUNNEL_DETAILS);
+ rmp->src_address = t->src.data_u32;
+ rmp->dst_address = t->dst.data_u32;
+ rmp->encap_vrf_id = htonl(im->fibs[t->encap_fib_index].table_id);
+ rmp->vni = htonl(t->vni);
+ rmp->decap_next_index = htonl(t->decap_next_index);
+ rmp->sw_if_index = htonl(t->sw_if_index);
+
+ vl_msg_api_send_shmem (q, (u8 *)&rmp);
+}
+
+static void vl_api_vxlan_tunnel_dump_t_handler
+(vl_api_vxlan_tunnel_dump_t * mp)
+{
+ unix_shared_memory_queue_t * q;
+ vxlan_main_t * vxm = &vxlan_main;
+ vxlan_tunnel_t * t;
+ u32 sw_if_index;
+
+ q = vl_api_client_index_to_input_queue (mp->client_index);
+ if (q == 0) {
+ return;
+ }
+
+ sw_if_index = ntohl(mp->sw_if_index);
+
+ if (~0 == sw_if_index) {
+ pool_foreach (t, vxm->tunnels,
+ ({
+ send_vxlan_tunnel_details(t, q);
+ }));
+ } else {
+ if ((sw_if_index >= vec_len(vxm->tunnel_index_by_sw_if_index)) ||
+ (~0 == vxm->tunnel_index_by_sw_if_index[sw_if_index])) {
+ return;
+ }
+ t = &vxm->tunnels[vxm->tunnel_index_by_sw_if_index[sw_if_index]];
+ send_vxlan_tunnel_details(t, q);
+ }
+}
+