> This patch gets very brief PPPOE server implementation.
This one closer to style(9)

Common subdirectories: /usr/aeriesrc2205/sys/net/CVS and /usr/src/sys/net/CVS
diff -u /usr/aeriesrc2205/sys/net/if_pppoe.c /usr/src/sys/net/if_pppoe.c
--- /usr/aeriesrc2205/sys/net/if_pppoe.c        Fri Dec 26 23:51:52 2008
+++ /usr/src/sys/net/if_pppoe.c Mon May 25 03:29:36 2009
@@ -1378,6 +1378,14 @@
        /* include hunique */
        len += 2 + 2 + sc->sc_hunique_len;
        
+       if (sc->sc_concentrator_name != NULL) {
+               /* include ac_name */
+               len += 2 + 2 + sizeof(sc->sc_concentrator_name);
+               if (sc->sc_service_name != NULL)
+                       /* include service_name */
+                       len += 2 + 2 + sizeof(sc->sc_service_name);
+       }
+
        m0 = pppoe_get_mbuf(len + PPPOE_HEADERLEN);
        if (m0 == NULL)
                return (ENOBUFS);
@@ -1386,12 +1394,24 @@
        PPPOE_ADD_HEADER(p, PPPOE_CODE_PADO, 0, len);
        PPPOE_ADD_16(p, PPPOE_TAG_ACCOOKIE);
        PPPOE_ADD_16(p, sizeof(sc->sc_unique));
-       memcpy(p, &sc, sizeof(sc->sc_unique));
+       memcpy(p, &sc->sc_unique, sizeof(sc->sc_unique));
        p += sizeof(sc->sc_unique);
        PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);
        PPPOE_ADD_16(p, sc->sc_hunique_len);
        memcpy(p, sc->sc_hunique, sc->sc_hunique_len);

+       if (sc->sc_concentrator_name != NULL) {
+               p += sc->sc_hunique_len;
+               PPPOE_ADD_16(p, PPPOE_TAG_ACNAME);
+               PPPOE_ADD_16(p, sizeof(sc->sc_concentrator_name));
+               memcpy(p, sc->sc_concentrator_name, 
sizeof(sc->sc_concentrator_name));
+               if (sc->sc_service_name != NULL) {
+                       p += sizeof(sc->sc_concentrator_name);
+                       PPPOE_ADD_16(p, PPPOE_TAG_SNAME);
+                       PPPOE_ADD_16(p, sizeof(sc->sc_service_name));
+                       memcpy(p, sc->sc_service_name, 
sizeof(sc->sc_service_name));
+               }
+       }
        return (pppoe_output(sc, m0));
 }

@@ -1402,11 +1422,15 @@
        struct mbuf *m0;
        size_t len, l1;
        u_int8_t *p;
+       struct timeval tv;

        if (sc->sc_state != PPPOE_STATE_PADO_SENT)
                return (EIO);

-       sc->sc_session = mono_time.tv_sec % 0xff + 1;
+       getmicrotime(&tv);
+       sc->sc_session = tv.tv_sec % 0xff + 1;
+       sc->sc_session_time.tv_sec = tv.tv_sec;
+       sc->sc_session_time.tv_usec = tv.tv_usec;

        /* calc length */
        len = 0;
@@ -1464,6 +1488,11 @@
         * function and defer disconnecting to the timeout handler.
         */
        sc->sc_state = PPPOE_STATE_CLOSING;
+#ifdef PPPOE_SERVER
+       /* notify upper layer */
+       if (sp->pp_if.if_flags & IFF_PASSIVE)
+               sc->sc_sppp.pp_down(&sc->sc_sppp);
+#endif
        timeout_add(&sc->sc_timeout, hz / 50);
 }

diff -u /usr/aeriesrc2205/sys/net/if_spppsubr.c /usr/src/sys/net/if_spppsubr.c
--- /usr/aeriesrc2205/sys/net/if_spppsubr.c     Fri Dec 26 23:51:52 2008
+++ /usr/src/sys/net/if_spppsubr.c      Mon May 25 03:42:02 2009
@@ -140,6 +140,7 @@
 #define PPP_CHAP       0xc223          /* Challenge-Handshake Auth Protocol */
 #define PPP_IPCP       0x8021          /* Internet Protocol Control Protocol */
 #define PPP_IPV6CP     0x8057          /* IPv6 Control Protocol */
+#define PPP_CCP                0x80fd          /* Compression Control Protocol 
*/

 #define CONF_REQ       1               /* PPP configure request */
 #define CONF_ACK       2               /* PPP configure acknowledge */
