cvs commit: src/sys/net if_ethersubr.c

Ruslan Ermilov ru at FreeBSD.org
Tue Feb 15 15:38:54 PST 2005


[ Redirected to -net ]

On Tue, Feb 15, 2005 at 08:37:44PM +0200, Ruslan Ermilov wrote:
> On Tue, Feb 15, 2005 at 09:48:52AM -0800, Sam Leffler wrote:
[...]
> > As to your other suggestion of allocating an mbuf flag bit that'd be 
> > fine with me.  I didn't offer that because I thought we were out of free 
> > bits but I see m_flags got changed to an int a while back and only 
> > 16-bits are assigned.
> > 
> OK, I'll post the patches soon then.
> 
The patch is attached.  It's rather small, and it has been
tested on the IFCAP_VLAN_HWTAGGING hardware.  It should now
be faster than ever.

The first argument to VLAN_OUTPUT_TAG() is now unused, but
I don't think it would be a good idea (though I'm not opposed
to it either) to trim it.

I also embellished a fix in rev. 1.174 of if_ethersubr.c -- it
now properly checks for mbufs with VLAN tags, making it possible
to bridge(4) on vlan(4)'s whose parent interfaces support VLAN
decapsulation in hardware.


Cheers,
-- 
Ruslan Ermilov
ru at FreeBSD.org
FreeBSD committer
-------------- next part --------------
Index: sys/mbuf.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/mbuf.h,v
retrieving revision 1.165
diff -u -p -r1.165 mbuf.h
--- sys/mbuf.h	10 Feb 2005 22:23:02 -0000	1.165
+++ sys/mbuf.h	15 Feb 2005 22:00:02 -0000
@@ -178,6 +178,7 @@ struct mbuf {
 #define	M_FRAG		0x0800	/* packet is a fragment of a larger packet */
 #define	M_FIRSTFRAG	0x1000	/* packet is first fragment */
 #define	M_LASTFRAG	0x2000	/* packet is last fragment */
+#define	M_VLANTAG	0x10000	/* packet has VLAN tag attached */
 
 /*
  * External buffer types: identify ext_buf type.
@@ -195,7 +196,8 @@ struct mbuf {
  */
 #define	M_COPYFLAGS	(M_PKTHDR|M_EOR|M_RDONLY|M_PROTO1|M_PROTO1|M_PROTO2|\
 			    M_PROTO3|M_PROTO4|M_PROTO5|M_SKIP_FIREWALL|\
-			    M_BCAST|M_MCAST|M_FRAG|M_FIRSTFRAG|M_LASTFRAG)
+			    M_BCAST|M_MCAST|M_FRAG|M_FIRSTFRAG|M_LASTFRAG|\
+			    M_VLANTAG)
 
 /*
  * Flags indicating hw checksum support and sw checksum requirements.
Index: net/if_ethersubr.c
===================================================================
RCS file: /home/ncvs/src/sys/net/if_ethersubr.c,v
retrieving revision 1.184
diff -u -p -r1.184 if_ethersubr.c
--- net/if_ethersubr.c	14 Feb 2005 11:58:54 -0000	1.184
+++ net/if_ethersubr.c	15 Feb 2005 23:16:13 -0000
@@ -604,7 +604,8 @@ ether_demux(struct ifnet *ifp, struct mb
 #endif
 
 	if (!(BDG_ACTIVE(ifp)) &&
-	    !(ether_type == ETHERTYPE_VLAN && ifp->if_nvlans > 0)) {
+	    !((ether_type == ETHERTYPE_VLAN || m->m_flags & M_VLANTAG) &&
+	    ifp->if_nvlans > 0)) {
 		/*
 		 * Discard packet if upper layers shouldn't see it because it
 		 * was unicast to a different Ethernet address. If the driver
@@ -618,7 +619,7 @@ ether_demux(struct ifnet *ifp, struct mb
 		 * it's undesired.
 		 */
 		if ((ifp->if_flags & IFF_PROMISC) != 0
-		    && (eh->ether_dhost[0] & 1) == 0
+		    && !ETHER_IS_MULTICAST(eh->ether_dhost)
 		    && bcmp(eh->ether_dhost,
 		      IFP2AC(ifp)->ac_enaddr, ETHER_ADDR_LEN) != 0
 		    && (ifp->if_flags & IFF_PPROMISC) == 0) {
@@ -657,8 +658,7 @@ post_stats:
 	 * Check to see if the device performed the VLAN decapsulation and
 	 * provided us with the tag.
 	 */
-	if (m_tag_first(m) != NULL &&
-	    m_tag_locate(m, MTAG_VLAN, MTAG_VLAN_TAG, NULL) != NULL) {
+	if (m->m_flags & M_VLANTAG) {
 		/*
 		 * If no VLANs are configured, drop.
 		 */
Index: net/if_vlan_var.h
===================================================================
RCS file: /home/ncvs/src/sys/net/if_vlan_var.h,v
retrieving revision 1.20
diff -u -p -r1.20 if_vlan_var.h
--- net/if_vlan_var.h	7 Jan 2005 01:45:34 -0000	1.20
+++ net/if_vlan_var.h	15 Feb 2005 21:57:31 -0000
@@ -80,8 +80,8 @@ struct	vlanreq {
  *
  * to mark the packet m with the specified VLAN tag.  The last
  * parameter provides code to execute in case of an error.  On
- * output the driver should check ifnet to see if any VLANs are
- * in use and only then check for a packet tag; this is done with:
+ * output the driver should check mbuf to see if a VLAN tag is
+ * present and only then check for a tag; this is done with:
  *
  *	struct m_tag *mtag;
  *	mtag = VLAN_OUTPUT_TAG(ifp, m);
@@ -107,10 +107,11 @@ struct	vlanreq {
 	}							\
 	*(u_int *)(mtag+1) = (_t);				\
 	m_tag_prepend((_m), mtag);				\
+	(_m)->m_flags |= M_VLANTAG;				\
 } while (0)
 
 #define	VLAN_OUTPUT_TAG(_ifp, _m)				\
-	((_ifp)->if_nvlans != 0 ?				\
+	((_m)->m_flags & M_VLANTAG ?				\
 		m_tag_locate((_m), MTAG_VLAN, MTAG_VLAN_TAG, NULL) : NULL)
 #define	VLAN_TAG_VALUE(_mt)	(*(u_int *)((_mt)+1))
 #endif /* _KERNEL */
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-net/attachments/20050216/e2edd434/attachment.bin


More information about the freebsd-net mailing list