making tun(4) not IFT_TUNNEL and tap(4) not IFT_ETHER makes for some interesting possibilities for fun with the rest of the kernel. I think we should just not allow the if_types to be changed.
I have another diff somewhere to prevent changing the flags (IFF_BROADCAST etc) somewhere too, but we can start here. ok? Index: if_tun.c =================================================================== RCS file: /cvs/src/sys/net/if_tun.c,v retrieving revision 1.186 diff -u -p -r1.186 if_tun.c --- if_tun.c 12 May 2019 16:38:02 -0000 1.186 +++ if_tun.c 10 Jun 2019 06:13:22 -0000 @@ -623,8 +623,9 @@ tun_dev_ioctl(struct tun_softc *tp, u_lo tunp = (struct tuninfo *)data; if (tunp->mtu < ETHERMIN || tunp->mtu > TUNMRU) return (EINVAL); + if (tunp->type != tp->tun_if.if_type) + return (EINVAL); tp->tun_if.if_mtu = tunp->mtu; - tp->tun_if.if_type = tunp->type; tp->tun_if.if_flags = (tunp->flags & TUN_IFF_FLAGS) | (tp->tun_if.if_flags & ~TUN_IFF_FLAGS);