@@ -474,7 +475,7 @@
 };


-/*
+/*
  * Exported functions, comprising our interface to the lower layer.
  */

@@ -559,6 +560,7 @@
                        goto drop;
                }
                switch (ntohs (h->protocol)) {
+               case PPP_CCP:
                default:
                        if (sp->state[IDX_LCP] == STATE_OPENED)
                                sppp_cp_send (sp, PPP_LCP, PROTO_REJ,
@@ -1538,6 +1540,11 @@
                                log(LOG_DEBUG, SPP_FMT "%s send 
terminate-ack\n",
                                    SPP_ARGS(ifp), cp->name);
                        sppp_cp_send(sp, cp->proto, TERM_ACK, h->ident, 0, 0);
+#ifdef PPPOE_SERVER
+                       sp->rst_counter[cp->protoidx] = 0;
+                       sppp_cp_change_state(cp, sp, STATE_CLOSING);
+                       (cp->tlf)(sp);
+#endif
                        break;
                case STATE_OPENED:
                        sp->rst_counter[cp->protoidx] = 0;
@@ -1817,6 +1824,12 @@
                (cp->tls)(sp);
                break;
        case STATE_STARTING:
+#ifdef PPPOE_SERVER
+               if (sp->pp_if.if_flags & IFF_PASSIVE) {
+                       sppp_cp_change_state(cp, sp, STATE_STARTING);
+                       (cp->tls)(sp);
+               }
+#endif
                break;
        case STATE_CLOSED:
                sp->rst_counter[cp->protoidx] = sp->lcp.max_configure;
@@ -2116,6 +2129,10 @@
        else
                sp->lcp.opts &= ~(1 << LCP_OPT_AUTH_PROTO);
        sp->pp_flags &= ~PP_NEEDAUTH;
+#ifdef PPPOE_SERVER
+       if (sp->pp_if.if_flags & IFF_PASSIVE)
+               sp->lcp.opts |= (1 << LCP_OPT_AUTH_PROTO);
+#endif
        sppp_open_event(&lcp, sp);
 }

@@ -2392,7 +2409,7 @@
                                break;
                        }
                        if (debug)
-                               addlog("[access denied]\n");
+                               addlog("[access denied: No authentication]\n");
                        lcp.Close(sp);
                        break;
                }
@@ -2471,7 +2488,7 @@
                         * deny.
                         */
                        if (debug)
-                               addlog("[access denied]\n");
+                               addlog("[access denied: Auth method 
mismatch]\n");
                        lcp.Close(sp);
                        break;
                }
@@ -2616,7 +2633,14 @@
        }

        if (sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) {
+#ifdef PPPOE_SERVER
+               if(sp->pp_if.if_flags & IFF_PASSIVE)
+                       authproto = sp->myauth.proto = sp->hisauth.proto;
+               else
+                       authproto = sp->hisauth.proto;
+#else
                authproto = sp->hisauth.proto;
+#endif
                opt[i++] = LCP_OPT_AUTH_PROTO;
                opt[i++] = authproto == PPP_CHAP? 5: 4;
                opt[i++] = authproto >> 8;
@@ -3050,6 +3074,10 @@
                sp->ipcp.flags |= IPCP_MYADDR_DYN;
                sp->ipcp.opts |= (1 << IPCP_OPT_ADDRESS);
        }
+#ifdef PPPOE_SERVER
+       if(sp->pp_if.if_flags & IFF_PASSIVE)
+               sp->ipcp.opts |= (1 << IPCP_OPT_ADDRESS);
+#endif
        if (hisaddr == 1) {
                /*
                 * XXX - remove this hack!
@@ -3843,6 +3871,7 @@
                        sppp_print_string(sp->hisauth.name,
                                          sppp_strnlen(sp->hisauth.name, 
AUTHNAMELEN));
                        addlog("\n");
+                       goto bad;
                }
                if (debug) {
                        log(LOG_DEBUG, SPP_FMT "chap input(%s) "
@@ -3879,7 +3908,7 @@
                if (value_len != sizeof digest ||
                    bcmp(digest, value, value_len) != 0) {
                        /* action scn, tld */
-                       sppp_auth_send(&chap, sp, CHAP_FAILURE, h->ident,
+bad:           sppp_auth_send(&chap, sp, CHAP_FAILURE, h->ident,
                                       sizeof(FAILMSG) - 1, (u_char *)FAILMSG,
                                       0);
                        chap.tld(sp);

-- 
antonvm

Reply via email to