]> git.ipfire.org Git - thirdparty/wireguard-tools.git/commitdiff
wg-quick: freebsd: use ifconfig for determining if interface is up
authorJason A. Donenfeld <Jason@zx2c4.com>
Mon, 19 Apr 2021 02:40:02 +0000 (20:40 -0600)
committerJason A. Donenfeld <Jason@zx2c4.com>
Mon, 19 Apr 2021 02:40:02 +0000 (20:40 -0600)
We no longer need the arp hack, as these bugs have been fixed in the
FreeBSD kernel.

This partially reverts 090639ae90fb45ac05e3158e1e31e5bf15fd9559.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
src/wg-quick/freebsd.bash

index e00f1e1e78d36b858f8f97607632439783b8acbf..e731384248d29a2529bacb68181ebe059e36d859 100755 (executable)
@@ -152,20 +152,6 @@ del_routes() {
        done
 }
 
-if_exists() {
-       # HACK: The goal is simply to determine whether or not the interface exists. The
-       # straight-forward way of doing this would be `ifconfig $INTERFACE`, but this
-       # invokes the SIOCGIFSTATUS ioctl, which races with interface shutdown inside
-       # the tun driver, resulting in a kernel panic. So we work around it the stupid
-       # way by using the one utility that appears to call if_nametoindex fairly early
-       # and fails if it doesn't exist: `arp`.
-       if arp -i "$INTERFACE" -a -n >/dev/null 2>&1; then
-               return 0
-       else
-               return 1
-       fi
-}
-
 del_if() {
        [[ $HAVE_SET_DNS -eq 0 ]] || unset_dns
        if [[ -S /var/run/wireguard/$INTERFACE.sock ]]; then
@@ -173,7 +159,7 @@ del_if() {
        else
                cmd ifconfig "$INTERFACE" destroy
        fi
-       while if_exists; do
+       while ifconfig "$INTERFACE" >/dev/null 2>&1; do
                # HACK: it would be nice to `route monitor` here and wait for RTM_IFANNOUNCE
                # but it turns out that the announcement is made before the interface
                # disappears so we sometimes get a hang. So, we're instead left with polling
@@ -305,7 +291,7 @@ monitor_daemon() {
        # endpoints change.
        while read -r event; do
                [[ $event == RTM_* ]] || continue
-               if_exists || break
+               ifconfig "$INTERFACE" >/dev/null 2>&1 || break
                [[ $AUTO_ROUTE4 -eq 1 || $AUTO_ROUTE6 -eq 1 ]] && set_endpoint_direct_route
                # TODO: set the mtu as well, but only if up
        done < <(route -n monitor)) & disown