Module Name:    src
Committed By:   yamaguchi
Date:           Tue Jun  1 03:27:23 UTC 2021

Modified Files:
        src/sys/net: if_spppsubr.c if_spppvar.h

Log Message:
restart LCP when loopback packets are detected

In if_spppsubr.c down and up do not mean that LCP is stopping
or running, but mean that the lower layer of LCP is up or down.
And, restarting of LCP is had to use close event and open event.


To generate a diff of this commit:
cvs rdiff -u -r1.246 -r1.247 src/sys/net/if_spppsubr.c
cvs rdiff -u -r1.38 -r1.39 src/sys/net/if_spppvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_spppsubr.c
diff -u src/sys/net/if_spppsubr.c:1.246 src/sys/net/if_spppsubr.c:1.247
--- src/sys/net/if_spppsubr.c:1.246	Wed May 19 02:14:19 2021
+++ src/sys/net/if_spppsubr.c	Tue Jun  1 03:27:23 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppsubr.c,v 1.246 2021/05/19 02:14:19 yamaguchi Exp $	 */
+/*	$NetBSD: if_spppsubr.c,v 1.247 2021/06/01 03:27:23 yamaguchi Exp $	 */
 
 /*
  * Synchronous PPP/Cisco link level subroutines.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.246 2021/05/19 02:14:19 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.247 2021/06/01 03:27:23 yamaguchi Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -1480,15 +1480,18 @@ sppp_cisco_input(struct sppp *sp, struct
 				printf ("%s: loopback\n",
 					ifp->if_xname);
 				sp->pp_loopcnt = 0;
-				if (ifp->if_flags & IFF_UP) {
-					SPPP_UNLOCK(sp);
-					if_down(ifp);
-					SPPP_LOCK(sp, RW_WRITER);
 
-					IF_PURGE(&sp->pp_cpq);
-				}
+				sp->pp_flags |= PP_LOOPBACK;
+				sppp_wq_add(sp->wq_cp,
+				    &sp->work_ifdown);
+
+				sppp_wq_add(sp->wq_cp,
+				    &sp->scp[IDX_LCP].work_close);
+				sppp_wq_add(sp->wq_cp,
+				    &sp->scp[IDX_LCP].work_open);
+			} else {
+				++sp->pp_loopcnt;
 			}
-			++sp->pp_loopcnt;
 
 			/* Generate new local sequence number */
 			sp->scp[IDX_LCP].seq = cprng_fast32();
@@ -1500,6 +1503,7 @@ sppp_cisco_input(struct sppp *sp, struct
 			SPPP_UNLOCK(sp);
 			if_up(ifp);
 			SPPP_LOCK(sp, RW_WRITER);
+			sp->pp_flags &= ~PP_LOOPBACK;
 		}
 		break;
 	case CISCO_ADDR_REQ:
