summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>1995-12-18 03:45:58 +0000
committerPaul Mackerras <paulus@samba.org>1995-12-18 03:45:58 +0000
commite1746e5f6bc21a42ed4c0b35dc5271026d580a81 (patch)
tree9425379e77552a8d3b7d9f81c58450c5fa07c329
parente3a35824cd85bf337d77fda821f149a90aabb674 (diff)
downloadppp-e1746e5f6bc21a42ed4c0b35dc5271026d580a81.tar.gz
support micro$oft DNS options;
extend protocol table; supply message on protocol close
-rw-r--r--pppd/ipcp.c71
-rw-r--r--pppd/ipcp.h12
2 files changed, 68 insertions, 15 deletions
diff --git a/pppd/ipcp.c b/pppd/ipcp.c
index 2566fc8..734f741 100644
--- a/pppd/ipcp.c
+++ b/pppd/ipcp.c
@@ -18,7 +18,7 @@
*/
#ifndef lint
-static char rcsid[] = "$Id: ipcp.c,v 1.21 1995/08/17 11:57:12 paulus Exp $";
+static char rcsid[] = "$Id: ipcp.c,v 1.22 1995/12/18 03:45:56 paulus Exp $";
#endif
/*
@@ -80,6 +80,12 @@ static fsm_callbacks ipcp_callbacks = { /* IPCP callback routines */
"IPCP" /* String name of protocol */
};
+struct protent ipcp_protent = {
+ PPP_IPCP, ipcp_init, ipcp_input, ipcp_protrej,
+ ipcp_lowerup, ipcp_lowerdown, ipcp_open, ipcp_close,
+ ipcp_printpkt, NULL, 1, "IPCP"
+};
+
/*
* Lengths of configuration options.
*/
@@ -130,13 +136,11 @@ ipcp_init(unit)
f->callbacks = &ipcp_callbacks;
fsm_init(&ipcp_fsm[unit]);
- wo->neg_addr = 1;
- wo->old_addrs = 0;
- wo->ouraddr = 0;
- wo->hisaddr = 0;
+ memset(wo, 0, sizeof(*wo));
+ memset(ao, 0, sizeof(*ao));
+ wo->neg_addr = 1;
wo->neg_vj = 1;
- wo->old_vj = 0;
wo->vj_protocol = IPCP_VJ_COMP;
wo->maxslotindex = MAX_STATES - 1; /* really max index */
wo->cflag = 1;
@@ -174,10 +178,11 @@ ipcp_open(unit)
* ipcp_close - Take IPCP down.
*/
void
-ipcp_close(unit)
+ipcp_close(unit, reason)
int unit;
+ char *reason;
{
- fsm_close(&ipcp_fsm[unit]);
+ fsm_close(&ipcp_fsm[unit], reason);
}
@@ -857,6 +862,46 @@ ipcp_reqci(f, inp, len, reject_if_disagree)
ho->neg_addr = 1;
ho->hisaddr = ciaddr1;
break;
+
+#ifdef USE_MS_DNS
+ case CI_MS_DNS1:
+ /* Microsoft primary DNS request */
+ IPCPDEBUG((LOG_INFO, "ipcp: received DNS1 Request "));
+
+ /* If we do not have a DNS address then we cannot send it */
+ if (ao->dnsaddr[0] == 0 ||
+ cilen != CILEN_ADDR) { /* Check CI length */
+ orc = CONFREJ; /* Reject CI */
+ break;
+ }
+ GETLONG(tl, p);
+ if (htonl(tl) != ao->dnsaddr[0]) {
+ DECPTR(sizeof(u_int32_t), p);
+ tl = ntohl(ao->dnsaddr[0]);
+ PUTLONG(tl, p);
+ orc = CONFNAK;
+ }
+ break;
+
+ case CI_MS_DNS2:
+ /* Microsoft secondary DNS request */
+ IPCPDEBUG((LOG_INFO, "ipcp: received DNS2 Request "));
+
+ /* If we do not have a DNS address then we cannot send it */
+ if (ao->dnsaddr[1] == 0 || /* Yes, this is the first one! */
+ cilen != CILEN_ADDR) { /* Check CI length */
+ orc = CONFREJ; /* Reject CI */
+ break;
+ }
+ GETLONG(tl, p);
+ if (htonl(tl) != ao->dnsaddr[1]) { /* and this is the 2nd one */
+ DECPTR(sizeof(u_int32_t), p);
+ tl = ntohl(ao->dnsaddr[1]);
+ PUTLONG(tl, p);
+ orc = CONFNAK;
+ }
+ break;
+#endif
case CI_COMPRESSTYPE:
IPCPDEBUG((LOG_INFO, "ipcp: received COMPRESSTYPE "));
@@ -992,12 +1037,12 @@ ipcp_up(f)
if (ho->hisaddr == 0) {
syslog(LOG_ERR, "Could not determine remote IP address");
- ipcp_close(f->unit);
+ ipcp_close(f->unit, "Could not determine remote IP address");
return;
}
if (go->ouraddr == 0) {
syslog(LOG_ERR, "Could not determine local IP address");
- ipcp_close(f->unit);
+ ipcp_close(f->unit, "Could not determine local IP address");
return;
}
@@ -1007,7 +1052,7 @@ ipcp_up(f)
if (!auth_ip_addr(f->unit, ho->hisaddr)) {
syslog(LOG_ERR, "Peer is not authorized to use remote address %s",
ip_ntoa(ho->hisaddr));
- ipcp_close(f->unit);
+ ipcp_close(f->unit, "Unauthorized remote IP address");
return;
}
@@ -1020,7 +1065,7 @@ ipcp_up(f)
mask = GetMask(go->ouraddr);
if (!sifaddr(f->unit, go->ouraddr, ho->hisaddr, mask)) {
IPCPDEBUG((LOG_WARNING, "sifaddr failed"));
- ipcp_close(f->unit);
+ ipcp_close(f->unit, "Interface configuration failed");
return;
}
@@ -1030,7 +1075,7 @@ ipcp_up(f)
/* bring the interface up for IP */
if (!sifup(f->unit)) {
IPCPDEBUG((LOG_WARNING, "sifup failed"));
- ipcp_close(f->unit);
+ ipcp_close(f->unit, "Interface configuration failed");
return;
}
diff --git a/pppd/ipcp.h b/pppd/ipcp.h
index b1f9b40..e125146 100644
--- a/pppd/ipcp.h
+++ b/pppd/ipcp.h
@@ -16,7 +16,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: ipcp.h,v 1.5 1994/09/21 06:47:37 paulus Exp $
+ * $Id: ipcp.h,v 1.6 1995/12/18 03:45:58 paulus Exp $
*/
/*
@@ -26,6 +26,9 @@
#define CI_COMPRESSTYPE 2 /* Compression Type */
#define CI_ADDR 3
+#define CI_MS_DNS1 129 /* Primary DNS value */
+#define CI_MS_DNS2 131 /* Secondary DNS value */
+
#define MAX_STATES 16 /* from slcompress.h */
#define IPCP_VJMODE_OLD 1 /* "old" mode (option # = 0x0037) */
@@ -50,6 +53,9 @@ typedef struct ipcp_options {
u_short vj_protocol; /* protocol value to use in VJ option */
u_char maxslotindex, cflag; /* values for RFC1332 VJ compression neg. */
u_int32_t ouraddr, hisaddr; /* Addresses in NETWORK BYTE ORDER */
+#ifdef USE_MS_DNS
+ u_int32_t dnsaddr[2]; /* Primary and secondary DNS entries */
+#endif
} ipcp_options;
extern fsm ipcp_fsm[];
@@ -60,9 +66,11 @@ extern ipcp_options ipcp_hisoptions[];
void ipcp_init __P((int));
void ipcp_open __P((int));
-void ipcp_close __P((int));
+void ipcp_close __P((int, char *));
void ipcp_lowerup __P((int));
void ipcp_lowerdown __P((int));
void ipcp_input __P((int, u_char *, int));
void ipcp_protrej __P((int));
int ipcp_printpkt __P((u_char *, int, void (*)(), void *));
+
+extern struct protent ipcp_protent;