X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fipsec%2Fipsec_sa.c;h=e8a015957cee595ee1065bae07c82a75d1ef4fc8;hb=72f2a3acb797797416a96dc10312ccd431126de7;hp=46c3b6d3821ca80b809de19236b22e00d8a15a22;hpb=be95444fbb31b875c2ab98cd330fdcb36027ced8;p=vpp.git diff --git a/src/vnet/ipsec/ipsec_sa.c b/src/vnet/ipsec/ipsec_sa.c index 46c3b6d3821..e8a015957ce 100644 --- a/src/vnet/ipsec/ipsec_sa.c +++ b/src/vnet/ipsec/ipsec_sa.c @@ -80,14 +80,14 @@ ipsec_sa_stack (ipsec_sa_t * sa) fib_entry_contribute_forwarding (sa->fib_entry_index, fct, &tmp); - dpo_stack_from_node ((ipsec_sa_is_set_IS_TUNNEL_V6 (sa) ? - im->ah6_encrypt_node_index : - im->ah4_encrypt_node_index), - &sa->dpo[IPSEC_PROTOCOL_AH], &tmp); - dpo_stack_from_node ((ipsec_sa_is_set_IS_TUNNEL_V6 (sa) ? - im->esp6_encrypt_node_index : - im->esp4_encrypt_node_index), - &sa->dpo[IPSEC_PROTOCOL_ESP], &tmp); + if (IPSEC_PROTOCOL_AH == sa->protocol) + dpo_stack_from_node ((ipsec_sa_is_set_IS_TUNNEL_V6 (sa) ? + im->ah6_encrypt_node_index : + im->ah4_encrypt_node_index), &sa->dpo, &tmp); + else + dpo_stack_from_node ((ipsec_sa_is_set_IS_TUNNEL_V6 (sa) ? + im->esp6_encrypt_node_index : + im->esp4_encrypt_node_index), &sa->dpo, &tmp); dpo_reset (&tmp); } @@ -171,13 +171,19 @@ ipsec_sa_add (u32 id, im->crypto_algs[crypto_alg].alg, (u8 *) ck->data, ck->len); if (~0 == sa->crypto_key_index) - return VNET_API_ERROR_INVALID_VALUE; + { + pool_put (im->sad, sa); + return VNET_API_ERROR_KEY_LENGTH; + } sa->integ_key_index = vnet_crypto_key_add (vm, im->integ_algs[integ_alg].alg, (u8 *) ik->data, ik->len); if (~0 == sa->integ_key_index) - return VNET_API_ERROR_INVALID_VALUE; + { + pool_put (im->sad, sa); + return VNET_API_ERROR_KEY_LENGTH; + } err = ipsec_check_support_cb (im, sa); if (err) @@ -299,8 +305,7 @@ ipsec_sa_del (u32 id) fib_table_entry_special_remove (sa->tx_fib_index, fib_entry_get_prefix (sa->fib_entry_index), FIB_SOURCE_RR); - dpo_reset (&sa->dpo[IPSEC_PROTOCOL_AH]); - dpo_reset (&sa->dpo[IPSEC_PROTOCOL_ESP]); + dpo_reset (&sa->dpo); } vnet_crypto_key_del (vm, sa->crypto_key_index); vnet_crypto_key_del (vm, sa->integ_key_index); @@ -335,52 +340,6 @@ ipsec_is_sa_used (u32 sa_index) return 0; } -int -ipsec_set_sa_key (u32 id, const ipsec_key_t * ck, const ipsec_key_t * ik) -{ - vlib_main_t *vm = vlib_get_main (); - ipsec_main_t *im = &ipsec_main; - uword *p; - u32 sa_index; - ipsec_sa_t *sa = 0; - clib_error_t *err; - - p = hash_get (im->sa_index_by_sa_id, id); - if (!p) - return VNET_API_ERROR_SYSCALL_ERROR_1; /* no such sa-id */ - - sa_index = p[0]; - sa = pool_elt_at_index (im->sad, sa_index); - - /* new crypto key */ - if (ck) - { - clib_memcpy (&sa->crypto_key, ck, sizeof (sa->crypto_key)); - vnet_crypto_key_modify (vm, sa->crypto_key_index, sa->crypto_calg, - (u8 *) ck->data, ck->len); - } - - /* new integ key */ - if (ik) - { - clib_memcpy (&sa->integ_key, 0, sizeof (sa->integ_key)); - vnet_crypto_key_modify (vm, sa->integ_key_index, sa->integ_calg, - (u8 *) ik->data, ik->len); - } - - if (ck || ik) - { - err = ipsec_call_add_del_callbacks (im, sa, sa_index, 0); - if (err) - { - clib_error_free (err); - return VNET_API_ERROR_SYSCALL_ERROR_1; - } - } - - return 0; -} - u32 ipsec_get_sa_index_by_sa_id (u32 sa_id) {