The branch main has been updated by jhibbits:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=87e728340b1d57f10e4d439d168226d9ffffed40

commit 87e728340b1d57f10e4d439d168226d9ffffed40
Author:     Justin Hibbits <jhibb...@freebsd.org>
AuthorDate: 2023-01-13 16:22:11 +0000
Commit:     Justin Hibbits <jhibb...@freebsd.org>
CommitDate: 2023-02-03 14:38:03 +0000

    Mechanically convert wg(4) to IfAPI
    
    Reviewed By:    jhb
    Sponsored by:   Juniper Networks, Inc.
    Differential Revision: https://reviews.freebsd.org/D38307
---
 sys/dev/wg/if_wg.c | 109 +++++++++++++++++++++++++++--------------------------
 1 file changed, 55 insertions(+), 54 deletions(-)

diff --git a/sys/dev/wg/if_wg.c b/sys/dev/wg/if_wg.c
index f6c8c2d52278..6a99061cac54 100644
--- a/sys/dev/wg/if_wg.c
+++ b/sys/dev/wg/if_wg.c
@@ -67,7 +67,7 @@
 #define NEW_HANDSHAKE_TIMEOUT  (REKEY_TIMEOUT + KEEPALIVE_TIMEOUT)
 #define UNDERLOAD_TIMEOUT      1
 
