From nobody@FreeBSD.org  Sun Feb 19 17:43:57 2012
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id C9377106566C
	for <freebsd-gnats-submit@FreeBSD.org>; Sun, 19 Feb 2012 17:43:57 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id 9C1A98FC16
	for <freebsd-gnats-submit@FreeBSD.org>; Sun, 19 Feb 2012 17:43:57 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.4/8.14.4) with ESMTP id q1JHhvE5044041
	for <freebsd-gnats-submit@FreeBSD.org>; Sun, 19 Feb 2012 17:43:57 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.4/8.14.4/Submit) id q1JHhvBl044033;
	Sun, 19 Feb 2012 17:43:57 GMT
	(envelope-from nobody)
Message-Id: <201202191743.q1JHhvBl044033@red.freebsd.org>
Date: Sun, 19 Feb 2012 17:43:57 GMT
From: Ivan Rozhuk <rozhuk.im@gmail.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: Fix EVL_APPLY_VLID, update EVL_APPLY_PRI macro
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         165296
>Category:       kern
>Synopsis:       [vlan] [patch] Fix EVL_APPLY_VLID, update EVL_APPLY_PRI macro
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-net
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Feb 19 17:50:01 UTC 2012
>Closed-Date:    
>Last-Modified:  Mon Feb 20 01:54:23 UTC 2012
>Originator:     Ivan Rozhuk
>Release:        9.0
>Organization:
>Environment:
FreeBSD firewall 9.0-STABLE FreeBSD 9.0-STABLE #0: Sat Jan 21 11:32:18 IRKT 2012     root@firewall:/tmp/obj/usr/src/sys/RIM  i386

>Description:
EVL_APPLY_VLID macro removes the flag Canonical Format Indicator (CFI) and the Priority Code Point (PCP) instead of removing VLAN Identifier (VID). The new VID is superimposed on the old one.
(m) -> m_pkthdr.ether_vtag & = EVL_VLID_MASK; \
(m) -> m_pkthdr.ether_vtag | = (vlid); \

The correct version:
(m) -> m_pkthdr.ether_vtag & = ~ EVL_VLID_MASK; \
(m) -> m_pkthdr.ether_vtag | = ((vlid) & EVL_VLID_MASK); \

>How-To-Repeat:

>Fix:
apply patch

Patch attached with submission follows:

--- ./if_vlan_var.h.orig	2011-09-23 09:51:37.000000000 +0900
+++ ./if_vlan_var.h	2012-02-20 02:28:50.000000000 +0900
@@ -52,27 +52,24 @@
 #define EVL_APPLY_VLID(m, vlid)						\
 	do {								\
 		if ((m)->m_flags & M_VLANTAG) {				\
-			(m)->m_pkthdr.ether_vtag &= EVL_VLID_MASK;	\
-			(m)->m_pkthdr.ether_vtag |= (vlid);		\
+			(m)->m_pkthdr.ether_vtag &= ~EVL_VLID_MASK;	\
 		} else {						\
-			(m)->m_pkthdr.ether_vtag = (vlid);		\
+			(m)->m_pkthdr.ether_vtag = 0;			\
 			(m)->m_flags |= M_VLANTAG;			\
 		}							\
+		(m)->m_pkthdr.ether_vtag |= ((vlid) & EVL_VLID_MASK);	\
 	} while (0)
 
 /* Set the priority ID in an mbuf packet header non-destructively. */
 #define EVL_APPLY_PRI(m, pri)						\
 	do {								\
 		if ((m)->m_flags & M_VLANTAG) {				\
-			uint16_t __vlantag = (m)->m_pkthdr.ether_vtag;	\
-			(m)->m_pkthdr.ether_vtag |= EVL_MAKETAG(	\
-			    EVL_VLANOFTAG(__vlantag), (pri),		\
-			    EVL_CFIOFTAG(__vlantag));			\
+			(m)->m_pkthdr.ether_vtag &= ~EVL_PRI_MASK;	\
 		} else {						\
-			(m)->m_pkthdr.ether_vtag =			\
-			    EVL_MAKETAG(0, (pri), 0);			\
+			(m)->m_pkthdr.ether_vtag = 0;			\
 			(m)->m_flags |= M_VLANTAG;			\
 		}							\
+		(m)->m_pkthdr.ether_vtag |= (((pri) & 7) << 1);		\
 	} while (0)
 
 /* sysctl(3) tags, for compatibility purposes */


