aarch64 CPU arch / ThunderX platform initial support
[vpp.git] / vpp / api / api.c
index a1e7f02..9f3da21 100644 (file)
@@ -52,7 +52,9 @@
 #include <vnet/mpls-gre/mpls.h>
 #include <vnet/dhcp/proxy.h>
 #include <vnet/dhcp/client.h>
+#if IPV6SR > 0
 #include <vnet/sr/sr.h>
+#endif
 #include <vnet/dhcpv6/proxy.h>
 #include <vlib/vlib.h>
 #include <vlib/unix/unix.h>
@@ -73,7 +75,9 @@
 #include <vnet/l2/l2_fib.h>
 
 #if DPDK > 0
+#if IPSEC > 0
 #include <vnet/ipsec/ipsec.h>
+#endif /* IPSEC */
 #include <vnet/devices/virtio/vhost-user.h>
 #endif
 
@@ -271,6 +275,7 @@ _(L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable)     \
 _(L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key)                         \
 _(SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump)                   \
 _(VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel)                           \
+_(VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump)                                 \
 _(L2_FIB_CLEAR_TABLE, l2_fib_clear_table)                               \
 _(L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter)                     \
 _(L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)         \
@@ -388,6 +393,15 @@ int vl_api_memclnt_delete_callback (u32 client_index)
 #define API_LINK_STATE_EVENT 1
 #define API_ADMIN_UP_DOWN_EVENT 2
 
+static int
+event_data_cmp (void * a1, void * a2)
+{
+  uword * e1 = a1;
+  uword * e2 = a2;
+
+  return (word) e1[0] - (word) e2[0];
+}
+
 static uword
 link_state_process (vlib_main_t * vm,
                     vlib_node_runtime_t * rt,
@@ -414,7 +428,7 @@ link_state_process (vlib_main_t * vm,
             (vm, &event_data, API_ADMIN_UP_DOWN_EVENT);
 
         /* Sort, so we can eliminate duplicates */
-        vec_sort (event_data, e1, e2, (word) e1[0] - (word) e2[0]);
+        vec_sort_with_function (event_data, event_data_cmp);
 
         prev_sw_if_index = ~0;
 
@@ -3266,6 +3280,9 @@ static void vl_api_set_arp_neighbor_limit_t_handler (vl_api_set_arp_neighbor_lim
 static void vl_api_sr_tunnel_add_del_t_handler
 (vl_api_sr_tunnel_add_del_t *mp)
 {
+#if IPV6SR == 0
+    clib_warning ("unimplemented");
+#else
     ip6_sr_add_del_tunnel_args_t _a, *a=&_a;
     int rv = 0;
     vl_api_sr_tunnel_add_del_reply_t * rmp;
@@ -3309,6 +3326,7 @@ static void vl_api_sr_tunnel_add_del_t_handler
 out:
 
     REPLY_MACRO(VL_API_SR_TUNNEL_ADD_DEL_REPLY);
+#endif
 }
 
 #define foreach_classify_add_del_table_field    \
@@ -4109,6 +4127,55 @@ out:
     }));
 }
 
+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);
+    }
+}
+
 static void 
 vl_api_l2_patch_add_del_t_handler (vl_api_l2_patch_add_del_t *mp)
 {
@@ -4450,6 +4517,10 @@ static void vl_api_input_acl_set_interface_t_handler
 static void vl_api_ipsec_spd_add_del_t_handler
 (vl_api_ipsec_spd_add_del_t * mp)
 {
+#if IPSEC == 0
+    clib_warning ("unimplemented");
+#else
+
     vlib_main_t *vm __attribute__((unused)) = vlib_get_main();
     vl_api_ipsec_spd_add_del_reply_t * rmp;
     int rv;
@@ -4461,6 +4532,7 @@ static void vl_api_ipsec_spd_add_del_t_handler
 #endif
 
     REPLY_MACRO(VL_API_IPSEC_SPD_ADD_DEL_REPLY);
+#endif
 }
 
 static void vl_api_ipsec_interface_add_del_spd_t_handler
@@ -4477,7 +4549,7 @@ static void vl_api_ipsec_interface_add_del_spd_t_handler
 
     VALIDATE_SW_IF_INDEX(mp);
 
-#if DPDK > 0 
+#if IPSEC > 0 
     rv = ipsec_set_interface_spd(vm, sw_if_index, spd_id, mp->is_add);
 #else
     rv = VNET_API_ERROR_UNIMPLEMENTED;
@@ -4495,7 +4567,7 @@ static void vl_api_ipsec_spd_add_del_entry_t_handler
     vl_api_ipsec_spd_add_del_entry_reply_t * rmp;
     int rv;
 
-#if DPDK > 0
+#if IPSEC > 0 
     ipsec_policy_t p;
 
     p.id = ntohl(mp->spd_id);
@@ -4545,7 +4617,7 @@ static void vl_api_ipsec_sad_add_del_entry_t_handler
     vlib_main_t *vm __attribute__((unused)) = vlib_get_main();
     vl_api_ipsec_sad_add_del_entry_reply_t * rmp;
     int rv;
-#if DPDK > 0
+#if IPSEC > 0
     ipsec_sa_t sa;
 
     sa.id = ntohl(mp->sad_id);
@@ -4771,7 +4843,7 @@ static void vl_api_ipsec_sa_set_key_t_handler
     vlib_main_t *vm __attribute__((unused)) = vlib_get_main();
     vl_api_ipsec_sa_set_key_reply_t *rmp;
     int rv;
-#if DPDK > 0
+#if IPSEC > 0
     ipsec_sa_t sa;
     sa.id = ntohl(mp->sa_id);
     sa.crypto_key_len = mp->crypto_key_length;