Boris Kovalenko wrote: > > Hello! > > I want to implement 802.1p priority tagging for VLAN. I made this > dirty > patch and wonder - it works for me. May somebody look at it and tell me > is this enough for BSD community or should I look and patch something more?
Not a bad idea. :-) To make it perfect the packet priority should be settable from anywhere in the system (ipfw, dummynet, pf, etc.) through a mtag and then inserted into the ethernet frame header. And it should for for "untagged" frames too. You don't have to code that though. ;-) Please file this patch as PR and post the PR number so we don't forget about it. -- Andre > -- > With respect, > Boris > > > -------------------------------------------------------------------------------- > --- sbin/ifconfig/ifconfig.h.orig Wed Jan 19 10:44:20 2005 > +++ sbin/ifconfig/ifconfig.h Wed Jan 19 10:09:57 2005 > @@ -49,6 +49,7 @@ > > extern void setvlantag(const char *, int, int, const struct afswtch *rafp); > extern void setvlandev(const char *, int, int, const struct afswtch *rafp); > +extern void setvlanpri(const char *, int, int, const struct afswtch *rafp); > extern void unsetvlandev(const char *, int, int, const struct afswtch *rafp); > extern void vlan_status(int s, struct rt_addrinfo *); > > --- sbin/ifconfig/ifvlan.c.orig Thu Apr 18 23:14:09 2002 > +++ sbin/ifconfig/ifvlan.c Wed Jan 19 10:46:52 2005 > @@ -59,6 +59,7 @@ > "$FreeBSD: src/sbin/ifconfig/ifvlan.c,v 1.5 2002/04/18 17:14:09 imp Exp $"; > #endif > static int __tag = 0; > +static int __pri = 0; > static int __have_tag = 0; > > void > @@ -72,9 +73,9 @@ > if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1) > return; > > - printf("\tvlan: %d parent interface: %s\n", > - vreq.vlr_tag, vreq.vlr_parent[0] == '\0' ? > - "<none>" : vreq.vlr_parent); > + printf("\tvlan: %d parent interface: %s 802.1p: %d\n", > + EVL_VLANOFTAG(vreq.vlr_tag), vreq.vlr_parent[0] == '\0' ? > + "<none>" : vreq.vlr_parent, EVL_PRIOFTAG(vreq.vlr_tag)); > > return; > } > @@ -94,7 +95,29 @@ > if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1) > err(1, "SIOCGETVLAN"); > > - vreq.vlr_tag = tag; > + vreq.vlr_tag = EVL_MAKETAG(tag, __pri); > + > + if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1) > + err(1, "SIOCSETVLAN"); > + > + return; > +} > + > +void > +setvlanpri(const char *val, int d, int s, const struct afswtch *afp) > +{ > + u_int16_t pri; > + struct vlanreq vreq; > + > + __pri = pri = atoi(val); > + > + bzero((char *)&vreq, sizeof(struct vlanreq)); > + ifr.ifr_data = (caddr_t)&vreq; > + > + if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1) > + err(1, "SIOCGETVLAN"); > + > + vreq.vlr_tag = EVL_MAKETAG(EVL_VLANOFTAG(vreq.vlr_tag), pri); > > if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1) > err(1, "SIOCSETVLAN"); > @@ -117,7 +140,7 @@ > err(1, "SIOCGETVLAN"); > > strncpy(vreq.vlr_parent, val, sizeof(vreq.vlr_parent)); > - vreq.vlr_tag = __tag; > + vreq.vlr_tag = EVL_MAKETAG(__tag, __pri); > > if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1) > err(1, "SIOCSETVLAN"); > --- sys/net/if_vlan_var.h.orig Mon Jan 19 00:29:04 2004 > +++ sys/net/if_vlan_var.h Wed Jan 19 10:42:04 2005 > @@ -43,6 +43,7 @@ > #define EVL_VLID_MASK 0x0FFF > #define EVL_VLANOFTAG(tag) ((tag) & EVL_VLID_MASK) > #define EVL_PRIOFTAG(tag) (((tag) >> 13) & 7) > +#define EVL_MAKETAG(tag,pri) ((((pri) & 7) << 13) | ((tag) & EVL_VLID_MASK)) > > /* sysctl(3) tags, for compatibility purposes */ > #define VLANCTL_PROTO 1 > @@ -52,8 +53,8 @@ > * Configuration structure for SIOCSETVLAN and SIOCGETVLAN ioctls. > */ > struct vlanreq { > - char vlr_parent[IFNAMSIZ]; > - u_short vlr_tag; > + char vlr_parent[IFNAMSIZ]; > + u_int16_t vlr_tag; > }; > #define SIOCSETVLAN SIOCSIFGENERIC > #define SIOCGETVLAN SIOCGIFGENERIC > --- sys/net/if_vlan.c.orig Wed Jan 19 10:40:32 2005 > +++ sys/net/if_vlan.c Wed Jan 19 10:42:22 2005 > @@ -930,15 +930,6 @@ > error = ENOENT; > break; > } > - /* > - * Don't let the caller set up a VLAN tag with > - * anything except VLID bits. > - */ > - > - if (vlr.vlr_tag & ~EVL_VLID_MASK) { > - error = EINVAL; > - break; > - } > > VLAN_LOCK(); > error = vlan_config(ifv, p); > --- sbin/ifconfig/ifconfig.c.orig Wed Jan 19 10:56:44 2005 > +++ sbin/ifconfig/ifconfig.c Wed Jan 19 10:56:24 2005 > @@ -248,6 +248,7 @@ > #ifdef USE_VLANS > { "vlan", NEXTARG, setvlantag }, > { "vlandev", NEXTARG, setvlandev }, > + { "vlanpri", NEXTARG, setvlandev }, > { "-vlandev", NEXTARG, unsetvlandev }, > #endif > #if 0 > > > -------------------------------------------------------------------------------- > _______________________________________________ > freebsd-net@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-net > To unsubscribe, send any mail to "[EMAIL PROTECTED]" _______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "[EMAIL PROTECTED]"