Hi,

the initial intention was to differentiate a trunk port from a regular Ethernet 
interface.

As long as an interface is a member of a trunk, it is not a fully featured 
Ethernet interface. The changed type prevented from using it elsewhere.

I‘m not so familiar with the current network stack anymore, so maybe there are 
other ways to do it these days, but you should test that a trunk port cannot be 
attached to a bridge or carp or anything like this.

You also forgot a comment that mentions the type as well.

Reyk

> Am 11.06.2019 um 08:33 schrieb David Gwynne <da...@gwynne.id.au>:
> 
> 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