X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fipcp.c;h=da5fd739560f22d50f0191651da97cddc4b70ebb;hb=8bc5a4e58d34b6e5304d86f4722e2d2428abbf7c;hp=efc1af8d87c87abf98678cddf8658008942a915a;hpb=a492cec08cacae8eeb09f5a6f0412ebc0e21bda1;p=ppp.git diff --git a/pppd/ipcp.c b/pppd/ipcp.c index efc1af8..da5fd73 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.67 2004/11/08 11:45:59 paulus Exp $" +#define RCSID "$Id: ipcp.c,v 1.69 2004/11/13 12:03:26 paulus Exp $" /* * TODO: @@ -103,7 +103,7 @@ static void ipcp_resetci __P((fsm *)); /* Reset our CI */ static int ipcp_cilen __P((fsm *)); /* Return length of our CI */ static void ipcp_addci __P((fsm *, u_char *, int *)); /* Add our CI */ static int ipcp_ackci __P((fsm *, u_char *, int)); /* Peer ack'd our CI */ -static int ipcp_nakci __P((fsm *, u_char *, int)); /* Peer nak'd our CI */ +static int ipcp_nakci __P((fsm *, u_char *, int, int));/* Peer nak'd our CI */ static int ipcp_rejci __P((fsm *, u_char *, int)); /* Peer rej'd our CI */ static int ipcp_reqci __P((fsm *, u_char *, int *, int)); /* Rcv CI */ static void ipcp_up __P((fsm *)); /* We're UP */ @@ -961,10 +961,11 @@ bad: * 1 - Nak was good. */ static int -ipcp_nakci(f, p, len) +ipcp_nakci(f, p, len, treat_as_reject) fsm *f; u_char *p; int len; + int treat_as_reject; { ipcp_options *go = &ipcp_gotoptions[f->unit]; u_char cimaxslotindex, cicflag; @@ -1040,11 +1041,17 @@ ipcp_nakci(f, p, len) * from our idea, only if the accept_{local,remote} flag is set. */ NAKCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, - if (go->accept_local && ciaddr1) { /* Do we know our address? */ - try.ouraddr = ciaddr1; - } - if (go->accept_remote && ciaddr2) { /* Does he know his? */ - try.hisaddr = ciaddr2; + if (treat_as_reject) { + try.old_addrs = 0; + } else { + if (go->accept_local && ciaddr1) { + /* take his idea of our address */ + try.ouraddr = ciaddr1; + } + if (go->accept_remote && ciaddr2) { + /* take his idea of his address */ + try.hisaddr = ciaddr2; + } } ); @@ -1055,7 +1062,9 @@ ipcp_nakci(f, p, len) * the peer wants. */ NAKCIVJ(CI_COMPRESSTYPE, neg_vj, - if (cilen == CILEN_VJ) { + if (treat_as_reject) { + try.neg_vj = 0; + } else if (cilen == CILEN_VJ) { GETCHAR(cimaxslotindex, p); GETCHAR(cicflag, p); if (cishort == IPCP_VJ_COMP) { @@ -1078,18 +1087,30 @@ ipcp_nakci(f, p, len) ); NAKCIADDR(CI_ADDR, neg_addr, - if (go->accept_local && ciaddr1) { /* Do we know our address? */ + 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; } ); NAKCIDNS(CI_MS_DNS1, req_dns1, - try.dnsaddr[0] = cidnsaddr; - ); + if (treat_as_reject) { + try.req_dns1 = 0; + } else { + try.dnsaddr[0] = cidnsaddr; + } + ); NAKCIDNS(CI_MS_DNS2, req_dns2, - try.dnsaddr[1] = cidnsaddr; - ); + if (treat_as_reject) { + try.req_dns2 = 0; + } else { + try.dnsaddr[1] = cidnsaddr; + } + ); /* * There may be remaining CIs, if the peer is requesting negotiation @@ -1673,6 +1694,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");