Module Name: src
Committed By: yamaguchi
Date: Wed Nov 25 09:38:39 UTC 2020
Modified Files:
src/sys/net: if_spppsubr.c if_spppvar.h
Log Message:
call if_down() in workqueue instead of callout(9)
To generate a diff of this commit:
cvs rdiff -u -r1.198 -r1.199 src/sys/net/if_spppsubr.c
cvs rdiff -u -r1.27 -r1.28 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.198 src/sys/net/if_spppsubr.c:1.199
--- src/sys/net/if_spppsubr.c:1.198 Wed Nov 25 09:35:23 2020
+++ src/sys/net/if_spppsubr.c Wed Nov 25 09:38:39 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: if_spppsubr.c,v 1.198 2020/11/25 09:35:23 yamaguchi Exp $ */
+/* $NetBSD: if_spppsubr.c,v 1.199 2020/11/25 09:38:39 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.198 2020/11/25 09:35:23 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.199 2020/11/25 09:38:39 yamaguchi Exp $");
#if defined(_KERNEL_OPT)
#include "opt_inet.h"
@@ -341,6 +341,7 @@ static void sppp_null_event(struct sppp
static void sppp_null(struct sppp *);
static void sppp_sca_scn(const struct cp *, struct sppp *);
+static void sppp_ifdown(struct sppp *, void *);
static void sppp_lcp_init(struct sppp *);
static void sppp_lcp_up(struct sppp *, void *);
@@ -1016,6 +1017,7 @@ sppp_attach(struct ifnet *ifp)
sp->pp_phase = SPPP_PHASE_DEAD;
sp->pp_up = sppp_notify_up;
sp->pp_down = sppp_notify_down;
+ sppp_wq_set(&sp->work_ifdown, sppp_ifdown, NULL);
memset(sp->scp, 0, sizeof(sp->scp));
rw_init(&sp->pp_lock);
@@ -5486,11 +5488,7 @@ sppp_keepalive(void *dummy)
if (sp->pp_alivecnt >= sp->pp_maxalive) {
/* No keepalive packets got. Stop the interface. */
- SPPP_UNLOCK(sp);
- if_down (ifp);
- SPPP_LOCK(sp, RW_WRITER);
-
- IF_PURGE(&sp->pp_cpq);
+ sppp_wq_add(sp->wq_cp, &sp->work_ifdown);
if (! (sp->pp_flags & PP_CISCO)) {
printf("%s: LCP keepalive timed out, going to restart the connection\n",
@@ -6498,6 +6496,17 @@ sppp_sca_scn(const struct cp *cp, struct
kmem_free(buf, blen);
}
}
+
+static void
+sppp_ifdown(struct sppp *sp, void *xcp __unused)
+{
+
+ SPPP_UNLOCK(sp);
+ if_down(&sp->pp_if);
+ IF_PURGE(&sp->pp_cpq);
+ SPPP_LOCK(sp, RW_WRITER);
+}
+
/*
* This file is large. Tell emacs to highlight it nevertheless.
*
Index: src/sys/net/if_spppvar.h
diff -u src/sys/net/if_spppvar.h:1.27 src/sys/net/if_spppvar.h:1.28
--- src/sys/net/if_spppvar.h:1.27 Wed Nov 25 09:35:23 2020
+++ src/sys/net/if_spppvar.h Wed Nov 25 09:38:39 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: if_spppvar.h,v 1.27 2020/11/25 09:35:23 yamaguchi Exp $ */
+/* $NetBSD: if_spppvar.h,v 1.28 2020/11/25 09:38:39 yamaguchi Exp $ */
#ifndef _NET_IF_SPPPVAR_H_
#define _NET_IF_SPPPVAR_H_
@@ -160,6 +160,7 @@ struct sppp {
struct callout_handle pap_my_to_ch; /* PAP needs one more... */
#endif
struct workqueue *wq_cp;
+ struct sppp_work work_ifdown;
struct sppp_cp scp[IDX_COUNT];
struct slcp lcp; /* LCP params */
struct sipcp ipcp; /* IPCP params */