*/
#ifndef lint
-static char rcsid[] = "$Id: ipcp.c,v 1.37 1999/03/08 05:34:43 paulus Exp $";
+static char rcsid[] = "$Id: ipcp.c,v 1.44 1999/04/12 06:24:45 paulus Exp $";
#endif
/*
#include <stdio.h>
#include <string.h>
-#include <syslog.h>
#include <netdb.h>
#include <sys/param.h>
#include <sys/types.h>
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 */
+static int ipcp_is_up; /* have called np_up() */
/*
* Callbacks for fsm code. (CI = Configuration Information)
"disable proxyarp option", OPT_A2COPY,
&ipcp_wantoptions[0].proxy_arp },
{ "usepeerdns", o_bool, &usepeerdns,
- "Ask peer for DNS address(es)" },
+ "Ask peer for DNS address(es)", 1 },
{ NULL }
};
NULL,
1,
"IPCP",
+ "IP",
ipcp_option_list,
ip_check_options,
ip_demand_conf,
{
static char b[64];
- ipaddr = ntohl(ipaddr);
-
- sprintf(b, "%d.%d.%d.%d",
- (u_char)(ipaddr >> 24),
- (u_char)(ipaddr >> 16),
- (u_char)(ipaddr >> 8),
- (u_char)(ipaddr));
+ slprintf(b, sizeof(b), "%I", ipaddr);
return b;
}
wo->maxslotindex = MAX_STATES - 1; /* really max index */
wo->cflag = 1;
- wo->req_dns1 = usepeerdns; /* Request DNS addresses from the peer */
- wo->req_dns2 = usepeerdns;
-
/* max slots and slot-id compression are currently hardwired in */
/* ppp_if.c to 16 and 1, this needs to be changed (among other */
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;
cis_received[f->unit] = 0;
}
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.
*/
return (1);
bad:
- IPCPDEBUG((LOG_INFO, "ipcp_ackci: received bad Ack!"));
+ IPCPDEBUG(("ipcp_ackci: received bad Ack!"));
return (0);
}
code \
}
-/*
- * Peer returns DNS address in a NAK packet
- */
#define NAKCIDNS(opt, neg, code) \
if (go->neg && \
((cilen = p[1]) == CILEN_ADDR) && \
NAKCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), neg_addr, go->old_addrs,
if (go->accept_local && ciaddr1) { /* Do we know our address? */
try.ouraddr = ciaddr1;
- IPCPDEBUG((LOG_INFO, "local IP address %s",
- ip_ntoa(ciaddr1)));
}
if (go->accept_remote && ciaddr2) { /* Does he know his? */
try.hisaddr = ciaddr2;
- IPCPDEBUG((LOG_INFO, "remote IP address %s",
- ip_ntoa(ciaddr2)));
}
);
NAKCIDNS(CI_MS_DNS1, req_dns1,
try.dnsaddr[0] = cidnsaddr;
- IPCPDEBUG((LOG_INFO, "Received DNS address %s", ip_ntoa(cidnsaddr)));
- try.req_dns1 = 0;
);
NAKCIDNS(CI_MS_DNS2, req_dns2,
try.dnsaddr[1] = cidnsaddr;
- IPCPDEBUG((LOG_INFO, "Received DNS address %s", ip_ntoa(cidnsaddr)));
- try.req_dns2 = 0;
);
/*
p = next;
}
- /* If there is still anything left, this packet is bad. */
- if (len != 0)
- goto bad;
-
/*
* OK, the Nak is good. Now we can update state.
+ * If there are any remaining options, we ignore them.
*/
if (f->state != OPENED)
*go = try;
return 1;
bad:
- IPCPDEBUG((LOG_INFO, "ipcp_nakci: received bad Nak!"));
+ IPCPDEBUG(("ipcp_nakci: received bad Nak!"));
return 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; \
return 1;
bad:
- IPCPDEBUG((LOG_INFO, "ipcp_rejci: received bad Reject!"));
+ IPCPDEBUG(("ipcp_rejci: received bad Reject!"));
return 0;
}
if (l < 2 || /* Not enough data for CI header or */
p[1] < 2 || /* CI length too small or */
p[1] > l) { /* CI length too big? */
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: bad CI length!"));
+ IPCPDEBUG(("ipcp_reqci: bad CI length!"));
orc = CONFREJ; /* Reject bad CI */
cilen = l; /* Reject till end of packet */
l = 0; /* Don't loop again */
switch (citype) { /* Check CI type */
case CI_ADDRS:
- IPCPDEBUG((LOG_INFO, "ipcp: received ADDRS "));
if (!ao->neg_addr ||
cilen != CILEN_ADDRS) { /* Check CI length */
orc = CONFREJ; /* Reject CI */
*/
GETLONG(tl, p); /* Parse source address (his) */
ciaddr1 = htonl(tl);
- IPCPDEBUG((LOG_INFO, "(%s:", ip_ntoa(ciaddr1)));
if (ciaddr1 != wo->hisaddr
&& (ciaddr1 == 0 || !wo->accept_remote)) {
orc = CONFNAK;
*/
GETLONG(tl, p); /* Parse desination address (ours) */
ciaddr2 = htonl(tl);
- IPCPDEBUG((LOG_INFO, "%s)", ip_ntoa(ciaddr2)));
if (ciaddr2 != wo->ouraddr) {
if (ciaddr2 == 0 || !wo->accept_local) {
orc = CONFNAK;
break;
case CI_ADDR:
- IPCPDEBUG((LOG_INFO, "ipcp: received ADDR "));
-
if (!ao->neg_addr ||
cilen != CILEN_ADDR) { /* Check CI length */
orc = CONFREJ; /* Reject CI */
*/
GETLONG(tl, p); /* Parse source address (his) */
ciaddr1 = htonl(tl);
- IPCPDEBUG((LOG_INFO, "(%s)", ip_ntoa(ciaddr1)));
if (ciaddr1 != wo->hisaddr
&& (ciaddr1 == 0 || !wo->accept_remote)) {
orc = CONFNAK;
case CI_MS_DNS2:
/* Microsoft primary or secondary DNS request */
d = citype == CI_MS_DNS2;
- IPCPDEBUG((LOG_INFO, "ipcp: received DNS%d Request ", d+1));
/* If we do not have a DNS address then we cannot send it */
if (ao->dnsaddr[d] == 0 ||
case CI_MS_WINS2:
/* Microsoft primary or secondary WINS request */
d = citype == CI_MS_WINS2;
- IPCPDEBUG((LOG_INFO, "ipcp: received WINS%d Request ", d+1));
/* If we do not have a DNS address then we cannot send it */
if (ao->winsaddr[d] == 0 ||
break;
case CI_COMPRESSTYPE:
- IPCPDEBUG((LOG_INFO, "ipcp: received COMPRESSTYPE "));
if (!ao->neg_vj ||
(cilen != CILEN_VJ && cilen != CILEN_COMPRESS)) {
orc = CONFREJ;
break;
}
GETSHORT(cishort, p);
- IPCPDEBUG((LOG_INFO, "(%d)", cishort));
if (!(cishort == IPCP_VJ_COMP ||
(cishort == IPCP_VJ_COMP_OLD && cilen == CILEN_COMPRESS))) {
orc = CONFREJ;
break;
}
-
endswitch:
- IPCPDEBUG((LOG_INFO, " (%s)\n", CODENAME(orc)));
-
if (orc == CONFACK && /* Good CI */
rc != CONFACK) /* but prior CI wasnt? */
continue; /* Don't send this one */
}
*len = ucp - inp; /* Compute output length */
- IPCPDEBUG((LOG_INFO, "ipcp: returning Configure-%s", CODENAME(rc)));
+ IPCPDEBUG(("ipcp: returning Configure-%s", CODENAME(rc)));
return (rc); /* Return final code */
}
if (sifproxyarp(u, wo->hisaddr))
proxy_arp_set[u] = 1;
- syslog(LOG_NOTICE, "local IP address %s", ip_ntoa(wo->ouraddr));
- syslog(LOG_NOTICE, "remote IP address %s", ip_ntoa(wo->hisaddr));
+ notice("local IP address %I", wo->ouraddr);
+ notice("remote IP address %I", wo->hisaddr);
return 1;
}
ipcp_options *go = &ipcp_gotoptions[f->unit];
ipcp_options *wo = &ipcp_wantoptions[f->unit];
- np_up(f->unit, PPP_IP);
- IPCPDEBUG((LOG_INFO, "ipcp: up"));
+ IPCPDEBUG(("ipcp: up"));
/*
* We must have a non-zero IP address for both ends of the link.
ho->hisaddr = wo->hisaddr;
if (ho->hisaddr == 0) {
- syslog(LOG_ERR, "Could not determine remote IP address");
+ error("Could not determine remote IP address");
ipcp_close(f->unit, "Could not determine remote IP address");
return;
}
if (go->ouraddr == 0) {
- syslog(LOG_ERR, "Could not determine local IP address");
+ error("Could not determine local IP address");
ipcp_close(f->unit, "Could not determine local IP address");
return;
}
* Check that the peer is allowed to use the IP address it wants.
*/
if (!auth_ip_addr(f->unit, ho->hisaddr)) {
- syslog(LOG_ERR, "Peer is not authorized to use remote address %s",
- ip_ntoa(ho->hisaddr));
+ error("Peer is not authorized to use remote address %I", ho->hisaddr);
ipcp_close(f->unit, "Unauthorized remote IP address");
return;
}
if (demand) {
if (go->ouraddr != wo->ouraddr || ho->hisaddr != wo->hisaddr) {
if (go->ouraddr != wo->ouraddr) {
- syslog(LOG_WARNING, "Local IP address changed to %s",
- ip_ntoa(go->ouraddr));
+ warn("Local IP address changed to %I", go->ouraddr);
script_setenv("OLDIPLOCAL", ip_ntoa(wo->ouraddr));
wo->ouraddr = go->ouraddr;
} else
script_unsetenv("OLDIPLOCAL");
if (ho->hisaddr != wo->hisaddr) {
- syslog(LOG_WARNING, "Remote IP address changed to %s",
- ip_ntoa(ho->hisaddr));
+ warn("Remote IP address changed to %I", ho->hisaddr);
script_setenv("OLDIPREMOTE", ip_ntoa(wo->hisaddr));
wo->hisaddr = ho->hisaddr;
} else
/* Set the interface to the new addresses */
mask = GetMask(go->ouraddr);
if (!sifaddr(f->unit, go->ouraddr, ho->hisaddr, mask)) {
- IPCPDEBUG((LOG_WARNING, "sifaddr failed"));
+ if (debug)
+ warn("Interface configuration failed");
ipcp_close(f->unit, "Interface configuration failed");
return;
}
#if !(defined(SVR4) && (defined(SNI) || defined(__USLC__)))
if (!sifaddr(f->unit, go->ouraddr, ho->hisaddr, mask)) {
- IPCPDEBUG((LOG_WARNING, "sifaddr failed"));
+ if (debug)
+ warn("Interface configuration failed");
ipcp_close(f->unit, "Interface configuration failed");
return;
}
/* bring the interface up for IP */
if (!sifup(f->unit)) {
- IPCPDEBUG((LOG_WARNING, "sifup failed"));
+ if (debug)
+ warn("Interface failed to come up");
ipcp_close(f->unit, "Interface configuration failed");
return;
}
#if (defined(SVR4) && (defined(SNI) || defined(__USLC__)))
if (!sifaddr(f->unit, go->ouraddr, ho->hisaddr, mask)) {
- IPCPDEBUG((LOG_WARNING, "sifaddr failed"));
+ if (debug)
+ warn("Interface configuration failed");
ipcp_close(f->unit, "Interface configuration failed");
return;
}
if (sifproxyarp(f->unit, ho->hisaddr))
proxy_arp_set[f->unit] = 1;
- syslog(LOG_NOTICE, "local IP address %s", ip_ntoa(go->ouraddr));
- syslog(LOG_NOTICE, "remote IP address %s", ip_ntoa(ho->hisaddr));
- syslog(LOG_NOTICE, "primary DNS address %s", ip_ntoa(go->dnsaddr[0]));
- syslog(LOG_NOTICE, "secondary DNS address %s", ip_ntoa(go->dnsaddr[1]));
+ notice("local IP address %I", go->ouraddr);
+ notice("remote IP address %I", ho->hisaddr);
+ if (go->dnsaddr[0])
+ notice("primary DNS address %I", go->dnsaddr[0]);
+ if (go->dnsaddr[1])
+ notice("secondary DNS address %I", go->dnsaddr[1]);
}
+ np_up(f->unit, PPP_IP);
+ ipcp_is_up = 1;
+
/*
* Execute the ip-up script, like this:
* /etc/ppp/ip-up interface tty speed local-IP remote-IP
ipcp_down(f)
fsm *f;
{
- IPCPDEBUG((LOG_INFO, "ipcp: down"));
- np_down(f->unit, PPP_IP);
+ IPCPDEBUG(("ipcp: down"));
+ if (get_ppp_stats(f->unit, &link_stats))
+ link_stats_valid = 1;
+ if (ipcp_is_up) {
+ ipcp_is_up = 0;
+ np_down(f->unit, PPP_IP);
+ }
sifvjcomp(f->unit, 0, 0, 0);
/*
char strspeed[32], strlocal[32], strremote[32];
char *argv[8];
- sprintf(strspeed, "%d", baud_rate);
- strcpy(strlocal, ip_ntoa(ipcp_gotoptions[0].ouraddr));
- strcpy(strremote, ip_ntoa(ipcp_hisoptions[0].hisaddr));
+ slprintf(strspeed, sizeof(strspeed), "%d", baud_rate);
+ slprintf(strlocal, sizeof(strlocal), "%I", ipcp_gotoptions[0].ouraddr);
+ slprintf(strremote, sizeof(strremote), "%I", ipcp_hisoptions[0].hisaddr);
argv[0] = script;
argv[1] = ifname;
f = fopen(_PATH_RESOLV, "w");
if (f == NULL) {
- syslog(LOG_ERR, "Failed to create %s: %m", _PATH_RESOLV);
+ error("Failed to create %s: %m", _PATH_RESOLV);
return;
}
fprintf(f, "nameserver %s\n", ip_ntoa(peerdns2));
if (ferror(f))
- syslog(LOG_ERR, "Write failed to %s: %m", _PATH_RESOLV);
+ error("Write failed to %s: %m", _PATH_RESOLV);
fclose(f);
}