wireguard: initial implementation of wireguard protocol
[vpp.git] / src / plugins / wireguard / wireguard_index_table.c
1 /*
2  * Copyright (c) 2020 Doc.ai and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #include <vppinfra/hash.h>
17 #include <vppinfra/pool.h>
18 #include <vppinfra/random.h>
19 #include <wireguard/wireguard_index_table.h>
20
21 u32
22 wg_index_table_add (wg_index_table_t * table, u32 peer_pool_idx, u32 rnd_seed)
23 {
24   u32 key;
25
26   while (1)
27     {
28       key = random_u32 (&rnd_seed);
29       if (hash_get (table->hash, key))
30         continue;
31
32       hash_set (table->hash, key, peer_pool_idx);
33       break;
34     }
35   return key;
36 }
37
38 void
39 wg_index_table_del (wg_index_table_t * table, u32 key)
40 {
41   uword *p;
42   p = hash_get (table->hash, key);
43   if (p)
44     hash_unset (table->hash, key);
45 }
46
47 u32 *
48 wg_index_table_lookup (const wg_index_table_t * table, u32 key)
49 {
50   uword *p;
51
52   p = hash_get (table->hash, key);
53   return (u32 *) p;
54 }
55
56 /*
57  * fd.io coding-style-patch-verification: ON
58  *
59  * Local Variables:
60  * eval: (c-set-style "gnu")
61  * End:
62  */