X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fipcp.c;h=d3682a032b5243a8c7b6625b37bfe5c399f89bae;hb=31b4bba68d46b38119fd8620ee09ff7f8831f4b5;hp=d928c9f4946738a3685987c7ecd063c376b8f361;hpb=902fa1aaff444c3becacb37c352f7fa5e303400b;p=ppp.git diff --git a/pppd/ipcp.c b/pppd/ipcp.c index d928c9f..d3682a0 100644 --- a/pppd/ipcp.c +++ b/pppd/ipcp.c @@ -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;