Brian Boutel <[EMAIL PROTECTED]> wrote:

> So, I suggest that if demand and ipcp-accept-local are both set, and no initial 
>local ip address 
> is specified, although the interface can be set up with the default address, 
> it would do no harm, and in my circumstances it would be helpful, to issue the 
>initial request 
> with 0.0.0.0 rather than the default ip address.

The `nodefaultip' option is intended to do this, but the way it does
it in 2.3.8 isn't quite right for demand mode.  Here is a patch for
pppd/ipcp.c that should make it do the right thing in demand mode.

Paul.

Index: ipcp.c
===================================================================
RCS file: /data/cvs/ppp/pppd/ipcp.c,v
retrieving revision 1.46
diff -u -r1.46 ipcp.c
--- ipcp.c      1999/05/13 00:35:23     1.46
+++ ipcp.c      1999/07/16 05:24:30
@@ -189,7 +189,7 @@
     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 @@
     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 @@
      * 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 @@
      */
     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 @@
                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 @@
            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])
@@ -1541,7 +1546,8 @@
        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 */
@@ -1557,13 +1563,11 @@
  * 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;

-
To unsubscribe from this list: send the line "unsubscribe linux-ppp" in
the body of a message to [EMAIL PROTECTED]

Reply via email to