Source-Changes-HG archive

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

[src/trunk]: src/sys/net implement auth protocols on the state-machine of con...



details:   https://anonhg.NetBSD.org/src/rev/54cc1c178ee8
branches:  trunk
changeset: 1016610:54cc1c178ee8
user:      yamaguchi <yamaguchi%NetBSD.org@localhost>
date:      Wed Nov 25 09:46:05 2020 +0000

description:
implement auth protocols on the state-machine of control protocols

reviewed by knakahara@n.o.

diffstat:

 sys/net/if_spppsubr.c |  1144 +++++++++++++++++++++++++++---------------------
 sys/net/if_spppvar.h  |    19 +-
 2 files changed, 658 insertions(+), 505 deletions(-)

diffs (truncated from 1775 to 300 lines):

diff -r bbb76eba1132 -r 54cc1c178ee8 sys/net/if_spppsubr.c
--- a/sys/net/if_spppsubr.c     Wed Nov 25 09:41:20 2020 +0000
+++ b/sys/net/if_spppsubr.c     Wed Nov 25 09:46:05 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_spppsubr.c,v 1.200 2020/11/25 09:41:20 yamaguchi Exp $       */
+/*     $NetBSD: if_spppsubr.c,v 1.201 2020/11/25 09:46:05 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.200 2020/11/25 09:41:20 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.201 2020/11/25 09:46:05 yamaguchi Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -102,6 +102,9 @@
 #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.
  *
@@ -254,6 +257,12 @@
        void    (*scan)(const struct cp *, struct sppp *);
 };
 
+enum auth_role {
+       SPPP_AUTH_NOROLE = 0,
+       SPPP_AUTH_SERV = __BIT(0),
+       SPPP_AUTH_PEER = __BIT(1),
+};
+
 static struct sppp *spppq;
 static kmutex_t *spppq_lock = NULL;
 static callout_t keepalive_ch;
@@ -325,6 +334,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_up_event(struct sppp *, void *);
 static void sppp_down_event(struct sppp *, void *);
@@ -337,7 +348,6 @@
 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 *);
@@ -359,6 +369,7 @@
 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 void sppp_ipcp_init(struct sppp *);
 static void sppp_ipcp_up(struct sppp *, void *);
@@ -392,22 +403,31 @@
 
 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(void *);
-static void sppp_pap_my_TO(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_tld(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(void *);
+static void sppp_chap_TO(struct sppp *, void *);
 static void sppp_chap_tlu(struct sppp *);
-static void sppp_chap_tld(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);
 static const char *sppp_cp_type_name(u_char);
@@ -494,18 +514,18 @@
 
 static const struct cp pap = {
        PPP_PAP, IDX_PAP, CP_AUTH, "pap",
-       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
+       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
 };
 
 static const struct cp chap = {
        PPP_CHAP, IDX_CHAP, CP_AUTH, "chap",
-       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
+       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
 };
 
 static const struct cp *cps[IDX_COUNT] = {
@@ -1074,13 +1094,12 @@
 
        sppp_cp_fini(&lcp, sp);
        sppp_cp_fini(&ipcp, sp);
-       callout_stop(&sp->scp[IDX_PAP].ch);
-       callout_stop(&sp->scp[IDX_CHAP].ch);
+       sppp_cp_fini(&pap, sp);
+       sppp_cp_fini(&chap, sp);
 #ifdef INET6
        sppp_cp_fini(&ipv6cp, sp);
 #endif
        sppp_wq_destroy(sp, sp->wq_cp);
-       callout_stop(&sp->pap_my_to_ch);
 
        /* free authentication info */
        if (sp->myauth.name) free(sp->myauth.name, M_DEVBUF);
@@ -1523,6 +1542,23 @@
 }
 
 static void
+sppp_cp_to_pap(void *xsp)
+{
+       struct sppp *sp = xsp;
+
+       sppp_wq_add(sp->wq_cp, &sp->scp[IDX_PAP].work_to);
+}
+
+static void
+sppp_cp_to_chap(void *xsp)
+{
+       struct sppp *sp = xsp;
+
+       sppp_wq_add(sp->wq_cp, &sp->scp[IDX_CHAP].work_to);
+}
+
+
+static void
 sppp_cp_init(const struct cp *cp, struct sppp *sp)
 {
        struct sppp_cp *scp;
@@ -1531,6 +1567,8 @@
                [IDX_LCP] = sppp_cp_to_lcp,
                [IDX_IPCP] = sppp_cp_to_ipcp,
                [IDX_IPV6CP] = sppp_cp_to_ipv6cp,
+               [IDX_PAP] = sppp_cp_to_pap,
+               [IDX_CHAP] = sppp_cp_to_chap,
        };
 
        scp = &sp->scp[cp->protoidx];
@@ -1814,6 +1852,10 @@
 
        KASSERT(SPPP_WLOCKED(sp));
 
