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

📄 fsm.c

📁 picoos源码。The RTOS and the TCP/IP stack will be built automatically.
💻 C
📖 第 1 页 / 共 2 页
字号:
	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:		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!\n",					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\n",					   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\n",					   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\n",			   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\n",			   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!\n",				  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\n", 				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;	}		/*	* 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\n",				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)\n",					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) (fsm *, u_char *, int);	int ret;		FSMDEBUG((LOG_INFO, "fsm_rconfnakrej(%s): Rcvd id %d state=%d\n",				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)\n",					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. */static void fsm_rtermreq(fsm *f, int id, u_char *p, int len){	FSMDEBUG((LOG_INFO, "fsm_rtermreq(%s): Rcvd id %d state=%d\n",				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 (%x)\n", PROTO_NAME(f), p));		} else {			FSMDEBUG((LOG_INFO, "%s terminated by peer\n", 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\n", 				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\n", 				PROTO_NAME(f), f->state));		if (len < HEADERLEN) {		FSMDEBUG((LOG_INFO, "fsm_rcoderej: Rcvd short Code-Reject packet!\n"));		return;	}	GETCHAR(code, inp);	GETCHAR(id, inp);	FSMDEBUG((LOG_WARNING, "%s: Rcvd Code-Reject for code %d, id %d\n",				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\n",				PROTO_NAME(f), f->reqid));}#endif /* PPP_SUPPORT */

⌨️ 快捷键说明

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