Module Name:    src
Committed By:   yamaguchi
Date:           Wed Nov 25 09:55:02 UTC 2020

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

Log Message:
Simplify commonly used functions

reviewed by [email protected].


To generate a diff of this commit:
cvs rdiff -u -r1.201 -r1.202 src/sys/net/if_spppsubr.c

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.201 src/sys/net/if_spppsubr.c:1.202
--- src/sys/net/if_spppsubr.c:1.201	Wed Nov 25 09:46:05 2020
+++ src/sys/net/if_spppsubr.c	Wed Nov 25 09:55:01 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppsubr.c,v 1.201 2020/11/25 09:46:05 yamaguchi Exp $	 */
+/*	$NetBSD: if_spppsubr.c,v 1.202 2020/11/25 09:55:01 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.201 2020/11/25 09:46:05 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.202 2020/11/25 09:55:01 yamaguchi Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -102,9 +102,6 @@ __KERNEL_RCSID(0, "$NetBSD: if_spppsubr.
 #define	DEFAULT_NORECV_TIME		15	/* before we get worried */
 #define DEFAULT_MAX_AUTH_FAILURES	5	/* max. auth. failures */
 
-#define FAILMSG "Failed..."
-#define SUCCMSG "Welcome!"
-
 /*
  * Interface flags that can be set in an ifconfig command.
  *
@@ -249,11 +246,11 @@ struct cp {
 	void	(*RCN_rej)(struct sppp *, struct lcp_header *, int);
 	void	(*RCN_nak)(struct sppp *, struct lcp_header *, int);
 	/* actions */
-	void	(*tlu)(struct sppp *sp);
-	void	(*tld)(struct sppp *sp);
-	void	(*tls)(struct sppp *sp);
-	void	(*tlf)(struct sppp *sp);
-	void	(*scr)(struct sppp *sp);
+	void	(*tlu)(struct sppp *);
+	void	(*tld)(struct sppp *);
+	void	(*tls)(const struct cp *, struct sppp *);
+	void	(*tlf)(const struct cp *, struct sppp *);
+	void	(*scr)(struct sppp *);
 	void	(*scan)(const struct cp *, struct sppp *);
 };
 
@@ -335,7 +332,8 @@ static void sppp_cp_to_ipv6cp(void *);
 static void sppp_auth_send(const struct cp *, struct sppp *,
 			    unsigned int, unsigned int, ...);
 static int sppp_auth_role(const struct cp *, struct sppp *);
-static void sppp_auth_to_event(const struct cp *, struct sppp *);
+static void sppp_auth_to_event(struct sppp *, void *);
+static void sppp_auth_sca_scn(const struct cp *, struct sppp *);
 
 static void sppp_up_event(struct sppp *, void *);
 static void sppp_down_event(struct sppp *, void *);