+       if ((cp->flags & CP_AUTH) != 0 &&
+           sppp_auth_role(cp, sp) == SPPP_AUTH_NOROLE)
+               return;
+
        if (debug)
                log(LOG_DEBUG, "%s: %s up(%s)\n",
                    ifp->if_xname, cp->name,
@@ -1843,6 +1885,10 @@
 
        KASSERT(SPPP_WLOCKED(sp));
 
+       if ((cp->flags & CP_AUTH) != 0 &&
+           sppp_auth_role(cp, sp) == SPPP_AUTH_NOROLE)
+               return;
+
        if (debug)
                log(LOG_DEBUG, "%s: %s down(%s)\n",
                    ifp->if_xname, cp->name,
@@ -1882,6 +1928,10 @@
 
        KASSERT(SPPP_WLOCKED(sp));
 
+       if ((cp->flags & CP_AUTH) != 0 &&
+           sppp_auth_role(cp, sp) == SPPP_AUTH_NOROLE)
+               return;
+
        if (debug)
                log(LOG_DEBUG, "%s: %s open(%s)\n",
                    ifp->if_xname, cp->name,
@@ -1921,6 +1971,10 @@
 
        KASSERT(SPPP_WLOCKED(sp));
 
+       if ((cp->flags & CP_AUTH) != 0 &&
+           sppp_auth_role(cp, sp) == SPPP_AUTH_NOROLE)
+               return;
+
        if (debug)
                log(LOG_DEBUG, "%s: %s close(%s)\n",
                    ifp->if_xname, cp->name,
@@ -1948,8 +2002,10 @@
        case STATE_ACK_RCVD:
        case STATE_ACK_SENT:
                sp->scp[cp->protoidx].rst_counter = sp->lcp.max_terminate;
-               sppp_cp_send(sp, cp->proto, TERM_REQ,
-                   ++sp->scp[cp->protoidx].seq, 0, 0);
+               if ((cp->flags & CP_AUTH) == 0) {
+                       sppp_cp_send(sp, cp->proto, TERM_REQ,
+                           ++sp->scp[cp->protoidx].seq, 0, 0);
+               }
                sppp_cp_change_state(cp, sp, STATE_CLOSING);
                break;
        }
@@ -1976,21 +2032,18 @@
                /* TO- event */
                switch (sp->scp[cp->protoidx].state) {
                case STATE_CLOSING:
+                       sppp_cp_change_state(cp, sp, STATE_CLOSED);
                        (cp->tlf)(sp);
-                       sppp_cp_change_state(cp, sp, STATE_CLOSED);
-                       sppp_lcp_check_and_close(sp);
                        break;
                case STATE_STOPPING:
+                       sppp_cp_change_state(cp, sp, STATE_STOPPED);
                        (cp->tlf)(sp);
-                       sppp_cp_change_state(cp, sp, STATE_STOPPED);
-                       sppp_lcp_check_and_close(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);
-                       sppp_cp_change_state(cp, sp, STATE_STOPPED);
-                       sppp_lcp_check_and_close(sp);
                        break;
                }
        else
@@ -1998,8 +2051,10 @@
                switch (sp->scp[cp->protoidx].state) {
                case STATE_CLOSING:
                case STATE_STOPPING:
-                       sppp_cp_send(sp, cp->proto, TERM_REQ,
-                           ++sp->scp[cp->protoidx].seq, 0, 0);
+                       if ((cp->flags & CP_AUTH) == 0) {
+                               sppp_cp_send(sp, cp->proto, TERM_REQ,
+                                   ++sp->scp[cp->protoidx].seq, 0, 0);
+                       }
                        callout_schedule(&sp->scp[cp->protoidx].ch, sp->lcp.timeout);
                        break;
                case STATE_REQ_SENT:
@@ -2067,8 +2122,10 @@
                        }
                        break;
                case STATE_CLOSED:
-                       sppp_cp_send(sp, cp->proto, TERM_ACK,
-                           sp->scp[cp->protoidx].rconfid, 0, 0);
+                       if ((cp->flags & CP_AUTH) == 0) {
+                               sppp_cp_send(sp, cp->proto, TERM_ACK,
+                                   sp->scp[cp->protoidx].rconfid, 0, 0);
+                       }
                        break;
                default:
                        printf("%s: %s illegal RCR+ in state %s\n",
@@ -2109,8 +2166,10 @@
                        break;
                case STATE_CLOSED:
                        sppp_cp_change_state(cp, sp, STATE_CLOSED);
-                       sppp_cp_send(sp, cp->proto, TERM_ACK,
-                           sp->scp[cp->protoidx].rconfid, 0, 0);
+                       if ((cp->flags & CP_AUTH) == 0) {
+                               sppp_cp_send(sp, cp->proto, TERM_ACK,
+                                   sp->scp[cp->protoidx].rconfid, 0, 0);
+                       }
                        break;
                default:
                        printf("%s: %s illegal RCR- in state %s\n",



Home | Main Index | Thread Index | Old Index