Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/net Change a state of control protocol in thread context



details:   https://anonhg.NetBSD.org/src/rev/930d498684d3
branches:  trunk
changeset: 946375:930d498684d3
user:      yamaguchi <yamaguchi%NetBSD.org@localhost>
date:      Wed Nov 25 09:35:23 2020 +0000

description:
Change a state of control protocol in thread context

reviewed by knakahara@n.o.

diffstat:

 sys/net/if_spppsubr.c |  521 +++++++++++++++++++++++++++++++++----------------
 sys/net/if_spppvar.h  |   27 ++-
 2 files changed, 373 insertions(+), 175 deletions(-)

diffs (truncated from 1244 to 300 lines):

diff -r 14c7f06ee969 -r 930d498684d3 sys/net/if_spppsubr.c
--- a/sys/net/if_spppsubr.c     Wed Nov 25 09:30:49 2020 +0000
+++ b/sys/net/if_spppsubr.c     Wed Nov 25 09:35:23 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_spppsubr.c,v 1.197 2020/11/25 09:30:49 yamaguchi Exp $       */
+/*     $NetBSD: if_spppsubr.c,v 1.198 2020/11/25 09:35: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.197 2020/11/25 09:30:49 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.198 2020/11/25 09:35:23 yamaguchi Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -237,11 +237,11 @@
 #define CP_QUAL                0x08    /* this is a quality reporting protocol */
        const char *name;       /* name of this control protocol */
        /* event handlers */
-       void    (*Up)(struct sppp *);
-       void    (*Down)(struct sppp *);
-       void    (*Open)(struct sppp *);
-       void    (*Close)(struct sppp *);
-       void    (*TO)(void *);
+       void    (*Up)(struct sppp *, void *);
+       void    (*Down)(struct sppp *, void *);
+       void    (*Open)(struct sppp *, void *);
+       void    (*Close)(struct sppp *, void *);
+       void    (*TO)(struct sppp *, void *);
        int     (*RCR)(struct sppp *, struct lcp_header *, int);
        void    (*RCN_rej)(struct sppp *, struct lcp_header *, int);
        void    (*RCN_nak)(struct sppp *, struct lcp_header *, int);
@@ -271,6 +271,8 @@
        SPPP_LOCK(_sp, RW_WRITER);      \
 }while (0)
 #define SPPP_DOWNGRADE(_sp)    rw_downgrade(&(_sp)->pp_lock)
+#define SPPP_WQ_SET(_wk, _func, _arg)  \
+       sppp_wq_set((_wk), (_func), __UNCONST((_arg)))
 
 #ifdef INET
 #ifndef SPPPSUBR_MPSAFE
@@ -301,36 +303,51 @@
 static void sppp_cisco_send(struct sppp *, int, int32_t, int32_t);
 static void sppp_cisco_input(struct sppp *, struct mbuf *);
 
+static void sppp_cp_init(const struct cp *, struct sppp *);
+static void sppp_cp_fini(const struct cp *, struct sppp *);
+static void sppp_cp_input(const struct cp *, struct sppp *,
+                         struct mbuf *);
 static void sppp_cp_input(const struct cp *, struct sppp *,
                          struct mbuf *);
 static void sppp_cp_send(struct sppp *, u_short, u_char,
                         u_char, u_short, void *);
 /* static void sppp_cp_timeout(void *arg); */
 static void sppp_cp_change_state(const struct cp *, struct sppp *, int);
+static struct workqueue *
+    sppp_wq_create(struct sppp *, const char *, pri_t, int, int);
+static void sppp_wq_destroy(struct sppp *, struct workqueue *);
+static void sppp_wq_set(struct sppp_work *,
+    void (*)(struct sppp *, void *), void *);
+static void sppp_wq_add(struct workqueue *, struct sppp_work *);
+static void sppp_wq_wait(struct workqueue *, struct sppp_work *);
+static void sppp_cp_to_lcp(void *);
+static void sppp_cp_to_ipcp(void *);
+static void sppp_cp_to_ipv6cp(void *);
 static void sppp_auth_send(const struct cp *, struct sppp *,
                            unsigned int, unsigned int, ...);
 
