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