-#define DPRINTF(sc, ...) if (sc->sc_ifp->if_flags & IFF_DEBUG) 
if_printf(sc->sc_ifp, ##__VA_ARGS__)
+#define DPRINTF(sc, ...) if (if_getflags(sc->sc_ifp) & IFF_DEBUG) 
if_printf(sc->sc_ifp, ##__VA_ARGS__)
 
 /* First byte indicating packet type on the wire */
 #define WG_PKT_INITIATION htole32(1)
@@ -219,7 +219,7 @@ struct wg_socket {
 
 struct wg_softc {
        LIST_ENTRY(wg_softc)     sc_entry;
-       struct ifnet            *sc_ifp;
+       if_t                     sc_ifp;
        int                      sc_flags;
 
        struct ucred            *sc_ucred;
@@ -358,22 +358,22 @@ static struct wg_packet *wg_queue_dequeue_parallel(struct 
wg_queue *);
 static bool wg_input(struct mbuf *, int, struct inpcb *, const struct sockaddr 
*, void *);
 static void wg_peer_send_staged(struct wg_peer *);
 static int wg_clone_create(struct if_clone *ifc, char *name, size_t len,
-       struct ifc_data *ifd, struct ifnet **ifpp);
-static void wg_qflush(struct ifnet *);
+       struct ifc_data *ifd, if_t *ifpp);
+static void wg_qflush(if_t);
 static inline int determine_af_and_pullup(struct mbuf **m, sa_family_t *af);
-static int wg_xmit(struct ifnet *, struct mbuf *, sa_family_t, uint32_t);
-static int wg_transmit(struct ifnet *, struct mbuf *);
-static int wg_output(struct ifnet *, struct mbuf *, const struct sockaddr *, 
struct route *);
-static int wg_clone_destroy(struct if_clone *ifc, struct ifnet *ifp,
+static int wg_xmit(if_t, struct mbuf *, sa_family_t, uint32_t);
+static int wg_transmit(if_t, struct mbuf *);
+static int wg_output(if_t, struct mbuf *, const struct sockaddr *, struct 
route *);
+static int wg_clone_destroy(struct if_clone *ifc, if_t ifp,
        uint32_t flags);
 static bool wgc_privileged(struct wg_softc *);
 static int wgc_get(struct wg_softc *, struct wg_data_io *);
 static int wgc_set(struct wg_softc *, struct wg_data_io *);
 static int wg_up(struct wg_softc *);
 static void wg_down(struct wg_softc *);
-static void wg_reassign(struct ifnet *, struct vnet *, char *unused);
+static void wg_reassign(if_t, struct vnet *, char *unused);
 static void wg_init(void *);
-static int wg_ioctl(struct ifnet *, u_long, caddr_t);
+static int wg_ioctl(if_t, u_long, caddr_t);
 static void vnet_wg_init(const void *);
 static void vnet_wg_uninit(const void *);
 static int wg_module_init(void);
@@ -1308,7 +1308,7 @@ wg_handshake(struct wg_softc *sc, struct wg_packet *pkt)
                res = cookie_checker_validate_macs(&sc->sc_cookie, &init->m,
                                init, sizeof(*init) - sizeof(init->m),
                                underload, &e->e_remote.r_sa,
-                               sc->sc_ifp->if_vnet);
+                               if_getvnet(sc->sc_ifp));
 
                if (res == EINVAL) {
                        DPRINTF(sc, "Invalid initiation MAC\n");
@@ -1342,7 +1342,7 @@ wg_handshake(struct wg_softc *sc, struct wg_packet *pkt)
                res = cookie_checker_validate_macs(&sc->sc_cookie, &resp->m,
                                resp, sizeof(*resp) - sizeof(resp->m),
                                underload, &e->e_remote.r_sa,
-                               sc->sc_ifp->if_vnet);
+                               if_getvnet(sc->sc_ifp));
 
                if (res == EINVAL) {
                        DPRINTF(sc, "Invalid response MAC\n");
@@ -1677,7 +1677,7 @@ static void
 wg_deliver_in(struct wg_peer *peer)
 {
        struct wg_softc         *sc = peer->p_sc;
-       struct ifnet            *ifp = sc->sc_ifp;
+       if_t                     ifp = sc->sc_ifp;
        struct wg_packet        *pkt;
        struct mbuf             *m;
        struct epoch_tracker     et;
@@ -1714,8 +1714,8 @@ wg_deliver_in(struct wg_peer *peer)
                NET_EPOCH_ENTER(et);
                BPF_MTAP2_AF(ifp, m, pkt->p_af);
 
-               CURVNET_SET(ifp->if_vnet);
-               M_SETFIB(m, ifp->if_fib);
+               CURVNET_SET(if_getvnet(ifp));
+               M_SETFIB(m, if_getfib(ifp));
                if (pkt->p_af == AF_INET)
                        netisr_dispatch(NETISR_IP, m);
                if (pkt->p_af == AF_INET6)
@@ -2050,7 +2050,7 @@ error:
 }
 
 static inline void
-xmit_err(struct ifnet *ifp, struct mbuf *m, struct wg_packet *pkt, sa_family_t 
af)
+xmit_err(if_t ifp, struct mbuf *m, struct wg_packet *pkt, sa_family_t af)
 {
        if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
        switch (af) {
@@ -2078,16 +2078,16 @@ xmit_err(struct ifnet *ifp, struct mbuf *m, struct 
wg_packet *pkt, sa_family_t a
 }
 
 static int
-wg_xmit(struct ifnet *ifp, struct mbuf *m, sa_family_t af, uint32_t mtu)
+wg_xmit(if_t ifp, struct mbuf *m, sa_family_t af, uint32_t mtu)
 {
        struct wg_packet        *pkt = NULL;
-       struct wg_softc         *sc = ifp->if_softc;
+       struct wg_softc         *sc = if_getsoftc(ifp);
        struct wg_peer          *peer;
        int                      rc = 0;
        sa_family_t              peer_af;
 
        /* Work around lifetime issue in the ipv6 mld code. */
-       if (__predict_false((ifp->if_flags & IFF_DYING) || !sc)) {
+       if (__predict_false((if_getflags(ifp) & IFF_DYING) || !sc)) {
                rc = ENXIO;
                goto err_xmit;
        }
@@ -2164,7 +2164,7 @@ determine_af_and_pullup(struct mbuf **m, sa_family_t *af)
 }
 
 static int
-wg_transmit(struct ifnet *ifp, struct mbuf *m)
+wg_transmit(if_t ifp, struct mbuf *m)
 {
        sa_family_t af;
        int ret;
@@ -2184,11 +2184,11 @@ wg_transmit(struct ifnet *ifp, struct mbuf *m)
                xmit_err(ifp, m, NULL, AF_UNSPEC);
                return (ret);
        }
-       return (wg_xmit(ifp, m, af, ifp->if_mtu));
+       return (wg_xmit(ifp, m, af, if_getmtu(ifp)));
 }
 
 static int
-wg_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst, 
struct route *ro)
+wg_output(if_t ifp, struct mbuf *m, const struct sockaddr *dst, struct route 
*ro)
 {
        sa_family_t parsed_af;
        uint32_t af, mtu;
@@ -2222,7 +2222,7 @@ wg_output(struct ifnet *ifp, struct mbuf *m, const struct 
sockaddr *dst, struct
                xmit_err(ifp, m, NULL, AF_UNSPEC);
                return (EAFNOSUPPORT);
        }
-       mtu = (ro != NULL && ro->ro_mtu > 0) ? ro->ro_mtu : ifp->if_mtu;
+       mtu = (ro != NULL && ro->ro_mtu > 0) ? ro->ro_mtu : if_getmtu(ifp);
        return (wg_xmit(ifp, m, parsed_af, mtu));
 }
 
@@ -2332,7 +2332,7 @@ wg_peer_add(struct wg_softc *sc, const nvlist_t *nvl)
                        goto out;
                TAILQ_INSERT_TAIL(&sc->sc_peers, peer, p_entry);
                sc->sc_peers_num++;
-               if (sc->sc_ifp->if_link_state == LINK_STATE_UP)
+               if (if_getlinkstate(sc->sc_ifp) == LINK_STATE_UP)
                        wg_timers_enable(peer);
        }
        if (remote != NULL)
@@ -2350,7 +2350,7 @@ static int
 wgc_set(struct wg_softc *sc, struct wg_data_io *wgd)
 {
        uint8_t public[WG_KEY_SIZE], private[WG_KEY_SIZE];
-       struct ifnet *ifp;
+       if_t ifp;
        void *nvlpacked;
        nvlist_t *nvl;
        ssize_t size;
@@ -2386,7 +2386,7 @@ wgc_set(struct wg_softc *sc, struct wg_data_io *wgd)
                        goto out_locked;
                }
                if (new_port != sc->sc_socket.so_port) {
-                       if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
+                       if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
                                if ((err = wg_socket_init(sc, new_port)) != 0)
                                        goto out_locked;
                        } else
@@ -2584,7 +2584,7 @@ err:
 }
 
 static int
-wg_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
+wg_ioctl(if_t ifp, u_long cmd, caddr_t data)
 {
        struct wg_data_io *wgd = (struct wg_data_io *)data;
        struct ifreq *ifr = (struct ifreq *)data;
@@ -2592,7 +2592,7 @@ wg_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
        int ret = 0;
 
        sx_slock(&wg_sx);
-       sc = ifp->if_softc;
+       sc = if_getsoftc(ifp);
        if (!sc) {
                ret = ENXIO;
                goto out;
@@ -2615,7 +2615,7 @@ wg_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
                 */
                break;
        case SIOCSIFFLAGS:
-               if (ifp->if_flags & IFF_UP)
+               if (if_getflags(ifp) & IFF_UP)
                        ret = wg_up(sc);
                else
                        wg_down(sc);
@@ -2624,7 +2624,7 @@ wg_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
                if (ifr->ifr_mtu <= 0 || ifr->ifr_mtu > MAX_MTU)
                        ret = EINVAL;
                else
-                       ifp->if_mtu = ifr->ifr_mtu;
+                       if_setmtu(ifp, ifr->ifr_mtu);
                break;
        case SIOCADDMULTI:
        case SIOCDELMULTI:
@@ -2655,7 +2655,7 @@ out:
 static int
 wg_up(struct wg_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
+       if_t ifp = sc->sc_ifp;
        struct wg_peer *peer;
        int rc = EBUSY;
 
@@ -2666,9 +2666,9 @@ wg_up(struct wg_softc *sc)
 
        /* Silent success if we're already running. */
        rc = 0;
-       if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+       if (if_getdrvflags(ifp) & IFF_DRV_RUNNING)
                goto out;
-       ifp->if_drv_flags |= IFF_DRV_RUNNING;
+       if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0);
 
        rc = wg_socket_init(sc, sc->sc_socket.so_port);
        if (rc == 0) {
@@ -2676,7 +2676,7 @@ wg_up(struct wg_softc *sc)
                        wg_timers_enable(peer);
                if_link_state_change(sc->sc_ifp, LINK_STATE_UP);
        } else {
-               ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+               if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
                DPRINTF(sc, "Unable to initialize sockets: %d\n", rc);
        }
 out:
@@ -2687,15 +2687,15 @@ out:
 static void
 wg_down(struct wg_softc *sc)
 {
-       struct ifnet *ifp = sc->sc_ifp;
+       if_t ifp = sc->sc_ifp;
        struct wg_peer *peer;
 
        sx_xlock(&sc->sc_lock);
-       if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+       if (!(if_getdrvflags(ifp) & IFF_DRV_RUNNING)) {
                sx_xunlock(&sc->sc_lock);
                return;
        }
-       ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+       if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
 
        TAILQ_FOREACH(peer, &sc->sc_peers, p_entry) {
                wg_queue_purge(&peer->p_stage_queue);
@@ -2720,7 +2720,7 @@ wg_clone_create(struct if_clone *ifc, char *name, size_t 
len,
     struct ifc_data *ifd, struct ifnet **ifpp)
 {
        struct wg_softc *sc;
-       struct ifnet *ifp;
+       if_t ifp;
 
        sc = malloc(sizeof(*sc), M_WG, M_WAITOK | M_ZERO);
 
@@ -2769,18 +2769,19 @@ wg_clone_create(struct if_clone *ifc, char *name, 
size_t len,
 
        sx_init(&sc->sc_lock, "wg softc lock");
 
-       ifp->if_softc = sc;
-       ifp->if_capabilities = ifp->if_capenable = WG_CAPS;
+       if_setsoftc(ifp, sc);
+       if_setcapabilities(ifp, WG_CAPS);
+       if_setcapenable(ifp, WG_CAPS);
        if_initname(ifp, wgname, ifd->unit);
 
        if_setmtu(ifp, DEFAULT_MTU);
-       ifp->if_flags = IFF_NOARP | IFF_MULTICAST;
-       ifp->if_init = wg_init;
-       ifp->if_reassign = wg_reassign;
-       ifp->if_qflush = wg_qflush;
-       ifp->if_transmit = wg_transmit;
-       ifp->if_output = wg_output;
-       ifp->if_ioctl = wg_ioctl;
+       if_setflags(ifp, IFF_NOARP | IFF_MULTICAST);
+       if_setinitfn(ifp, wg_init);
+       if_setreassignfn(ifp, wg_reassign);
+       if_setqflushfn(ifp, wg_qflush);
+       if_settransmitfn(ifp, wg_transmit);
+       if_setoutputfn(ifp, wg_output);
+       if_setioctlfn(ifp, wg_ioctl);
        if_attach(ifp);
        bpfattach(ifp, DLT_NULL, sizeof(uint32_t));
 #ifdef INET6
@@ -2813,13 +2814,13 @@ wg_clone_deferred_free(struct noise_local *l)
 }
 
 static int
-wg_clone_destroy(struct if_clone *ifc, struct ifnet *ifp, uint32_t flags)
+wg_clone_destroy(struct if_clone *ifc, if_t ifp, uint32_t flags)
 {
-       struct wg_softc *sc = ifp->if_softc;
+       struct wg_softc *sc = if_getsoftc(ifp);
        struct ucred *cred;
 
        sx_xlock(&wg_sx);
-       ifp->if_softc = NULL;
+       if_setsoftc(ifp, NULL);
        sx_xlock(&sc->sc_lock);
        sc->sc_flags |= WGF_DYING;
        cred = sc->sc_ucred;
@@ -2829,7 +2830,7 @@ wg_clone_destroy(struct if_clone *ifc, struct ifnet *ifp, 
uint32_t flags)
        sx_xunlock(&wg_sx);
 
        if_link_state_change(sc->sc_ifp, LINK_STATE_DOWN);
-       CURVNET_SET(sc->sc_ifp->if_vnet);
+       CURVNET_SET(if_getvnet(sc->sc_ifp));
        if_purgeaddrs(sc->sc_ifp);
        CURVNET_RESTORE();
 
@@ -2878,7 +2879,7 @@ wg_clone_destroy(struct if_clone *ifc, struct ifnet *ifp, 
uint32_t flags)
 }
 
 static void
-wg_qflush(struct ifnet *ifp __unused)
+wg_qflush(if_t ifp __unused)
 {
 }
 
@@ -2896,12 +2897,12 @@ wgc_privileged(struct wg_softc *sc)
 }
 
 static void
-wg_reassign(struct ifnet *ifp, struct vnet *new_vnet __unused,
+wg_reassign(if_t ifp, struct vnet *new_vnet __unused,
     char *unused __unused)
 {
        struct wg_softc *sc;
 
-       sc = ifp->if_softc;
+       sc = if_getsoftc(ifp);
        wg_down(sc);
 }
 

Reply via email to