]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/ipcp.c
Ignore NAK'd options we don't recognize.
[ppp.git] / pppd / ipcp.c
index 9032f73eb71c30e6c6f542ffc1d0a05f342b6b00..3d99235440b2d5a6a6a9ea97f8193679b02b9e6f 100644 (file)
@@ -18,7 +18,7 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$Id: ipcp.c,v 1.14 1994/10/24 04:31:11 paulus Exp $";
+static char rcsid[] = "$Id: ipcp.c,v 1.20 1995/08/10 06:51:04 paulus Exp $";
 #endif
 
 /*
@@ -575,16 +575,15 @@ ipcp_nakci(f, p, len)
        case CI_ADDR:
            if (go->neg_addr || no.neg_addr || cilen != CILEN_ADDR)
                goto bad;
-           try.neg_addr = 1;
            try.old_addrs = 0;
            GETLONG(l, p);
            ciaddr1 = htonl(l);
            if (ciaddr1 && go->accept_local)
                try.ouraddr = ciaddr1;
+           if (try.ouraddr != 0)
+               try.neg_addr = 1;
            no.neg_addr = 1;
            break;
-       default:
-           goto bad;
        }
        p = next;
     }
@@ -774,10 +773,17 @@ ipcp_reqci(f, inp, len, reject_if_disagree)
                && (ciaddr1 == 0 || !wo->accept_remote)) {
                orc = CONFNAK;
                if (!reject_if_disagree) {
-                   DECPTR(sizeof (long), p);
+                   DECPTR(sizeof(u_int32_t), p);
                    tl = ntohl(wo->hisaddr);
                    PUTLONG(tl, p);
                }
+           } else if (ciaddr1 == 0 && wo->hisaddr == 0) {
+               /*
+                * If neither we nor he knows his address, reject the option.
+                */
+               orc = CONFREJ;
+               wo->req_addr = 0;       /* don't NAK with 0.0.0.0 later */
+               break;
            }
 
            /*
@@ -791,7 +797,7 @@ ipcp_reqci(f, inp, len, reject_if_disagree)
                if (ciaddr2 == 0 || !wo->accept_local) {
                    orc = CONFNAK;
                    if (!reject_if_disagree) {
-                       DECPTR(sizeof (long), p);
+                       DECPTR(sizeof(u_int32_t), p);
                        tl = ntohl(wo->ouraddr);
                        PUTLONG(tl, p);
                    }
@@ -828,10 +834,17 @@ ipcp_reqci(f, inp, len, reject_if_disagree)
                && (ciaddr1 == 0 || !wo->accept_remote)) {
                orc = CONFNAK;
                if (!reject_if_disagree) {
-                   DECPTR(sizeof (long), p);
+                   DECPTR(sizeof(u_int32_t), p);
                    tl = ntohl(wo->hisaddr);
                    PUTLONG(tl, p);
                }
+           } else if (ciaddr1 == 0 && wo->hisaddr == 0) {
+               /*
+                * Don't ACK an address of 0.0.0.0 - reject it instead.
+                */
+               orc = CONFREJ;
+               wo->req_addr = 0;       /* don't NAK with 0.0.0.0 later */
+               break;
            }
        
            ho->neg_addr = 1;
@@ -874,7 +887,7 @@ ipcp_reqci(f, inp, len, reject_if_disagree)
                    }
                }
                ho->maxslotindex = maxslotindex;
-               ho->cflag = wo->cflag;
+               ho->cflag = cflag;
            } else {
                ho->old_vj = 1;
                ho->maxslotindex = MAX_STATES - 1;
@@ -1083,7 +1096,8 @@ ipcp_script(f, script)
     argv[3] = strspeed;
     argv[4] = strlocal;
     argv[5] = strremote;
-    argv[6] = NULL;
+    argv[6] = ipparam;
+    argv[7] = NULL;
     run_program(script, argv, 0);
 }