⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsm.c

📁 自己精简过的PPPD代码。在嵌入中应用可以更好的发挥。比原先的小了很多
💻 C
📖 第 1 页 / 共 2 页
字号:
 * fsm_rconfreq - Receive Configure-Request. */static voidfsm_rconfreq(f, id, inp, len)    fsm *f;    u_char id;    u_char *inp;    int len;{    int code, reject_if_disagree;    switch( f->state ){    case CLOSED:	/* Go away, we're closed */	fsm_sdata(f, TERMACK, id, NULL, 0);	return;    case CLOSING:    case STOPPING:	return;    case OPENED:	/* Go down and restart negotiation */	if( f->callbacks->down )	    (*f->callbacks->down)(f);	/* Inform upper layers */	fsm_sconfreq(f, 0);		/* Send initial Configure-Request */	f->state = REQSENT;	break;    case STOPPED:	/* Negotiation started by our peer */	fsm_sconfreq(f, 0);		/* Send initial Configure-Request */	f->state = REQSENT;	break;    }    /*     * Pass the requested configuration options     * to protocol-specific code for checking.     */    if (f->callbacks->reqci){		/* Check CI */	reject_if_disagree = (f->nakloops >= f->maxnakloops);	code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree);    } else if (len)	code = CONFREJ;			/* Reject all CI */    else	code = CONFACK;    /* send the Ack, Nak or Rej to the peer */    fsm_sdata(f, code, id, inp, len);    if (code == CONFACK) {	if (f->state == ACKRCVD) {	    UNTIMEOUT(fsm_timeout, f);	/* Cancel timeout */	    f->state = OPENED;	    if (f->callbacks->up)		(*f->callbacks->up)(f);	/* Inform upper layers */	} else	    f->state = ACKSENT;	f->nakloops = 0;    } else {	/* we sent CONFACK or CONFREJ */	if (f->state != ACKRCVD)	    f->state = REQSENT;	if( code == CONFNAK )	    ++f->nakloops;    }}/* * fsm_rconfack - Receive Configure-Ack. */static voidfsm_rconfack(f, id, inp, len)    fsm *f;    int id;    u_char *inp;    int len;{    if (id != f->reqid || f->seen_ack)		/* Expected id? */	return;					/* Nope, toss... */    if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len):	  (len == 0)) ){	/* Ack is bad - ignore it */	error("Received bad configure-ack: %P", inp, len);	return;    }    f->seen_ack = 1;    f->rnakloops = 0;    switch (f->state) {    case CLOSED:    case STOPPED:	fsm_sdata(f, TERMACK, id, NULL, 0);	break;    case REQSENT:	f->state = ACKRCVD;	f->retransmits = f->maxconfreqtransmits;	break;    case ACKRCVD:	/* Huh? an extra valid Ack? oh well... */	UNTIMEOUT(fsm_timeout, f);	/* Cancel timeout */	fsm_sconfreq(f, 0);	f->state = REQSENT;	break;    case ACKSENT:	UNTIMEOUT(fsm_timeout, f);	/* Cancel timeout */	f->state = OPENED;	f->retransmits = f->maxconfreqtransmits;	if (f->callbacks->up)	    (*f->callbacks->up)(f);	/* Inform upper layers */	break;    case OPENED:	/* Go down and restart negotiation */	if (f->callbacks->down)	    (*f->callbacks->down)(f);	/* Inform upper layers */	fsm_sconfreq(f, 0);		/* Send initial Configure-Request */	f->state = REQSENT;	break;    }}/* * fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject. */static voidfsm_rconfnakrej(f, code, id, inp, len)    fsm *f;    int code, id;    u_char *inp;    int len;{    int ret;    int treat_as_reject;    if (id != f->reqid || f->seen_ack)	/* Expected id? */	return;				/* Nope, toss... */    if (code == CONFNAK) {	++f->rnakloops;	treat_as_reject = (f->rnakloops >= f->maxnakloops);	if (f->callbacks->nakci == NULL	    || !(ret = f->callbacks->nakci(f, inp, len, treat_as_reject))) {	    error("Received bad configure-nak: %P", inp, len);	    return;	}    } else {	f->rnakloops = 0;	if (f->callbacks->rejci == NULL	    || !(ret = f->callbacks->rejci(f, inp, len))) {	    error("Received bad configure-rej: %P", inp, len);	    return;	}    }    f->seen_ack = 1;    switch (f->state) {    case CLOSED:    case STOPPED:	fsm_sdata(f, TERMACK, id, NULL, 0);	break;    case REQSENT:    case ACKSENT:	/* They didn't agree to what we wanted - try another 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, f);	/* Cancel timeout */	fsm_sconfreq(f, 0);	f->state = REQSENT;	break;    case OPENED:	/* Go down and restart negotiation */	if (f->callbacks->down)	    (*f->callbacks->down)(f);	/* Inform upper layers */	fsm_sconfreq(f, 0);		/* Send initial Configure-Request */	f->state = REQSENT;	break;    }}/* * fsm_rtermreq - Receive Terminate-Req. */static voidfsm_rtermreq(f, id, p, len)    fsm *f;    int id;    u_char *p;    int len;{    switch (f->state) {    case ACKRCVD:    case ACKSENT:	f->state = REQSENT;		/* Start over but keep trying */	break;    case OPENED:	if (len > 0) {	    info("%s terminated by peer (%0.*v)", PROTO_NAME(f), len, p);	} else	    info("%s terminated by peer", PROTO_NAME(f));	f->retransmits = 0;	f->state = STOPPING;	if (f->callbacks->down)	    (*f->callbacks->down)(f);	/* Inform upper layers */	TIMEOUT(fsm_timeout, f, f->timeouttime);	break;    }    fsm_sdata(f, TERMACK, id, NULL, 0);}/* * fsm_rtermack - Receive Terminate-Ack. */static voidfsm_rtermack(f)    fsm *f;{    switch (f->state) {    case CLOSING:	UNTIMEOUT(fsm_timeout, f);	f->state = CLOSED;	if( f->callbacks->finished )	    (*f->callbacks->finished)(f);	break;    case STOPPING:	UNTIMEOUT(fsm_timeout, f);	f->state = STOPPED;	if( f->callbacks->finished )	    (*f->callbacks->finished)(f);	break;    case ACKRCVD:	f->state = REQSENT;	break;    case OPENED:	if (f->callbacks->down)	    (*f->callbacks->down)(f);	/* Inform upper layers */	fsm_sconfreq(f, 0);	f->state = REQSENT;	break;    }}/* * fsm_rcoderej - Receive an Code-Reject. */static voidfsm_rcoderej(f, inp, len)    fsm *f;    u_char *inp;    int len;{    u_char code, id;    if (len < HEADERLEN) {	FSMDEBUG(("fsm_rcoderej: Rcvd short Code-Reject packet!"));	return;    }    GETCHAR(code, inp);    GETCHAR(id, inp);    warn("%s: Rcvd Code-Reject for code %d, id %d", PROTO_NAME(f), code, id);    if( f->state == ACKRCVD )	f->state = REQSENT;}/* * fsm_protreject - Peer doesn't speak this protocol. * * Treat this as a catastrophic error (RXJ-). */voidfsm_protreject(f)    fsm *f;{    switch( f->state ){    case CLOSING:	UNTIMEOUT(fsm_timeout, f);	/* Cancel timeout */	/* fall through */    case CLOSED:	f->state = CLOSED;	if( f->callbacks->finished )	    (*f->callbacks->finished)(f);	break;    case STOPPING:    case REQSENT:    case ACKRCVD:    case ACKSENT:	UNTIMEOUT(fsm_timeout, f);	/* Cancel timeout */	/* fall through */    case STOPPED:	f->state = STOPPED;	if( f->callbacks->finished )	    (*f->callbacks->finished)(f);	break;    case OPENED:	terminate_layer(f, STOPPING);	break;    default:	FSMDEBUG(("%s: Protocol-reject event in state %d!",		  PROTO_NAME(f), f->state));    }}/* * fsm_sconfreq - Send a Configure-Request. */static voidfsm_sconfreq(f, retransmit)    fsm *f;    int retransmit;{    u_char *outp;    int cilen;    if( f->state != REQSENT && f->state != ACKRCVD && f->state != ACKSENT ){	/* Not currently negotiating - reset options */	if( f->callbacks->resetci )	    (*f->callbacks->resetci)(f);	f->nakloops = 0;	f->rnakloops = 0;    }    if( !retransmit ){	/* New request - reset retransmission counter, use new ID */	f->retransmits = f->maxconfreqtransmits;	f->reqid = ++f->id;    }    f->seen_ack = 0;    /*     * Make up the request packet     */    outp = outpacket_buf + PPP_HDRLEN + HEADERLEN;    if( f->callbacks->cilen && f->callbacks->addci ){	cilen = (*f->callbacks->cilen)(f);	if( cilen > peer_mru[f->unit] - HEADERLEN )	    cilen = peer_mru[f->unit] - HEADERLEN;	if (f->callbacks->addci)	    (*f->callbacks->addci)(f, outp, &cilen);    } else	cilen = 0;    /* send the request to our peer */    fsm_sdata(f, CONFREQ, f->reqid, outp, cilen);    /* start the retransmit timer */    --f->retransmits;    TIMEOUT(fsm_timeout, f, f->timeouttime);}/* * fsm_sdata - Send some data. * * Used for all packets sent to our peer by this module. */voidfsm_sdata(f, code, id, data, datalen)    fsm *f;    u_char code, id;    u_char *data;    int datalen;{    u_char *outp;    int outlen;    /* Adjust length to be smaller than MTU */    outp = outpacket_buf;    if (datalen > peer_mru[f->unit] - HEADERLEN)	datalen = peer_mru[f->unit] - HEADERLEN;    if (datalen && data != outp + PPP_HDRLEN + HEADERLEN)	BCOPY(data, outp + PPP_HDRLEN + HEADERLEN, datalen);    outlen = datalen + HEADERLEN;    MAKEHEADER(outp, f->protocol);    PUTCHAR(code, outp);    PUTCHAR(id, outp);    PUTSHORT(outlen, outp);    output(f->unit, outpacket_buf, outlen + PPP_HDRLEN);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -