[PATCH] 802.1p priority
Andre Oppermann
andre at freebsd.org
Thu Jan 20 12:32:10 PST 2005
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 at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
More information about the freebsd-net
mailing list