Module Name:    src
Committed By:   yamaguchi
Date:           Fri May 14 08:41:25 UTC 2021

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

Log Message:
Add a parameter to change keepalive interval in each PPPoE I/F


To generate a diff of this commit:
cvs rdiff -u -r1.1281 -r1.1282 src/sys/conf/files
cvs rdiff -u -r1.35 -r1.36 src/sys/net/if_sppp.h
cvs rdiff -u -r1.240 -r1.241 src/sys/net/if_spppsubr.c
cvs rdiff -u -r1.37 -r1.38 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/conf/files
diff -u src/sys/conf/files:1.1281 src/sys/conf/files:1.1282
--- src/sys/conf/files:1.1281	Fri May 14 08:31:14 2021
+++ src/sys/conf/files	Fri May 14 08:41:25 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: files,v 1.1281 2021/05/14 08:31:14 yamaguchi Exp $
+#	$NetBSD: files,v 1.1282 2021/05/14 08:41:25 yamaguchi Exp $
 #	@(#)files.newconf	7.5 (Berkeley) 5/10/93
 
 version 	20171118
@@ -292,6 +292,7 @@ defflag opt_pppoe.h		PPPOE_SERVER PPPOE_
 
 defparam opt_sppp.h		SPPP_KEEPALIVE_INTERVAL
 				SPPP_NORECV_TIME
+				SPPP_ALIVE_INTERVAL
 
 # networking options
 #

Index: src/sys/net/if_sppp.h
diff -u src/sys/net/if_sppp.h:1.35 src/sys/net/if_sppp.h:1.36
--- src/sys/net/if_sppp.h:1.35	Tue May 11 06:42:42 2021
+++ src/sys/net/if_sppp.h	Fri May 14 08:41:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_sppp.h,v 1.35 2021/05/11 06:42:42 yamaguchi Exp $	*/
+/*	$NetBSD: if_sppp.h,v 1.36 2021/05/14 08:41:25 yamaguchi Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -153,6 +153,7 @@ struct spppkeepalivesettings {
 	u_int	maxalive;		/* number of LCP echo req. w/o reply */
 	time_t	max_noreceive;		/* (sec.) grace period before we start
 					   sending LCP echo requests. */
