]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/lcp.c
Set current_option for error reporting. Bug and fix by Clive Nicolson.
[ppp.git] / pppd / lcp.c
index 050ad201d3f3c37c6b844b8c81b67a2c04029f6e..1923c6d4cc0cc9b467b76b7642c4804e424c90b7 100644 (file)
@@ -17,7 +17,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#define RCSID  "$Id: lcp.c,v 1.60 2002/04/02 13:54:59 dfs Exp $"
+#define RCSID  "$Id: lcp.c,v 1.62 2002/09/24 11:35:22 fcusack Exp $"
 
 /*
  * TODO:
@@ -676,12 +676,12 @@ lcp_addci(f, ucp, lenp)
        PUTCHAR(CILEN_SHORT, ucp); \
        PUTSHORT(val, ucp); \
     }
-#define ADDCICHAP(opt, neg, val, digest) \
+#define ADDCICHAP(opt, neg, val) \
     if (neg) { \
        PUTCHAR((opt), ucp); \
        PUTCHAR(CILEN_CHAP, ucp); \
-       PUTSHORT((val), ucp); \
-       PUTCHAR((digest), ucp); \
+       PUTSHORT(PPP_CHAP, ucp); \
+       PUTCHAR((CHAP_DIGEST(val)), ucp); \
     }
 #define ADDCILONG(opt, neg, val) \
     if (neg) { \
@@ -715,7 +715,7 @@ lcp_addci(f, ucp, lenp)
     ADDCISHORT(CI_MRU, go->neg_mru && go->mru != DEFMRU, go->mru);
     ADDCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF,
              go->asyncmap);
-    ADDCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP,CHAP_DIGEST(go->chap_mdtype));
+    ADDCICHAP(CI_AUTHTYPE, go->neg_chap, go->chap_mdtype);
     ADDCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);
     ADDCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);
     ADDCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);
@@ -794,7 +794,7 @@ lcp_ackci(f, p, len)
        if (cichar != val) \
            goto bad; \
     }
-#define ACKCICHAP(opt, neg, val, digest) \
+#define ACKCICHAP(opt, neg, val) \
     if (neg) { \
        if ((len -= CILEN_CHAP) < 0) \
            goto bad; \
@@ -804,10 +804,10 @@ lcp_ackci(f, p, len)
            citype != (opt)) \
            goto bad; \
        GETSHORT(cishort, p); \
-       if (cishort != (val)) \
+       if (cishort != PPP_CHAP) \
            goto bad; \
        GETCHAR(cichar, p); \
-       if (cichar != (digest)) \
+       if (cichar != (CHAP_DIGEST(val))) \
          goto bad; \
     }
 #define ACKCILONG(opt, neg, val) \
@@ -862,7 +862,7 @@ lcp_ackci(f, p, len)
     ACKCISHORT(CI_MRU, go->neg_mru && go->mru != DEFMRU, go->mru);
     ACKCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF,
              go->asyncmap);
-    ACKCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP,CHAP_DIGEST(go->chap_mdtype));
+    ACKCICHAP(CI_AUTHTYPE, go->neg_chap, go->chap_mdtype);
     ACKCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);
     ACKCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);
     ACKCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);
@@ -1058,8 +1058,8 @@ lcp_nakci(f, p, len)
                        go->chap_mdtype = CHAP_MDTYPE_D(cichar);
                    } else {
                        /* ... otherwise, try our next-preferred algorithm. */
-                       go->chap_mdtype &= ~(CHAP_MDTYPE(go->chap_mdtype));
-                       if (go->chap_mdtype == MDTYPE_NONE) /* out of algos */
+                       try.chap_mdtype &= ~(CHAP_MDTYPE(try.chap_mdtype));
+                       if (try.chap_mdtype == MDTYPE_NONE) /* out of algos */
                            try.neg_chap = 0;
                    }
                } else {
@@ -1300,7 +1300,7 @@ lcp_rejci(f, p, len)
            goto bad; \
        try.neg = 0; \
     }
-#define REJCICHAP(opt, neg, val, digest) \
+#define REJCICHAP(opt, neg, val) \
     if (go->neg && \
        len >= CILEN_CHAP && \
        p[1] == CILEN_CHAP && \
@@ -1310,7 +1310,7 @@ lcp_rejci(f, p, len)
        GETSHORT(cishort, p); \
        GETCHAR(cichar, p); \
        /* Check rejected value. */ \
-       if ((cishort != (val)) || (cichar != (digest))) \
+       if ((cishort != PPP_CHAP) || (cichar != (CHAP_DIGEST(val)))) \
            goto bad; \
        try.neg = 0; \
        try.neg_upap = 0; \
@@ -1376,7 +1376,7 @@ lcp_rejci(f, p, len)
 
     REJCISHORT(CI_MRU, neg_mru, go->mru);
     REJCILONG(CI_ASYNCMAP, neg_asyncmap, go->asyncmap);
-    REJCICHAP(CI_AUTHTYPE, neg_chap, PPP_CHAP, CHAP_DIGEST(go->chap_mdtype));
+    REJCICHAP(CI_AUTHTYPE, neg_chap, go->chap_mdtype);
     if (!go->neg_chap) {
        REJCISHORT(CI_AUTHTYPE, neg_upap, PPP_PAP);
     }
@@ -1775,7 +1775,7 @@ lcp_up(f)
     lcp_options *ho = &lcp_hisoptions[f->unit];
     lcp_options *go = &lcp_gotoptions[f->unit];
     lcp_options *ao = &lcp_allowoptions[f->unit];
-    int mtu;
+    int mtu, mru;
 
     if (!go->neg_magicnumber)
        go->magicnumber = 0;
@@ -1788,18 +1788,19 @@ lcp_up(f)
      * set our MRU to the larger of value we wanted and
      * the value we got in the negotiation.
      * Note on the MTU: the link MTU can be the MRU the peer wanted,
-     * the interface MTU is set to the lower of that and the
-     * MTU we want to use.
+     * the interface MTU is set to the lowest of that, the
+     * MTU we want to use, and our link MRU.
      */
     mtu = ho->neg_mru? ho->mru: PPP_MRU;
+    mru = go->neg_mru? MAX(wo->mru, go->mru): PPP_MRU;
 #ifdef HAVE_MULTILINK
     if (!(multilink && go->neg_mrru && ho->neg_mrru))
 #endif /* HAVE_MULTILINK */
-       netif_set_mtu(f->unit, MIN(mtu, ao->mru));
+       netif_set_mtu(f->unit, MIN(MIN(mtu, mru), ao->mru));
     ppp_send_config(f->unit, mtu,
                    (ho->neg_asyncmap? ho->asyncmap: 0xffffffff),
                    ho->neg_pcompression, ho->neg_accompression);
-    ppp_recv_config(f->unit, (go->neg_mru? MAX(wo->mru, go->mru): PPP_MRU),
+    ppp_recv_config(f->unit, mru,
                    (lax_recv? 0: go->neg_asyncmap? go->asyncmap: 0xffffffff),
                    go->neg_pcompression, go->neg_accompression);