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

📄 netfsm.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 2 页
字号:

	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:

		if( f->callbacks->down )

			(*f->callbacks->down)(f);

		

		/* Init restart counter, send Terminate-Request */

		f->retransmits = f->maxtermtransmits;

		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;

		break;

	

	default:

		FSMDEBUG((LOG_INFO, "%s: Protocol-reject event in state %d!",

					PROTO_NAME(f), f->state));

	}

}











/**********************************/

/*** LOCAL FUNCTION DEFINITIONS ***/

/**********************************/



/*

 * fsm_timeout - Timeout expired.

 */

static void fsm_timeout(void *arg)

{

    fsm *f = (fsm *) arg;



    switch (f->state) {

    case CLOSING:

    case STOPPING:

		if( f->retransmits <= 0 ){

		    FSMDEBUG((LOG_WARNING, "%s: timeout sending Terminate-Request state=%d",

					   PROTO_NAME(f), f->state));

		    /*

		     * We've waited for an ack long enough.  Peer probably heard us.

		     */

		    f->state = (f->state == CLOSING)? CLOSED: STOPPED;

		    if( f->callbacks->finished )

			(*f->callbacks->finished)(f);

		} else {

		    FSMDEBUG((LOG_WARNING, "%s: timeout resending Terminate-Requests state=%d",

					   PROTO_NAME(f), f->state));

		    /* Send Terminate-Request */

		    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;



    case REQSENT:

    case ACKRCVD:

    case ACKSENT:

		if (f->retransmits <= 0) {

		    FSMDEBUG((LOG_WARNING, "%s: timeout sending Config-Requests state=%d",

			   PROTO_NAME(f), f->state));

		    f->state = STOPPED;

		    if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished )

				(*f->callbacks->finished)(f);

	

		} else {

		    FSMDEBUG((LOG_WARNING, "%s: timeout resending Config-Request state=%d",

			   PROTO_NAME(f), f->state));

		    /* Retransmit the configure-request */

		    if (f->callbacks->retransmit)

				(*f->callbacks->retransmit)(f);

		    fsm_sconfreq(f, 1);		/* Re-send Configure-Request */

		    if( f->state == ACKRCVD )

				f->state = REQSENT;

		}

		break;



    default:

		FSMDEBUG((LOG_INFO, "%s: Timeout event in state %d!",

				  PROTO_NAME(f), f->state));

	    }

}





/*

 * fsm_rconfreq - Receive Configure-Request.

 */

static void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len)

{

	int code, reject_if_disagree;

	

	FSMDEBUG((LOG_INFO, "fsm_rconfreq(%s): Rcvd id %d state=%d", 

				PROTO_NAME(f), id, f->state));

	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 */

		break;

	

	case STOPPED:

		/* Negotiation started by our peer */

		fsm_sconfreq(f, 0);		/* Send initial Configure-Request */

		f->state = REQSENT;

		break;



	case ACKSENT:

		fsm_sconfreq(f, 0);

		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, (u_char)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 void fsm_rconfack(fsm *f, int id, u_char *inp, int len)

{

	FSMDEBUG((LOG_INFO, "fsm_rconfack(%s): Rcvd id %d state=%d",

				PROTO_NAME(f), id, f->state));

	

	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 */

		FSMDEBUG((LOG_INFO, "%s: received bad Ack (length %d)",

					PROTO_NAME(f), len));

		return;

	}

	f->seen_ack = 1;

	

	switch (f->state) {

	case CLOSED:

	case STOPPED:

		fsm_sdata(f, TERMACK, (u_char)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 void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len)

{

	int (*proc) __P((fsm *, u_char *, int));

	int ret;

	

	FSMDEBUG((LOG_INFO, "fsm_rconfnakrej(%s): Rcvd id %d state=%d",

				PROTO_NAME(f), id, f->state));

	

	if (id != f->reqid || f->seen_ack)	/* Expected id? */

		return;				/* Nope, toss... */

	proc = (code == CONFNAK)? f->callbacks->nakci: f->callbacks->rejci;

	if (!proc || !(ret = proc(f, inp, len))) {

		/* Nak/reject is bad - ignore it */

		FSMDEBUG((LOG_INFO, "%s: received bad %s (length %d)",

					PROTO_NAME(f), (code==CONFNAK? "Nak": "reject"), len));

		return;

	}

	f->seen_ack = 1;

	

	switch (f->state) {

	case CLOSED:

	case STOPPED:

		fsm_sdata(f, TERMACK, (u_char)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.

 */

 

//#pragma argsused

static void fsm_rtermreq(fsm *f, int id, u_char *p, int len)

{

	FSMDEBUG((LOG_INFO, "fsm_rtermreq(%s): Rcvd id %d state=%d",

				PROTO_NAME(f), id, f->state));

	

	switch (f->state) {

	case ACKRCVD:

	case ACKSENT:

		f->state = REQSENT;		/* Start over but keep trying */

		break;

	

	case OPENED:

		if (len > 0) {

			FSMDEBUG((LOG_INFO, "%s terminated by peer (%0.40Z)", PROTO_NAME(f), p));

		} else {

			FSMDEBUG((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, f, f->timeouttime);

		break;

	}

	

	fsm_sdata(f, TERMACK, (u_char)id, NULL, 0);

}





/*

 * fsm_rtermack - Receive Terminate-Ack.

 */

static void fsm_rtermack(fsm *f)

{

	FSMDEBUG((LOG_INFO, "fsm_rtermack(%s): state=%d", 

				PROTO_NAME(f), f->state));

	

	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);

		break;

	}

}





/*

 * fsm_rcoderej - Receive an Code-Reject.

 */

static void fsm_rcoderej(fsm *f, u_char *inp, int len)

{

	u_char code, id;

	

	FSMDEBUG((LOG_INFO, "fsm_rcoderej(%s): state=%d", 

				PROTO_NAME(f), f->state));

	

	if (len < HEADERLEN) {

		FSMDEBUG((LOG_INFO, "fsm_rcoderej: Rcvd short Code-Reject packet!"));

		return;

	}

	GETCHAR(code, inp);

	GETCHAR(id, inp);

	FSMDEBUG((LOG_WARNING, "%s: Rcvd Code-Reject for code %d, id %d",

				PROTO_NAME(f), code, id));

	

	if( f->state == ACKRCVD )

		f->state = REQSENT;

}





/*

 * fsm_sconfreq - Send a Configure-Request.

 */

static void fsm_sconfreq(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;

		}

	

	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[f->unit] + PPP_HDRLEN + HEADERLEN;

	if( f->callbacks->cilen && f->callbacks->addci ){

		cilen = (*f->callbacks->cilen)(f);

		if( cilen > peer_mru[f->unit] - (int)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);

	

	FSMDEBUG((LOG_INFO, "%s: sending Configure-Request, id %d",

				PROTO_NAME(f), f->reqid));

}







⌨️ 快捷键说明

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