On Mon, Jun 06, 2016 at 23:52 +0200, Vincent Gross wrote: > On Mon, 6 Jun 2016 17:33:36 +0100 > Stuart Henderson <s...@spacehopper.org> wrote: > > > On 2016/06/06 16:15, Vincent Gross wrote: > > > When sending ARP requests, or when writing to a bpf handle (as when > > > sending DHCP Discover), we bypass pf(4) so we have no way to define > > > the priority (m->m_pkthdr.pf.prio) of the outgoing packets. > [...] > > > > > > This diff adds > > > 1) an if_llprio field to struct ifnet > > > > struct if_data.. this is used by enough ports that changing the abi > [...] > > > > > diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8 > > > > BTW. patch warns about offsets if you apply this to -current. > > > [...] > > > > Other than these points, it seems a useful thing to do, pppoe could > > use it too. > > > > I wonder what these broken ISP devices are that require the > > priority field in the vlan frame header to be 0 (aka "prio 1")... > > > > r2 below. I moved if_llprio from if_data to struct ifnet, and went from > u_char to u_int8_t. I also added a bound check in ifioctl(). > > Comments ? ok ? >
We have discussed this here with henning and benno and think that this diff should go in. OK mikeb > Index: sbin/ifconfig/ifconfig.8 > =================================================================== > RCS file: /cvs/src/sbin/ifconfig/ifconfig.8,v > retrieving revision 1.267 > diff -u -p -r1.267 ifconfig.8 > --- sbin/ifconfig/ifconfig.8 6 Apr 2016 10:07:14 -0000 1.267 > +++ sbin/ifconfig/ifconfig.8 6 Jun 2016 21:43:46 -0000 > @@ -327,6 +327,10 @@ Disable special processing at the link l > Change the link layer address (MAC address) of the interface. > This should be specified as six colon-separated hex values, or can > be chosen randomly. > +.It Cm llprio Ar prio > +Set the priority for link layer communications > +.Pf ( Xr arp 4 , > +.Xr bpf 4 ) . > .It Cm media Op Ar type > Set the media type of the interface to > .Ar type . > Index: sbin/ifconfig/ifconfig.c > =================================================================== > RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v > retrieving revision 1.322 > diff -u -p -r1.322 ifconfig.c > --- sbin/ifconfig/ifconfig.c 3 May 2016 17:52:33 -0000 1.322 > +++ sbin/ifconfig/ifconfig.c 6 Jun 2016 21:43:46 -0000 > @@ -135,6 +135,7 @@ char name[IFNAMSIZ]; > int flags, xflags, setaddr, setipdst, doalias; > u_long metric, mtu; > int rdomainid; > +int llprio; > int clearaddr, s; > int newaddr = 0; > int af = AF_INET; > @@ -157,6 +158,7 @@ void addaf(const char *, int); > void removeaf(const char *, int); > void setifbroadaddr(const char *, int); > void setifmtu(const char *, int); > +void setifllprio(const char *, int); > void setifnwid(const char *, int); > void setifbssid(const char *, int); > void setifnwkey(const char *, int); > @@ -521,6 +523,7 @@ const struct cmd { > { "instance", NEXTARG, A_MEDIAINST, setmediainst }, > { "inst", NEXTARG, A_MEDIAINST, setmediainst }, > { "lladdr", NEXTARG, 0, setiflladdr }, > + { "llprio", NEXTARG, 0, setifllprio }, > { NULL, /*src*/ 0, 0, setifaddr }, > { NULL, /*dst*/ 0, 0, setifdstaddr }, > { NULL, /*illegal*/0, 0, NULL }, > @@ -854,6 +857,11 @@ getinfo(struct ifreq *ifr, int create) > else > rdomainid = ifr->ifr_rdomainid; > #endif > + if (ioctl(s, SIOCGIFLLPRIO, (caddr_t)ifr) < 0) > + llprio = 0; > + else > + llprio = ifr->ifr_llprio; > + > return (0); > } > > @@ -1411,6 +1419,21 @@ setifmtu(const char *val, int d) > > /* ARGSUSED */ > void > +setifllprio(const char *val, int d) > +{ > + const char *errmsg = NULL; > + > + (void) strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); > + > + ifr.ifr_mtu = strtonum(val, 0, UCHAR_MAX, &errmsg); > + if (errmsg) > + errx(1, "mtu %s: %s", val, errmsg); > + if (ioctl(s, SIOCSIFLLPRIO, (caddr_t)&ifr) < 0) > + warn("SIOCSIFLLPRIO"); > +} > + > +/* ARGSUSED */ > +void > setifgroup(const char *group_name, int dummy) > { > struct ifgroupreq ifgr; > @@ -2894,6 +2917,7 @@ status(int link, struct sockaddr_dl *sdl > printf(" metric %lu", metric); > if (mtu) > printf(" mtu %lu", mtu); > + printf(" llprio %lu", llprio); > putchar('\n'); > #ifndef SMALL > if (showcapsflag) > Index: sys/net/bpf.c > =================================================================== > RCS file: /cvs/src/sys/net/bpf.c,v > retrieving revision 1.141 > diff -u -p -r1.141 bpf.c > --- sys/net/bpf.c 18 May 2016 03:46:03 -0000 1.141 > +++ sys/net/bpf.c 6 Jun 2016 21:43:48 -0000 > @@ -561,6 +561,7 @@ bpfwrite(dev_t dev, struct uio *uio, int > } > > m->m_pkthdr.ph_rtableid = ifp->if_rdomain; > + m->m_pkthdr.pf.prio = ifp->if_llprio; > > if (d->bd_hdrcmplt && dst.ss_family == AF_UNSPEC) > dst.ss_family = pseudo_AF_HDRCMPLT; > Index: sys/net/if.c > =================================================================== > RCS file: /cvs/src/sys/net/if.c,v > retrieving revision 1.433 > diff -u -p -r1.433 if.c > --- sys/net/if.c 18 May 2016 03:46:03 -0000 1.433 > +++ sys/net/if.c 6 Jun 2016 21:43:48 -0000 > @@ -536,6 +536,7 @@ if_attach_common(struct ifnet *ifp) > M_TEMP, M_WAITOK|M_ZERO); > ifp->if_linkstatetask = malloc(sizeof(*ifp->if_linkstatetask), > M_TEMP, M_WAITOK|M_ZERO); > + ifp->if_llprio = IFQ_DEFPRIO; > > SRPL_INIT(&ifp->if_inputs); > } > @@ -1986,6 +1987,18 @@ ifioctl(struct socket *so, u_long cmd, c > } > > ifnewlladdr(ifp); > + break; > + > + case SIOCGIFLLPRIO: > + ifr->ifr_llprio = ifp->if_llprio; > + break; > + > + case SIOCSIFLLPRIO: > + if ((error = suser(p, 0))) > + return (error); > + if (ifr->ifr_llprio > UCHAR_MAX) > + return (EINVAL); > + ifp->if_llprio = ifr->ifr_llprio; > break; > > default: > Index: sys/net/if.h > =================================================================== > RCS file: /cvs/src/sys/net/if.h,v > retrieving revision 1.176 > diff -u -p -r1.176 if.h > --- sys/net/if.h 2 Mar 2016 00:00:16 -0000 1.176 > +++ sys/net/if.h 6 Jun 2016 21:43:48 -0000 > @@ -378,6 +378,7 @@ struct ifreq { > #define ifr_ttl ifr_ifru.ifru_metric /* tunnel TTL > (overload) */ > #define ifr_data ifr_ifru.ifru_data /* for use by interface > */ > #define ifr_index ifr_ifru.ifru_index /* interface index */ > +#define ifr_llprio ifr_ifru.ifru_metric /* link layer priority */ > }; > > struct ifaliasreq { > Index: sys/net/if_var.h > =================================================================== > RCS file: /cvs/src/sys/net/if_var.h,v > retrieving revision 1.71 > diff -u -p -r1.71 if_var.h > --- sys/net/if_var.h 15 Apr 2016 05:05:21 -0000 1.71 > +++ sys/net/if_var.h 6 Jun 2016 21:43:48 -0000 > @@ -131,6 +131,7 @@ struct ifnet { /* and the > entries */ > char if_description[IFDESCRSIZE]; /* interface description */ > u_short if_rtlabelid; /* next route label */ > u_int8_t if_priority; > + u_int8_t if_llprio; /* link layer priority */ > struct timeout *if_slowtimo; /* watchdog timeout */ > struct task *if_watchdogtask; /* watchdog task */ > struct task *if_linkstatetask; /* task to do route updates */ > Index: sys/netinet/if_ether.c > =================================================================== > RCS file: /cvs/src/sys/netinet/if_ether.c,v > retrieving revision 1.213 > diff -u -p -r1.213 if_ether.c > --- sys/netinet/if_ether.c 6 Jun 2016 07:07:11 -0000 1.213 > +++ sys/netinet/if_ether.c 6 Jun 2016 21:43:48 -0000 > @@ -235,6 +235,7 @@ arprequest(struct ifnet *ifp, u_int32_t > m->m_len = sizeof(*ea); > m->m_pkthdr.len = sizeof(*ea); > m->m_pkthdr.ph_rtableid = ifp->if_rdomain; > + m->m_pkthdr.pf.prio = ifp->if_llprio; > MH_ALIGN(m, sizeof(*ea)); > ea = mtod(m, struct ether_arp *); > eh = (struct ether_header *)sa.sa_data; > @@ -832,6 +833,7 @@ revarprequest(struct ifnet *ifp) > return; > m->m_len = sizeof(*ea); > m->m_pkthdr.len = sizeof(*ea); > + m->m_pkthdr.pf.prio = ifp->if_llprio; > MH_ALIGN(m, sizeof(*ea)); > ea = mtod(m, struct ether_arp *); > eh = (struct ether_header *)sa.sa_data; > Index: sys/sys/sockio.h > =================================================================== > RCS file: /cvs/src/sys/sys/sockio.h,v > retrieving revision 1.64 > diff -u -p -r1.64 sockio.h > --- sys/sys/sockio.h 31 May 2016 22:35:02 -0000 1.64 > +++ sys/sys/sockio.h 6 Jun 2016 21:43:48 -0000 > @@ -202,6 +202,9 @@ > #define SIOCGIFPARENT _IOWR('i', 179, struct if_parent) /* get parent > if */ > #define SIOCDIFPARENT _IOW('i', 180, struct ifreq) /* del parent > if */ > > +#define SIOCSIFLLPRIO _IOW('i', 181, struct ifreq) /* set ifnet > llprio */ > +#define SIOCGIFLLPRIO _IOWR('i', 182, struct ifreq) /* get ifnet > llprio */ > + > #define SIOCSVH _IOWR('i', 245, struct ifreq) /* set carp > param */ > #define SIOCGVH _IOWR('i', 246, struct ifreq) /* get carp > param */ > >