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

📄 rmt.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
			if ((tx =  sm_mac_get_tx_state(smc)) == 4 || tx == 5) {			DB_RMTN(2,"RMT : DETECT && TRT_EXPIRED && T4/T5\n",0,0);				smc->r.bn_flag = TRUE ;				/*				 * If one of the upstream stations beaconed				 * and the link to the upstream neighbor is				 * lost we need to restart the stuck timer to				 * check the "stuck beacon" condition.				 */				start_rmt_timer1(smc,smc->s.rmt_t_stuck,					RM_TIMEOUT_T_STUCK) ;			}			/*			 * We do NOT need to clear smc->r.bn_flag in case of			 * not being in state T4 or T5, because the flag			 * must be cleared in order to get in this condition.			 */			DB_RMTN(2,			"RMT : sm_mac_get_tx_state() = %d (bn_flag = %d)\n",			tx,smc->r.bn_flag) ;		}		/*RM34a*/		else if (cmd == RM_MY_CLAIM && smc->r.timer0_exp) {			rmt_new_dup_actions(smc) ;			GO_STATE(RM4_NON_OP_DUP) ;			break ;		}		/*RM34b*/		else if (cmd == RM_MY_BEACON && smc->r.timer0_exp) {			rmt_new_dup_actions(smc) ;			GO_STATE(RM4_NON_OP_DUP) ;			break ;		}		/*RM34c*/		else if (cmd == RM_VALID_CLAIM) {			rmt_new_dup_actions(smc) ;			GO_STATE(RM4_NON_OP_DUP) ;			break ;		}		/*RM36*/		else if (cmd == RM_TIMEOUT_T_STUCK &&			smc->r.rm_join && smc->r.bn_flag) {			GO_STATE(RM6_DIRECTED) ;			break ;		}		break ;	case ACTIONS(RM4_NON_OP_DUP) :		start_rmt_timer0(smc,smc->s.rmt_t_announce,RM_TIMEOUT_ANNOUNCE);		start_rmt_timer1(smc,smc->s.rmt_t_stuck,RM_TIMEOUT_T_STUCK) ;		start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL) ;		sm_mac_check_beacon_claim(smc) ;		DB_RMTN(1,"RMT : RM4_NON_OP_DUP\n",0,0) ;		ACTIONS_DONE() ;		break ;	case RM4_NON_OP_DUP :		if (cmd == RM_TIMEOUT_POLL) {			start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL);			sm_mac_check_beacon_claim(smc) ;			break ;		}		/*RM41*/		if (!smc->r.da_flag) {			GO_STATE(RM1_NON_OP) ;			break ;		}		/*RM44a*/		else if ((cmd == RM_MY_BEACON || cmd == RM_OTHER_BEACON) &&			smc->r.bn_flag) {			smc->r.bn_flag = FALSE ;		}		/*RM44b*/		else if (cmd == RM_TRT_EXP && !smc->r.bn_flag) {			int	tx ;			/*			 * set bn_flag only if in state T4 or T5:			 * only if we're the beaconer should we start the			 * trace !			 */			if ((tx =  sm_mac_get_tx_state(smc)) == 4 || tx == 5) {			DB_RMTN(2,"RMT : NOPDUP && TRT_EXPIRED && T4/T5\n",0,0);				smc->r.bn_flag = TRUE ;				/*				 * If one of the upstream stations beaconed				 * and the link to the upstream neighbor is				 * lost we need to restart the stuck timer to				 * check the "stuck beacon" condition.				 */				start_rmt_timer1(smc,smc->s.rmt_t_stuck,					RM_TIMEOUT_T_STUCK) ;			}			/*			 * We do NOT need to clear smc->r.bn_flag in case of			 * not being in state T4 or T5, because the flag			 * must be cleared in order to get in this condition.			 */			DB_RMTN(2,			"RMT : sm_mac_get_tx_state() = %d (bn_flag = %d)\n",			tx,smc->r.bn_flag) ;		}		/*RM44c*/		else if (cmd == RM_TIMEOUT_ANNOUNCE && !smc->r.bn_flag) {			rmt_dup_actions(smc) ;		}		/*RM45*/		else if (cmd == RM_RING_OP) {			smc->r.no_flag = FALSE ;			GO_STATE(RM5_RING_OP_DUP) ;			break ;		}		/*RM46*/		else if (cmd == RM_TIMEOUT_T_STUCK &&			smc->r.rm_join && smc->r.bn_flag) {			GO_STATE(RM6_DIRECTED) ;			break ;		}		break ;	case ACTIONS(RM5_RING_OP_DUP) :		stop_rmt_timer0(smc) ;		stop_rmt_timer1(smc) ;		stop_rmt_timer2(smc) ;		DB_RMTN(1,"RMT : RM5_RING_OP_DUP\n",0,0) ;		ACTIONS_DONE() ;		break;	case RM5_RING_OP_DUP :		/*RM52*/		if (smc->r.dup_addr_test == DA_PASSED) {			smc->r.da_flag = FALSE ;			GO_STATE(RM2_RING_OP) ;			break ;		}		/*RM54*/		else if (cmd == RM_RING_NON_OP) {			smc->r.jm_flag = FALSE ;			smc->r.bn_flag = FALSE ;			GO_STATE(RM4_NON_OP_DUP) ;			break ;		}		break ;	case ACTIONS(RM6_DIRECTED) :		start_rmt_timer0(smc,smc->s.rmt_t_direct,RM_TIMEOUT_T_DIRECT) ;		stop_rmt_timer1(smc) ;		start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL) ;		sm_ma_control(smc,MA_DIRECTED) ;		RS_SET(smc,RS_BEACON) ;		DB_RMTN(1,"RMT : RM6_DIRECTED\n",0,0) ;		ACTIONS_DONE() ;		break ;	case RM6_DIRECTED :		/*RM63*/		if (cmd == RM_TIMEOUT_POLL) {			start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL);			sm_mac_check_beacon_claim(smc) ;#ifndef SUPERNET_3			/* Because of problems with the Supernet II chip set			 * sending of Directed Beacon will stop after 165ms			 * therefore restart_trt_for_dbcn(smc) will be called			 * to prevent this.			 */			restart_trt_for_dbcn(smc) ;#endif /*SUPERNET_3*/			break ;		}		if ((cmd == RM_MY_BEACON || cmd == RM_OTHER_BEACON) &&			!smc->r.da_flag) {			smc->r.bn_flag = FALSE ;			GO_STATE(RM3_DETECT) ;			break ;		}		/*RM64*/		else if ((cmd == RM_MY_BEACON || cmd == RM_OTHER_BEACON) &&			smc->r.da_flag) {			smc->r.bn_flag = FALSE ;			GO_STATE(RM4_NON_OP_DUP) ;			break ;		}		/*RM67*/		else if (cmd == RM_TIMEOUT_T_DIRECT) {			GO_STATE(RM7_TRACE) ;			break ;		}		break ;	case ACTIONS(RM7_TRACE) :		stop_rmt_timer0(smc) ;		stop_rmt_timer1(smc) ;		stop_rmt_timer2(smc) ;		smc->e.trace_prop |= ENTITY_BIT(ENTITY_MAC) ;		queue_event(smc,EVENT_ECM,EC_TRACE_PROP) ;		DB_RMTN(1,"RMT : RM7_TRACE\n",0,0) ;		ACTIONS_DONE() ;		break ;	case RM7_TRACE :		break ;	default:		SMT_PANIC(smc,SMT_E0122, SMT_E0122_MSG) ;		break;	}}/* * (jd) RMT duplicate address actions * leave the ring or reinsert just as configured */static void rmt_dup_actions(struct s_smc *smc){	if (smc->r.jm_flag) {	}	else {		if (smc->s.rmt_dup_mac_behavior) {			SMT_ERR_LOG(smc,SMT_E0138, SMT_E0138_MSG) ;                        rmt_reinsert_actions(smc) ;		}		else {			SMT_ERR_LOG(smc,SMT_E0135, SMT_E0135_MSG) ;			rmt_leave_actions(smc) ;		}	}}/* * Reconnect to the Ring */static void rmt_reinsert_actions(struct s_smc *smc){	queue_event(smc,EVENT_ECM,EC_DISCONNECT) ;	queue_event(smc,EVENT_ECM,EC_CONNECT) ;}/* * duplicate address detected */static void rmt_new_dup_actions(struct s_smc *smc){	smc->r.da_flag = TRUE ;	smc->r.bn_flag = FALSE ;	smc->r.jm_flag = FALSE ;	/*	 * we have three options : change address, jam or leave	 * we leave the ring as default 	 * Optionally it's possible to reinsert after leaving the Ring	 * but this will not conform with SMT Spec.	 */	if (smc->s.rmt_dup_mac_behavior) {		SMT_ERR_LOG(smc,SMT_E0138, SMT_E0138_MSG) ;		rmt_reinsert_actions(smc) ;	}	else {		SMT_ERR_LOG(smc,SMT_E0135, SMT_E0135_MSG) ;		rmt_leave_actions(smc) ;	}}/* * leave the ring */static void rmt_leave_actions(struct s_smc *smc){	queue_event(smc,EVENT_ECM,EC_DISCONNECT) ;	/*	 * Note: Do NOT try again later. (with please reconnect)	 * The station must be left from the ring!	 */}/* * SMT timer interface *	start RMT timer 0 */static void start_rmt_timer0(struct s_smc *smc, u_long value, int event){	smc->r.timer0_exp = FALSE ;		/* clear timer event flag */	smt_timer_start(smc,&smc->r.rmt_timer0,value,EV_TOKEN(EVENT_RMT,event));}/* * SMT timer interface *	start RMT timer 1 */static void start_rmt_timer1(struct s_smc *smc, u_long value, int event){	smc->r.timer1_exp = FALSE ;	/* clear timer event flag */	smt_timer_start(smc,&smc->r.rmt_timer1,value,EV_TOKEN(EVENT_RMT,event));}/* * SMT timer interface *	start RMT timer 2 */static void start_rmt_timer2(struct s_smc *smc, u_long value, int event){	smc->r.timer2_exp = FALSE ;		/* clear timer event flag */	smt_timer_start(smc,&smc->r.rmt_timer2,value,EV_TOKEN(EVENT_RMT,event));}/* * SMT timer interface *	stop RMT timer 0 */static void stop_rmt_timer0(struct s_smc *smc){	if (smc->r.rmt_timer0.tm_active)		smt_timer_stop(smc,&smc->r.rmt_timer0) ;}/* * SMT timer interface *	stop RMT timer 1 */static void stop_rmt_timer1(struct s_smc *smc){	if (smc->r.rmt_timer1.tm_active)		smt_timer_stop(smc,&smc->r.rmt_timer1) ;}/* * SMT timer interface *	stop RMT timer 2 */static void stop_rmt_timer2(struct s_smc *smc){	if (smc->r.rmt_timer2.tm_active)		smt_timer_stop(smc,&smc->r.rmt_timer2) ;}

⌨️ 快捷键说明

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