wireguard: move adjacency processing from wireguard_peer to wireguard_interface
[vpp.git] / src / plugins / wireguard / wireguard_api.c
old mode 100755 (executable)
new mode 100644 (file)
index e107cb5..3f17f65
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2020 Cisco and/or its affiliates.
  * Copyright (c) 2020 Doc.ai and/or its affiliates.
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -39,9 +40,11 @@ static void
   wg_main_t *wmp = &wg_main;
   u8 private_key[NOISE_PUBLIC_KEY_LEN];
   ip_address_t src;
-  u32 sw_if_index;
+  u32 sw_if_index = ~0;
   int rv = 0;
 
+  wg_feature_init (wmp);
+
   ip_address_decode2 (&mp->interface.src_ip, &src);
 
   if (AF_IP6 == ip_addr_version (&src))
@@ -74,6 +77,8 @@ static void
   wg_main_t *wmp = &wg_main;
   int rv = 0;
 
+  wg_feature_init (wmp);
+
   VALIDATE_SW_IF_INDEX (mp);
 
   rv = wg_if_delete (ntohl (mp->sw_if_index));
@@ -89,6 +94,7 @@ typedef struct wg_deatils_walk_t_
 {
   vl_api_registration_t *reg;
   u32 context;
+  u8 show_private_key;
 } wg_deatils_walk_t;
 
 static walk_rc_t
@@ -97,15 +103,20 @@ wireguard_if_send_details (index_t wgii, void *data)
   vl_api_wireguard_interface_details_t *rmp;
   wg_deatils_walk_t *ctx = data;
   const wg_if_t *wgi;
+  const noise_local_t *local;
 
   wgi = wg_if_get (wgii);
+  local = noise_local_get (wgi->local_idx);
 
   rmp = vl_msg_api_alloc_zero (sizeof (*rmp));
   rmp->_vl_msg_id = htons (VL_API_WIREGUARD_INTERFACE_DETAILS +
                           wg_main.msg_id_base);
 
-  clib_memcpy (rmp->interface.private_key,
-              wgi->local.l_private, NOISE_PUBLIC_KEY_LEN);
+  if (ctx->show_private_key)
+    clib_memcpy (rmp->interface.private_key,
+                local->l_private, NOISE_PUBLIC_KEY_LEN);
+  clib_memcpy (rmp->interface.public_key,
+              local->l_public, NOISE_PUBLIC_KEY_LEN);
   rmp->interface.sw_if_index = htonl (wgi->sw_if_index);
   rmp->interface.port = htons (wgi->port);
   ip_address_encode2 (&wgi->src_ip, &rmp->interface.src_ip);
@@ -122,6 +133,9 @@ vl_api_wireguard_interface_dump_t_handler (vl_api_wireguard_interface_dump_t *
                                           mp)
 {
   vl_api_registration_t *reg;
+  wg_main_t *wmp = &wg_main;
+
+  wg_feature_init (wmp);
 
   reg = vl_api_client_index_to_registration (mp->client_index);
   if (reg == 0)
@@ -130,6 +144,7 @@ vl_api_wireguard_interface_dump_t_handler (vl_api_wireguard_interface_dump_t *
   wg_deatils_walk_t ctx = {
     .reg = reg,
     .context = mp->context,
+    .show_private_key = mp->show_private_key,
   };
 
   wg_if_walk (wireguard_if_send_details, &ctx);
@@ -140,7 +155,7 @@ vl_api_wireguard_peer_add_t_handler (vl_api_wireguard_peer_add_t * mp)
 {
   vl_api_wireguard_peer_add_reply_t *rmp;
   wg_main_t *wmp = &wg_main;
-  index_t peeri;
+  index_t peeri = INDEX_INVALID;
   int ii, rv = 0;
 
   ip_address_t endpoint;
@@ -154,6 +169,8 @@ vl_api_wireguard_peer_add_t_handler (vl_api_wireguard_peer_add_t * mp)
       goto done;
     }
 
+  wg_feature_init (wmp);
+
   vec_validate (allowed_ips, mp->peer.n_allowed_ips - 1);
   ip_address_decode2 (&mp->peer.endpoint, &endpoint);
 
@@ -192,6 +209,8 @@ vl_api_wireguard_peer_remove_t_handler (vl_api_wireguard_peer_remove_t * mp)
   wg_main_t *wmp = &wg_main;
   int rv = 0;
 
+  wg_feature_init (wmp);
+
   rv = wg_peer_remove (ntohl (mp->peer_index));
 
   /* *INDENT-OFF* */
@@ -230,8 +249,7 @@ send_wg_peers_details (index_t peeri, void *data)
 
   int ii;
   for (ii = 0; ii < n_allowed_ips; ii++)
-    ip_prefix_encode (&peer->allowed_ips[ii].prefix,
-                     &rmp->peer.allowed_ips[ii]);
+    ip_prefix_encode (&peer->allowed_ips[ii], &rmp->peer.allowed_ips[ii]);
 
   rmp->context = ctx->context;
 
@@ -244,6 +262,9 @@ static void
 vl_api_wireguard_peers_dump_t_handler (vl_api_wireguard_peers_dump_t * mp)
 {
   vl_api_registration_t *reg;
+  wg_main_t *wmp = &wg_main;
+
+  wg_feature_init (wmp);
 
   reg = vl_api_client_index_to_registration (mp->client_index);
   if (reg == NULL)