kern/47920: if ng_pppoe switches to nonstandard mode it stays
in it forever
Gleb Smirnoff
glebius at cell.sick.ru
Tue Dec 9 07:30:25 PST 2003
The following reply was made to PR kern/47920; it has been noted by GNATS.
From: Gleb Smirnoff <glebius at cell.sick.ru>
To: Yar Tikhiy <yar at FreeBSD.ORG>
Cc: FreeBSD-gnats-submit at FreeBSD.ORG, freebsd-bugs at FreeBSD.ORG
Subject: Re: kern/47920: if ng_pppoe switches to nonstandard mode it stays in it forever
Date: Tue, 9 Dec 2003 18:20:54 +0300
--dDRMvlgZJXvWKvBx
Content-Type: text/plain; charset=koi8-r
Content-Disposition: inline
On Tue, Dec 09, 2003 at 04:14:41PM +0300, Yar Tikhiy wrote:
Y> I would rather change the name of the variable "nonstandard"
Y> to "pppoe_mode", not "standard", because lines like this one:
Y>
Y> standard = PPPOE_NONSTANDARD;
Y>
Y> give me a schizoid feeling :-)
Here it is.
--
Totus tuus, Glebius.
GLEBIUS-RIPN GLEB-RIPE
--dDRMvlgZJXvWKvBx
Content-Type: text/plain; charset=koi8-r
Content-Disposition: attachment; filename="ng_pppoe.c.diff"
--- /usr/src/sys/netgraph/ng_pppoe.c Wed Jul 3 02:17:18 2002
+++ ng_pppoe.c Tue Dec 9 11:57:25 2003
@@ -54,6 +54,7 @@
#include <sys/malloc.h>
#include <sys/errno.h>
#include <sys/sysctl.h>
+#include <sys/syslog.h>
#include <net/ethernet.h>
#include <netgraph/ng_message.h>
@@ -165,23 +166,33 @@
{0x00,0x00,0x00,0x00,0x00,0x00},
ETHERTYPE_PPPOE_DISC};
-static int nonstandard;
+static int pppoe_mode;
+#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)
{
int error;
int val;
- val = nonstandard;
+ val = pppoe_mode;
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:
+ pppoe_mode = PPPOE_NONSTANDARD;
eh_prototype.ether_type = ETHERTYPE_PPPOE_STUPID_DISC;
- } else {
- nonstandard = 0;
+ break;
+ case PPPOE_STANDARD:
+ pppoe_mode = PPPOE_STANDARD;
eh_prototype.ether_type = ETHERTYPE_PPPOE_DISC;
+ break;
+ case PPPOE_KEEPSTANDARD:
+ pppoe_mode = PPPOE_KEEPSTANDARD;
+ eh_prototype.ether_type = ETHERTYPE_PPPOE_DISC;
+ break;
}
return (0);
}
@@ -913,8 +924,16 @@
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 (pppoe_mode != PPPOE_KEEPSTANDARD) {
+ pppoe_mode = PPPOE_NONSTANDARD;
+ eh_prototype.ether_type = ETHERTYPE_PPPOE_STUPID_DISC;
+ log(LOG_NOTICE,
+ "Switched to nonstandard PPPoE (packet from %*D)\n",
+ sizeof(wh->eh.ether_shost), wh->eh.ether_shost,":");
+ } else
+ log(LOG_NOTICE,
+ "Ignored nonstandard PPPoE packet from %*D\n",
+ sizeof(wh->eh.ether_shost), wh->eh.ether_shost,":");
/* fall through */
case ETHERTYPE_PPPOE_DISC:
/*
@@ -1098,7 +1117,7 @@
* from NEWCONNECTED to CONNECTED
*/
sp->pkt_hdr = neg->pkt->pkt_header;
- if (nonstandard)
+ if (pppoe_mode == PPPOE_NONSTANDARD)
sp->pkt_hdr.eh.ether_type
= ETHERTYPE_PPPOE_STUPID_SESS;
else
@@ -1150,7 +1169,7 @@
* Keep a copy of the header we will be using.
*/
sp->pkt_hdr = neg->pkt->pkt_header;
- if (nonstandard)
+ if (pppoe_mode == PPPOE_NONSTANDARD)
sp->pkt_hdr.eh.ether_type
= ETHERTYPE_PPPOE_STUPID_SESS;
else
@@ -1434,7 +1453,7 @@
/* revert the stored header to DISC/PADT mode */
wh = &sp->pkt_hdr;
wh->ph.code = PADT_CODE;
- if (nonstandard)
+ if (pppoe_mode == PPPOE_NONSTANDARD)
wh->eh.ether_type = ETHERTYPE_PPPOE_STUPID_DISC;
else
wh->eh.ether_type = ETHERTYPE_PPPOE_DISC;
--dDRMvlgZJXvWKvBx--
More information about the freebsd-bugs
mailing list