X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fipcp.c;h=8c09d705be3f5b29f0d4d8926500a23293b56428;hp=484c00c4b988c9a49f58b6912d9cd55e12a2fd4d;hb=52a17b6d41d64d0502a73e5b4224546360581b49;hpb=9b7089a0401b5d0973cace08f1f632d526a06377;ds=sidebyside diff --git a/pppd/ipcp.c b/pppd/ipcp.c index 484c00c..8c09d70 100644 --- a/pppd/ipcp.c +++ b/pppd/ipcp.c @@ -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);