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

📄 pmf.c

📁 h内核
💻 C
📖 第 1 页 / 共 3 页
字号:
	struct smt_para	*pa ;	const struct s_p_tab	*pt ;	struct fddi_mib_m *mib_m = NULL;	struct fddi_mib_p *mib_p = NULL;	int		len ;	int		plen ;	char		*from ;	char		*to ;	const char	*swap ;	char		c ;	int		range ;	char		*mib_addr ;	int		mac ;	int		path ;	int		port ;	int		sp_len ;	/*	 * skip if errror	 */	if (pcon->pc_err)		return ;	/*	 * actions don't have a value	 */	pt = smt_get_ptab(para) ;	if (pt && pt->p_access == AC_S)		return ;	to = (char *) (pcon->pc_p) ;	/* destination pointer */	len = pcon->pc_len ;		/* free space */	plen = len ;			/* remember start length */	pa = (struct smt_para *) to ;	/* type/length pointer */	to += PARA_LEN ;		/* skip smt_para */	len -= PARA_LEN ;	/*	 * set index if required	 */	if (((range = (para & 0xf000)) == 0x2000) ||		range == 0x3000 || range == 0x4000) {		if (len < 4)			goto wrong_error ;		to[0] = 0 ;		to[1] = 0 ;		to[2] = 0 ;		to[3] = index ;		len -= 4 ;		to += 4 ;	}	mac = index - INDEX_MAC ;	path = index - INDEX_PATH ;	port = index - INDEX_PORT ;	/*	 * get pointer to mib	 */	switch (range) {	case 0x1000 :	default :		mib_addr = (char *) (&smc->mib) ;		break ;	case 0x2000 :		if (mac < 0 || mac >= NUMMACS) {			pcon->pc_err = SMT_RDF_NOPARAM ;			return ;		}		mib_addr = (char *) (&smc->mib.m[mac]) ;		mib_m = (struct fddi_mib_m *) mib_addr ;		break ;	case 0x3000 :		if (path < 0 || path >= NUMPATHS) {			pcon->pc_err = SMT_RDF_NOPARAM ;			return ;		}		mib_addr = (char *) (&smc->mib.a[path]) ;		break ;	case 0x4000 :		if (port < 0 || port >= smt_mib_phys(smc)) {			pcon->pc_err = SMT_RDF_NOPARAM ;			return ;		}		mib_addr = (char *) (&smc->mib.p[port_to_mib(smc,port)]) ;		mib_p = (struct fddi_mib_p *) mib_addr ;		break ;	}	/*	 * check special paras	 */	swap = NULL;	switch (para) {	case SMT_P10F0 :	case SMT_P10F1 :#ifdef	ESS	case SMT_P10F2 :	case SMT_P10F3 :	case SMT_P10F4 :	case SMT_P10F5 :	case SMT_P10F6 :	case SMT_P10F7 :#endif#ifdef	SBA	case SMT_P10F8 :	case SMT_P10F9 :#endif	case SMT_P20F1 :		if (!local) {			pcon->pc_err = SMT_RDF_NOPARAM ;			return ;		}		break ;	case SMT_P2034 :	case SMT_P2046 :	case SMT_P2047 :	case SMT_P204A :	case SMT_P2051 :	case SMT_P2052 :		mac_update_counter(smc) ;		break ;	case SMT_P4022:		mib_p->fddiPORTPC_LS = LS2MIB(			sm_pm_get_ls(smc,port_to_mib(smc,port))) ;		break ;	case SMT_P_REASON :		* (u_long *) to = 0 ;		sp_len = 4 ;		goto sp_done ;	case SMT_P1033 :			/* time stamp */		smt_set_timestamp(smc,smc->mib.fddiSMTTimeStamp) ;		break ;	case SMT_P1020:				/* port indexes */#if	NUMPHYS == 12		swap = "IIIIIIIIIIII" ;#else#if	NUMPHYS == 2		if (smc->s.sas == SMT_SAS)			swap = "I" ;		else			swap = "II" ;#else#if	NUMPHYS == 24		swap = "IIIIIIIIIIIIIIIIIIIIIIII" ;#else	????#endif#endif#endif		break ;	case SMT_P3212 :		{			sp_len = cem_build_path(smc,to,path) ;			goto sp_done ;		}	case SMT_P1048 :		/* peer wrap condition */		{			struct smt_p_1048	*sp ;			sp = (struct smt_p_1048 *) to ;			sp->p1048_flag = smc->mib.fddiSMTPeerWrapFlag ;			sp->p1048_cf_state = smc->mib.fddiSMTCF_State ;			sp_len = sizeof(struct smt_p_1048) ;			goto sp_done ;		}	case SMT_P208C :		{			struct smt_p_208c	*sp ;			sp = (struct smt_p_208c *) to ;			sp->p208c_flag =				smc->mib.m[MAC0].fddiMACDuplicateAddressCond ;			sp->p208c_dupcondition =				(mib_m->fddiMACDA_Flag ? SMT_ST_MY_DUPA : 0) |				(mib_m->fddiMACUNDA_Flag ? SMT_ST_UNA_DUPA : 0);			sp->p208c_fddilong =				mib_m->fddiMACSMTAddress ;			sp->p208c_fddiunalong =				mib_m->fddiMACUpstreamNbr ;			sp->p208c_pad = 0 ;			sp_len = sizeof(struct smt_p_208c) ;			goto sp_done ;		}	case SMT_P208D :		/* frame error condition */		{			struct smt_p_208d	*sp ;			sp = (struct smt_p_208d *) to ;			sp->p208d_flag =				mib_m->fddiMACFrameErrorFlag ;			sp->p208d_frame_ct =				mib_m->fddiMACFrame_Ct ;			sp->p208d_error_ct =				mib_m->fddiMACError_Ct ;			sp->p208d_lost_ct =				mib_m->fddiMACLost_Ct ;			sp->p208d_ratio =				mib_m->fddiMACFrameErrorRatio ;			sp_len = sizeof(struct smt_p_208d) ;			goto sp_done ;		}	case SMT_P208E :		/* not copied condition */		{			struct smt_p_208e	*sp ;			sp = (struct smt_p_208e *) to ;			sp->p208e_flag =				mib_m->fddiMACNotCopiedFlag ;			sp->p208e_not_copied =				mib_m->fddiMACNotCopied_Ct ;			sp->p208e_copied =				mib_m->fddiMACCopied_Ct ;			sp->p208e_not_copied_ratio =				mib_m->fddiMACNotCopiedRatio ;			sp_len = sizeof(struct smt_p_208e) ;			goto sp_done ;		}	case SMT_P208F :	/* neighbor change event */		{			struct smt_p_208f	*sp ;			sp = (struct smt_p_208f *) to ;			sp->p208f_multiple =				mib_m->fddiMACMultiple_N ;			sp->p208f_nacondition =				mib_m->fddiMACDuplicateAddressCond ;			sp->p208f_old_una =				mib_m->fddiMACOldUpstreamNbr ;			sp->p208f_new_una =				mib_m->fddiMACUpstreamNbr ;			sp->p208f_old_dna =				mib_m->fddiMACOldDownstreamNbr ;			sp->p208f_new_dna =				mib_m->fddiMACDownstreamNbr ;			sp->p208f_curren_path =				mib_m->fddiMACCurrentPath ;			sp->p208f_smt_address =				mib_m->fddiMACSMTAddress ;			sp_len = sizeof(struct smt_p_208f) ;			goto sp_done ;		}	case SMT_P2090 :		{			struct smt_p_2090	*sp ;			sp = (struct smt_p_2090 *) to ;			sp->p2090_multiple =				mib_m->fddiMACMultiple_P ;			sp->p2090_availablepaths =				mib_m->fddiMACAvailablePaths ;			sp->p2090_currentpath =				mib_m->fddiMACCurrentPath ;			sp->p2090_requestedpaths =				mib_m->fddiMACRequestedPaths ;			sp_len = sizeof(struct smt_p_2090) ;			goto sp_done ;		}	case SMT_P4050 :		{			struct smt_p_4050	*sp ;			sp = (struct smt_p_4050 *) to ;			sp->p4050_flag =				mib_p->fddiPORTLerFlag ;			sp->p4050_pad = 0 ;			sp->p4050_cutoff =				mib_p->fddiPORTLer_Cutoff ; ;			sp->p4050_alarm =				mib_p->fddiPORTLer_Alarm ; ;			sp->p4050_estimate =				mib_p->fddiPORTLer_Estimate ;			sp->p4050_reject_ct =				mib_p->fddiPORTLem_Reject_Ct ;			sp->p4050_ct =				mib_p->fddiPORTLem_Ct ;			sp_len = sizeof(struct smt_p_4050) ;			goto sp_done ;		}	case SMT_P4051 :		{			struct smt_p_4051	*sp ;			sp = (struct smt_p_4051 *) to ;			sp->p4051_multiple =				mib_p->fddiPORTMultiple_U ;			sp->p4051_porttype =				mib_p->fddiPORTMy_Type ;			sp->p4051_connectstate =				mib_p->fddiPORTConnectState ; ;			sp->p4051_pc_neighbor =				mib_p->fddiPORTNeighborType ;			sp->p4051_pc_withhold =				mib_p->fddiPORTPC_Withhold ;			sp_len = sizeof(struct smt_p_4051) ;			goto sp_done ;		}	case SMT_P4052 :		{			struct smt_p_4052	*sp ;			sp = (struct smt_p_4052 *) to ;			sp->p4052_flag =				mib_p->fddiPORTEB_Condition ;			sp->p4052_eberrorcount =				mib_p->fddiPORTEBError_Ct ;			sp_len = sizeof(struct smt_p_4052) ;			goto sp_done ;		}	case SMT_P4053 :		{			struct smt_p_4053	*sp ;			sp = (struct smt_p_4053 *) to ;			sp->p4053_multiple =				mib_p->fddiPORTMultiple_P ; ;			sp->p4053_availablepaths =				mib_p->fddiPORTAvailablePaths ;			sp->p4053_currentpath =				mib_p->fddiPORTCurrentPath ;			memcpy(	(char *) &sp->p4053_requestedpaths,				(char *) mib_p->fddiPORTRequestedPaths,4) ;			sp->p4053_mytype =				mib_p->fddiPORTMy_Type ;			sp->p4053_neighbortype =				mib_p->fddiPORTNeighborType ;			sp_len = sizeof(struct smt_p_4053) ;			goto sp_done ;		}	default :		break ;	}	/*	 * in table ?	 */	if (!pt) {		pcon->pc_err = (para & 0xff00) ? SMT_RDF_NOPARAM :						SMT_RDF_ILLEGAL ;		return ;	}	/*	 * check access rights	 */	switch (pt->p_access) {	case AC_G :	case AC_GR :		break ;	default :		pcon->pc_err = SMT_RDF_ILLEGAL ;		return ;	}	from = mib_addr + pt->p_offset ;	if (!swap)		swap = pt->p_swap ;		/* pointer to swap string */	/*	 * copy values	 */	while ((c = *swap++)) {		switch(c) {		case 'b' :		case 'w' :		case 'l' :			break ;		case 'S' :		case 'E' :		case 'R' :		case 'r' :			if (len < 4)				goto len_error ;			to[0] = 0 ;			to[1] = 0 ;#ifdef	LITTLE_ENDIAN			if (c == 'r') {				to[2] = *from++ ;				to[3] = *from++ ;			}			else {				to[3] = *from++ ;				to[2] = *from++ ;			}#else			to[2] = *from++ ;			to[3] = *from++ ;#endif			to += 4 ;			len -= 4 ;			break ;		case 'I' :		/* for SET of port indexes */			if (len < 2)				goto len_error ;#ifdef	LITTLE_ENDIAN			to[1] = *from++ ;			to[0] = *from++ ;#else			to[0] = *from++ ;			to[1] = *from++ ;#endif			to += 2 ;			len -= 2 ;			break ;		case 'F' :		case 'B' :			if (len < 4)				goto len_error ;			len -= 4 ;			to[0] = 0 ;			to[1] = 0 ;			to[2] = 0 ;			to[3] = *from++ ;			to += 4 ;			break ;		case 'C' :		case 'T' :		case 'L' :			if (len < 4)				goto len_error ;#ifdef	LITTLE_ENDIAN			to[3] = *from++ ;			to[2] = *from++ ;			to[1] = *from++ ;			to[0] = *from++ ;#else			to[0] = *from++ ;			to[1] = *from++ ;			to[2] = *from++ ;			to[3] = *from++ ;#endif			len -= 4 ;			to += 4 ;			break ;		case '2' :		/* PortMacIndicated */			if (len < 4)				goto len_error ;			to[0] = 0 ;			to[1] = 0 ;			to[2] = *from++ ;			to[3] = *from++ ;			len -= 4 ;			to += 4 ;			break ;		case '4' :			if (len < 4)				goto len_error ;			to[0] = *from++ ;			to[1] = *from++ ;			to[2] = *from++ ;			to[3] = *from++ ;			len -= 4 ;			to += 4 ;			break ;		case 'A' :			if (len < 8)				goto len_error ;			to[0] = 0 ;			to[1] = 0 ;			memcpy((char *) to+2,(char *) from,6) ;			to += 8 ;			from += 8 ;			len -= 8 ;			break ;		case '8' :			if (len < 8)				goto len_error ;			memcpy((char *) to,(char *) from,8) ;			to += 8 ;			from += 8 ;			len -= 8 ;			break ;		case 'D' :			if (len < 32)				goto len_error ;			memcpy((char *) to,(char *) from,32) ;			to += 32 ;			from += 32 ;			len -= 32 ;			break ;		case 'P' :		/* timestamp is NOT swapped */			if (len < 8)				goto len_error ;			to[0] = *from++ ;			to[1] = *from++ ;			to[2] = *from++ ;			to[3] = *from++ ;			to[4] = *from++ ;			to[5] = *from++ ;			to[6] = *from++ ;			to[7] = *from++ ;			to += 8 ;			len -= 8 ;			break ;		default :			SMT_PANIC(smc,SMT_E0119, SMT_E0119_MSG) ;			break ;		}	}done:	/*	 * make it even (in case of 'I' encoding)	 * note: len is DECREMENTED	 */	if (len & 3) {		to[0] = 0 ;		to[1] = 0 ;		to += 4 - (len & 3 ) ;		len = len & ~ 3 ;	}	/* set type and length */	pa->p_type = para ;	pa->p_len = plen - len - PARA_LEN ;	/* return values */	pcon->pc_p = (void *) to ;	pcon->pc_len = len ;	return ;sp_done:	len -= sp_len ;	to += sp_len ;	goto done ;len_error:	/* parameter does not fit in frame */	pcon->pc_err = SMT_RDF_TOOLONG ;	return ;wrong_error:	pcon->pc_err = SMT_RDF_LENGTH ;}/* * set parameter */int smt_set_para(struct s_smc *smc, struct smt_para *pa, int index, int local,		 int set){#define IFSET(x)	if (set) (x)	const struct s_p_tab	*pt ;	int		len ;	char		*from ;	char		*to ;	const char	*swap ;	char		c ;	char		*mib_addr ;	struct fddi_mib	*mib ;	struct fddi_mib_m	*mib_m = NULL;	struct fddi_mib_a	*mib_a = NULL;	struct fddi_mib_p	*mib_p = NULL;	int		mac ;	int		path ;	int		port ;	SK_LOC_DECL(u_char,byte_val) ;	SK_LOC_DECL(u_short,word_val) ;	SK_LOC_DECL(u_long,long_val) ;	mac = index - INDEX_MAC ;	path = index - INDEX_PATH ;	port = index - INDEX_PORT ;	len = pa->p_len ;	from = (char *) (pa + 1 ) ;	mib = &smc->mib ;	switch (pa->p_type & 0xf000) {	case 0x1000 :	default :		mib_addr = (char *) mib ;		break ;	case 0x2000 :

⌨️ 快捷键说明

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