Subject: PPPoE performance improvement
To: None <martin@netbsd.org>
From: Aymeric Vincent <xmimic@free.fr>
List: tech-net
Date: 03/02/2003 02:03:40
        Hi,

A friend of mine noticed that the performance of our in-kernel PPPoE
is not very good on a slow machine he has and I could verify that on a
SPARCclassic.

Reading RFC 2516 shows that all the packets which go from the server
to a host are sent unicast.

Reading if_pppoe.c shows that each packet that hits pppoe_input() will
take a very long time to be processed, even if we don't care at all
about it (and I get a lot of unwanted PADI packets from other hosts).

With the appended patch, the PPPoE code will not bother with PPPoE
packets that are multicast anymore.

I added the #ifndef PPPOE_SERVER gratuitously as a reminder that if we
implement in-kernel PPPoE server support, we'll have to adjust which
packets we drop (and probably do that in if_pppoe.c).

The performance improvement is huge for me on a SPARCclassic at 50MHz.

Any objection before I commit the following patch?

 Aymeric

Index: if_ethersubr.c
===================================================================
RCS file: /usr/local/cvsroot/src/sys/net/if_ethersubr.c,v
retrieving revision 1.104
diff -u -r1.104 if_ethersubr.c
--- if_ethersubr.c	26 Feb 2003 06:31:12 -0000	1.104
+++ if_ethersubr.c	2 Mar 2003 00:52:33 -0000
@@ -802,6 +802,13 @@
 #if NPPPOE > 0
 	case ETHERTYPE_PPPOEDISC:
 	case ETHERTYPE_PPPOE:
+#ifndef PPPOE_SERVER
+		if (m->m_flags & (M_MCAST | M_BCAST)) {
+			m_freem(m);
+			return;
+		}
+#endif
+
 		if (etype == ETHERTYPE_PPPOEDISC) 
 			inq = &ppoediscinq;
 		else