On 2016/06/07 21:49, Vincent Gross wrote:
> 
> It's how henning@ set things up when integrating the new queuing mechanism.
> http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/sys/kern/uipc_mbuf.c#rev1.160
> 
> > Is there any use for this apart for vlan(4) interfaces?
> 
> AFAICT, no. 

My understanding is that it is also meant to be used for interface
output queues. So you could use this to prioritize ARP over IP
traffic if you wanted. (Well..you could anyway, but you don't
have as many options - many switches map the priorities 0-7
onto 4 queues so there is only lower-priority than the default
'prio=3').

> > Should it
> > really be part of "struct ifnet" ?
> > 
> 
> sthen@ pointed out that struct if_data was heavily used by our ports, and
> that such a change would require a version bump. Now, I may have overlooked
> a better place for it.

I think it could go at the end of struct if_data without causing
trouble, though since it doesn't need to be exported to userland
isn't it better directly in ifnet rather than if_data? (if_data
is included in RTM_IFINFO's if_msghdr, whereas you need an ioctl
to see the non-if_data parts of struct ifnet from userland).

> I don't think we should make a special case for vlan(4), this kind of detail
> do not belong to the arp(4) or bpf(4) layer.

btw, since this is a perfect fit for the vlan priority for pppoe
control packets that I was looking at recently, here's a diff
to use it there.

Index: if_sppp.h
===================================================================
RCS file: /cvs/src/sys/net/if_sppp.h,v
retrieving revision 1.24
diff -u -p -r1.24 if_sppp.h
--- if_sppp.h   30 May 2016 23:30:11 -0000      1.24
+++ if_sppp.h   7 Jun 2016 20:53:28 -0000
@@ -56,7 +56,6 @@ enum ppp_phase {
 
 #define AUTHMAXLEN     256     /* including terminating '\0' */
 #define AUTHCHALEN     16      /* length of the challenge we send */
-#define SPPP_CTL_PRIO  7       /* priority to use for control packets */
 
 /*
  * Definitions to pass struct sppp data down into the kernel using the
Index: if_spppsubr.c
===================================================================
RCS file: /cvs/src/sys/net/if_spppsubr.c,v
retrieving revision 1.153
diff -u -p -r1.153 if_spppsubr.c
--- if_spppsubr.c       30 May 2016 23:30:10 -0000      1.153
+++ if_spppsubr.c       7 Jun 2016 20:53:28 -0000
@@ -914,7 +914,7 @@ sppp_cp_send(struct sppp *sp, u_short pr
                return;
        m->m_pkthdr.len = m->m_len = PKTHDRLEN + LCP_HEADER_LEN + len;
        m->m_pkthdr.ph_ifidx = 0;
-       m->m_pkthdr.pf.prio = SPPP_CTL_PRIO;
+       m->m_pkthdr.pf.prio = sp->pp_if.if_llprio;
 
        *mtod(m, u_int16_t *) = htons(proto);
        lh = (struct lcp_header *)(mtod(m, u_int8_t *) + 2);
@@ -3992,7 +3992,7 @@ sppp_auth_send(const struct cp *cp, stru
        if (! m)
                return;
        m->m_pkthdr.ph_ifidx = 0;
-       m->m_pkthdr.pf.prio = SPPP_CTL_PRIO;
+       m->m_pkthdr.pf.prio = sp->pp_if.if_llprio;
 
        *mtod(m, u_int16_t *) = htons(cp->proto);
        lh = (struct lcp_header *)(mtod(m, u_int8_t *) + 2);

Index: if_pppoe.c
===================================================================
RCS file: /cvs/src/sys/net/if_pppoe.c,v
retrieving revision 1.56
diff -u -p -r1.56 if_pppoe.c
--- if_pppoe.c  30 May 2016 23:30:11 -0000      1.56
+++ if_pppoe.c  7 Jun 2016 20:53:28 -0000
@@ -163,7 +163,7 @@ static void pppoe_timeout(void *);
 /* sending actual protocol control packets */
 static int pppoe_send_padi(struct pppoe_softc *);
 static int pppoe_send_padr(struct pppoe_softc *);
-static int pppoe_send_padt(unsigned int, u_int, const u_int8_t *);
+static int pppoe_send_padt(unsigned int, u_int, const u_int8_t *, u_int8_t);
 
 /* raw output */
 static int pppoe_output(struct pppoe_softc *, struct mbuf *);
@@ -696,7 +696,7 @@ pppoe_data_input(struct mbuf *m)
 #ifdef PPPOE_TERM_UNKNOWN_SESSIONS
                printf("pppoe (data): input for unknown session 0x%x, sending 
PADT\n",
                    session);
-               pppoe_send_padt(m->m_pkthdr.ph_ifidx, session, shost);
+               pppoe_send_padt(m->m_pkthdr.ph_ifidx, session, shost, 0);
 #endif
                goto drop;
        }
@@ -1011,7 +1011,7 @@ pppoe_send_padi(struct pppoe_softc *sc)
        m0 = pppoe_get_mbuf(len + PPPOE_HEADERLEN);     /* header len + payload 
len */
        if (m0 == NULL)
                return (ENOBUFS);
-       m0->m_pkthdr.pf.prio = SPPP_CTL_PRIO;
+       m0->m_pkthdr.pf.prio = sc->sc_sppp.pp_if.if_llprio;
 
        /* fill in pkt */
        p = mtod(m0, u_int8_t *);
@@ -1170,7 +1170,8 @@ pppoe_disconnect(struct pppoe_softc *sc)
                PPPOEDEBUG(("%s: disconnecting\n",
                    sc->sc_sppp.pp_if.if_xname));
                err = pppoe_send_padt(sc->sc_eth_ifidx,
-                   sc->sc_session, (const u_int8_t *)&sc->sc_dest);
+                   sc->sc_session, (const u_int8_t *)&sc->sc_dest,
+                   sc->sc_sppp.pp_if.if_llprio);
        }
 
        /* cleanup softc */
@@ -1238,7 +1239,7 @@ pppoe_send_padr(struct pppoe_softc *sc)
        m0 = pppoe_get_mbuf(len + PPPOE_HEADERLEN);
        if (m0 == NULL)
                return (ENOBUFS);
-       m0->m_pkthdr.pf.prio = SPPP_CTL_PRIO;
+       m0->m_pkthdr.pf.prio = sc->sc_sppp.pp_if.if_llprio;
 
        p = mtod(m0, u_int8_t *);
        PPPOE_ADD_HEADER(p, PPPOE_CODE_PADR, 0, len);
@@ -1285,7 +1286,7 @@ pppoe_send_padr(struct pppoe_softc *sc)
 
 /* Send a PADT packet. */
 static int
-pppoe_send_padt(unsigned int ifidx, u_int session, const u_int8_t *dest)
+pppoe_send_padt(unsigned int ifidx, u_int session, const u_int8_t *dest, 
u_int8_t prio)
 {
        struct ether_header *eh;
        struct sockaddr dst;
@@ -1302,7 +1303,7 @@ pppoe_send_padt(unsigned int ifidx, u_in
                if_put(eth_if);
                return (ENOBUFS);
        }
-       m0->m_pkthdr.pf.prio = SPPP_CTL_PRIO;
+       m0->m_pkthdr.pf.prio = prio;
 
        p = mtod(m0, u_int8_t *);
        PPPOE_ADD_HEADER(p, PPPOE_CODE_PADT, session, 0);

Reply via email to