vppinfra: bihash add-but-do-not-overwrite semantics

If is_add=2, fail w/ return value -2 if the key exists instead of
overwriting the (key,value) pair.

Type: feature

Change-Id: I00a3c194a381c68090369c31d6c6f9870cfe0a62
Signed-off-by: Dave Barach <dave@barachs.net>
diff --git a/src/vppinfra/bihash_template.c b/src/vppinfra/bihash_template.c
index bf6be83..cd75a7a 100644
--- a/src/vppinfra/bihash_template.c
+++ b/src/vppinfra/bihash_template.c
@@ -519,6 +519,13 @@
 	{
 	  if (BV (clib_bihash_key_compare) (v->kvp[i].key, add_v->key))
 	    {
+	      /* Add but do not overwrite? */
+	      if (is_add == 2)
+		{
+		  BV (clib_bihash_unlock_bucket) (b);
+		  return (-2);
+		}
+
 	      CLIB_MEMORY_BARRIER ();	/* Add a delay */
 	      clib_memcpy_fast (&(v->kvp[i]), add_v, sizeof (*add_v));
 	      BV (clib_bihash_unlock_bucket) (b);