patch-2.4.19 linux-2.4.19/drivers/net/pppoe.c
Next file: linux-2.4.19/drivers/net/pppox.c
Previous file: linux-2.4.19/drivers/net/ppp_synctty.c
Back to the patch index
Back to the overall index
- Lines: 75
- Date:
Fri Aug 2 17:39:44 2002
- Orig file:
linux-2.4.18/drivers/net/pppoe.c
- Orig date:
Fri Nov 9 14:02:24 2001
diff -urN linux-2.4.18/drivers/net/pppoe.c linux-2.4.19/drivers/net/pppoe.c
@@ -5,7 +5,7 @@
* PPPoE --- PPP over Ethernet (RFC 2516)
*
*
- * Version: 0.6.9
+ * Version: 0.6.11
*
* 030700 : Fixed connect logic to allow for disconnect.
* 270700 : Fixed potential SMP problems; we must protect against
@@ -31,6 +31,12 @@
* a memory leak.
* 081001 : Misc. cleanup (licence string, non-blocking, prevent
* reference of device on close).
+ * 121301 : New ppp channels interface; cannot unregister a channel
+ * from interrupts. Thus, we mark the socket as a ZOMBIE
+ * and do the unregistration later.
+ * 071502 : When a connection is being torn down, we must remember that
+ * ZOMBIE state connections are still connected and thus
+ * pppox_unbind_sock must unbind them (in pppoe_release).
*
* Author: Michal Ostrowski <mostrows@speakeasy.net>
* Contributors:
@@ -86,11 +92,11 @@
#if 0
-#define CHECKPTR(x,y) { if (!(x) && pppoe_debug &7 ){ printk(KERN_CRIT "PPPoE Invalid pointer : %s , %p\n",#x,(x)); error=-EINVAL; goto y; }}
-#define DEBUG(s,args...) if( pppoe_debug & (s) ) printk(KERN_CRIT args );
+#define CHECKPTR(x,y) do { if (!(x) && pppoe_debug &7 ){ printk(KERN_CRIT "PPPoE Invalid pointer : %s , %p\n",#x,(x)); error=-EINVAL; goto y; }} while (0)
+#define DEBUG(s,args...) do { if( pppoe_debug & (s) ) printk(KERN_CRIT args ); } while (0)
#else
-#define CHECKPTR(x,y) do {} while (0);
-#define DEBUG(s,args...) do { } while (0);
+#define CHECKPTR(x,y) do { } while (0)
+#define DEBUG(s,args...) do { } while (0)
#endif
@@ -273,10 +279,10 @@
lock_sock(sk);
- if (sk->state & (PPPOX_CONNECTED | PPPOX_BOUND)) {
+ if (sk->state & (PPPOX_CONNECTED|PPPOX_BOUND)){
pppox_unbind_sock(sk);
dev_put(dev);
- sk->state = PPPOX_DEAD;
+ sk->state = PPPOX_ZOMBIE;
sk->state_change(sk);
}
@@ -439,8 +445,12 @@
* one socket family type, we cannot (easily) distinguish
* what kind of SKB it is during backlog rcv.
*/
- if (sk->lock.users == 0)
- pppox_unbind_sock(sk);
+ if (sk->lock.users == 0) {
+ /* We're no longer connect at the PPPOE layer,
+ * and must wait for ppp channel to disconnect us.
+ */
+ sk->state = PPPOX_ZOMBIE;
+ }
bh_unlock_sock(sk);
sock_put(sk);
@@ -722,7 +732,7 @@
struct pppox_opt *relay_po;
err = -EBUSY;
- if (sk->state & PPPOX_BOUND)
+ if (sk->state & (PPPOX_BOUND|PPPOX_ZOMBIE|PPPOX_DEAD))
break;
err = -ENOTCONN;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)