Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Feb 2003 20:29:59 +0300
From:      Gleb Smirnoff <glebius@cell.sick.ru>
To:        freebsd-bugs@FreeBSD.ORG, FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   Re: kern/47920: if ng_pppoe switches to nonstandard mode it stays in it forever
Message-ID:  <20030210172959.GA10333@cell.sick.ru>
In-Reply-To: <200302101320.h1ADK2mE024400@freefall.freebsd.org>
References:  <200302101320.h1ADK2mE024400@freefall.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Sorry. This one is better.

-- 
Totus tuus, Glebius.
GLEBIUS-RIPN GLEB-RIPE

--- ng_pppoe.c.orig	Mon Feb 10 15:16:04 2003
+++ ng_pppoe.c	Mon Feb 10 20:27:34 2003
@@ -166,6 +166,9 @@
 	 ETHERTYPE_PPPOE_DISC};
 
 static int nonstandard;
+#define PPPOE_STANDARD		0	/* try standard */
+#define PPPOE_NONSTANDARD	1	/* be nonstandard */
+#define PPPOE_KEEPSTANDARD	-1	/* never switch to nonstandard mode */
 static int
 ngpppoe_set_ethertype(SYSCTL_HANDLER_ARGS)
 {
@@ -176,12 +179,19 @@
 	error = sysctl_handle_int(oidp, &val, sizeof(int), req);
 	if (error != 0 || req->newptr == NULL)
 		return (error);
-	if (val == 1) {
-		nonstandard = 1;
+	switch (val) {
+	case PPPOE_NONSTANDARD:
+		nonstandard = PPPOE_NONSTANDARD;
 		eh_prototype.ether_type = ETHERTYPE_PPPOE_STUPID_DISC;
-	} else {
-		nonstandard = 0;
+		break;
+	case PPPOE_STANDARD:
+		nonstandard = PPPOE_STANDARD;
 		eh_prototype.ether_type = ETHERTYPE_PPPOE_DISC;
+		break;
+	case PPPOE_KEEPSTANDARD:
+		nonstandard = PPPOE_KEEPSTANDARD;
+		eh_prototype.ether_type = ETHERTYPE_PPPOE_DISC;
+		break;
 	}
 	return (0);
 }
@@ -913,8 +923,12 @@
 		code = wh->ph.code; 
 		switch(wh->eh.ether_type) {
 		case	ETHERTYPE_PPPOE_STUPID_DISC:
-			nonstandard = 1;
-			eh_prototype.ether_type = ETHERTYPE_PPPOE_STUPID_DISC;
+			if (nonstandard > PPPOE_KEEPSTANDARD) {
+			  nonstandard = PPPOE_NONSTANDARD;
+			  eh_prototype.ether_type = ETHERTYPE_PPPOE_STUPID_DISC;
+			  printf("Switched to nonstandard PPPoE");
+			} else
+			  printf("Ignored nonstandard PPPoE");
 			/* fall through */
 		case	ETHERTYPE_PPPOE_DISC:
 			/*
@@ -1098,7 +1112,7 @@
 				 * from NEWCONNECTED to CONNECTED
 				 */
 				sp->pkt_hdr = neg->pkt->pkt_header;
-				if (nonstandard)
+				if (nonstandard == PPPOE_NONSTANDARD)
 					sp->pkt_hdr.eh.ether_type
 						= ETHERTYPE_PPPOE_STUPID_SESS;
 				else
@@ -1150,7 +1164,7 @@
 				 * Keep a copy of the header we will be using.
 				 */
 				sp->pkt_hdr = neg->pkt->pkt_header;
-				if (nonstandard)
+				if (nonstandard == PPPOE_NONSTANDARD)
 					sp->pkt_hdr.eh.ether_type
 						= ETHERTYPE_PPPOE_STUPID_SESS;
 				else
@@ -1434,7 +1448,7 @@
 			/* revert the stored header to DISC/PADT mode */
 		 	wh = &sp->pkt_hdr;
 			wh->ph.code = PADT_CODE;
-			if (nonstandard)
+			if (nonstandard == PPPOE_NONSTANDARD)
 				wh->eh.ether_type = ETHERTYPE_PPPOE_STUPID_DISC;
 			else
 				wh->eh.ether_type = ETHERTYPE_PPPOE_DISC;

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030210172959.GA10333>