>Release-Note:
>Audit-Trail:

From: rozhuk.im@gmail.com
To: <bug-followup@FreeBSD.org>,
	<rozhuk.im@gmail.com>
Cc:  
Subject: Re: kern/165296: Fix EVL_APPLY_VLID, update EVL_APPLY_PRI macro
Date: Mon, 20 Feb 2012 03:16:00 +0900

 This is a multi-part message in MIME format.
 
 ------=_NextPart_000_0046_01CCEF7D.FB03C320
 Content-Type: text/plain;
 	charset="US-ASCII"
 Content-Transfer-Encoding: 7bit
 
 -             (m)->m_pkthdr.ether_vtag |= (((pri) & 7) << 1);            \
 +             (m)->m_pkthdr.ether_vtag |= (((pri) & 7) << 13);           \
 
 ------=_NextPart_000_0046_01CCEF7D.FB03C320
 Content-Type: application/octet-stream;
 	name="if_vlan_var.h.patch"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment;
 	filename="if_vlan_var.h.patch"
 
 --- ./if_vlan_var.h.orig	2011-09-23 09:51:37.000000000 +0900=0A=
 +++ ./if_vlan_var.h	2012-02-20 03:11:20.000000000 +0900=0A=
 @@ -52,27 +52,24 @@=0A=
  #define EVL_APPLY_VLID(m, vlid)						\=0A=
  	do {								\=0A=
  		if ((m)->m_flags & M_VLANTAG) {				\=0A=
 -			(m)->m_pkthdr.ether_vtag &=3D EVL_VLID_MASK;	\=0A=
 -			(m)->m_pkthdr.ether_vtag |=3D (vlid);		\=0A=
 +			(m)->m_pkthdr.ether_vtag &=3D ~EVL_VLID_MASK;	\=0A=
  		} else {						\=0A=
 -			(m)->m_pkthdr.ether_vtag =3D (vlid);		\=0A=
 +			(m)->m_pkthdr.ether_vtag =3D 0;			\=0A=
  			(m)->m_flags |=3D M_VLANTAG;			\=0A=
  		}							\=0A=
 +		(m)->m_pkthdr.ether_vtag |=3D ((vlid) & EVL_VLID_MASK);	\=0A=
  	} while (0)=0A=
  =0A=
  /* Set the priority ID in an mbuf packet header non-destructively. */=0A=
  #define EVL_APPLY_PRI(m, pri)						\=0A=
  	do {								\=0A=
  		if ((m)->m_flags & M_VLANTAG) {				\=0A=
 -			uint16_t __vlantag =3D (m)->m_pkthdr.ether_vtag;	\=0A=
 -			(m)->m_pkthdr.ether_vtag |=3D EVL_MAKETAG(	\=0A=
 -			    EVL_VLANOFTAG(__vlantag), (pri),		\=0A=
 -			    EVL_CFIOFTAG(__vlantag));			\=0A=
 +			(m)->m_pkthdr.ether_vtag &=3D ~EVL_PRI_MASK;	\=0A=
  		} else {						\=0A=
 -			(m)->m_pkthdr.ether_vtag =3D			\=0A=
 -			    EVL_MAKETAG(0, (pri), 0);			\=0A=
 +			(m)->m_pkthdr.ether_vtag =3D 0;			\=0A=
  			(m)->m_flags |=3D M_VLANTAG;			\=0A=
  		}							\=0A=
 +		(m)->m_pkthdr.ether_vtag |=3D (((pri) & 7) << 13);	\=0A=
  	} while (0)=0A=
  =0A=
  /* sysctl(3) tags, for compatibility purposes */=0A=
 
 ------=_NextPart_000_0046_01CCEF7D.FB03C320--
 
Responsible-Changed-From-To: freebsd-bugs->freebsd-net 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Mon Feb 20 01:54:04 UTC 2012 
Responsible-Changed-Why:  
Over to maintainer(s). 

http://www.freebsd.org/cgi/query-pr.cgi?pr=165296 
>Unformatted:
