gre: Tunnel encap/decap flags
[vpp.git] / src / vnet / gre / gre_api.c
index 0d6c33b..934fc66 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <vnet/gre/gre.h>
 #include <vnet/fib/fib_table.h>
+#include <vnet/tunnel/tunnel_types_api.h>
 #include <vnet/ip/ip_types_api.h>
 
 #include <vnet/vnet_msg_enum.h>
@@ -52,19 +53,14 @@ _(GRE_TUNNEL_DUMP, gre_tunnel_dump)
 static int
 gre_tunnel_type_decode (vl_api_gre_tunnel_type_t in, gre_tunnel_type_t * out)
 {
-  in = clib_net_to_host_u32 (in);
-
   switch (in)
     {
-    case GRE_API_TUNNEL_TYPE_L3:
-      *out = GRE_TUNNEL_TYPE_L3;
-      return (0);
-    case GRE_API_TUNNEL_TYPE_TEB:
-      *out = GRE_TUNNEL_TYPE_TEB;
-      return (0);
-    case GRE_API_TUNNEL_TYPE_ERSPAN:
-      *out = GRE_TUNNEL_TYPE_ERSPAN;
-      return (0);
+#define _(n, v)                                           \
+      case GRE_API_TUNNEL_TYPE_##n:                       \
+        *out = GRE_TUNNEL_TYPE_##n;                       \
+        return (0);
+      foreach_gre_tunnel_type
+#undef _
     }
 
   return (VNET_API_ERROR_INVALID_VALUE);
@@ -77,19 +73,14 @@ gre_tunnel_type_encode (gre_tunnel_type_t in)
 
   switch (in)
     {
-    case GRE_TUNNEL_TYPE_L3:
-      out = GRE_API_TUNNEL_TYPE_L3;
-      break;
-    case GRE_TUNNEL_TYPE_TEB:
-      out = GRE_API_TUNNEL_TYPE_TEB;
-      break;
-    case GRE_TUNNEL_TYPE_ERSPAN:
-      out = GRE_API_TUNNEL_TYPE_ERSPAN;
-      break;
+#define _(n, v)                                           \
+      case GRE_TUNNEL_TYPE_##n:                           \
+        out = GRE_API_TUNNEL_TYPE_##n;                    \
+        break;
+      foreach_gre_tunnel_type
+#undef _
     }
 
-  out = clib_net_to_host_u32 (out);
-
   return (out);
 }
 
@@ -98,6 +89,7 @@ static void vl_api_gre_tunnel_add_del_t_handler
 {
   vnet_gre_tunnel_add_del_args_t _a = { }, *a = &_a;
   vl_api_gre_tunnel_add_del_reply_t *rmp;
+  tunnel_encap_decap_flags_t flags;
   u32 sw_if_index = ~0;
   ip46_type_t itype[2];
   int rv = 0;
@@ -119,6 +111,16 @@ static void vl_api_gre_tunnel_add_del_t_handler
 
   rv = gre_tunnel_type_decode (mp->tunnel.type, &a->type);
 
+  if (rv)
+    goto out;
+
+  rv = tunnel_mode_decode (mp->tunnel.mode, &a->mode);
+
+  if (rv)
+    goto out;
+
+  rv = tunnel_encap_decap_flags_decode (mp->tunnel.flags, &flags);
+
   if (rv)
     goto out;
 
@@ -126,7 +128,8 @@ static void vl_api_gre_tunnel_add_del_t_handler
   a->is_ipv6 = (itype[0] == IP46_TYPE_IP6);
   a->instance = ntohl (mp->tunnel.instance);
   a->session_id = ntohs (mp->tunnel.session_id);
-  a->outer_fib_id = ntohl (mp->tunnel.outer_fib_id);
+  a->outer_table_id = ntohl (mp->tunnel.outer_table_id);
+  a->flags = flags;
 
   rv = vnet_gre_tunnel_add_del (a, &sw_if_index);
 
@@ -151,14 +154,16 @@ static void send_gre_tunnel_details
   ip_address_encode (&t->tunnel_src, IP46_TYPE_ANY, &rmp->tunnel.src);
   ip_address_encode (&t->tunnel_dst.fp_addr, IP46_TYPE_ANY, &rmp->tunnel.dst);
 
-  rmp->tunnel.outer_fib_id =
+  rmp->tunnel.outer_table_id =
     htonl (fib_table_get_table_id
           (t->outer_fib_index, t->tunnel_dst.fp_proto));
 
   rmp->tunnel.type = gre_tunnel_type_encode (t->type);
+  rmp->tunnel.mode = tunnel_mode_encode (t->mode);
   rmp->tunnel.instance = htonl (t->user_instance);
   rmp->tunnel.sw_if_index = htonl (t->sw_if_index);
   rmp->tunnel.session_id = htons (t->session_id);
+
   rmp->context = context;
 
   vl_api_send_msg (reg, (u8 *) rmp);
@@ -221,7 +226,7 @@ setup_message_id_table (api_main_t * am)
 static clib_error_t *
 gre_api_hookup (vlib_main_t * vm)
 {
-  api_main_t *am = &api_main;
+  api_main_t *am = vlibapi_get_main ();
 
 #define _(N,n)                                                  \
     vl_msg_api_set_handlers(VL_API_##N, #n,                     \