git: 87e728340b1d - main - Mechanically convert wg(4) to IfAPI
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 03 Feb 2023 14:45:21 UTC
The branch main has been updated by jhibbits:
URL: https://cgit.FreeBSD.org/src/commit/?id=87e728340b1d57f10e4d439d168226d9ffffed40
commit 87e728340b1d57f10e4d439d168226d9ffffed40
Author: Justin Hibbits <jhibbits@FreeBSD.org>
AuthorDate: 2023-01-13 16:22:11 +0000
Commit: Justin Hibbits <jhibbits@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);
}