summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pppd/fsm.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1997-08-19 17:52:48 +0000
committerpeter <peter@FreeBSD.org>1997-08-19 17:52:48 +0000
commit070f42a366d1f592be37f248439635c1d36eaaa3 (patch)
tree485faad86f4448a6b6ceaf08b9bca8d9250596b3 /usr.sbin/pppd/fsm.c
parentf52b01f46739c1ff6b61ccfe02a7fbd874f14bed (diff)
downloadFreeBSD-src-070f42a366d1f592be37f248439635c1d36eaaa3.zip
FreeBSD-src-070f42a366d1f592be37f248439635c1d36eaaa3.tar.gz
*gulp* First pass at merging in ppp-2.3.0's pppd. (this has
dial-on-demand, packet filtering, idle timeouts, etc). The IPX support is pretty much there but more work needs to be done in sys-bsd.c for the interface ioctls (Linux has a very different way of configuring IPX interfaces). Along the way some things have temporarily been lost due to very messy conflicts. I will recover them shortly when I can think clearer. The main one is the local:remote address override in pap-secrets and chap-secrets. Some other home-grown features (dns1,dns2) have been implemented differently. Microsoft's chap client auth hacks have been implemented. There are bound to be more rough edges... The changes for connect-max-retries doesn't fit well with the dial-on-demand code.
Diffstat (limited to 'usr.sbin/pppd/fsm.c')
-rw-r--r--usr.sbin/pppd/fsm.c88
1 files changed, 53 insertions, 35 deletions
diff --git a/usr.sbin/pppd/fsm.c b/usr.sbin/pppd/fsm.c
index ea3815c..624799f 100644
--- a/usr.sbin/pppd/fsm.c
+++ b/usr.sbin/pppd/fsm.c
@@ -35,13 +35,11 @@ static char rcsid[] = "$Id$";
#include "pppd.h"
#include "fsm.h"
-extern char *proto_name();
-
-static void fsm_timeout __P((caddr_t));
+static void fsm_timeout __P((void *));
static void fsm_rconfreq __P((fsm *, int, u_char *, int));
static void fsm_rconfack __P((fsm *, int, u_char *, int));
static void fsm_rconfnakrej __P((fsm *, int, int, u_char *, int));
-static void fsm_rtermreq __P((fsm *, int));
+static void fsm_rtermreq __P((fsm *, int, u_char *, int));
static void fsm_rtermack __P((fsm *));
static void fsm_rcoderej __P((fsm *, u_char *, int));
static void fsm_sconfreq __P((fsm *, int));
@@ -67,6 +65,7 @@ fsm_init(f)
f->maxconfreqtransmits = DEFMAXCONFREQS;
f->maxtermtransmits = DEFMAXTERMREQS;
f->maxnakloops = DEFMAXNAKLOOPS;
+ f->term_reason_len = 0;
}
@@ -121,7 +120,7 @@ fsm_lowerdown(f)
case CLOSING:
f->state = INITIAL;
- UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */
+ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
break;
case STOPPING:
@@ -129,7 +128,7 @@ fsm_lowerdown(f)
case ACKRCVD:
case ACKSENT:
f->state = STARTING;
- UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */
+ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
break;
case OPENED:
@@ -190,9 +189,12 @@ fsm_open(f)
* the CLOSED state.
*/
void
-fsm_close(f)
+fsm_close(f, reason)
fsm *f;
+ char *reason;
{
+ f->term_reason = reason;
+ f->term_reason_len = (reason == NULL? 0: strlen(reason));
switch( f->state ){
case STARTING:
f->state = INITIAL;
@@ -209,14 +211,15 @@ fsm_close(f)
case ACKSENT:
case OPENED:
if( f->state != OPENED )
- UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */
+ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
else if( f->callbacks->down )
(*f->callbacks->down)(f); /* Inform upper layers we're down */
/* Init restart counter, send Terminate-Request */
f->retransmits = f->maxtermtransmits;
- fsm_sdata(f, TERMREQ, f->reqid = ++f->id, NULL, 0);
- TIMEOUT(fsm_timeout, (caddr_t) f, f->timeouttime);
+ fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
+ (u_char *) f->term_reason, f->term_reason_len);
+ TIMEOUT(fsm_timeout, f, f->timeouttime);
--f->retransmits;
f->state = CLOSING;
@@ -230,7 +233,7 @@ fsm_close(f)
*/
static void
fsm_timeout(arg)
- caddr_t arg;
+ void *arg;
{
fsm *f = (fsm *) arg;
@@ -246,8 +249,9 @@ fsm_timeout(arg)
(*f->callbacks->finished)(f);
} else {
/* Send Terminate-Request */
- fsm_sdata(f, TERMREQ, f->reqid = ++f->id, NULL, 0);
- TIMEOUT(fsm_timeout, (caddr_t) f, f->timeouttime);
+ fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
+ (u_char *) f->term_reason, f->term_reason_len);
+ TIMEOUT(fsm_timeout, f, f->timeouttime);
--f->retransmits;
}
break;
@@ -288,7 +292,7 @@ fsm_input(f, inpacket, l)
u_char *inpacket;
int l;
{
- u_char *inp, *outp;
+ u_char *inp;
u_char code, id;
int len;
@@ -341,7 +345,7 @@ fsm_input(f, inpacket, l)
break;
case TERMREQ:
- fsm_rtermreq(f, id);
+ fsm_rtermreq(f, id, inp, len);
break;
case TERMACK:
@@ -371,7 +375,6 @@ fsm_rconfreq(f, id, inp, len)
u_char *inp;
int len;
{
- u_char *outp;
int code, reject_if_disagree;
FSMDEBUG((LOG_INFO, "fsm_rconfreq(%s): Rcvd id %d.", PROTO_NAME(f), id));
@@ -415,7 +418,7 @@ fsm_rconfreq(f, id, inp, len)
if (code == CONFACK) {
if (f->state == ACKRCVD) {
- UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */
+ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
f->state = OPENED;
if (f->callbacks->up)
(*f->callbacks->up)(f); /* Inform upper layers */
@@ -451,6 +454,7 @@ fsm_rconfack(f, id, inp, len)
if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len):
(len == 0)) ){
/* Ack is bad - ignore it */
+ log_packet(inp, len, "Received bad configure-ack: ", LOG_ERR);
FSMDEBUG((LOG_INFO, "%s: received bad Ack (length %d)",
PROTO_NAME(f), len));
return;
@@ -470,13 +474,13 @@ fsm_rconfack(f, id, inp, len)
case ACKRCVD:
/* Huh? an extra valid Ack? oh well... */
- UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */
+ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
fsm_sconfreq(f, 0);
f->state = REQSENT;
break;
case ACKSENT:
- UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */
+ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
f->state = OPENED;
f->retransmits = f->maxconfreqtransmits;
if (f->callbacks->up)
@@ -504,7 +508,8 @@ fsm_rconfnakrej(f, code, id, inp, len)
u_char *inp;
int len;
{
- int (*proc)();
+ int (*proc) __P((fsm *, u_char *, int));
+ int ret;
FSMDEBUG((LOG_INFO, "fsm_rconfnakrej(%s): Rcvd id %d.",
PROTO_NAME(f), id));
@@ -512,8 +517,9 @@ fsm_rconfnakrej(f, code, id, inp, len)
if (id != f->reqid || f->seen_ack) /* Expected id? */
return; /* Nope, toss... */
proc = (code == CONFNAK)? f->callbacks->nakci: f->callbacks->rejci;
- if (!proc || !proc(f, inp, len)) {
+ if (!proc || !(ret = proc(f, inp, len))) {
/* Nak/reject is bad - ignore it */
+ log_packet(inp, len, "Received bad configure-nak/rej: ", LOG_ERR);
FSMDEBUG((LOG_INFO, "%s: received bad %s (length %d)",
PROTO_NAME(f), (code==CONFNAK? "Nak": "reject"), len));
return;
@@ -529,13 +535,16 @@ fsm_rconfnakrej(f, code, id, inp, len)
case REQSENT:
case ACKSENT:
/* They didn't agree to what we wanted - try another request */
- UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */
- fsm_sconfreq(f, 0); /* Send Configure-Request */
+ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
+ if (ret < 0)
+ f->state = STOPPED; /* kludge for stopping CCP */
+ else
+ fsm_sconfreq(f, 0); /* Send Configure-Request */
break;
case ACKRCVD:
/* Got a Nak/reject when we had already had an Ack?? oh well... */
- UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */
+ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
fsm_sconfreq(f, 0);
f->state = REQSENT;
break;
@@ -555,10 +564,14 @@ fsm_rconfnakrej(f, code, id, inp, len)
* fsm_rtermreq - Receive Terminate-Req.
*/
static void
-fsm_rtermreq(f, id)
+fsm_rtermreq(f, id, p, len)
fsm *f;
int id;
+ u_char *p;
+ int len;
{
+ char str[80];
+
FSMDEBUG((LOG_INFO, "fsm_rtermreq(%s): Rcvd id %d.",
PROTO_NAME(f), id));
@@ -569,12 +582,16 @@ fsm_rtermreq(f, id)
break;
case OPENED:
- syslog(LOG_INFO, "%s terminated at peer's request", PROTO_NAME(f));
+ if (len > 0) {
+ fmtmsg(str, sizeof(str), "%0.*v", len, p);
+ syslog(LOG_INFO, "%s terminated by peer (%s)", PROTO_NAME(f), str);
+ } else
+ syslog(LOG_INFO, "%s terminated by peer", PROTO_NAME(f));
if (f->callbacks->down)
(*f->callbacks->down)(f); /* Inform upper layers */
f->retransmits = 0;
f->state = STOPPING;
- TIMEOUT(fsm_timeout, (caddr_t) f, f->timeouttime);
+ TIMEOUT(fsm_timeout, f, f->timeouttime);
break;
}
@@ -593,13 +610,13 @@ fsm_rtermack(f)
switch (f->state) {
case CLOSING:
- UNTIMEOUT(fsm_timeout, (caddr_t) f);
+ UNTIMEOUT(fsm_timeout, f);
f->state = CLOSED;
if( f->callbacks->finished )
(*f->callbacks->finished)(f);
break;
case STOPPING:
- UNTIMEOUT(fsm_timeout, (caddr_t) f);
+ UNTIMEOUT(fsm_timeout, f);
f->state = STOPPED;
if( f->callbacks->finished )
(*f->callbacks->finished)(f);
@@ -656,7 +673,7 @@ fsm_protreject(f)
{
switch( f->state ){
case CLOSING:
- UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */
+ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
/* fall through */
case CLOSED:
f->state = CLOSED;
@@ -668,7 +685,7 @@ fsm_protreject(f)
case REQSENT:
case ACKRCVD:
case ACKSENT:
- UNTIMEOUT(fsm_timeout, (caddr_t) f); /* Cancel timeout */
+ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
/* fall through */
case STOPPED:
f->state = STOPPED;
@@ -682,8 +699,9 @@ fsm_protreject(f)
/* Init restart counter, send Terminate-Request */
f->retransmits = f->maxtermtransmits;
- fsm_sdata(f, TERMREQ, f->reqid = ++f->id, NULL, 0);
- TIMEOUT(fsm_timeout, (caddr_t) f, f->timeouttime);
+ fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
+ (u_char *) f->term_reason, f->term_reason_len);
+ TIMEOUT(fsm_timeout, f, f->timeouttime);
--f->retransmits;
f->state = STOPPING;
@@ -705,7 +723,7 @@ fsm_sconfreq(f, retransmit)
int retransmit;
{
u_char *outp;
- int outlen, cilen;
+ int cilen;
if( f->state != REQSENT && f->state != ACKRCVD && f->state != ACKSENT ){
/* Not currently negotiating - reset options */
@@ -740,7 +758,7 @@ fsm_sconfreq(f, retransmit)
/* start the retransmit timer */
--f->retransmits;
- TIMEOUT(fsm_timeout, (caddr_t) f, f->timeouttime);
+ TIMEOUT(fsm_timeout, f, f->timeouttime);
FSMDEBUG((LOG_INFO, "%s: sending Configure-Request, id %d",
PROTO_NAME(f), f->reqid));
OpenPOWER on IntegriCloud