X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fipsec%2Fipsec_if.c;fp=src%2Fvnet%2Fipsec%2Fipsec_if.c;h=8d0eef21ae008d48d801d1c9854e13c493df4db0;hb=d6c9e82fa3f7caf01502b7f877bb3c7a1d9aaa34;hp=f7cd95873db400cf845a92c4c6b85a41e4273c1b;hpb=a11bf45b1aba14246cc1259fff1dfb8e9c60581f;p=vpp.git diff --git a/src/vnet/ipsec/ipsec_if.c b/src/vnet/ipsec/ipsec_if.c index f7cd95873db..8d0eef21ae0 100644 --- a/src/vnet/ipsec/ipsec_if.c +++ b/src/vnet/ipsec/ipsec_if.c @@ -230,6 +230,21 @@ ipsec_tun_mk_output_sa_id (u32 ti) return (0xc0000000 | ti); } +static void +ipsec_tunnel_feature_set (ipsec_tunnel_if_t * t, u8 enable) +{ + vnet_feature_enable_disable ("ip4-output", + "esp4-encrypt-tun", + t->sw_if_index, enable, + &t->output_sa_index, + sizeof (t->output_sa_index)); + vnet_feature_enable_disable ("ip6-output", + "esp6-encrypt-tun", + t->sw_if_index, enable, + &t->output_sa_index, + sizeof (t->output_sa_index)); +} + int ipsec_add_del_tunnel_if_internal (vnet_main_t * vnm, ipsec_add_del_tunnel_args_t * args, @@ -362,16 +377,7 @@ ipsec_add_del_tunnel_if_internal (vnet_main_t * vnm, ~0); im->ipsec_if_by_sw_if_index[t->sw_if_index] = dev_instance; - vnet_feature_enable_disable ("ip4-output", - "esp4-encrypt-tun", - t->sw_if_index, 1, - &t->output_sa_index, - sizeof (t->output_sa_index)); - vnet_feature_enable_disable ("ip6-output", - "esp6-encrypt-tun", - t->sw_if_index, 1, - &t->output_sa_index, - sizeof (t->output_sa_index)); + ipsec_tunnel_feature_set (t, 1); /*1st interface, register protocol */ if (pool_elts (im->tunnel_interfaces) == 1) @@ -396,16 +402,7 @@ ipsec_add_del_tunnel_if_internal (vnet_main_t * vnm, hi = vnet_get_hw_interface (vnm, t->hw_if_index); vnet_sw_interface_set_flags (vnm, hi->sw_if_index, 0); /* admin down */ - vnet_feature_enable_disable ("ip4-output", - "esp4-encrypt-tun", - hi->sw_if_index, 0, - &t->output_sa_index, - sizeof (t->output_sa_index)); - vnet_feature_enable_disable ("ip6-output", - "esp6-encrypt-tun", - hi->sw_if_index, 0, - &t->output_sa_index, - sizeof (t->output_sa_index)); + ipsec_tunnel_feature_set (t, 0); vnet_delete_hw_interface (vnm, t->hw_if_index); if (is_ip6) @@ -649,7 +646,13 @@ ipsec_set_interface_sa (vnet_main_t * vnm, u32 hw_if_index, u32 sa_id, return VNET_API_ERROR_INVALID_VALUE; } + /* + * re-enable the feature to get the new SA in + * the workers are stopped so no packets are sent in the clear + */ + ipsec_tunnel_feature_set (t, 0); t->output_sa_index = sa_index; + ipsec_tunnel_feature_set (t, 1); } /* remove sa_id to sa_index mapping on old SA */ @@ -661,7 +664,7 @@ ipsec_set_interface_sa (vnet_main_t * vnm, u32 hw_if_index, u32 sa_id, clib_warning ("IPsec backend add/del callback returned error"); return VNET_API_ERROR_SYSCALL_ERROR_1; } - pool_put (im->sad, old_sa); + ipsec_sa_del (old_sa->id); return 0; }