@@ -1946,20 +1950,16 @@ sppp_cp_input(const struct cp *cp, struc
 		if (ntohl(u32) == sp->lcp.magic) {
 			/* Line loopback mode detected. */
 			printf("%s: loopback\n", ifp->if_xname);
-			/*
-			 * There is no change for items of sp->scp[cp->protoidx]
-			 * while if_down() even without SPPP_LOCK
-			 */
-			SPPP_UNLOCK(sp);
-			if_down(ifp);
-			SPPP_LOCK(sp, RW_WRITER);
 
-			IF_PURGE(&sp->pp_cpq);
+			sp->pp_flags |= PP_LOOPBACK;
+			sppp_wq_add(sp->wq_cp,
+			    &sp->work_ifdown);
 
 			/* Shut down the PPP link. */
-			/* XXX */
-			sppp_wq_add(sp->wq_cp, &sp->scp[IDX_LCP].work_down);
-			sppp_wq_add(sp->wq_cp, &sp->scp[IDX_LCP].work_up);
+			sppp_wq_add(sp->wq_cp,
+			    &sp->scp[IDX_LCP].work_close);
+			sppp_wq_add(sp->wq_cp,
+			    &sp->scp[IDX_LCP].work_open);
 			break;
 		}
 		u32 = htonl(sp->lcp.magic);
@@ -3000,21 +3000,20 @@ sppp_lcp_confreq(struct sppp *sp, struct
 				printf ("%s: loopback\n",
 					ifp->if_xname);
 				sp->pp_loopcnt = 0;
-				if (ifp->if_flags & IFF_UP) {
-					SPPP_UNLOCK(sp);
-					if_down(ifp);
-					SPPP_LOCK(sp, RW_WRITER);
 
-					IF_PURGE(&sp->pp_cpq);
-					/* XXX ? */
-					sppp_wq_add(sp->wq_cp,
-					    &sp->scp[IDX_LCP].work_down);
-					sppp_wq_add(sp->wq_cp,
-					    &sp->scp[IDX_LCP].work_up);
-				}
-			} else if (debug)
-				addlog(" [glitch]");
-			++sp->pp_loopcnt;
+				sp->pp_flags |= PP_LOOPBACK;
+				sppp_wq_add(sp->wq_cp,
+				    &sp->work_ifdown);
+
+				sppp_wq_add(sp->wq_cp,
+				    &sp->scp[IDX_LCP].work_close);
+				sppp_wq_add(sp->wq_cp,
+				    &sp->scp[IDX_LCP].work_open);
+			} else {
+				if (debug)
+					addlog(" [glitch]");
+				++sp->pp_loopcnt;
+			}
 			/*
 			 * We negate our magic here, and NAK it.  If
 			 * we see it later in an NAK packet, we
@@ -3351,22 +3350,34 @@ sppp_lcp_tlu(struct sppp *sp)
 {
 	STDDCL;
 	int i;
+	bool going_up;
 
 	KASSERT(SPPP_WLOCKED(sp));
 
 	/* unlock for IFNET_LOCK and if_up() */
 	SPPP_UNLOCK(sp);
 
-	/* XXX ? */
 	if (! (ifp->if_flags & IFF_UP) &&
 	    (ifp->if_flags & IFF_RUNNING)) {
 		/* Coming out of loopback mode. */
+		going_up = true;
 		if_up(ifp);
+	} else {
+		going_up = false;
 	}
 
 	IFNET_LOCK(ifp);
 	SPPP_LOCK(sp, RW_WRITER);
 
+	if (going_up) {
+		if ((sp->pp_flags & PP_LOOPBACK) == 0) {
+			log(LOG_DEBUG, "%s: interface is going up, "
+			    "but no loopback packet is deteted\n",
+			    ifp->if_xname);
+		}
+		sp->pp_flags &= ~PP_LOOPBACK;
+	}
+
 	if (ifp->if_mtu > sp->lcp.their_mru) {
 		sp->pp_saved_mtu = ifp->if_mtu;
 		ifp->if_mtu = sp->lcp.their_mru;

Index: src/sys/net/if_spppvar.h
diff -u src/sys/net/if_spppvar.h:1.38 src/sys/net/if_spppvar.h:1.39
--- src/sys/net/if_spppvar.h:1.38	Fri May 14 08:41:25 2021
+++ src/sys/net/if_spppvar.h	Tue Jun  1 03:27:23 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppvar.h,v 1.38 2021/05/14 08:41:25 yamaguchi Exp $	*/
+/*	$NetBSD: if_spppvar.h,v 1.39 2021/06/01 03:27:23 yamaguchi Exp $	*/
 
 #ifndef _NET_IF_SPPPVAR_H_
 #define _NET_IF_SPPPVAR_H_
@@ -203,14 +203,15 @@ struct sppp {
 	void	(*pp_chg)(struct sppp *, int);
 };
 
-#define PP_KEEPALIVE    0x01    /* use keepalive protocol */
-#define PP_CISCO        0x02    /* use Cisco protocol instead of PPP */
+#define PP_KEEPALIVE	0x01	/* use keepalive protocol */
+#define PP_CISCO	0x02	/* use Cisco protocol instead of PPP */
 				/* 0x04 was PP_TIMO */
 #define PP_CALLIN	0x08	/* we are being called */
 #define PP_NEEDAUTH	0x10	/* remote requested authentication */
-#define	PP_NOFRAMING	0x20	/* do not add/expect encapsulation
+#define PP_NOFRAMING	0x20	/* do not add/expect encapsulation
 				   around PPP frames (i.e. the serial
 				   HDLC like encapsulation, RFC1662) */
+#define PP_LOOPBACK	0x40	/* in line loopback mode */
 
 
 #define PP_MTU          1500    /* default/minimal MRU */

Reply via email to