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>
