[PATCH] 802.1p priority (fixed)
Boris Kovalenko
boris at ntmk.ru
Tue Jan 25 00:08:47 PST 2005
Hello!
Is this patch looks ok for You now? Or should I do something more?
--
With respect,
Boris
-------------- next part --------------
--- sbin/ifconfig/ifconfig.h.orig Wed Jan 19 10:44:20 2005
+++ sbin/ifconfig/ifconfig.h Fri Jan 21 09:11:22 2005
@@ -49,6 +49,8 @@
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 setvlancfi(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/ifconfig.c.orig Wed Jan 19 10:56:44 2005
+++ sbin/ifconfig/ifconfig.c Fri Jan 21 09:11:54 2005
@@ -247,6 +247,8 @@
#endif
#ifdef USE_VLANS
{ "vlan", NEXTARG, setvlantag },
+ { "vlanpri", NEXTARG, setvlanpri },
+ { "vlancfi", NEXTARG, setvlancfi },
{ "vlandev", NEXTARG, setvlandev },
{ "-vlandev", NEXTARG, unsetvlandev },
#endif
--- sbin/ifconfig/ifvlan.c.orig Thu Apr 18 23:14:09 2002
+++ sbin/ifconfig/ifvlan.c Tue Jan 25 13:05:11 2005
@@ -59,6 +59,8 @@
"$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 __cfi = 0;
static int __have_tag = 0;
void
@@ -72,9 +74,10 @@
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 802.1p: %d CFI: %d parent interface: %s \n",
+ EVL_VLANOFTAG(vreq.vlr_tag), EVL_PRIOFTAG(vreq.vlr_tag),
+ EVL_CFIOFTAG(vreq.vlr_tag),
+ vreq.vlr_parent[0] == '\0' ? "<none>" : vreq.vlr_parent );
return;
}
@@ -84,17 +87,79 @@
{
u_int16_t tag;
struct vlanreq vreq;
+ char *endptr;
- __tag = tag = atoi(val);
+ __tag = tag = (u_int16_t)strtoul(val, &endptr, 0);
+ if(*endptr != '\0')
+ errx(1, "VLID ID must be a number");
__have_tag = 1;
+ if(tag < 1 || tag > 4094)
+ errx(1, "VLAN ID should be in range 1..4094");
+
+ 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(tag, __pri, __cfi);
+
+ 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;
+ char *endptr;
+
+ __pri = pri = (u_int16_t)strtoul(val, &endptr, 0);
+ if(*endptr != '\0')
+ errx(1, "VLAN 802.1p must be a number");
+
+ if(pri > 7)
+ errx(1, "VLAN 802.1p shoud be in range 0..7");
+
+ 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, __cfi);
+
+ if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1)
+ err(1, "SIOCSETVLAN");
+
+ return;
+}
+
+void
+setvlancfi(const char *val, int d, int s, const struct afswtch *afp)
+{
+ u_int16_t cfi;
+ struct vlanreq vreq;
+ char *endptr;
+
+ __cfi = cfi = (u_int16_t)strtoul(val, &endptr, 0);
+ if(*endptr != '\0')
+ errx(1, "VLAN CFI must be a number");
+
+ if(cfi > 1)
+ errx(1, "VLAN CFI shoud be 0 or 1");
+
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 = tag;
+ vreq.vlr_tag = EVL_MAKETAG(EVL_VLANOFTAG(vreq.vlr_tag), __pri, cfi);
if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1)
err(1, "SIOCSETVLAN");
@@ -117,7 +182,7 @@
err(1, "SIOCGETVLAN");
strncpy(vreq.vlr_parent, val, sizeof(vreq.vlr_parent));
- vreq.vlr_tag = __tag;
+ vreq.vlr_tag = EVL_MAKETAG(__tag, __pri, __cfi);
if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1)
err(1, "SIOCSETVLAN");
--- sbin/ifconfig/ifconfig.8.orig Thu Sep 30 20:25:39 2004
+++ sbin/ifconfig/ifconfig.8 Fri Jan 21 09:39:24 2005
@@ -386,15 +386,35 @@
pseudo interface, set the VLAN tag value
to
.Ar vlan_tag .
-This value is a 16-bit number which is used to create an 802.1Q
+This value is a 12-bit number which is used to create an 802.1Q
VLAN header for packets sent from the
.Xr vlan 4
interface.
Note that
-.Cm vlan
+.Cm vlan, vlanpri, vlancfi
and
.Cm vlandev
-must both be set at the same time.
+must be set at the same time.
+.It Cm vlanpri Ar vlan_pri
+If the interface is a
+.Xr vlan 4
+pseudo interface, set the 802.1p priority value
+to
+.Ar vlan_pri .
+This value is a 3-bit number which is used to tag outgoing
+VLAN packtes with apropriate priority. If
+.Cm vlanpri
+is omitted it default to 0.
+.It Cm vlancfi Ar vlan_cfi
+If the interface is a
+.Xr vlan 4
+pseudo interface, set the CFI value
+to
+.Ar vlan_cfi .
+This value is a 1-bit number which is used to tag outgoing
+VLAN packtes with apropriate CFI value. If
+.Cm vlancfi
+is omitted it default to 0.
.It Cm vlandev Ar iface
If the interface is a
.Xr vlan 4
--- sys/net/if_vlan_var.h.orig Mon Jan 19 00:29:04 2004
+++ sys/net/if_vlan_var.h Tue Jan 25 11:54:33 2005
@@ -43,6 +43,8 @@
#define EVL_VLID_MASK 0x0FFF
#define EVL_VLANOFTAG(tag) ((tag) & EVL_VLID_MASK)
#define EVL_PRIOFTAG(tag) (((tag) >> 13) & 7)
+#define EVL_CFIOFTAG(tag) (((tag) >> 12) & 1)
+#define EVL_MAKETAG(vlid,pri,cfi) ((((((pri) & 7) << 1) | ((cfi) & 1)) << 12) | ((vlid) & EVL_VLID_MASK))
/* sysctl(3) tags, for compatibility purposes */
#define VLANCTL_PROTO 1
--- sys/net/if_vlan.c.orig Wed Jan 19 10:40:32 2005
+++ sys/net/if_vlan.c Fri Jan 21 09:05:45 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);
More information about the freebsd-net
mailing list