diff options
author | Matt Dunwoodie <ncon@noconroy.net> | 2021-04-21 01:25:05 +1000 |
---|---|---|
committer | Matt Dunwoodie <ncon@noconroy.net> | 2021-04-21 03:44:11 +1000 |
commit | 5d509153a519081b69bd68cb9c9af3919173b9f0 (patch) | |
tree | 9fedbae49cbda37b05ec8ecc77d42494af4cc5e0 | |
parent | wg_noise: unify two state bools to an enum (diff) | |
download | wireguard-freebsd-5d509153a519081b69bd68cb9c9af3919173b9f0.tar.xz wireguard-freebsd-5d509153a519081b69bd68cb9c9af3919173b9f0.zip |
if_wg: minor code cleanup, improve readability
Nothing serious here, just use a goto in wg_deliver_{in,out} rather than
another if/else indentation. The code should have no functional change,
just improve readability.
Additionally, use a local `sc` variable rather than `peer->p_sc` in
spots.
Signed-off-by: Matt Dunwoodie <ncon@noconroy.net>
-rw-r--r-- | src/if_wg.c | 144 |
1 files changed, 75 insertions, 69 deletions
diff --git a/src/if_wg.c b/src/if_wg.c index 0714082..6ffcce1 100644 --- a/src/if_wg.c +++ b/src/if_wg.c @@ -448,10 +448,11 @@ wg_peer_free_deferred(struct noise_remote *r) static void wg_peer_destroy(struct wg_peer *peer) { - sx_assert(&peer->p_sc->sc_lock, SX_XLOCKED); + struct wg_softc *sc = peer->p_sc; + sx_assert(&sc->sc_lock, SX_XLOCKED); noise_remote_disable(peer->p_remote); - wg_aip_remove_all(peer->p_sc, peer); + wg_aip_remove_all(sc, peer); /* We disable all timers, so we can't call the following tasks. */ wg_timers_disable(peer); @@ -468,9 +469,9 @@ wg_peer_destroy(struct wg_peer *peer) wg_queue_deinit(&peer->p_stage_queue); /* Final cleanup */ - peer->p_sc->sc_peers_num--; - TAILQ_REMOVE(&peer->p_sc->sc_peers, peer, p_entry); - DPRINTF(peer->p_sc, "Peer %"PRIu64" destroyed\n", peer->p_id); + sc->sc_peers_num--; + TAILQ_REMOVE(&sc->sc_peers, peer, p_entry); + DPRINTF(sc, "Peer %"PRIu64" destroyed\n", peer->p_id); noise_remote_free(peer->p_remote, wg_peer_free_deferred); } @@ -1582,31 +1583,33 @@ wg_deliver_out(struct wg_peer *peer) wg_peer_get_endpoint(peer, &endpoint); while ((pkt = wg_queue_dequeue_serial(&peer->p_encrypt_serial)) != NULL) { - if (pkt->p_state == WG_PACKET_CRYPTED) { - m = pkt->p_mbuf; - pkt->p_mbuf = NULL; - - len = m->m_pkthdr.len; - - rc = wg_send(sc, &endpoint, m); - if (rc == 0) { - wg_timers_event_any_authenticated_packet_traversal(peer); - wg_timers_event_any_authenticated_packet_sent(peer); - if (len > (sizeof(struct wg_pkt_data)+NOISE_AUTHTAG_LEN)) - data_sent = true; - counter_u64_add(peer->p_tx_bytes, len); - } else if (rc == EADDRNOTAVAIL) { - wg_peer_clear_src(peer); - wg_peer_get_endpoint(peer, &endpoint); - goto error; - } else { - goto error; - } + if (pkt->p_state != WG_PACKET_CRYPTED) + goto error; + + m = pkt->p_mbuf; + pkt->p_mbuf = NULL; + + len = m->m_pkthdr.len; + + rc = wg_send(sc, &endpoint, m); + if (rc == 0) { + wg_timers_event_any_authenticated_packet_traversal(peer); + wg_timers_event_any_authenticated_packet_sent(peer); + if (len > (sizeof(struct wg_pkt_data)+NOISE_AUTHTAG_LEN)) + data_sent = true; + counter_u64_add(peer->p_tx_bytes, len); + } else if (rc == EADDRNOTAVAIL) { + wg_peer_clear_src(peer); + wg_peer_get_endpoint(peer, &endpoint); + goto error; } else { -error: - if_inc_counter(peer->p_sc->sc_ifp, IFCOUNTER_OERRORS, 1); + goto error; } wg_packet_free(pkt); + continue; +error: + if_inc_counter(sc->sc_ifp, IFCOUNTER_OERRORS, 1); + wg_packet_free(pkt); } if (data_sent) @@ -1626,49 +1629,52 @@ wg_deliver_in(struct wg_peer *peer) bool data_recv = false; while ((pkt = wg_queue_dequeue_serial(&peer->p_decrypt_serial)) != NULL) { - if (pkt->p_state == WG_PACKET_CRYPTED) { - m = pkt->p_mbuf; - if (noise_keypair_nonce_check(pkt->p_keypair, pkt->p_nonce) != 0) - goto error; + if (pkt->p_state != WG_PACKET_CRYPTED) + goto error; - if (noise_keypair_received_with(pkt->p_keypair) == ECONNRESET) - wg_timers_event_handshake_complete(peer); + m = pkt->p_mbuf; + if (noise_keypair_nonce_check(pkt->p_keypair, pkt->p_nonce) != 0) + goto error; - wg_timers_event_any_authenticated_packet_received(peer); - wg_timers_event_any_authenticated_packet_traversal(peer); - wg_peer_set_endpoint(peer, &pkt->p_endpoint); - - counter_u64_add(peer->p_rx_bytes, m->m_pkthdr.len + - sizeof(struct wg_pkt_data) + NOISE_AUTHTAG_LEN); - if_inc_counter(sc->sc_ifp, IFCOUNTER_IPACKETS, 1); - if_inc_counter(sc->sc_ifp, IFCOUNTER_IBYTES, m->m_pkthdr.len + - sizeof(struct wg_pkt_data) + NOISE_AUTHTAG_LEN); - - if (m->m_pkthdr.len == 0) - goto free; - - MPASS(pkt->p_af == AF_INET || pkt->p_af == AF_INET6); - pkt->p_mbuf = NULL; - data_recv = true; - - m->m_flags &= ~(M_MCAST | M_BCAST); - m->m_pkthdr.rcvif = ifp; - - af = pkt->p_af; - BPF_MTAP2(ifp, &af, sizeof(af), m); - - CURVNET_SET(ifp->if_vnet); - M_SETFIB(m, ifp->if_fib); - if (pkt->p_af == AF_INET) - netisr_dispatch(NETISR_IP, m); - if (pkt->p_af == AF_INET6) - netisr_dispatch(NETISR_IPV6, m); - CURVNET_RESTORE(); - } else { + if (noise_keypair_received_with(pkt->p_keypair) == ECONNRESET) + wg_timers_event_handshake_complete(peer); + + wg_timers_event_any_authenticated_packet_received(peer); + wg_timers_event_any_authenticated_packet_traversal(peer); + wg_peer_set_endpoint(peer, &pkt->p_endpoint); + + counter_u64_add(peer->p_rx_bytes, m->m_pkthdr.len + + sizeof(struct wg_pkt_data) + NOISE_AUTHTAG_LEN); + if_inc_counter(sc->sc_ifp, IFCOUNTER_IPACKETS, 1); + if_inc_counter(sc->sc_ifp, IFCOUNTER_IBYTES, m->m_pkthdr.len + + sizeof(struct wg_pkt_data) + NOISE_AUTHTAG_LEN); + + if (m->m_pkthdr.len == 0) + goto done; + + MPASS(pkt->p_af == AF_INET || pkt->p_af == AF_INET6); + pkt->p_mbuf = NULL; + data_recv = true; + + m->m_flags &= ~(M_MCAST | M_BCAST); + m->m_pkthdr.rcvif = ifp; + + af = pkt->p_af; + BPF_MTAP2(ifp, &af, sizeof(af), m); + + CURVNET_SET(ifp->if_vnet); + M_SETFIB(m, ifp->if_fib); + if (pkt->p_af == AF_INET) + netisr_dispatch(NETISR_IP, m); + if (pkt->p_af == AF_INET6) + netisr_dispatch(NETISR_IPV6, m); + CURVNET_RESTORE(); + +done: + wg_packet_free(pkt); + continue; error: - if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); - } -free: + if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); wg_packet_free(pkt); } @@ -1962,9 +1968,9 @@ wg_peer_send_staged(struct wg_peer *peer) STAILQ_FOREACH_SAFE(pkt, &list, p_parallel, tpkt) { pkt->p_keypair = noise_keypair_ref(keypair); if (wg_queue_both(&sc->sc_encrypt_parallel, &peer->p_encrypt_serial, pkt) != 0) - if_inc_counter(peer->p_sc->sc_ifp, IFCOUNTER_OQDROPS, 1); + if_inc_counter(sc->sc_ifp, IFCOUNTER_OQDROPS, 1); } - wg_encrypt_dispatch(peer->p_sc); + wg_encrypt_dispatch(sc); noise_keypair_put(keypair); return; |