]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/ipcp.c
Fix an infinite negotiation loop where we would respond to a
[ppp.git] / pppd / ipcp.c
index c2a7f27337fa0c1874c01d68439a42dcce88b6e2..efc1af8d87c87abf98678cddf8658008942a915a 100644 (file)
@@ -40,7 +40,7 @@
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#define RCSID  "$Id: ipcp.c,v 1.64 2003/07/28 12:25:41 carlsonj Exp $"
+#define RCSID  "$Id: ipcp.c,v 1.67 2004/11/08 11:45:59 paulus Exp $"
 
 /*
  * TODO:
@@ -696,6 +696,7 @@ ipcp_resetci(f)
            wo->accept_remote = 0;
        }
     }
+    BZERO(&ipcp_hisoptions[f->unit], sizeof(ipcp_options));
 }
 
 
@@ -720,10 +721,8 @@ ipcp_cilen(f)
      * First see if we want to change our options to the old
      * forms because we have received old forms from the peer.
      */
-    if ((wo->neg_addr || wo->old_addrs) && !go->neg_addr && !go->old_addrs) {
-       /* use the old style of address negotiation */
-       go->old_addrs = 1;
-    }
+    if (go->neg_addr && go->old_addrs && !ho->neg_addr && ho->old_addrs)
+       go->neg_addr = 0;
     if (wo->neg_vj && !go->neg_vj && !go->old_vj) {
        /* try an older style of VJ negotiation */
        /* use the old style only if the peer did */
@@ -1687,12 +1686,12 @@ ipcp_up(f)
     script_setenv("IPLOCAL", ip_ntoa(go->ouraddr), 0);
     script_setenv("IPREMOTE", ip_ntoa(ho->hisaddr), 1);
 
+    if (go->dnsaddr[0])
+       script_setenv("DNS1", ip_ntoa(go->dnsaddr[0]), 0);
+    if (go->dnsaddr[1])
+       script_setenv("DNS2", ip_ntoa(go->dnsaddr[1]), 0);
     if (usepeerdns && (go->dnsaddr[0] || go->dnsaddr[1])) {
        script_setenv("USEPEERDNS", "1", 0);
-       if (go->dnsaddr[0])
-           script_setenv("DNS1", ip_ntoa(go->dnsaddr[0]), 0);
-       if (go->dnsaddr[1])
-           script_setenv("DNS2", ip_ntoa(go->dnsaddr[1]), 0);
        create_resolv(go->dnsaddr[0], go->dnsaddr[1]);
     }
 
@@ -1805,6 +1804,8 @@ ipcp_up(f)
            notice("secondary DNS address %I", go->dnsaddr[1]);
     }
 
+    reset_link_stats(f->unit);
+
     np_up(f->unit, PPP_IP);
     ipcp_is_up = 1;
 
@@ -1836,6 +1837,8 @@ ipcp_down(f)
     IPCPDEBUG(("ipcp: down"));
     /* XXX a bit IPv4-centric here, we only need to get the stats
      * before the interface is marked down. */
+    /* XXX more correct: we must get the stats before running the notifiers,
+     * at least for the radius plugin */
     update_link_stats(f->unit);
     notify(ip_down_notifier, 0);
     if (ip_down_hook)
@@ -1846,6 +1849,10 @@ ipcp_down(f)
     }
     sifvjcomp(f->unit, 0, 0, 0);
 
+    print_link_stats(); /* _after_ running the notifiers and ip_down_hook(),
+                        * because print_link_stats() sets link_stats_valid
+                        * to 0 (zero) */
+
     /*
      * If we are doing dial-on-demand, set the interface
      * to queue up outgoing packets (for now).