@@ -350,6 +348,8 @@ static void sppp_rta_event(struct sppp *
 static void sppp_rxj_event(struct sppp *, void *);
 
 static void sppp_null(struct sppp *);
+static void sppp_tls(const struct cp *, struct sppp *);
+static void sppp_tlf(const struct cp *, struct sppp *);
 static void sppp_sca_scn(const struct cp *, struct sppp *);
 static void sppp_ifdown(struct sppp *, void *);
 
@@ -357,76 +357,45 @@ static void sppp_lcp_init(struct sppp *)
 static void sppp_lcp_up(struct sppp *, void *);
 static void sppp_lcp_down(struct sppp *, void *);
 static void sppp_lcp_open(struct sppp *, void *);
-static void sppp_lcp_close(struct sppp *, void *);
-static void sppp_lcp_TO(struct sppp *, void *);
 static int sppp_lcp_RCR(struct sppp *, struct lcp_header *, int);
 static void sppp_lcp_RCN_rej(struct sppp *, struct lcp_header *, int);
 static void sppp_lcp_RCN_nak(struct sppp *, struct lcp_header *, int);
 static void sppp_lcp_tlu(struct sppp *);
 static void sppp_lcp_tld(struct sppp *);
-static void sppp_lcp_tls(struct sppp *);
-static void sppp_lcp_tlf(struct sppp *);
+static void sppp_lcp_tls(const struct cp *, struct sppp *);
+static void sppp_lcp_tlf(const struct cp *, struct sppp *);
 static void sppp_lcp_scr(struct sppp *);
 static void sppp_lcp_check_and_close(struct sppp *);
-static int sppp_ncp_check(struct sppp *);
-static int sppp_auth_check(struct sppp *);
+static int sppp_cp_check(struct sppp *, u_char);
 
 static void sppp_ipcp_init(struct sppp *);
-static void sppp_ipcp_up(struct sppp *, void *);
-static void sppp_ipcp_down(struct sppp *, void *);
 static void sppp_ipcp_open(struct sppp *, void *);
 static void sppp_ipcp_close(struct sppp *, void *);
-static void sppp_ipcp_TO(struct sppp *, void *);
 static int sppp_ipcp_RCR(struct sppp *, struct lcp_header *, int);
 static void sppp_ipcp_RCN_rej(struct sppp *, struct lcp_header *, int);
 static void sppp_ipcp_RCN_nak(struct sppp *, struct lcp_header *, int);
 static void sppp_ipcp_tlu(struct sppp *);
-static void sppp_ipcp_tld(struct sppp *);
-static void sppp_ipcp_tls(struct sppp *);
-static void sppp_ipcp_tlf(struct sppp *);
 static void sppp_ipcp_scr(struct sppp *);
 
 static void sppp_ipv6cp_init(struct sppp *);
-static void sppp_ipv6cp_up(struct sppp *, void *);
-static void sppp_ipv6cp_down(struct sppp *, void *);
 static void sppp_ipv6cp_open(struct sppp *, void *);
-static void sppp_ipv6cp_close(struct sppp *, void *);
-static void sppp_ipv6cp_TO(struct sppp *, void *);
 static int sppp_ipv6cp_RCR(struct sppp *, struct lcp_header *, int);
 static void sppp_ipv6cp_RCN_rej(struct sppp *, struct lcp_header *, int);
 static void sppp_ipv6cp_RCN_nak(struct sppp *, struct lcp_header *, int);
 static void sppp_ipv6cp_tlu(struct sppp *);
-static void sppp_ipv6cp_tld(struct sppp *);
-static void sppp_ipv6cp_tls(struct sppp *);
-static void sppp_ipv6cp_tlf(struct sppp *);
 static void sppp_ipv6cp_scr(struct sppp *);
 
 static void sppp_pap_input(struct sppp *, struct mbuf *);
 static void sppp_pap_init(struct sppp *);
-static void sppp_pap_up(struct sppp *, void *);
-static void sppp_pap_down(struct sppp *, void *);
-static void sppp_pap_open(struct sppp *, void *);
-static void sppp_pap_close(struct sppp *, void *);
-static void sppp_pap_TO(struct sppp *, void *);
-static void sppp_pap_tls(struct sppp *);
-static void sppp_pap_tlf(struct sppp *);
 static void sppp_pap_tlu(struct sppp *);
 static void sppp_pap_scr(struct sppp *);
 static void sppp_pap_scr(struct sppp *);
-static void sppp_pap_scan(const struct cp *, struct sppp *);
 
 static void sppp_chap_input(struct sppp *, struct mbuf *);
 static void sppp_chap_init(struct sppp *);
-static void sppp_chap_up(struct sppp *, void *);
-static void sppp_chap_down(struct sppp *, void *);
 static void sppp_chap_open(struct sppp *, void *);
-static void sppp_chap_close(struct sppp *, void *);
-static void sppp_chap_TO(struct sppp *, void *);
 static void sppp_chap_tlu(struct sppp *);
-static void sppp_chap_tls(struct sppp *);
-static void sppp_chap_tlf(struct sppp *);
 static void sppp_chap_scr(struct sppp *);
-static void sppp_chap_scan(const struct cp *, struct sppp *);
 static void sppp_chap_rcv_challenge_event(struct sppp *, void *);
 
 static const char *sppp_auth_type_name(u_short, u_char);
@@ -478,8 +447,8 @@ static void sppp_notify_chg_wlocked(stru
 /* our control protocol descriptors */
 static const struct cp lcp = {
 	PPP_LCP, IDX_LCP, CP_LCP, "lcp",
-	sppp_lcp_up, sppp_lcp_down, sppp_lcp_open, sppp_lcp_close,
-	sppp_lcp_TO, sppp_lcp_RCR, sppp_lcp_RCN_rej, sppp_lcp_RCN_nak,
+	sppp_lcp_up, sppp_lcp_down, sppp_lcp_open, sppp_close_event,
+	sppp_to_event, sppp_lcp_RCR, sppp_lcp_RCN_rej, sppp_lcp_RCN_nak,
 	sppp_lcp_tlu, sppp_lcp_tld, sppp_lcp_tls, sppp_lcp_tlf,
 	sppp_lcp_scr, sppp_sca_scn
 };
@@ -492,9 +461,9 @@ static const struct cp ipcp = {
 	0,
 #endif
 	"ipcp",
-	sppp_ipcp_up, sppp_ipcp_down, sppp_ipcp_open, sppp_ipcp_close,
-	sppp_ipcp_TO, sppp_ipcp_RCR, sppp_ipcp_RCN_rej, sppp_ipcp_RCN_nak,
-	sppp_ipcp_tlu, sppp_ipcp_tld, sppp_ipcp_tls, sppp_ipcp_tlf,
+	sppp_up_event, sppp_down_event, sppp_ipcp_open, sppp_ipcp_close,
+	sppp_to_event, sppp_ipcp_RCR, sppp_ipcp_RCN_rej, sppp_ipcp_RCN_nak,
+	sppp_ipcp_tlu, sppp_null, sppp_tls, sppp_tlf,
 	sppp_ipcp_scr, sppp_sca_scn
 };
 
@@ -506,26 +475,26 @@ static const struct cp ipv6cp = {
 	0,
 #endif
 	"ipv6cp",
-	sppp_ipv6cp_up, sppp_ipv6cp_down, sppp_ipv6cp_open, sppp_ipv6cp_close,
-	sppp_ipv6cp_TO, sppp_ipv6cp_RCR, sppp_ipv6cp_RCN_rej, sppp_ipv6cp_RCN_nak,
-	sppp_ipv6cp_tlu, sppp_ipv6cp_tld, sppp_ipv6cp_tls, sppp_ipv6cp_tlf,
+	sppp_up_event, sppp_down_event, sppp_ipv6cp_open, sppp_close_event,
+	sppp_to_event, sppp_ipv6cp_RCR, sppp_ipv6cp_RCN_rej, sppp_ipv6cp_RCN_nak,
+	sppp_ipv6cp_tlu, sppp_null, sppp_tls, sppp_tlf,
 	sppp_ipv6cp_scr, sppp_sca_scn
 };
 
 static const struct cp pap = {
 	PPP_PAP, IDX_PAP, CP_AUTH, "pap",
-	sppp_pap_up, sppp_pap_down, sppp_pap_open, sppp_pap_close,
-	sppp_pap_TO, 0, 0, 0,
-	sppp_pap_tlu, sppp_null, sppp_pap_tls, sppp_pap_tlf,
-	sppp_pap_scr, sppp_pap_scan
+	sppp_up_event, sppp_down_event, sppp_open_event, sppp_close_event,
+	sppp_to_event, 0, 0, 0,
+	sppp_pap_tlu, sppp_null, sppp_tls, sppp_tlf,
+	sppp_pap_scr, sppp_auth_sca_scn
 };
 
 static const struct cp chap = {
 	PPP_CHAP, IDX_CHAP, CP_AUTH, "chap",
-	sppp_chap_up, sppp_chap_down, sppp_chap_open, sppp_chap_close,
-	sppp_chap_TO, 0, 0, 0,
-	sppp_chap_tlu, sppp_null, sppp_chap_tls, sppp_chap_tlf,
-	sppp_chap_scr, sppp_chap_scan
+	sppp_up_event, sppp_down_event, sppp_chap_open, sppp_close_event,
+	sppp_auth_to_event, 0, 0, 0,
+	sppp_chap_tlu, sppp_null, sppp_tls, sppp_tlf,
+	sppp_chap_scr, sppp_auth_sca_scn
 };
 
 static const struct cp *cps[IDX_COUNT] = {
@@ -1163,7 +1132,7 @@ sppp_dequeue(struct ifnet *ifp)
 	 */
 	IF_DEQUEUE(&sp->pp_cpq, m);
 	if (m == NULL &&
-	    (sppp_ncp_check(sp) || (sp->pp_flags & PP_CISCO) != 0)) {
+	    (sppp_cp_check(sp, CP_NCP) || (sp->pp_flags & PP_CISCO) != 0)) {
 		IF_DEQUEUE(&sp->pp_fastq, m);
 		if (m == NULL)
 			IFQ_DEQUEUE(&sp->pp_if.if_snd, m);
@@ -1665,7 +1634,7 @@ sppp_cp_input(const struct cp *cp, struc
 		if (rv < 0) {
 			/* fatal error, shut down */
 			(cp->tld)(sp);
-			sppp_lcp_tlf(sp);
+			lcp.tlf(&lcp, sp);
 			SPPP_UNLOCK(sp);
 			return;
 		}
@@ -1900,7 +1869,7 @@ sppp_down_event(struct sppp *sp, void *x
 		sppp_cp_change_state(cp, sp, STATE_INITIAL);
 		break;
 	case STATE_STOPPED:
-		(cp->tls)(sp);
+		(cp->tls)(cp, sp);
 		/* fall through */
 	case STATE_STOPPING:
 	case STATE_REQ_SENT:
@@ -1940,7 +1909,7 @@ sppp_open_event(struct sppp *sp, void *x
 	switch (sp->scp[cp->protoidx].state) {
 	case STATE_INITIAL:
 		sppp_cp_change_state(cp, sp, STATE_STARTING);
-		(cp->tls)(sp);
+		(cp->tls)(cp, sp);
 		break;
 	case STATE_STARTING:
 		break;
@@ -1987,7 +1956,7 @@ sppp_close_event(struct sppp *sp, void *
 		break;
 	case STATE_STARTING:
 		sppp_cp_change_state(cp, sp, STATE_INITIAL);
-		(cp->tlf)(sp);
+		(cp->tlf)(cp, sp);
 		break;
 	case STATE_STOPPED:
 		sppp_cp_change_state(cp, sp, STATE_CLOSED);
@@ -2033,17 +2002,17 @@ sppp_to_event(struct sppp *sp, void *xcp
 		switch (sp->scp[cp->protoidx].state) {
 		case STATE_CLOSING:
 			sppp_cp_change_state(cp, sp, STATE_CLOSED);
-			(cp->tlf)(sp);
+			(cp->tlf)(cp, sp);
 			break;
 		case STATE_STOPPING:
 			sppp_cp_change_state(cp, sp, STATE_STOPPED);
-			(cp->tlf)(sp);
+			(cp->tlf)(cp, sp);
 			break;
 		case STATE_REQ_SENT:
 		case STATE_ACK_RCVD:
 		case STATE_ACK_SENT:
 			sppp_cp_change_state(cp, sp, STATE_STOPPED);
-			(cp->tlf)(sp);
+			(cp->tlf)(cp, sp);
 			break;
 		}
 	else
@@ -2315,11 +2284,11 @@ sppp_rta_event(struct sppp *sp, void *xc
 		break;
 	case STATE_CLOSING:
 		sppp_cp_change_state(cp, sp, STATE_CLOSED);
-		(cp->tlf)(sp);
+		(cp->tlf)(cp, sp);
 		break;
 	case STATE_STOPPING:
 		sppp_cp_change_state(cp, sp, STATE_STOPPED);
-		(cp->tlf)(sp);
+		(cp->tlf)(cp, sp);
 		break;
 	case STATE_ACK_RCVD:
 		sppp_cp_change_state(cp, sp, STATE_REQ_SENT);
@@ -2470,10 +2439,13 @@ sppp_lcp_up(struct sppp *sp, void *xcp)
 static void
 sppp_lcp_down(struct sppp *sp, void *xcp)
 {
+	const struct cp *cp = xcp;
+	int pidx;
 	STDDCL;
 
 	KASSERT(SPPP_WLOCKED(sp));
 
+	pidx = cp->protoidx;
 	sppp_down_event(sp, xcp);
 
 	/*
@@ -2500,12 +2472,11 @@ sppp_lcp_down(struct sppp *sp, void *xcp
 			    "%s: Down event (carrier loss)\n",
 			    ifp->if_xname);
 	}
-	sp->scp[IDX_LCP].fail_counter = 0;
+	sp->scp[pidx].fail_counter = 0;
 	sp->pp_flags &= ~PP_CALLIN;
-	if (sp->scp[IDX_LCP].state != STATE_INITIAL)
+	if (sp->scp[pidx].state != STATE_INITIAL)
 		sppp_wq_add(sp->wq_cp, &sp->scp[IDX_LCP].work_close);
 	ifp->if_flags &= ~IFF_RUNNING;
-
 }
 
 static void
@@ -2534,21 +2505,6 @@ sppp_lcp_open(struct sppp *sp, void *xcp
 	sppp_open_event(sp, xcp);
 }
 
-static void
-sppp_lcp_close(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_close_event(sp, xcp);
-}
-
-static void
-sppp_lcp_TO(struct sppp *sp, void *xcp)
-{
-
-	sppp_to_event(sp, xcp);
-}
-
 /*
  * Analyze a configure request.  Return true if it was agreeable, and
  * caused action sca, false if it has been rejected or nak'ed, and
@@ -3149,7 +3105,7 @@ sppp_lcp_tld(struct sppp *sp)
 }
 
 static void
-sppp_lcp_tls(struct sppp *sp)
+sppp_lcp_tls(const struct cp *cp __unused, struct sppp *sp)
 {
 
 	KASSERT(SPPP_WLOCKED(sp));
@@ -3171,7 +3127,7 @@ sppp_lcp_tls(struct sppp *sp)
 }
 
 static void
-sppp_lcp_tlf(struct sppp *sp)
+sppp_lcp_tlf(const struct cp *cp __unused, struct sppp *sp)
 {
 
 	KASSERT(SPPP_WLOCKED(sp));
@@ -3226,24 +3182,14 @@ sppp_lcp_scr(struct sppp *sp)
 /*
  * Check the open NCPs, return true if at least one NCP is open.
  */
-static int
-sppp_ncp_check(struct sppp *sp)
-{
-	int i, mask;
-
-	for (i = 0, mask = 1; i < IDX_COUNT; i++, mask <<= 1)
-		if ((sp->lcp.protos & mask) && (cps[i])->flags & CP_NCP)
-			return 1;
-	return 0;
-}
 
 static int
-sppp_auth_check(struct sppp *sp)
+sppp_cp_check(struct sppp *sp, u_char cp_flags)
 {
 	int i, mask;
 
 	for (i = 0, mask = 1; i < IDX_COUNT; i++, mask <<= 1)
-		if ((sp->lcp.protos & mask) && (cps[i])->flags & CP_AUTH)
+		if ((sp->lcp.protos & mask) && (cps[i])->flags & cp_flags)
 			return 1;
 	return 0;
 }
@@ -3264,33 +3210,16 @@ sppp_lcp_check_and_close(struct sppp *sp
 	}
 
 	if (sp->pp_phase == SPPP_PHASE_AUTHENTICATE &&
-	    sppp_auth_check(sp))
+	    sppp_cp_check(sp, CP_AUTH))
 		return;
 
 	if (sp->pp_phase >= SPPP_PHASE_NETWORK &&
-	    sppp_ncp_check(sp))
+	    sppp_cp_check(sp, CP_NCP))
 		return;
 
 	sppp_wq_add(sp->wq_cp, &sp->scp[IDX_LCP].work_close);
 }
 
-static void
-sppp_lcp_uls(const struct cp *cp, struct sppp *sp)
-{
-
-	sp->lcp.protos |= (1 << cp->protoidx);
-	if (sp->scp[IDX_LCP].state == STATE_OPENED)
-		sppp_wq_add(sp->wq_cp, &sp->scp[cp->protoidx].work_up);
-}
-
-static void
-sppp_lcp_ulf(const struct cp *cp, struct sppp *sp)
-{
-
-	sp->lcp.protos &= ~(1 << cp->protoidx);
-	sppp_lcp_check_and_close(sp);
-}
-
 /*
  *--------------------------------------------------------------------------*
  *                                                                          *
@@ -3325,20 +3254,6 @@ sppp_ipcp_init(struct sppp *sp)
 }
 
 static void
-sppp_ipcp_up(struct sppp *sp, void *xcp)
-{
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_up_event(sp, xcp);
-}
-
-static void
-sppp_ipcp_down(struct sppp *sp, void *xcp)
-{
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_down_event(sp, xcp);
-}
-
-static void
 sppp_ipcp_open(struct sppp *sp, void *xcp)
 {
 	STDDCL;
@@ -3405,13 +3320,6 @@ sppp_ipcp_close(struct sppp *sp, void *x
 #endif
 }
 
-static void
-sppp_ipcp_TO(struct sppp *sp, void *xcp)
-{
-
-	sppp_to_event(sp, xcp);
-}
-
 /*
  * Analyze a configure request.  Return true if it was agreeable, and
  * caused action sca, false if it has been rejected or nak'ed, and
@@ -3802,29 +3710,6 @@ sppp_ipcp_tlu(struct sppp *sp)
 }
 
 static void
-sppp_ipcp_tld(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-}
-
-static void
-sppp_ipcp_tls(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_lcp_uls(&ipcp, sp);
-}
-
-static void
-sppp_ipcp_tlf(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_lcp_ulf(&ipcp, sp);
-}
-
-static void
 sppp_ipcp_scr(struct sppp *sp)
 {
 	uint8_t opt[6 /* compression */ + 6 /* address */ + 12 /* dns addresses */];
@@ -3908,22 +3793,6 @@ sppp_ipv6cp_init(struct sppp *sp)
 }
 
 static void
-sppp_ipv6cp_up(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_up_event(sp, xcp);
-}
-
-static void
-sppp_ipv6cp_down(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_down_event(sp, xcp);
-}
-
-static void
 sppp_ipv6cp_open(struct sppp *sp, void *xcp)
 {
 	STDDCL;
@@ -3957,21 +3826,6 @@ sppp_ipv6cp_open(struct sppp *sp, void *
 	sppp_open_event(sp, xcp);
 }
 
-static void
-sppp_ipv6cp_close(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_close_event(sp, xcp);
-}
-
-static void
-sppp_ipv6cp_TO(struct sppp *sp, void *xcp)
-{
-
-	sppp_to_event(sp, xcp);
-}
-
 /*
  * Analyze a configure request.  Return true if it was agreeable, and
  * caused action sca, false if it has been rejected or nak'ed, and
@@ -4369,29 +4223,6 @@ sppp_ipv6cp_tlu(struct sppp *sp)
 }
 
 static void
-sppp_ipv6cp_tld(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-}
-
-static void
-sppp_ipv6cp_tls(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_lcp_uls(&ipv6cp, sp);
-}
-
-static void
-sppp_ipv6cp_tlf(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_lcp_ulf(&ipv6cp, sp);
-}
-
-static void
 sppp_ipv6cp_scr(struct sppp *sp)
 {
 	char opt[10 /* ifid */ + 4 /* compression, minimum */];
@@ -4430,35 +4261,7 @@ sppp_ipv6cp_init(struct sppp *sp)
 }
 
 static void
-sppp_ipv6cp_up(struct sppp *sp, void *xcp __unused)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-}
-
-static void
-sppp_ipv6cp_down(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-}
-
-static void
-sppp_ipv6cp_open(struct sppp *sp, void *xcp __unused)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-}
-
-static void
-sppp_ipv6cp_close(struct sppp *sp, void *xcp __unused)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-}
-
-static void
-sppp_ipv6cp_TO(struct sppp *sp, void *xcp __unused)
+sppp_ipv6cp_open(struct sppp *sp, void *xcp)
 {
 
 	KASSERT(SPPP_WLOCKED(sp));
@@ -4497,27 +4300,6 @@ sppp_ipv6cp_tlu(struct sppp *sp)
 }
 
 static void
-sppp_ipv6cp_tld(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-}
-
-static void
-sppp_ipv6cp_tls(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-}
-
-static void
-sppp_ipv6cp_tlf(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-}
-
-static void
 sppp_ipv6cp_scr(struct sppp *sp)
 {
 
@@ -4861,22 +4643,6 @@ sppp_chap_init(struct sppp *sp)
 }
 
 static void
-sppp_chap_up(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_up_event(sp, xcp);
-}
-
-static void
-sppp_chap_down(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_down_event(sp, xcp);
-}
-
-static void
 sppp_chap_open(struct sppp *sp, void *xcp)
 {
 
@@ -4890,22 +4656,6 @@ sppp_chap_open(struct sppp *sp, void *xc
 }
 
 static void
-sppp_chap_close(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_close_event(sp, xcp);
-}
-
-static void
-sppp_chap_TO(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_auth_to_event(xcp, sp);
-}
-
-static void
 sppp_chap_tlu(struct sppp *sp)
 {
 	STDDCL;
@@ -4953,27 +4703,6 @@ sppp_chap_tlu(struct sppp *sp)
 }
 
 static void
-sppp_chap_tls(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_lcp_uls(&chap, sp);
-}
-
-static void
-sppp_chap_tlf(struct sppp *sp)
-{
-	STDDCL;
-
-	KASSERT(SPPP_WLOCKED(sp));
-
-	if (debug)
-		log(LOG_DEBUG, "%s: chap tlf\n", ifp->if_xname);
-
-	sppp_lcp_ulf(&chap, sp);
-}
-
-static void
 sppp_chap_scr(struct sppp *sp)
 {
 	uint32_t *ch;
@@ -5012,39 +4741,6 @@ sppp_chap_scr(struct sppp *sp)
 }
 
 static void
-sppp_chap_scan(const struct cp *cp __unused, struct sppp *sp)
-{
-	u_char type, rconfid, mlen;
-	const char *msg;
-
-	if (!ISSET(sppp_auth_role(&chap, sp), SPPP_AUTH_SERV))
-		return;
-
-	rconfid = sp->scp[IDX_CHAP].rconfid;
-	if (sp->scp[IDX_CHAP].rcr_type == CONF_ACK) {
-		type = CHAP_SUCCESS;
-		msg = SUCCMSG;
-		mlen = sizeof(SUCCMSG) - 1;
-	} else {
-		type = CHAP_FAILURE;
-		msg = FAILMSG;
-		mlen = sizeof(FAILMSG) - 1;
-	}
-
-	sppp_auth_send(&chap, sp, type, rconfid,
-	   mlen, (const u_char *)msg, 0);
-	sp->chap.response_rcvd = true;
-
-	if (type == CHAP_SUCCESS) {
-		sp->pp_auth_failures = 0;
-	} else {
-		sp->pp_auth_failures++;
-		/* shutdown LCP if auth failed */
-		sppp_wq_add(sp->wq_cp, &sp->scp[IDX_LCP].work_close);
-	}
-}
-
-static void
 sppp_chap_rcv_challenge_event(struct sppp *sp, void *xcp)
 {
 	const struct cp *cp = xcp;
@@ -5276,58 +4972,6 @@ sppp_pap_init(struct sppp *sp)
 }
 
 static void
-sppp_pap_up(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_up_event(sp, xcp);
-}
-
-static void
-sppp_pap_down(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_down_event(sp, xcp);
-}
-
-static void
-sppp_pap_open(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_open_event(sp, xcp);
-}
-
-static void
-sppp_pap_close(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_close_event(sp, xcp);
-}
-
-static void
-sppp_pap_tls(struct sppp *sp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_lcp_uls(&pap, sp);
-}
-
-static void
-sppp_pap_tlf(struct sppp *sp)
-{
-	STDDCL;
-
-	KASSERT(SPPP_WLOCKED(sp));
-
-	if (debug)
-		log(LOG_DEBUG, "%s: pap tlf\n", ifp->if_xname);
-	sppp_lcp_ulf(&pap, sp);
-}
-
-static void
 sppp_pap_tlu(struct sppp *sp)
 {
 	STDDCL;
@@ -5343,19 +4987,8 @@ sppp_pap_tlu(struct sppp *sp)
 	sp->pp_auth_failures = 0;
 	splx(x);
 
-	sppp_phase_network(sp);
-}
-
-/*
- * That's the timeout routine if we are authenticator.  Since the
- * authenticator is basically passive in PAP, we can't do much here.
- */
-static void
-sppp_pap_TO(struct sppp *sp, void *xcp)
-{
-
-	KASSERT(SPPP_WLOCKED(sp));
-	sppp_auth_to_event(xcp, sp);
+	if (sp->pp_phase < SPPP_PHASE_NETWORK)
+		sppp_phase_network(sp);
 }
 
 static void
@@ -5386,38 +5019,6 @@ sppp_pap_scr(struct sppp *sp)
 	}
 }
 
-static void
-sppp_pap_scan(const struct cp *cp __unused, struct sppp *sp)
-{
-	u_char type, rconfid, mlen;
-	const char *msg;
-
-	if (!ISSET(sppp_auth_role(&pap, sp), SPPP_AUTH_SERV))
-		return;
-
-	rconfid = sp->scp[IDX_PAP].rconfid;
-	if (sp->scp[IDX_PAP].rcr_type == CONF_ACK) {
-		type = PAP_ACK;
-		msg = SUCCMSG;
-		mlen = sizeof(SUCCMSG) - 1;
-	} else {
-		type = PAP_NAK;
-		msg = FAILMSG;
-		mlen = sizeof(FAILMSG) - 1;
-	}
-
-	sppp_auth_send(&pap, sp, type, rconfid,
-	   mlen, (const u_char *)msg, 0);
-
-	if (type == PAP_ACK) {
-		sp->pp_auth_failures = 0;
-	} else {
-		sp->pp_auth_failures++;
-		/* shutdown LCP if auth failed */
-		sppp_wq_add(sp->wq_cp, &sp->scp[IDX_LCP].work_close);
-	}
-}
-
 /*
  * Random miscellaneous functions.
  */
@@ -5539,11 +5140,12 @@ sppp_auth_role(const struct cp *cp, stru
 }
 
 static void
-sppp_auth_to_event(const struct cp *cp, struct sppp *sp)
+sppp_auth_to_event(struct sppp *sp, void *xcp)
 {
-	STDDCL;
+	const struct cp *cp = xcp;
 	bool override;
 	int state;
+	STDDCL;
 
 	KASSERT(SPPP_WLOCKED(sp));
 
@@ -5579,8 +5181,43 @@ sppp_auth_to_event(const struct cp *cp, 
 			    sp->scp[cp->protoidx].rst_counter);
 		sp->scp[cp->protoidx].rst_counter--;
 	} else {
-		sppp_to_event(sp, __UNCONST(cp));
+		sppp_to_event(sp, xcp);
+	}
+}
+
+static void
+sppp_auth_sca_scn(const struct cp *cp, struct sppp *sp)
+{
+	static const char *succmsg = "Welcome!";
+	static const char *failmsg = "Failed...";
+	const char *msg;
+	u_char type, rconfid, mlen;
+
+	KASSERT(SPPP_WLOCKED(sp));
+
+	if (!ISSET(sppp_auth_role(cp, sp), SPPP_AUTH_SERV))
+		return;
+
+	rconfid = sp->scp[cp->protoidx].rconfid;
+
+	if (sp->scp[cp->protoidx].rcr_type == CONF_ACK) {
+		type = cp->proto == PPP_CHAP ? CHAP_SUCCESS : PAP_ACK;
+		msg = succmsg;
+		mlen = sizeof(succmsg) - 1;
+
+		sp->pp_auth_failures = 0;
+	} else {
+		type = cp->proto == PPP_CHAP ? CHAP_FAILURE : PAP_NAK;
+		msg = failmsg;
+		mlen = sizeof(failmsg) - 1;
+
+		/* shutdown LCP if auth failed */
+		sppp_wq_add(sp->wq_cp, &sp->scp[IDX_LCP].work_close);
+		sp->pp_auth_failures++;
 	}
+
+	sppp_auth_send(cp, sp, type, rconfid,
+	   mlen, (const u_char *)msg, 0);
 }
 
 /*
@@ -6288,7 +5925,7 @@ sppp_params(struct sppp *sp, u_long cmd,
 
 		SPPP_LOCK(sp, RW_READER);
 		status->phase = sp->pp_phase;
-		status->ncpup = sppp_ncp_check(sp);
+		status->ncpup = sppp_cp_check(sp, CP_NCP);
 		SPPP_UNLOCK(sp);
 	    }
 	    break;
@@ -6398,7 +6035,6 @@ static void
 sppp_phase_network(struct sppp *sp)
 {
 	int i;
-	uint32_t mask;
 
 	KASSERT(SPPP_WLOCKED(sp));
 
@@ -6408,18 +6044,8 @@ sppp_phase_network(struct sppp *sp)
 	for (i = 0; i < IDX_COUNT; i++)
 		if ((cps[i])->flags & CP_NCP)
 			sppp_wq_add(sp->wq_cp, &sp->scp[i].work_open);
-
-	/* Send Up events to all NCPs. */
-	for (i = 0, mask = 1; i < IDX_COUNT; i++, mask <<= 1)
-		if ((sp->lcp.protos & mask) && ((cps[i])->flags & CP_NCP)) {
-			sppp_wq_add(sp->wq_cp, &sp->scp[i].work_up);
-		}
-
-	/* if no NCP is starting, all this was in vain, close down */
-	sppp_lcp_check_and_close(sp);
 }
 
