X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fipcp.c;h=5962c4720a39ea6924b383463eaecaf513c73a7f;hb=ef0a499148f81d19ada42650cff5b969bf7cad7f;hp=874d68523feb6b4fa92bdd75e98616acdae56ba4;hpb=ec27e67401c1e4031be2fa7f692d3d66d5bee586;p=ppp.git diff --git a/pppd/ipcp.c b/pppd/ipcp.c index 874d685..5962c47 100644 --- a/pppd/ipcp.c +++ b/pppd/ipcp.c @@ -40,7 +40,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define RCSID "$Id: ipcp.c,v 1.68 2004/11/13 02:28:15 paulus Exp $" +#define RCSID "$Id: ipcp.c,v 1.70 2005/08/25 23:59:34 paulus Exp $" /* * TODO: @@ -264,7 +264,7 @@ struct protent ipcp_protent = { }; 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 __P((char *, int)); /* Run an up/down script */ static void ipcp_script_done __P((void *)); /* @@ -1089,6 +1089,7 @@ ipcp_nakci(f, p, len, treat_as_reject) NAKCIADDR(CI_ADDR, neg_addr, if (treat_as_reject) { try.neg_addr = 0; + try.old_addrs = 0; } else if (go->accept_local && ciaddr1) { /* take his idea of our address */ try.ouraddr = ciaddr1; @@ -1653,6 +1654,7 @@ ip_demand_conf(u) } if (!sifaddr(u, wo->ouraddr, wo->hisaddr, GetMask(wo->ouraddr))) return 0; + ipcp_script(_PATH_IPPREUP, 1); if (!sifup(u)) return 0; if (!sifnpmode(u, PPP_IP, NPMODE_QUEUE)) @@ -1693,6 +1695,12 @@ ipcp_up(f) if (!ho->neg_addr && !ho->old_addrs) ho->hisaddr = wo->hisaddr; + if (!(go->neg_addr || go->old_addrs) && (wo->neg_addr || wo->old_addrs) + && wo->ouraddr != 0) { + error("Peer refused to agree to our IP address"); + ipcp_close(f->unit, "Refused our IP address"); + return; + } if (go->ouraddr == 0) { error("Could not determine local IP address"); ipcp_close(f->unit, "Could not determine local IP address"); @@ -1786,6 +1794,9 @@ ipcp_up(f) } #endif + /* run the pre-up script, if any, and wait for it to finish */ + ipcp_script(_PATH_IPPREUP, 1); + /* bring the interface up for IP */ if (!sifup(f->unit)) { if (debug) @@ -1839,7 +1850,7 @@ ipcp_up(f) */ if (ipcp_script_state == s_down && ipcp_script_pid == 0) { ipcp_script_state = s_up; - ipcp_script(_PATH_IPUP); + ipcp_script(_PATH_IPUP, 0); } } @@ -1889,7 +1900,7 @@ ipcp_down(f) /* Execute the ip-down script */ if (ipcp_script_state == s_up && ipcp_script_pid == 0) { ipcp_script_state = s_down; - ipcp_script(_PATH_IPDOWN); + ipcp_script(_PATH_IPDOWN, 0); } } @@ -1943,13 +1954,13 @@ ipcp_script_done(arg) case s_up: if (ipcp_fsm[0].state != OPENED) { ipcp_script_state = s_down; - ipcp_script(_PATH_IPDOWN); + ipcp_script(_PATH_IPDOWN, 0); } break; case s_down: if (ipcp_fsm[0].state == OPENED) { ipcp_script_state = s_up; - ipcp_script(_PATH_IPUP); + ipcp_script(_PATH_IPUP, 0); } break; } @@ -1961,8 +1972,9 @@ ipcp_script_done(arg) * interface-name tty-name speed local-IP remote-IP. */ static void -ipcp_script(script) +ipcp_script(script, wait) char *script; + int wait; { char strspeed[32], strlocal[32], strremote[32]; char *argv[8]; @@ -1979,7 +1991,11 @@ ipcp_script(script) argv[5] = strremote; argv[6] = ipparam; argv[7] = NULL; - ipcp_script_pid = run_program(script, argv, 0, ipcp_script_done, NULL); + if (wait) + run_program(script, argv, 0, NULL, NULL, 1); + else + ipcp_script_pid = run_program(script, argv, 0, ipcp_script_done, + NULL, 0); } /*