]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/ipcp.c
Make pppd use blank username/password when explicitly specified
[ppp.git] / pppd / ipcp.c
index 5962c4720a39ea6924b383463eaecaf513c73a7f..b7da1f780fb3592d5096b5a9ec6c46306d9860ed 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.70 2005/08/25 23:59:34 paulus Exp $"
+#define RCSID  "$Id: ipcp.c,v 1.73 2008/05/26 08:33:22 paulus Exp $"
 
 /*
  * TODO:
@@ -72,6 +72,7 @@ ipcp_options ipcp_hisoptions[NUM_PPP];        /* Options that we ack'd */
 u_int32_t netmask = 0;         /* IP netmask to set on interface */
 
 bool   disable_defaultip = 0;  /* Don't use hostname for default IP adrs */
+bool   noremoteip = 0;         /* Let him have no IP address */
 
 /* Hook for a plugin to know when IP protocol has come up */
 void (*ip_up_hook) __P((void)) = NULL;
@@ -218,6 +219,13 @@ static option_t ipcp_option_list[] = {
     { "ipcp-no-address", o_bool, &ipcp_wantoptions[0].neg_addr,
       "Disable IP-Address usage", OPT_A2CLR,
       &ipcp_allowoptions[0].neg_addr },
+#ifdef __linux__
+    { "noremoteip", o_bool, &noremoteip,
+      "Allow peer to have no IP address", 1 },
+#endif
+    { "nosendip", o_bool, &ipcp_wantoptions[0].neg_addr,
+      "Don't send our IP address to peer", OPT_A2CLR,
+      &ipcp_wantoptions[0].old_addrs},
 
     { "IP addresses", o_wild, (void *) &setipaddr,
       "set local and remote IP addresses",
@@ -1117,6 +1125,8 @@ ipcp_nakci(f, p, len, treat_as_reject)
      * on an option that we didn't include in our request packet.
      * If they want to negotiate about IP addresses, we comply.
      * If they want us to ask for compression, we refuse.
+     * If they want us to ask for ms-dns, we do that, since some
+     * peers get huffy if we don't.
      */
     while (len >= CILEN_VOID) {
        GETCHAR(citype, p);
@@ -1159,6 +1169,22 @@ ipcp_nakci(f, p, len, treat_as_reject)
                try.neg_addr = 1;
            no.neg_addr = 1;
            break;
+       case CI_MS_DNS1:
+           if (go->req_dns1 || no.req_dns1 || cilen != CILEN_ADDR)
+               goto bad;
+           GETLONG(l, p);
+           try.dnsaddr[0] = htonl(l);
+           try.req_dns1 = 1;
+           no.req_dns1 = 1;
+           break;
+       case CI_MS_DNS2:
+           if (go->req_dns2 || no.req_dns2 || cilen != CILEN_ADDR)
+               goto bad;
+           GETLONG(l, p);
+           try.dnsaddr[1] = htonl(l);
+           try.req_dns2 = 1;
+           no.req_dns2 = 1;
+           break;
        }
        p = next;
     }
@@ -1581,7 +1607,7 @@ endswitch:
      * option safely.
      */
     if (rc != CONFREJ && !ho->neg_addr && !ho->old_addrs &&
-       wo->req_addr && !reject_if_disagree) {
+       wo->req_addr && !reject_if_disagree && !noremoteip) {
        if (rc == CONFACK) {
            rc = CONFNAK;
            ucp = inp;                  /* reset pointer */
@@ -1641,7 +1667,7 @@ ip_demand_conf(u)
 {
     ipcp_options *wo = &ipcp_wantoptions[u];
 
-    if (wo->hisaddr == 0) {
+    if (wo->hisaddr == 0 && !noremoteip) {
        /* make up an arbitrary address for the peer */
        wo->hisaddr = htonl(0x0a707070 + ifunit);
        wo->accept_remote = 1;
@@ -1667,7 +1693,8 @@ ip_demand_conf(u)
            proxy_arp_set[u] = 1;
 
     notice("local  IP address %I", wo->ouraddr);
-    notice("remote IP address %I", wo->hisaddr);
+    if (wo->hisaddr)
+       notice("remote IP address %I", wo->hisaddr);
 
     return 1;
 }
@@ -1706,14 +1733,19 @@ ipcp_up(f)
        ipcp_close(f->unit, "Could not determine local IP address");
        return;
     }
-    if (ho->hisaddr == 0) {
+    if (ho->hisaddr == 0 && !noremoteip) {
        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);
+    if (ho->hisaddr != 0)
+       script_setenv("IPREMOTE", ip_ntoa(ho->hisaddr), 1);
 
+    if (!go->req_dns1)
+           go->dnsaddr[0] = 0;
+    if (!go->req_dns2)
+           go->dnsaddr[1] = 0;
     if (go->dnsaddr[0])
        script_setenv("DNS1", ip_ntoa(go->dnsaddr[0]), 0);
     if (go->dnsaddr[1])
@@ -1726,7 +1758,7 @@ ipcp_up(f)
     /*
      * Check that the peer is allowed to use the IP address it wants.
      */
-    if (!auth_ip_addr(f->unit, ho->hisaddr)) {
+    if (ho->hisaddr != 0 && !auth_ip_addr(f->unit, ho->hisaddr)) {
        error("Peer is not authorized to use remote address %I", ho->hisaddr);
        ipcp_close(f->unit, "Unauthorized remote IP address");
        return;
@@ -1749,7 +1781,7 @@ ipcp_up(f)
                wo->ouraddr = go->ouraddr;
            } else
                script_unsetenv("OLDIPLOCAL");
-           if (ho->hisaddr != wo->hisaddr) {
+           if (ho->hisaddr != wo->hisaddr && wo->hisaddr != 0) {
                warn("Remote IP address changed to %I", ho->hisaddr);
                script_setenv("OLDIPREMOTE", ip_ntoa(wo->hisaddr), 0);
                wo->hisaddr = ho->hisaddr;
@@ -1771,7 +1803,7 @@ ipcp_up(f)
                    default_route_set[f->unit] = 1;
 
            /* Make a proxy ARP entry if requested. */
-           if (ipcp_wantoptions[f->unit].proxy_arp)
+           if (ho->hisaddr != 0 && ipcp_wantoptions[f->unit].proxy_arp)
                if (sifproxyarp(f->unit, ho->hisaddr))
                    proxy_arp_set[f->unit] = 1;
 
@@ -1821,14 +1853,15 @@ ipcp_up(f)
                default_route_set[f->unit] = 1;
 
        /* Make a proxy ARP entry if requested. */
-       if (ipcp_wantoptions[f->unit].proxy_arp)
+       if (ho->hisaddr != 0 && ipcp_wantoptions[f->unit].proxy_arp)
            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 (ho->hisaddr != 0)
+           notice("remote IP address %I", ho->hisaddr);
        if (go->dnsaddr[0])
            notice("primary   DNS address %I", go->dnsaddr[0]);
        if (go->dnsaddr[1])
@@ -2114,7 +2147,7 @@ ipcp_printpkt(p, plen, printer, arg)
            case CI_MS_DNS2:
                p += 2;
                GETLONG(cilong, p);
-               printer(arg, "ms-dns%d %I", code - CI_MS_DNS1 + 1,
+               printer(arg, "ms-dns%d %I", (code == CI_MS_DNS1? 1: 2),
                        htonl(cilong));
                break;
            case CI_MS_WINS1: