aboutsummaryrefslogtreecommitdiffstats
path: root/vnet/vnet/vxlan/vxlan.c
diff options
context:
space:
mode:
Diffstat (limited to 'vnet/vnet/vxlan/vxlan.c')
-rw-r--r--vnet/vnet/vxlan/vxlan.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/vnet/vnet/vxlan/vxlan.c b/vnet/vnet/vxlan/vxlan.c
index 89e56e7844f..4071714874b 100644
--- a/vnet/vnet/vxlan/vxlan.c
+++ b/vnet/vnet/vxlan/vxlan.c
@@ -218,7 +218,7 @@ int vnet_vxlan_add_del_tunnel
key6.src.as_u64[1] = a->dst.ip6.as_u64[1];
key6.vni = clib_host_to_net_u32 (a->vni << 8);
- p = hash_get (vxm->vxlan6_tunnel_by_key, pointer_to_uword(&key6));
+ p = hash_get_mem (vxm->vxlan6_tunnel_by_key, &key6);
}
if (a->is_add)
@@ -243,10 +243,16 @@ int vnet_vxlan_add_del_tunnel
else foreach_copy_ipv6
#undef _
- if (a->is_ip6) {
- /* copy the key */
- t->key6 = key6;
- }
+ /* copy the key */
+ if (a->is_ip6)
+ {
+ t->key6 = clib_mem_alloc (sizeof(vxlan6_tunnel_key_t));
+ clib_memcpy (t->key6, &key6, sizeof(key6));
+ }
+ else
+ {
+ t->key4 = 0; /* not yet used */
+ }
if (!a->is_ip6) t->flags |= VXLAN_TUNNEL_IS_IPV4;
@@ -265,7 +271,7 @@ int vnet_vxlan_add_del_tunnel
if (!a->is_ip6)
hash_set (vxm->vxlan4_tunnel_by_key, key4.as_u64, t - vxm->tunnels);
else
- hash_set (vxm->vxlan6_tunnel_by_key, pointer_to_uword(&t->key6), t - vxm->tunnels);
+ hash_set_mem (vxm->vxlan6_tunnel_by_key, t->key6, t - vxm->tunnels);
if (vec_len (vxm->free_vxlan_tunnel_hw_if_indices) > 0)
{
@@ -340,14 +346,21 @@ int vnet_vxlan_add_del_tunnel
if (!a->is_ip6)
hash_unset (vxm->vxlan4_tunnel_by_key, key4.as_u64);
else
- hash_unset (vxm->vxlan6_tunnel_by_key, pointer_to_uword(&key6));
+ hash_unset_mem (vxm->vxlan6_tunnel_by_key, t->key6);
vec_free (t->rewrite);
- if (!a->is_ip6) {
- t->rewrite = vxlan4_dummy_rewrite;
- } else {
- t->rewrite = vxlan6_dummy_rewrite;
- }
+ if (!a->is_ip6)
+ {
+ t->rewrite = vxlan4_dummy_rewrite;
+ t->key4 = 0;
+ }
+ else
+ {
+ t->rewrite = vxlan6_dummy_rewrite;
+ clib_mem_free (t->key6);
+ t->key6 = 0;
+ }
+
pool_put (vxm->tunnels, t);
}