misc: move to new pool_foreach macros
[vpp.git] / src / vnet / vxlan / vxlan.c
index c274cdb..bf205ad 100644 (file)
@@ -22,6 +22,7 @@
 #include <vnet/adj/rewrite.h>
 #include <vnet/interface.h>
 #include <vnet/flow/flow.h>
+#include <vnet/udp/udp_local.h>
 #include <vlib/vlib.h>
 
 /**
@@ -291,35 +292,6 @@ vxlan_decap_next_is_valid (vxlan_main_t * vxm, u32 is_ip6,
   return decap_next_index < r->n_next_nodes;
 }
 
-static uword
-vtep_addr_ref (ip46_address_t * ip)
-{
-  uword *vtep = ip46_address_is_ip4 (ip) ?
-    hash_get (vxlan_main.vtep4, ip->ip4.as_u32) :
-    hash_get_mem (vxlan_main.vtep6, &ip->ip6);
-  if (vtep)
-    return ++(*vtep);
-  ip46_address_is_ip4 (ip) ?
-    hash_set (vxlan_main.vtep4, ip->ip4.as_u32, 1) :
-    hash_set_mem_alloc (&vxlan_main.vtep6, &ip->ip6, 1);
-  return 1;
-}
-
-static uword
-vtep_addr_unref (ip46_address_t * ip)
-{
-  uword *vtep = ip46_address_is_ip4 (ip) ?
-    hash_get (vxlan_main.vtep4, ip->ip4.as_u32) :
-    hash_get_mem (vxlan_main.vtep6, &ip->ip6);
-  ASSERT (vtep);
-  if (--(*vtep) != 0)
-    return *vtep;
-  ip46_address_is_ip4 (ip) ?
-    hash_unset (vxlan_main.vtep4, ip->ip4.as_u32) :
-    hash_unset_mem_free (&vxlan_main.vtep6, &ip->ip6);
-  return 0;
-}
-
 /* *INDENT-OFF* */
 typedef CLIB_PACKED(union
 {
@@ -337,7 +309,7 @@ mcast_shared_get (ip46_address_t * ip)
 {
   ASSERT (ip46_address_is_multicast (ip));
   uword *p = hash_get_mem (vxlan_main.mcast_shared, ip);
-  ASSERT (p);
+  ALWAYS_ASSERT (p);
   mcast_shared_t ret = {.as_u64 = *p };
   return ret;
 }
@@ -513,7 +485,7 @@ int vnet_vxlan_add_del_tunnel
           * when the forwarding for the entry updates, and the tunnel can
           * re-stack accordingly
           */
-         vtep_addr_ref (&t->src);
+         vtep_addr_ref (&vxm->vtep_table, t->encap_fib_index, &t->src);
          t->fib_entry_index = fib_entry_track (t->encap_fib_index,
                                                &tun_dst_pfx,
                                                FIB_NODE_TYPE_VXLAN_TUNNEL,
@@ -530,7 +502,8 @@ int vnet_vxlan_add_del_tunnel
           */
          fib_protocol_t fp = fib_ip_proto (is_ip6);
 
-         if (vtep_addr_ref (&t->dst) == 1)
+         if (vtep_addr_ref (&vxm->vtep_table,
+                            t->encap_fib_index, &t->dst) == 1)
            {
              fib_node_index_t mfei;
              adj_index_t ai;
@@ -619,10 +592,11 @@ int vnet_vxlan_add_del_tunnel
          if (t->flow_index != ~0)
            vnet_flow_del (vnm, t->flow_index);
 
-         vtep_addr_unref (&t->src);
+         vtep_addr_unref (&vxm->vtep_table, t->encap_fib_index, &t->src);
          fib_entry_untrack (t->fib_entry_index, t->sibling_index);
        }
-      else if (vtep_addr_unref (&t->dst) == 0)
+      else if (vtep_addr_unref (&vxm->vtep_table,
+                               t->encap_fib_index, &t->dst) == 0)
        {
          mcast_shared_remove (&t->dst);
        }
@@ -888,10 +862,10 @@ show_vxlan_tunnel_command_fn (vlib_main_t * vm,
     vlib_cli_output (vm, "No vxlan tunnels configured...");
 
 /* *INDENT-OFF* */
-  pool_foreach (t, vxm->tunnels,
-  ({
+  pool_foreach (t, vxm->tunnels)
+   {
     vlib_cli_output (vm, "%U", format_vxlan_tunnel, t);
-  }));
+  }
 /* *INDENT-ON* */
 
   if (raw)
@@ -1117,7 +1091,7 @@ set_ip6_vxlan_bypass (vlib_main_t * vm,
 VLIB_CLI_COMMAND (set_interface_ip6_vxlan_bypass_command, static) = {
   .path = "set interface ip6 vxlan-bypass",
   .function = set_ip6_vxlan_bypass,
-  .short_help = "set interface ip vxlan-bypass <interface> [del]",
+  .short_help = "set interface ip6 vxlan-bypass <interface> [del]",
 };
 /* *INDENT-ON* */
 
@@ -1134,14 +1108,20 @@ vnet_vxlan_add_del_rx_flow (u32 hw_if_index, u32 t_index, int is_add)
          vxlan_main_t *vxm = &vxlan_main;
          vnet_flow_t flow = {
            .actions =
-             VNET_FLOW_ACTION_REDIRECT_TO_NODE | VNET_FLOW_ACTION_MARK,
+             VNET_FLOW_ACTION_REDIRECT_TO_NODE | VNET_FLOW_ACTION_MARK |
+             VNET_FLOW_ACTION_BUFFER_ADVANCE,
            .mark_flow_id = t->dev_instance + vxm->flow_id_start,
            .redirect_node_index = vxlan4_flow_input_node.index,
+           .buffer_advance = sizeof (ethernet_header_t),
            .type = VNET_FLOW_TYPE_IP4_VXLAN,
            .ip4_vxlan = {
-                         .src_addr = t->dst.ip4,
-                         .dst_addr = t->src.ip4,
-                         .dst_port = UDP_DST_PORT_vxlan,
+                         .protocol.prot = IP_PROTOCOL_UDP,
+                         .src_addr.addr = t->dst.ip4,
+                         .dst_addr.addr = t->src.ip4,
+                         .src_addr.mask.as_u32 = ~0,
+                         .dst_addr.mask.as_u32 = ~0,
+                         .dst_port.port = UDP_DST_PORT_vxlan,
+                         .dst_port.mask = 0xFF,
                          .vni = t->vni,
                          }
            ,
@@ -1259,7 +1239,7 @@ vxlan_init (vlib_main_t * vm)
                         VXLAN_HASH_NUM_BUCKETS, VXLAN_HASH_MEMORY_SIZE);
   clib_bihash_init_24_8 (&vxm->vxlan6_tunnel_by_key, "vxlan6",
                         VXLAN_HASH_NUM_BUCKETS, VXLAN_HASH_MEMORY_SIZE);
-  vxm->vtep6 = hash_create_mem (0, sizeof (ip6_address_t), sizeof (uword));
+  vxm->vtep_table = vtep_table_create ();
   vxm->mcast_shared = hash_create_mem (0,
                                       sizeof (ip46_address_t),
                                       sizeof (mcast_shared_t));