From owner-freebsd-net@FreeBSD.ORG Tue Feb 15 23:38:53 2005 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id DB33416A4E0; Tue, 15 Feb 2005 23:38:53 +0000 (GMT) Received: from tigra.ip.net.ua (tigra.ip.net.ua [82.193.96.10]) by mx1.FreeBSD.org (Postfix) with ESMTP id A12BE43D58; Tue, 15 Feb 2005 23:38:52 +0000 (GMT) (envelope-from ru@ip.net.ua) Received: from localhost (rocky.ip.net.ua [82.193.96.2]) by tigra.ip.net.ua (8.12.11/8.12.11) with ESMTP id j1FNcjsA044749; Wed, 16 Feb 2005 01:38:45 +0200 (EET) (envelope-from ru@ip.net.ua) Received: from tigra.ip.net.ua ([82.193.96.10]) by localhost (rocky.ipnet [82.193.96.2]) (amavisd-new, port 10024) with LMTP id 82604-11; Wed, 16 Feb 2005 01:38:44 +0200 (EET) Received: from heffalump.ip.net.ua (heffalump.ip.net.ua [82.193.96.213]) by tigra.ip.net.ua (8.12.11/8.12.11) with ESMTP id j1FNciRU044746 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 16 Feb 2005 01:38:44 +0200 (EET) (envelope-from ru@ip.net.ua) Received: (from ru@localhost) by heffalump.ip.net.ua (8.13.1/8.13.1) id j1FNcm5Z036566; Wed, 16 Feb 2005 01:38:48 +0200 (EET) (envelope-from ru) Date: Wed, 16 Feb 2005 01:38:42 +0200 From: Ruslan Ermilov To: Sam Leffler Message-ID: <20050215233842.GA24447@ip.net.ua> References: <200502140829.j1E8TgDs086634@repoman.freebsd.org> <4210D210.3080700@errno.com> <20050214181431.GA69635@ip.net.ua> <4210F849.8060005@errno.com> <20050214195558.GD69635@ip.net.ua> <421104C7.4070709@errno.com> <20050215074226.GA6781@ip.net.ua> <42123604.9070002@errno.com> <20050215183744.GA17554@ip.net.ua> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="yEPQxsgoJgBvi8ip" Content-Disposition: inline In-Reply-To: <20050215183744.GA17554@ip.net.ua> User-Agent: Mutt/1.5.6i X-Virus-Scanned: by amavisd-new at ip.net.ua cc: Gleb Smirnoff cc: net@FreeBSD.org cc: Joerg Wunsch Subject: Re: cvs commit: src/sys/net if_ethersubr.c X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Feb 2005 23:38:54 -0000 --yEPQxsgoJgBvi8ip Content-Type: multipart/mixed; boundary="dDRMvlgZJXvWKvBx" Content-Disposition: inline --dDRMvlgZJXvWKvBx Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable [ 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=20 > > fine with me. I didn't offer that because I thought we were out of fre= e=20 > > bits but I see m_flags got changed to an int a while back and only=20 > > 16-bits are assigned. > >=20 > OK, I'll post the patches soon then. >=20 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, --=20 Ruslan Ermilov ru@FreeBSD.org FreeBSD committer --dDRMvlgZJXvWKvBx Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p Content-Transfer-Encoding: quoted-printable Index: sys/mbuf.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 */ =20 /* * 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) =20 /* * Flags indicating hw checksum support and sw checksum requirements. Index: net/if_ethersubr.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 =20 if (!(BDG_ACTIVE(ifp)) && - !(ether_type =3D=3D ETHERTYPE_VLAN && ifp->if_nvlans > 0)) { + !((ether_type =3D=3D 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) !=3D 0 - && (eh->ether_dhost[0] & 1) =3D=3D 0 + && !ETHER_IS_MULTICAST(eh->ether_dhost) && bcmp(eh->ether_dhost, IFP2AC(ifp)->ac_enaddr, ETHER_ADDR_LEN) !=3D 0 && (ifp->if_flags & IFF_PPROMISC) =3D=3D 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) !=3D NULL && - m_tag_locate(m, MTAG_VLAN, MTAG_VLAN_TAG, NULL) !=3D NULL) { + if (m->m_flags & M_VLANTAG) { /* * If no VLANs are configured, drop. */ Index: net/if_vlan_var.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 =3D VLAN_OUTPUT_TAG(ifp, m); @@ -107,10 +107,11 @@ struct vlanreq { } \ *(u_int *)(mtag+1) =3D (_t); \ m_tag_prepend((_m), mtag); \ + (_m)->m_flags |=3D M_VLANTAG; \ } while (0) =20 #define VLAN_OUTPUT_TAG(_ifp, _m) \ - ((_ifp)->if_nvlans !=3D 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 */ --dDRMvlgZJXvWKvBx-- --yEPQxsgoJgBvi8ip Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.6 (FreeBSD) iD8DBQFCEogCqRfpzJluFF4RAnnKAJwLRdZD59Ml8XxqSLGG2zA0JQuhXQCfd/XX c/cwUJCTt2r/HqETXiLp0oU= =DJg7 -----END PGP SIGNATURE----- --yEPQxsgoJgBvi8ip--