-
 static const char *
 sppp_cp_type_name(u_char type)
 {
@@ -6617,6 +6243,41 @@ sppp_null(struct sppp *unused)
 }
 
 static void
+sppp_tls(const struct cp *cp, struct sppp *sp)
+{
+
+	/* notify lcp that is lower layer */
+	sp->lcp.protos |= (1 << cp->protoidx);
+
+	if (sp->scp[IDX_LCP].state == STATE_OPENED)
+		sppp_wq_add(sp->wq_cp, &sp->scp[cp->protoidx].work_up);
+}
+
+static void
+sppp_tlf(const struct cp *cp, struct sppp *sp)
+{
+	STDDCL;
+
+	if (debug)
+		log(LOG_DEBUG, "%s: %s tlf\n", ifp->if_xname, cp->name);
+
+	/* notify lcp that is lower layer */
+	sp->lcp.protos &= ~(1 << cp->protoidx);
+
+	/* cleanup */
+	if (sp->scp[cp->protoidx].rcr_buf != NULL) {
+		kmem_free(sp->scp[cp->protoidx].rcr_buf,
+		    sp->scp[cp->protoidx].rcr_blen);
+	}
+
+	sp->scp[cp->protoidx].rcr_buf = NULL;
+	sp->scp[cp->protoidx].rcr_blen = 0;
+	sp->scp[cp->protoidx].rcr_rlen = 0;
+
+	sppp_lcp_check_and_close(sp);
+}
+
+static void
 sppp_sca_scn(const struct cp *cp, struct sppp *sp)
 {
 	STDDCL;

Reply via email to