-static void sppp_up_event(const struct cp *, struct sppp *);
-static void sppp_down_event(const struct cp *, struct sppp *);
-static void sppp_open_event(const struct cp *, struct sppp *);
-static void sppp_close_event(const struct cp *, struct sppp *);
-static void sppp_to_event(const struct cp *, struct sppp *);
-static void sppp_rcr_event(const struct cp *, struct sppp *);
-static void sppp_rca_event(const struct cp *, struct sppp *);
-static void sppp_rcn_event(const struct cp *, struct sppp *);
-static void sppp_rtr_event(const struct cp *, struct sppp *);
-static void sppp_rta_event(const struct cp *, struct sppp *);
-static void sppp_rxj_event(const struct cp *, struct sppp *);
+static void sppp_up_event(struct sppp *, void *);
+static void sppp_down_event(struct sppp *, void *);
+static void sppp_open_event(struct sppp *, void *);
+static void sppp_close_event(struct sppp *, void *);
+static void sppp_to_event(struct sppp *, void *);
+static void sppp_rcr_event(struct sppp *, void *);
+static void sppp_rca_event(struct sppp *, void *);
+static void sppp_rcn_event(struct sppp *, void *);
+static void sppp_rtr_event(struct sppp *, void *);
+static void sppp_rta_event(struct sppp *, void *);
+static void sppp_rxj_event(struct sppp *, void *);
+static void sppp_null_event(struct sppp *, void *);
 
 static void sppp_null(struct sppp *);
 static void sppp_sca_scn(const struct cp *, struct sppp *);
 
 static void sppp_lcp_init(struct sppp *);
-static void sppp_lcp_up(struct sppp *);
-static void sppp_lcp_down(struct sppp *);
-static void sppp_lcp_open(struct sppp *);
-static void sppp_lcp_close(struct sppp *);
-static void sppp_lcp_TO(void *);
+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);
@@ -343,11 +360,11 @@
 static int sppp_ncp_check(struct sppp *);
 
 static void sppp_ipcp_init(struct sppp *);
-static void sppp_ipcp_up(struct sppp *);
-static void sppp_ipcp_down(struct sppp *);
-static void sppp_ipcp_open(struct sppp *);
-static void sppp_ipcp_close(struct sppp *);
-static void sppp_ipcp_TO(void *);
+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);
@@ -358,11 +375,11 @@
 static void sppp_ipcp_scr(struct sppp *);
 
 static void sppp_ipv6cp_init(struct sppp *);
-static void sppp_ipv6cp_up(struct sppp *);
-static void sppp_ipv6cp_down(struct sppp *);
-static void sppp_ipv6cp_open(struct sppp *);
-static void sppp_ipv6cp_close(struct sppp *);
-static void sppp_ipv6cp_TO(void *);
+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);
@@ -374,8 +391,8 @@
 
 static void sppp_pap_input(struct sppp *, struct mbuf *);
 static void sppp_pap_init(struct sppp *);
-static void sppp_pap_open(struct sppp *);
-static void sppp_pap_close(struct sppp *);
+static void sppp_pap_open(struct sppp *, void *);
+static void sppp_pap_close(struct sppp *, void *);
 static void sppp_pap_TO(void *);
 static void sppp_pap_my_TO(void *);
 static void sppp_pap_tlu(struct sppp *);
@@ -384,8 +401,8 @@
 
 static void sppp_chap_input(struct sppp *, struct mbuf *);
 static void sppp_chap_init(struct sppp *);
-static void sppp_chap_open(struct sppp *);
-static void sppp_chap_close(struct sppp *);
+static void sppp_chap_open(struct sppp *, void *);
+static void sppp_chap_close(struct sppp *, void *);
 static void sppp_chap_TO(void *);
 static void sppp_chap_tlu(struct sppp *);
 static void sppp_chap_tld(struct sppp *);
@@ -476,16 +493,16 @@
 
 static const struct cp pap = {
        PPP_PAP, IDX_PAP, CP_AUTH, "pap",
-       sppp_null, sppp_null, sppp_pap_open, sppp_pap_close,
-       sppp_pap_TO, 0, 0, 0,
+       sppp_null_event, sppp_null_event, sppp_pap_open, sppp_pap_close,
+       sppp_null_event, 0, 0, 0,
        sppp_pap_tlu, sppp_pap_tld, sppp_null, sppp_null,
        sppp_pap_scr, 0
 };
 
 static const struct cp chap = {
        PPP_CHAP, IDX_CHAP, CP_AUTH, "chap",
-       sppp_null, sppp_null, sppp_chap_open, sppp_chap_close,
-       sppp_chap_TO, 0, 0, 0,
+       sppp_null_event, sppp_null_event, sppp_chap_open, sppp_chap_close,
+       sppp_null_event, 0, 0, 0,
        sppp_chap_tlu, sppp_chap_tld, sppp_null, sppp_null,
        sppp_chap_scr, 0
 };
