bfd: fix bfd_key_id update 16/34116/2
authorAlexander Skorichenko <askorichenko@netgate.com>
Fri, 15 Oct 2021 16:04:44 +0000 (16:04 +0000)
committerMatthew Smith <mgsmith@netgate.com>
Tue, 19 Oct 2021 14:50:35 +0000 (14:50 +0000)
Type: fix

Currently, auth activation CLI command
"bfd upd session auth activate ... conf-key-id <cki> bfd-key-id <bki>"
allows to change both key-ids to new values at once.
But if only bfd-key-id should be corrected, e.g. as a result of mistyping,
we can't do that in a single operation, and have to deactivate auth first
and then reactivate it with a correctly entered pair of ids.

Currently, backend's bfd_auth_activate() function returns immediately,
with no action, if it finds that submitted conf-key-id matches the
current record. No check on bfd-key-id value is made.

With this fix, bfd_auth_activate() checks if session's bfd-key-id has to
be changed to a new value, and if so, it updates and logs appropriately.

Change-Id: I3b915a936cb1721707860bb503f70e7dd29e0ddd
Signed-off-by: Alexander Skorichenko <askorichenko@netgate.com>
src/vnet/bfd/bfd_main.c

index b2bdd6c..27616db 100644 (file)
@@ -2022,22 +2022,27 @@ bfd_auth_activate (bfd_session_t * bs, u32 conf_key_id,
   bfd_auth_key_t *key = pool_elt_at_index (bm->auth_keys, key_idx);
   if (is_delayed)
     {
-      if (bs->auth.next_key == key)
+      if (bs->auth.next_key == key && bs->auth.next_bfd_key_id == bfd_key_id)
        {
          /* already using this key, no changes required */
          return 0;
        }
-      bs->auth.next_key = key;
+      if (bs->auth.next_key != key)
+       {
+         ++key->use_count;
+         bs->auth.next_key = key;
+       }
       bs->auth.next_bfd_key_id = bfd_key_id;
       bs->auth.is_delayed = 1;
     }
   else
     {
-      if (bs->auth.curr_key == key)
+      if (bs->auth.curr_key == key && bs->auth.curr_bfd_key_id == bfd_key_id)
        {
          /* already using this key, no changes required */
          return 0;
        }
+      ++key->use_count;
       if (bs->auth.curr_key)
        {
          --bs->auth.curr_key->use_count;
@@ -2046,7 +2051,6 @@ bfd_auth_activate (bfd_session_t * bs, u32 conf_key_id,
       bs->auth.curr_bfd_key_id = bfd_key_id;
       bs->auth.is_delayed = 0;
     }
-  ++key->use_count;
   BFD_DBG ("\nSession auth modified: %U", format_bfd_session, bs);
   vlib_log_info (bm->log_class, "session auth modified: %U",
                 format_bfd_session_brief, bs);