Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/net Split up wg_process_peer_tasks into bite-size functi...



details:   https://anonhg.NetBSD.org/src/rev/dfd16ed8d963
branches:  trunk
changeset: 1013081:dfd16ed8d963
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Thu Aug 20 21:34:23 2020 +0000

description:
Split up wg_process_peer_tasks into bite-size functions.

diffstat:

 sys/net/if_wg.c |  155 ++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 90 insertions(+), 65 deletions(-)

diffs (183 lines):

diff -r 9d159c305d1d -r dfd16ed8d963 sys/net/if_wg.c
--- a/sys/net/if_wg.c   Thu Aug 20 21:34:13 2020 +0000
+++ b/sys/net/if_wg.c   Thu Aug 20 21:34:23 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_wg.c,v 1.10 2020/08/20 21:34:13 riastradh Exp $     */
+/*     $NetBSD: if_wg.c,v 1.11 2020/08/20 21:34:23 riastradh Exp $     */
 
 /*
  * Copyright (C) Ryota Ozaki <ozaki.ryota%gmail.com@localhost>
@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_wg.c,v 1.10 2020/08/20 21:34:13 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_wg.c,v 1.11 2020/08/20 21:34:23 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -2633,6 +2633,86 @@
 }
 
 static void
+wg_task_send_init_message(struct wg_softc *wg, struct wg_peer *wgp)
+{
+       struct psref psref;
+       struct wg_session *wgs;
+
+       WG_TRACE("WGP_TASK_SEND_INIT_MESSAGE");
+
+       if (!wgp->wgp_endpoint_available) {
+               WGLOG(LOG_DEBUG, "No endpoint available\n");
+               /* XXX should do something? */
+               return;
+       }
+
+       wgs = wg_get_stable_session(wgp, &psref);
+       if (wgs->wgs_state == WGS_STATE_UNKNOWN) {
+               wg_put_session(wgs, &psref);
+               wg_send_handshake_msg_init(wg, wgp);
+       } else {
+               wg_put_session(wgs, &psref);
+               /* rekey */
+               wgs = wg_get_unstable_session(wgp, &psref);
+               if (wgs->wgs_state != WGS_STATE_INIT_ACTIVE)
+                       wg_send_handshake_msg_init(wg, wgp);
+               wg_put_session(wgs, &psref);
+       }
+}
+
+static void
+wg_task_endpoint_changed(struct wg_softc *wg, struct wg_peer *wgp)
+{
+
+       WG_TRACE("WGP_TASK_ENDPOINT_CHANGED");
+
+       mutex_enter(wgp->wgp_lock);
+       if (wgp->wgp_endpoint_changing) {
+               pserialize_perform(wgp->wgp_psz);
+               psref_target_destroy(&wgp->wgp_endpoint0->wgsa_psref,
+                   wg_psref_class);
+               psref_target_init(&wgp->wgp_endpoint0->wgsa_psref,
+                   wg_psref_class);
+               wgp->wgp_endpoint_changing = false;
+       }
+       mutex_exit(wgp->wgp_lock);
+}
+
+static void
+wg_task_send_keepalive_message(struct wg_softc *wg, struct wg_peer *wgp)
+{
+       struct psref psref;
+       struct wg_session *wgs;
+
+       WG_TRACE("WGP_TASK_SEND_KEEPALIVE_MESSAGE");
+
+       wgs = wg_get_stable_session(wgp, &psref);
+       wg_send_keepalive_msg(wgp, wgs);
+       wg_put_session(wgs, &psref);
+}
+
+static void
+wg_task_destroy_prev_session(struct wg_softc *wg, struct wg_peer *wgp)
+{
+       struct wg_session *wgs;
+
+       WG_TRACE("WGP_TASK_DESTROY_PREV_SESSION");
+
+       mutex_enter(wgp->wgp_lock);
+       wgs = wgp->wgp_session_unstable;
+       mutex_enter(wgs->wgs_lock);
+       if (wgs->wgs_state == WGS_STATE_DESTROYING) {
+               pserialize_perform(wgp->wgp_psz);
+               psref_target_destroy(&wgs->wgs_psref, wg_psref_class);
+               psref_target_init(&wgs->wgs_psref, wg_psref_class);
+               wg_clear_states(wgs);
+               wgs->wgs_state = WGS_STATE_UNKNOWN;
+       }
+       mutex_exit(wgs->wgs_lock);
+       mutex_exit(wgp->wgp_lock);
+}
+
+static void
 wg_process_peer_tasks(struct wg_softc *wg)
 {
        struct wg_peer *wgp;
@@ -2656,69 +2736,14 @@
 
                WG_DLOG("tasks=%x\n", tasks);
 
-               if (ISSET(tasks, WGP_TASK_SEND_INIT_MESSAGE)) {
-                       struct psref _psref;
-                       struct wg_session *wgs;
-
-                       WG_TRACE("WGP_TASK_SEND_INIT_MESSAGE");
-                       if (!wgp->wgp_endpoint_available) {
-                               WGLOG(LOG_DEBUG, "No endpoint available\n");
-                               /* XXX should do something? */
-                               goto skip_init_message;
-                       }
-                       wgs = wg_get_stable_session(wgp, &_psref);
-                       if (wgs->wgs_state == WGS_STATE_UNKNOWN) {
-                               wg_put_session(wgs, &_psref);
-                               wg_send_handshake_msg_init(wg, wgp);
-                       } else {
-                               wg_put_session(wgs, &_psref);
-                               /* rekey */
-                               wgs = wg_get_unstable_session(wgp, &_psref);
-                               if (wgs->wgs_state != WGS_STATE_INIT_ACTIVE)
-                                       wg_send_handshake_msg_init(wg, wgp);
-                               wg_put_session(wgs, &_psref);
-                       }
-               }
-       skip_init_message:
-               if (ISSET(tasks, WGP_TASK_ENDPOINT_CHANGED)) {
-                       WG_TRACE("WGP_TASK_ENDPOINT_CHANGED");
-                       mutex_enter(wgp->wgp_lock);
-                       if (wgp->wgp_endpoint_changing) {
-                               pserialize_perform(wgp->wgp_psz);
-                               psref_target_destroy(&wgp->wgp_endpoint0->wgsa_psref,
-                                   wg_psref_class);
-                               psref_target_init(&wgp->wgp_endpoint0->wgsa_psref,
-                                   wg_psref_class);
-                               wgp->wgp_endpoint_changing = false;
-                       }
-                       mutex_exit(wgp->wgp_lock);
-               }
-               if (ISSET(tasks, WGP_TASK_SEND_KEEPALIVE_MESSAGE)) {
-                       struct psref _psref;
-                       struct wg_session *wgs;
-
-                       WG_TRACE("WGP_TASK_SEND_KEEPALIVE_MESSAGE");
-                       wgs = wg_get_stable_session(wgp, &_psref);
-                       wg_send_keepalive_msg(wgp, wgs);
-                       wg_put_session(wgs, &_psref);
-               }
-               if (ISSET(tasks, WGP_TASK_DESTROY_PREV_SESSION)) {
-                       struct wg_session *wgs;
-
-                       WG_TRACE("WGP_TASK_DESTROY_PREV_SESSION");
-                       mutex_enter(wgp->wgp_lock);
-                       wgs = wgp->wgp_session_unstable;
-                       mutex_enter(wgs->wgs_lock);
-                       if (wgs->wgs_state == WGS_STATE_DESTROYING) {
-                               pserialize_perform(wgp->wgp_psz);
-                               psref_target_destroy(&wgs->wgs_psref, wg_psref_class);
-                               psref_target_init(&wgs->wgs_psref, wg_psref_class);
-                               wg_clear_states(wgs);
-                               wgs->wgs_state = WGS_STATE_UNKNOWN;
-                       }
-                       mutex_exit(wgs->wgs_lock);
-                       mutex_exit(wgp->wgp_lock);
-               }
+               if (ISSET(tasks, WGP_TASK_SEND_INIT_MESSAGE))
+                       wg_task_send_init_message(wg, wgp);
+               if (ISSET(tasks, WGP_TASK_ENDPOINT_CHANGED))
+                       wg_task_endpoint_changed(wg, wgp);
+               if (ISSET(tasks, WGP_TASK_SEND_KEEPALIVE_MESSAGE))
+                       wg_task_send_keepalive_message(wg, wgp);
+               if (ISSET(tasks, WGP_TASK_DESTROY_PREV_SESSION))
+                       wg_task_destroy_prev_session(wg, wgp);
 
                /* New tasks may be scheduled during processing tasks */
                WG_DLOG("wgp_tasks=%d\n", wgp->wgp_tasks);



Home | Main Index | Thread Index | Old Index