@@ -771,16 +788,7 @@
                 * to start LCP for it.
                 */
                ifp->if_flags |= IFF_RUNNING;
-
-               SPPP_UNLOCK(sp);
-               splx(s);
-
-               SPPP_LOCK(sp, RW_WRITER);
-               lcp.Open(sp);
-               SPPP_UNLOCK(sp);
-
-               s = splnet();
-               SPPP_LOCK(sp, RW_READER);
+               sppp_wq_add(sp->wq_cp, &sp->scp[IDX_LCP].work_open);
        }
 
        /*
@@ -978,6 +986,7 @@
 sppp_attach(struct ifnet *ifp)
 {
        struct sppp *sp = (struct sppp *) ifp;
+       char xnamebuf[MAXCOMLEN];
 
        /* Initialize keepalive handler. */
        if (! spppq) {
@@ -1015,6 +1024,10 @@
        /* Lets not beat about the bush, we know we're down. */
        ifp->if_link_state = LINK_STATE_DOWN;
 
+       snprintf(xnamebuf, sizeof(xnamebuf), "%s.wq_cp", ifp->if_xname);
+       sp->wq_cp = sppp_wq_create(sp, xnamebuf,
+           PRI_SOFTNET, IPL_SOFTNET, WQ_MPSAFE);
+
        memset(&sp->myauth, 0, sizeof sp->myauth);
        memset(&sp->hisauth, 0, sizeof sp->hisauth);
        SPPP_LOCK(sp, RW_WRITER);
@@ -1055,13 +1068,14 @@
        workqueue_destroy(sp->ipcp.update_addrs_wq);
        pcq_destroy(sp->ipcp.update_addrs_q);
 
-       callout_stop(&sp->scp[IDX_LCP].ch);
-       callout_stop(&sp->scp[IDX_IPCP].ch);
+       sppp_cp_fini(&lcp, sp);
+       sppp_cp_fini(&ipcp, sp);
        callout_stop(&sp->scp[IDX_PAP].ch);
        callout_stop(&sp->scp[IDX_CHAP].ch);
 #ifdef INET6
-       callout_stop(&sp->scp[IDX_IPV6CP].ch);
+       sppp_cp_fini(&ipv6cp, sp);
 #endif
+       sppp_wq_destroy(sp, sp->wq_cp);
        callout_stop(&sp->pap_my_to_ch);
 
        /* free authentication info */
@@ -1172,13 +1186,16 @@
                }
 
                if (going_up || going_down) {
-                       lcp.Close(sp);
+                       sp->lcp.reestablish = false;
+                       sppp_wq_add(sp->wq_cp, &sp->scp[IDX_LCP].work_close);
                }
                if (going_up && newmode == 0) {
                        /* neither auto-dial nor passive */
                        ifp->if_flags |= IFF_RUNNING;
-                       if (!(sp->pp_flags & PP_CISCO))
-                               lcp.Open(sp);
+                       if (!(sp->pp_flags & PP_CISCO)) {
+                               sppp_wq_add(sp->wq_cp,
+                                   &sp->scp[IDX_LCP].work_open);
+                       }
                } else if (going_down) {
                        SPPP_UNLOCK(sp);
                        sppp_flush(ifp);
@@ -1477,6 +1494,81 @@
        }
 }
 
+static void
+sppp_cp_to_lcp(void *xsp)
+{
+       struct sppp *sp = xsp;
+
+       sppp_wq_add(sp->wq_cp, &sp->scp[IDX_LCP].work_to);
+}
+
+static void
+sppp_cp_to_ipcp(void *xsp)
+{
+       struct sppp *sp = xsp;
+
+       sppp_wq_add(sp->wq_cp, &sp->scp[IDX_IPCP].work_to);
+}
+
+static void
+sppp_cp_to_ipv6cp(void *xsp)
+{
+       struct sppp *sp = xsp;
+
+       sppp_wq_add(sp->wq_cp, &sp->scp[IDX_IPV6CP].work_to);
+}
+
+static void
+sppp_cp_init(const struct cp *cp, struct sppp *sp)
+{
+       struct sppp_cp *scp;
+       typedef void (*sppp_co_cb_t)(void *);
+       static const sppp_co_cb_t to_cb[IDX_COUNT] = {
+               [IDX_LCP] = sppp_cp_to_lcp,
+               [IDX_IPCP] = sppp_cp_to_ipcp,



Home | Main Index | Thread Index | Old Index