]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/lcp.c
PPPoE updates: don't exit if discovery fails, cope with both
[ppp.git] / pppd / lcp.c
index 5d1500e63fe000dff9e176485a80ea8136b7349a..8d540715a0470775ea39516e83f199a28120ff94 100644 (file)
@@ -1,23 +1,46 @@
 /*
  * lcp.c - PPP Link Control Protocol.
  *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
+ * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The name "Carnegie Mellon University" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For permission or any legal
+ *    details, please contact
+ *      Office of Technology Transfer
+ *      Carnegie Mellon University
+ *      5000 Forbes Avenue
+ *      Pittsburgh, PA  15213-3890
+ *      (412) 268-4387, fax: (412) 268-7395
+ *      tech-transfer@andrew.cmu.edu
+ *
+ * 4. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by Computing Services
+ *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+ *
+ * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#define RCSID  "$Id: lcp.c,v 1.63 2002/11/02 19:48:12 carlsonj Exp $"
+#define RCSID  "$Id: lcp.c,v 1.70 2003/07/28 12:25:41 carlsonj Exp $"
 
 /*
  * TODO:
@@ -30,7 +53,7 @@
 #include "pppd.h"
 #include "fsm.h"
 #include "lcp.h"
-#include "chap.h"
+#include "chap-new.h"
 #include "magic.h"
 
 static const char rcsid[] = RCSID;
@@ -391,7 +414,7 @@ lcp_close(unit, reason)
        lcp_finished(f);
 
     } else
-       fsm_close(&lcp_fsm[unit], reason);
+       fsm_close(f, reason);
 }
 
 
@@ -410,9 +433,10 @@ lcp_lowerup(unit)
      * but accept A/C and protocol compressed packets
      * if we are going to ask for A/C and protocol compression.
      */
-    ppp_send_config(unit, PPP_MRU, 0xffffffff, 0, 0);
-    ppp_recv_config(unit, PPP_MRU, (lax_recv? 0: 0xffffffff),
-                   wo->neg_pcompression, wo->neg_accompression);
+    if (ppp_send_config(unit, PPP_MRU, 0xffffffff, 0, 0) < 0
+       || ppp_recv_config(unit, PPP_MRU, (lax_recv? 0: 0xffffffff),
+                          wo->neg_pcompression, wo->neg_accompression) < 0)
+           return;
     peer_mru[unit] = PPP_MRU;
 
     if (listen_time != 0) {
@@ -1005,6 +1029,10 @@ lcp_nakci(f, p, len)
        try.neg = 0; \
     }
 
+    /*
+     * NOTE!  There must be no assignments to individual fields of *go in
+     * the code below.  Any such assignment is a BUG!
+     */
     /*
      * We don't care if they want to send us smaller packets than
      * we want.  Therefore, accept any MRU less than what we asked for,
@@ -1065,7 +1093,7 @@ lcp_nakci(f, p, len)
                try.neg_eap = 0;
                /* Try to set up to use their suggestion, if possible */
                if (CHAP_CANDIGEST(go->chap_mdtype, cichar))
-                   go->chap_mdtype = CHAP_MDTYPE_D(cichar);
+                   try.chap_mdtype = CHAP_MDTYPE_D(cichar);
            } else if (go->neg_chap) {
                /*
                 * We were asking for our preferred algorithm, they must
@@ -1074,7 +1102,7 @@ lcp_nakci(f, p, len)
                if (cichar != CHAP_DIGEST(go->chap_mdtype)) {
                    if (CHAP_CANDIGEST(go->chap_mdtype, cichar)) {
                        /* Use their suggestion if we support it ... */
-                       go->chap_mdtype = CHAP_MDTYPE_D(cichar);
+                       try.chap_mdtype = CHAP_MDTYPE_D(cichar);
                    } else {
                        /* ... otherwise, try our next-preferred algorithm. */
                        try.chap_mdtype &= ~(CHAP_MDTYPE(try.chap_mdtype));
@@ -1192,7 +1220,7 @@ lcp_nakci(f, p, len)
      * An option we don't recognize represents the peer asking to
      * negotiate some option we don't support, so ignore it.
      */
-    while (len > CILEN_VOID) {
+    while (len >= CILEN_VOID) {
        GETCHAR(citype, p);
        GETCHAR(cilen, p);
        if (cilen < CILEN_VOID || (len -= cilen) < 0)
@@ -1579,11 +1607,11 @@ lcp_reqci(f, inp, lenp, reject_if_disagree)
                }
                if (!ao->neg_upap) {    /* we don't want to do PAP */
                    orc = CONFNAK;      /* NAK it and suggest CHAP or EAP */
+                   PUTCHAR(CI_AUTHTYPE, nakp);
                    if (ao->neg_eap) {
                        PUTCHAR(CILEN_SHORT, nakp);
                        PUTSHORT(PPP_EAP, nakp);
                    } else {
-                       PUTCHAR(CI_AUTHTYPE, nakp);
                        PUTCHAR(CILEN_CHAP, nakp);
                        PUTSHORT(PPP_CHAP, nakp);
                        PUTCHAR(CHAP_DIGEST(ao->chap_mdtype), nakp);
@@ -2010,7 +2038,7 @@ lcp_printpkt(p, plen, printer, arg)
                        printer(arg, "chap");
                        if (p < optend) {
                            switch (*p) {
-                           case CHAP_DIGEST_MD5:
+                           case CHAP_MD5:
                                printer(arg, " MD5");
                                ++p;
                                break;