]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/ipcp.c
Move the tty-related stuff out to tty.c as far as possible.
[ppp.git] / pppd / ipcp.c
index 484c00c4b988c9a49f58b6912d9cd55e12a2fd4d..8c09d705be3f5b29f0d4d8926500a23293b56428 100644 (file)
@@ -17,7 +17,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#define RCSID  "$Id: ipcp.c,v 1.54 2000/04/15 01:27:11 masputra Exp $"
+#define RCSID  "$Id: ipcp.c,v 1.55 2000/06/30 04:54:20 paulus Exp $"
 
 /*
  * TODO:
@@ -53,11 +53,15 @@ void (*ip_up_hook) __P((void)) = NULL;
 /* Hook for a plugin to know when IP protocol has come down */
 void (*ip_down_hook) __P((void)) = NULL;
 
+/* Hook for a plugin to choose the remote IP address */
+void (*ip_choose_hook) __P((u_int32_t *)) = NULL;
+
 /* local vars */
 static int default_route_set[NUM_PPP]; /* Have set up a default route */
 static int proxy_arp_set[NUM_PPP];     /* Have created proxy arp entry */
 static bool usepeerdns;                        /* Ask peer for DNS addrs */
 static int ipcp_is_up;                 /* have called np_up() */
+static bool ask_for_local;             /* request our address from peer */
 
 /*
  * Callbacks for fsm code.  (CI = Configuration Information)
@@ -449,15 +453,17 @@ ipcp_resetci(f)
     ipcp_options *go = &ipcp_gotoptions[f->unit];
 
     wo->req_addr = wo->neg_addr && ipcp_allowoptions[f->unit].neg_addr;
-    if (wo->ouraddr == 0 || disable_defaultip)
+    if (wo->ouraddr == 0)
        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;
     *go = *wo;
-    if (disable_defaultip)
+    if (!ask_for_local)
        go->ouraddr = 0;
+    if (ip_choose_hook)
+       ip_choose_hook(&wo->hisaddr);
 }
 
 
@@ -1300,7 +1306,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) {
+    if (wo->ouraddr == 0 && !disable_defaultip) {
        /*
         * Look up our hostname (possibly with domain name appended)
         * and take the first IP address as our local IP address.
@@ -1313,6 +1319,7 @@ ip_check_options()
                wo->ouraddr = local;
        }
     }
+    ask_for_local = wo->ouraddr != 0 || !disable_defaultip;
 }
 
 
@@ -1335,7 +1342,7 @@ ip_demand_conf(u)
        /* make up an arbitrary address for us */
        wo->ouraddr = htonl(0x0a404040 + ifunit);
        wo->accept_local = 1;
-       disable_defaultip = 1;  /* don't tell the peer this address */
+       ask_for_local = 0;      /* don't tell the peer this address */
     }
     if (!sifaddr(u, wo->ouraddr, wo->hisaddr, GetMask(wo->ouraddr)))
        return 0;
@@ -1379,16 +1386,16 @@ ipcp_up(f)
     if (!ho->neg_addr)
        ho->hisaddr = wo->hisaddr;
 
-    if (ho->hisaddr == 0) {
-       error("Could not determine remote IP address");
-       ipcp_close(f->unit, "Could not determine remote IP address");
-       return;
-    }
     if (go->ouraddr == 0) {
        error("Could not determine local IP address");
        ipcp_close(f->unit, "Could not determine local IP address");
        return;
     }
+    if (ho->hisaddr == 0) {
+       ho->hisaddr = htonl(0x0a404040 + ifunit);
+       warn("Could not determine remote IP address: defaulting to %I",
+            ho->hisaddr);
+    }
     script_setenv("IPLOCAL", ip_ntoa(go->ouraddr), 0);
     script_setenv("IPREMOTE", ip_ntoa(ho->hisaddr), 1);