Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Feb 2003 05:20:02 -0800 (PST)
From:      Gleb Smirnoff <glebius@cell.sick.ru>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/47920: if ng_pppoe switches to nonstandard mode it stays in it forever
Message-ID:  <200302101320.h1ADK2mE024400@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/47920; it has been noted by GNATS.

From: Gleb Smirnoff <glebius@cell.sick.ru>
To: Lev Shamardin <shamardin@theory.sinp.msu.ru>
Cc: FreeBSD-gnats-submit@FreeBSD.ORG
Subject: Re: kern/47920: if ng_pppoe switches to nonstandard mode it stays in it forever
Date: Mon, 10 Feb 2003 16:16:08 +0300

 Hi!
 
 A workaround and fix of the problem follows.
 
 L> cause inoperability of the whole PPPoE network, because the only way to
 L> switch pppoe back to standard mode is to reboot the kernel, and if the
 L> FreeBSD client reconnects to the server, this will bring the server back to
 L> non-standard mode.
 
 Really you do not need to reboot, but you can switch it back using:
 sysctl net.graph.nonstandard_pppoe=0
 
 But it will remain in standard mode until next stupid packet in the network.
 The dirty workaround we used is running this command in cron(8).
 
 L> >Fix:
 L> There should be a kernel option or sysctl variable which can disable usage
 L> of non-standard pppoe mode.
 
 Here is the patch we are using now. It is not tested thoroughly because I
 don't know where does non-standard packets come from, and I do not generated
 them for testing purposes. But this should work.
 
 The oid net.graph.nonstandard_pppoe gets new value of -1, which means
 "stay standard forever!".
 
 --- ng_pppoe.c.orig	Mon Feb 10 15:16:04 2003
 +++ ng_pppoe.c	Mon Feb 10 15:41:40 2003
 @@ -166,7 +166,6 @@
  	 ETHERTYPE_PPPOE_DISC};
  
  static int nonstandard;
 -static int
  ngpppoe_set_ethertype(SYSCTL_HANDLER_ARGS)
  {
  	int error;
 @@ -176,12 +175,19 @@
  	error = sysctl_handle_int(oidp, &val, sizeof(int), req);
  	if (error != 0 || req->newptr == NULL)
  		return (error);
 -	if (val == 1) {
 +	switch (val) {
 +	case 1:
  		nonstandard = 1;
  		eh_prototype.ether_type = ETHERTYPE_PPPOE_STUPID_DISC;
 -	} else {
 +		break;
 +	case 0:
  		nonstandard = 0;
  		eh_prototype.ether_type = ETHERTYPE_PPPOE_DISC;
 +		break;
 +	case -1:
 +		nonstandard = -1;
 +		eh_prototype.ether_type = ETHERTYPE_PPPOE_DISC;
 +		break;
  	}
  	return (0);
  }
 @@ -913,8 +919,10 @@
  		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 > -1) {
 +			  nonstandard = 1;
 +			  eh_prototype.ether_type = ETHERTYPE_PPPOE_STUPID_DISC;
 +			}
  			/* fall through */
  		case	ETHERTYPE_PPPOE_DISC:
  			/*
 
 -- 
 Totus tuus, Glebius.
 GLEBIUS-RIPN GLEB-RIPE

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?200302101320.h1ADK2mE024400>