+	u_int	alive_interval;		/* number of keepalive between echo req. */
 };
 struct spppkeepalivesettings50 {
 	char	ifname[IFNAMSIZ];	/* pppoe interface name */

Index: src/sys/net/if_spppsubr.c
diff -u src/sys/net/if_spppsubr.c:1.240 src/sys/net/if_spppsubr.c:1.241
--- src/sys/net/if_spppsubr.c:1.240	Fri May 14 08:31:14 2021
+++ src/sys/net/if_spppsubr.c	Fri May 14 08:41:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppsubr.c,v 1.240 2021/05/14 08:31:14 yamaguchi Exp $	 */
+/*	$NetBSD: if_spppsubr.c,v 1.241 2021/05/14 08:41:25 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.240 2021/05/14 08:31:14 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.241 2021/05/14 08:41:25 yamaguchi Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -98,6 +98,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_spppsubr.
 #endif
 
 #define DEFAULT_KEEPALIVE_INTERVAL	10	/* seconds between checks */
+#define DEFAULT_ALIVE_INTERVAL		1	/* count of sppp_keepalive */
 #define LOOPALIVECNT     		3	/* loopback detection tries */
 #define DEFAULT_MAXALIVECNT    		3	/* max. missed alive packets */
 #define	DEFAULT_NORECV_TIME		15	/* before we get worried */
@@ -111,6 +112,10 @@ __KERNEL_RCSID(0, "$NetBSD: if_spppsubr.
 #define SPPP_NORECV_TIME	DEFAULT_NORECV_TIME
 #endif
 
+#ifndef SPPP_ALIVE_INTERVAL
+#define SPPP_ALIVE_INTERVAL		DEFAULT_ALIVE_INTERVAL
+#endif
+
 /*
  * Interface flags that can be set in an ifconfig command.
  *
@@ -289,6 +294,7 @@ enum auth_role {
 static struct sppp *spppq;
 static kmutex_t *spppq_lock = NULL;
 static callout_t keepalive_ch;
+static unsigned int sppp_keepalive_cnt = 0;
 
 #define SPPPQ_LOCK()	if (spppq_lock) \
 				mutex_enter(spppq_lock);
@@ -1102,6 +1108,7 @@ sppp_attach(struct ifnet *ifp)
 	sp->pp_cpq.ifq_maxlen = 20;
 	sp->pp_loopcnt = 0;
 	sp->pp_alivecnt = 0;
+	sp->pp_alive_interval = SPPP_ALIVE_INTERVAL;
 	sp->pp_last_activity = 0;
 	sp->pp_last_receive = 0;
 	sp->pp_maxalive = DEFAULT_MAXALIVECNT;
@@ -5637,6 +5644,18 @@ sppp_keepalive(void *dummy)
 			continue;
 		}
 
+		/* No echo request */
+		if (sp->pp_alive_interval == 0) {
+			SPPP_UNLOCK(sp);
+			continue;
+		}
+
+		/* send a ECHO_REQ once in sp->pp_alive_interval times */
+		if ((sppp_keepalive_cnt % sp->pp_alive_interval) != 0) {
+			SPPP_UNLOCK(sp);
+			continue;
+		}
+
 		if (sp->pp_alivecnt >= sp->pp_maxalive) {
 			/* No keepalive packets got.  Stop the interface. */
 			sppp_wq_add(sp->wq_cp, &sp->work_ifdown);
@@ -5671,6 +5690,7 @@ sppp_keepalive(void *dummy)
 		SPPP_UNLOCK(sp);
 	}
 	splx(s);
+	sppp_keepalive_cnt++;
 	callout_reset(&keepalive_ch, hz * SPPP_KEEPALIVE_INTERVAL, sppp_keepalive, NULL);
 
 	SPPPQ_UNLOCK();
@@ -6318,6 +6338,7 @@ sppp_params(struct sppp *sp, u_long cmd,
 		SPPP_LOCK(sp, RW_READER);
 		settings->maxalive = sp->pp_maxalive;
 		settings->max_noreceive = sp->pp_max_noreceive;
+		settings->alive_interval = sp->pp_alive_interval;
 		SPPP_UNLOCK(sp);
 	    }
 	    break;
@@ -6329,6 +6350,7 @@ sppp_params(struct sppp *sp, u_long cmd,
 		SPPP_LOCK(sp, RW_WRITER);
 		sp->pp_maxalive = settings->maxalive;
 		sp->pp_max_noreceive = settings->max_noreceive;
+		sp->pp_alive_interval = settings->alive_interval;
 		SPPP_UNLOCK(sp);
 	    }
 	    break;

Index: src/sys/net/if_spppvar.h
diff -u src/sys/net/if_spppvar.h:1.37 src/sys/net/if_spppvar.h:1.38
--- src/sys/net/if_spppvar.h:1.37	Tue May 11 01:27:45 2021
+++ src/sys/net/if_spppvar.h	Fri May 14 08:41:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppvar.h,v 1.37 2021/05/11 01:27:45 yamaguchi Exp $	*/
+/*	$NetBSD: if_spppvar.h,v 1.38 2021/05/14 08:41:25 yamaguchi Exp $	*/
 
 #ifndef _NET_IF_SPPPVAR_H_
 #define _NET_IF_SPPPVAR_H_
@@ -144,6 +144,7 @@ struct sppp {
 	u_int	pp_ncpflags;	/* enable or disable each NCP */
 	u_int	pp_framebytes;	/* number of bytes added by (hardware) framing */
 	u_int   pp_alivecnt;    /* keepalive packets counter */
+	u_int	pp_alive_interval;	/* keepalive interval */
 	u_int   pp_loopcnt;     /* loopback detection counter */
 	u_int	pp_maxalive;	/* number or echo req. w/o reply */
 	uint64_t	pp_saved_mtu;	/* saved MTU value */

Reply via email to