*/
#ifndef lint
-static char rcsid[] = "$Id: ipcp.c,v 1.36 1999/03/02 05:35:09 paulus Exp $";
+static char rcsid[] = "$Id: ipcp.c,v 1.43 1999/03/19 04:23:39 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;
}
return (1);
bad:
- IPCPDEBUG((LOG_INFO, "ipcp_ackci: received bad Ack!"));
+ IPCPDEBUG(("ipcp_ackci: received bad Ack!"));
return (0);
}
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;
}
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);
/*
* has finished.
*/
static void
-ipcp_script_done(void *arg)
+ipcp_script_done(arg)
+ void *arg;
{
ipcp_script_pid = 0;
switch (ipcp_script_state) {
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);
}