i think trunk(4) is the only thing left in the kernel that modifies an
interfaces if_type at runtime. this diff removes that fiddling, so
hopefully we can say that if_type is immutable after this.

however, while this diff reads well to me, i don't actually know if it
works. could someone kick the tyres for me?

cheers,
dlg

Index: if_trunk.c
===================================================================
RCS file: /cvs/src/sys/net/if_trunk.c,v
retrieving revision 1.140
diff -u -p -r1.140 if_trunk.c
--- if_trunk.c  11 May 2019 18:10:45 -0000      1.140
+++ if_trunk.c  11 Jun 2019 06:31:29 -0000
@@ -330,10 +330,7 @@ trunk_port_create(struct trunk_softc *tr
                }
        }
 
-       /* Change the interface type */
-       tp->tp_iftype = ifp->if_type;
-       ifp->if_type = IFT_IEEE8023ADLAG;
-
+       /* Change the interface methods */
        tp->tp_ioctl = ifp->if_ioctl;
        ifp->if_ioctl = trunk_port_ioctl;
 
@@ -422,9 +419,7 @@ trunk_port_destroy(struct trunk_port *tp
        if (tr->tr_port_destroy != NULL)
                (*tr->tr_port_destroy)(tp);
 
-       /* Restore interface type. */
-       ifp->if_type = tp->tp_iftype;
-
+       /* Restore interface methods. */
        ifp->if_ioctl = tp->tp_ioctl;
        ifp->if_output = tp->tp_output;
 
@@ -474,8 +469,7 @@ trunk_port_ioctl(struct ifnet *ifp, u_lo
        int error = 0;
 
        /* Should be checked by the caller */
-       if (ifp->if_type != IFT_IEEE8023ADLAG ||
-           (tp = trunk_port_get(NULL, ifp)) == NULL ||
+       if ((tp = trunk_port_get(NULL, ifp)) == NULL ||
            (tr = (struct trunk_softc *)tp->tp_trunk) == NULL) {
                error = EINVAL;
                goto fallback;
@@ -521,8 +515,7 @@ trunk_port_output(struct ifnet *ifp, str
     struct rtentry *rt)
 {
        /* restrict transmission on trunk members to bpf only */
-       if (ifp->if_type == IFT_IEEE8023ADLAG &&
-           (m_tag_find(m, PACKET_TAG_DLT, NULL) == NULL)) {
+       if ((m_tag_find(m, PACKET_TAG_DLT, NULL) == NULL)) {
                m_freem(m);
                return (EBUSY);
        }
@@ -1123,10 +1116,6 @@ trunk_input(struct ifnet *ifp, struct mb
        eh = mtod(m, struct ether_header *);
        if (ETHER_IS_MULTICAST(eh->ether_dhost))
                ifp->if_imcasts++;
-
-       /* Should be checked by the caller */
-       if (ifp->if_type != IFT_IEEE8023ADLAG)
-               goto bad;
 
        tp = (struct trunk_port *)cookie;
        if ((tr = (struct trunk_softc *)tp->tp_trunk) == NULL)

Reply via email to