*/
#ifndef lint
-static char rcsid[] = "$Id: ipcp.c,v 1.43 1999/03/19 04:23:39 paulus Exp $";
+static char rcsid[] = "$Id: ipcp.c,v 1.45 1999/05/04 06:57:27 paulus Exp $";
#endif
/*
bool disable_defaultip = 0; /* Don't use hostname for default IP adrs */
/* local vars */
-static int cis_received[NUM_PPP]; /* # Conf-Reqs received */
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 */
wo->req_dns1 = usepeerdns; /* Request DNS addresses from the peer */
wo->req_dns2 = usepeerdns;
ipcp_gotoptions[f->unit] = *wo;
- cis_received[f->unit] = 0;
}
}
if (wo->neg_vj && !go->neg_vj && !go->old_vj) {
/* try an older style of VJ negotiation */
- if (cis_received[f->unit] == 0) {
- /* keep trying the new style until we see some CI from the peer */
+ /* use the old style only if the peer did */
+ if (ho->neg_vj && ho->old_vj) {
go->neg_vj = 1;
- } else {
- /* use the old style only if the peer did */
- if (ho->neg_vj && ho->old_vj) {
- go->neg_vj = 1;
- go->old_vj = 1;
- go->vj_protocol = ho->vj_protocol;
- }
+ go->old_vj = 1;
+ go->vj_protocol = ho->vj_protocol;
}
}
neg = 0; \
}
-#define ADDCIDNS(opt, neg) \
+#define ADDCIDNS(opt, neg, addr) \
if (neg) { \
- int addrlen = CILEN_ADDR; \
- if (len >= addrlen) { \
+ if (len >= CILEN_ADDR) { \
u_int32_t l; \
PUTCHAR(opt, ucp); \
- PUTCHAR(addrlen, ucp); \
- l = ntohl(0); \
+ PUTCHAR(CILEN_ADDR, ucp); \
+ l = ntohl(addr); \
PUTLONG(l, ucp); \
- len -= addrlen; \
+ len -= CILEN_ADDR; \
} else \
neg = 0; \
}
ADDCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,
go->maxslotindex, go->cflag);
- ADDCIDNS(CI_MS_DNS1, go->req_dns1);
+ ADDCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);
- ADDCIDNS(CI_MS_DNS2, go->req_dns2);
+ ADDCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);
*lenp -= len;
}
} \
}
+#define ACKCIDNS(opt, neg, addr) \
+ if (neg) { \
+ u_int32_t l; \
+ if ((len -= CILEN_ADDR) < 0) \
+ goto bad; \
+ GETCHAR(citype, p); \
+ GETCHAR(cilen, p); \
+ if (cilen != CILEN_ADDR || citype != opt) \
+ goto bad; \
+ GETLONG(l, p); \
+ cilong = htonl(l); \
+ if (addr != cilong) \
+ goto bad; \
+ }
+
ACKCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), go->neg_addr,
go->old_addrs, go->ouraddr, go->hisaddr);
ACKCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,
go->maxslotindex, go->cflag);
+ ACKCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);
+
+ ACKCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);
+
/*
* If there are any remaining CIs, then this packet is bad.
*/
code \
}
-/*
- * Peer returns DNS address in a NAK packet
- */
#define NAKCIDNS(opt, neg, code) \
if (go->neg && \
((cilen = p[1]) == CILEN_ADDR) && \
NAKCIDNS(CI_MS_DNS1, req_dns1,
try.dnsaddr[0] = cidnsaddr;
- try.req_dns1 = 0;
);
NAKCIDNS(CI_MS_DNS2, req_dns2,
try.dnsaddr[1] = cidnsaddr;
- try.req_dns2 = 0;
);
/*
#define REJCIDNS(opt, neg, dnsaddr) \
if (go->neg && \
- ((cilen = p[1]) == CI_MS_DNS1) && \
+ ((cilen = p[1]) == CILEN_ADDR) && \
len >= cilen && \
p[0] == opt) { \
u_int32_t l; \
u_char maxslotindex, cflag;
int d;
- cis_received[f->unit] = 1;
-
/*
* Reset all his options.
*/
case CI_MS_DNS2:
p += 2;
GETLONG(cilong, p);
- printer(arg, "ms-dns %I", htonl(cilong));
+ printer(arg, "ms-dns%d %I", code - CI_MS_DNS1 + 1,
+ htonl(cilong));
break;
case CI_MS_WINS1:
case CI_MS_WINS2: