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 */
>  
> 

Reply via email to