]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/ipcp.c
Fix the rcsid's for non-ansi compilers
[ppp.git] / pppd / ipcp.c
index d928c9f4946738a3685987c7ecd063c376b8f361..d3682a032b5243a8c7b6625b37bfe5c399f89bae 100644 (file)
@@ -17,9 +17,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#ifndef lint
-static char rcsid[] = "$Id: ipcp.c,v 1.45 1999/05/04 06:57:27 paulus Exp $";
-#endif
+#define RCSID  "$Id: ipcp.c,v 1.49 1999/08/13 06:46:12 paulus Exp $"
 
 /*
  * TODO:
@@ -39,6 +37,8 @@ static char rcsid[] = "$Id: ipcp.c,v 1.45 1999/05/04 06:57:27 paulus Exp $";
 #include "ipcp.h"
 #include "pathnames.h"
 
+static const char rcsid[] = RCSID;
+
 /* global vars */
 ipcp_options ipcp_wantoptions[NUM_PPP];        /* Options that we want to request */
 ipcp_options ipcp_gotoptions[NUM_PPP]; /* Options that peer ack'd */
@@ -189,7 +189,7 @@ struct protent ipcp_protent = {
     ip_active_pkt
 };
 
-static void ipcp_clear_addrs __P((int));
+static void ipcp_clear_addrs __P((int, u_int32_t, u_int32_t));
 static void ipcp_script __P((char *));         /* Run an up/down script */
 static void ipcp_script_done __P((void *));
 
@@ -440,15 +440,18 @@ ipcp_resetci(f)
     fsm *f;
 {
     ipcp_options *wo = &ipcp_wantoptions[f->unit];
+    ipcp_options *go = &ipcp_gotoptions[f->unit];
 
     wo->req_addr = wo->neg_addr && ipcp_allowoptions[f->unit].neg_addr;
-    if (wo->ouraddr == 0)
+    if (wo->ouraddr == 0 || disable_defaultip)
        wo->accept_local = 1;
     if (wo->hisaddr == 0)
        wo->accept_remote = 1;
     wo->req_dns1 = usepeerdns; /* Request DNS addresses from the peer */
     wo->req_dns2 = usepeerdns;
-    ipcp_gotoptions[f->unit] = *wo;
+    *go = *wo;
+    if (disable_defaultip)
+       go->ouraddr = 0;
 }
 
 
@@ -1291,7 +1294,7 @@ ip_check_options()
      * Default our local IP address based on our hostname.
      * If local IP address already given, don't bother.
      */
-    if (wo->ouraddr == 0 && !disable_defaultip) {
+    if (wo->ouraddr == 0) {
        /*
         * Look up our hostname (possibly with domain name appended)
         * and take the first IP address as our local IP address.
@@ -1411,6 +1414,7 @@ ipcp_up(f)
      */
     if (demand) {
        if (go->ouraddr != wo->ouraddr || ho->hisaddr != wo->hisaddr) {
+           ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr);
            if (go->ouraddr != wo->ouraddr) {
                warn("Local IP address changed to %I", go->ouraddr);
                script_setenv("OLDIPLOCAL", ip_ntoa(wo->ouraddr));
@@ -1423,7 +1427,6 @@ ipcp_up(f)
                wo->hisaddr = ho->hisaddr;
            } else
                script_unsetenv("OLDIPREMOTE");
-           ipcp_clear_addrs(f->unit);
 
            /* Set the interface to the new addresses */
            mask = GetMask(go->ouraddr);
@@ -1491,6 +1494,8 @@ ipcp_up(f)
            if (sifproxyarp(f->unit, ho->hisaddr))
                proxy_arp_set[f->unit] = 1;
 
+       ipcp_wantoptions[0].ouraddr = go->ouraddr;
+
        notice("local  IP address %I", go->ouraddr);
        notice("remote IP address %I", ho->hisaddr);
        if (go->dnsaddr[0])
@@ -1524,8 +1529,9 @@ ipcp_down(f)
     fsm *f;
 {
     IPCPDEBUG(("ipcp: down"));
-    if (get_ppp_stats(f->unit, &link_stats))
-       link_stats_valid = 1;
+    /* XXX a bit IPv4-centric here, we only need to get the stats
+     * before the interface is marked down. */
+    update_link_stats(f->unit);
     if (ipcp_is_up) {
        ipcp_is_up = 0;
        np_down(f->unit, PPP_IP);
@@ -1540,7 +1546,8 @@ ipcp_down(f)
        sifnpmode(f->unit, PPP_IP, NPMODE_QUEUE);
     } else {
        sifdown(f->unit);
-       ipcp_clear_addrs(f->unit);
+       ipcp_clear_addrs(f->unit, ipcp_gotoptions[f->unit].ouraddr,
+                        ipcp_hisoptions[f->unit].hisaddr);
     }
 
     /* Execute the ip-down script */
@@ -1556,13 +1563,11 @@ ipcp_down(f)
  * proxy arp entries, etc.
  */
 static void
-ipcp_clear_addrs(unit)
+ipcp_clear_addrs(unit, ouraddr, hisaddr)
     int unit;
+    u_int32_t ouraddr;  /* local address */
+    u_int32_t hisaddr;  /* remote address */
 {
-    u_int32_t ouraddr, hisaddr;
-
-    ouraddr = ipcp_gotoptions[unit].ouraddr;
-    hisaddr = ipcp_hisoptions[unit].hisaddr;
     if (proxy_arp_set[unit]) {
        cifproxyarp(unit, hisaddr);
        proxy_arp_set[unit] = 0;