vether(4) is pretty dummy. Nothing denies it to be `IFXF_MPSAFE'.

Index: sys/net/if_vether.c
===================================================================
RCS file: /cvs/src/sys/net/if_vether.c,v
retrieving revision 1.33
diff -u -p -r1.33 if_vether.c
--- sys/net/if_vether.c 28 Jul 2020 09:52:32 -0000      1.33
+++ sys/net/if_vether.c 9 Aug 2020 00:13:17 -0000
@@ -36,7 +36,7 @@
 
 void   vetherattach(int);
 int    vetherioctl(struct ifnet *, u_long, caddr_t);
-void   vetherstart(struct ifnet *);
+void   vetherqstart(struct ifqueue *);
 int    vether_clone_create(struct if_clone *, int);
 int    vether_clone_destroy(struct ifnet *);
 int    vether_media_change(struct ifnet *);
@@ -83,12 +83,12 @@ vether_clone_create(struct if_clone *ifc
 
        ifp->if_softc = sc;
        ifp->if_ioctl = vetherioctl;
-       ifp->if_start = vetherstart;
+       ifp->if_qstart = vetherqstart;
        ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN);
 
        ifp->if_hardmtu = ETHER_MAX_HARDMTU_LEN;
        ifp->if_capabilities = IFCAP_VLAN_MTU;
-       ifp->if_xflags = IFXF_CLONED;
+       ifp->if_xflags = IFXF_CLONED | IFXF_MPSAFE;
 
        ifmedia_init(&sc->sc_media, 0, vether_media_change,
            vether_media_status);
@@ -117,15 +117,12 @@ vether_clone_destroy(struct ifnet *ifp)
  * and we only need to discard the packets.
  */
 void
-vetherstart(struct ifnet *ifp)
+vetherqstart(struct ifqueue *ifq)
 {
+       struct ifnet            *ifp = ifq->ifq_if;
        struct mbuf             *m;
 
-       for (;;) {
-               m = ifq_dequeue(&ifp->if_snd);
-               if (m == NULL)
-                       return;
-
+       while ((m = ifq_dequeue(ifq)) != NULL) {
 #if NBPFILTER > 0
                if (ifp->if_bpf)
                        bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);

Reply via email to