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

📄 skaddr.c

📁 优龙2410linux2.6.8内核源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
 */int	SkAddrMcUpdate(SK_AC	*pAC,		/* adapter context */SK_IOC	IoC,		/* I/O context */SK_U32	PortNumber)	/* Port Number */{	int ReturnCode;#if (!defined(SK_SLIM) || defined(DEBUG))	if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) {		return (SK_ADDR_ILLEGAL_PORT);	}#endif /* !SK_SLIM || DEBUG */#ifdef GENESIS	if (pAC->GIni.GIGenesis) {		ReturnCode = SkAddrXmacMcUpdate(pAC, IoC, PortNumber);	}#endif /* GENESIS */#ifdef YUKON	if (!pAC->GIni.GIGenesis) {		ReturnCode = SkAddrGmacMcUpdate(pAC, IoC, PortNumber);	}#endif /* YUKON */	return (ReturnCode);}	/* SkAddrMcUpdate */#ifdef GENESIS/****************************************************************************** * *	SkAddrXmacMcUpdate - update the HW MC address table and set the MAC address * * Description: *	This routine enables reception of the addresses contained in a local *	table for a given port. *	It also programs the port's current physical MAC address. * * Notes: *	The return code is only valid for SK_PROM_MODE_NONE. * * Context: *	runtime, pageable *	may be called after SK_INIT_IO * * Returns: *	SK_MC_FILTERING_EXACT *	SK_MC_FILTERING_INEXACT *	SK_ADDR_ILLEGAL_PORT */int	SkAddrXmacMcUpdate(SK_AC	*pAC,		/* adapter context */SK_IOC	IoC,		/* I/O context */SK_U32	PortNumber)	/* Port Number */{	SK_U32		i;	SK_U8		Inexact;	SK_U16		*OutAddr;	SK_ADDR_PORT	*pAPort;	SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("SkAddrXmacMcUpdate on Port %u.\n", PortNumber))		pAPort = &pAC->Addr.Port[PortNumber];#ifdef DEBUG	SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber]))#endif /* DEBUG */	/* Start with 0 to also program the logical MAC address. */	for (i = 0; i < pAPort->NextExactMatchRlmt; i++) {		/* Set exact match address i on XMAC */		OutAddr = (SK_U16 *) &pAPort->Exact[i].a[0];		XM_OUTADDR(IoC, PortNumber, XM_EXM(i), OutAddr);	}	/* Clear other permanent exact match addresses on XMAC */	if (pAPort->NextExactMatchRlmt <= SK_ADDR_LAST_MATCH_RLMT) {				SkXmClrExactAddr(pAC, IoC, PortNumber, pAPort->NextExactMatchRlmt,			SK_ADDR_LAST_MATCH_RLMT);	}	for (i = pAPort->FirstExactMatchDrv; i < pAPort->NextExactMatchDrv; i++) {		OutAddr = (SK_U16 *) &pAPort->Exact[i].a[0];		XM_OUTADDR(IoC, PortNumber, XM_EXM(i), OutAddr);	}	/* Clear other non-permanent exact match addresses on XMAC */	if (pAPort->NextExactMatchDrv <= SK_ADDR_LAST_MATCH_DRV) {				SkXmClrExactAddr(pAC, IoC, PortNumber, pAPort->NextExactMatchDrv,			SK_ADDR_LAST_MATCH_DRV);	}	for (Inexact = 0, i = 0; i < 8; i++) {		Inexact |= pAPort->InexactFilter.Bytes[i];	}	if (pAPort->PromMode & SK_PROM_MODE_ALL_MC) {				/* Set all bits in 64-bit hash register. */		XM_OUTHASH(IoC, PortNumber, XM_HSM, &OnesHash);				/* Enable Hashing */		SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);	}	else if (Inexact != 0) {				/* Set 64-bit hash register to InexactFilter. */		XM_OUTHASH(IoC, PortNumber, XM_HSM, &pAPort->InexactFilter.Bytes[0]);				/* Enable Hashing */		SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);	}	else {		/* Disable Hashing */		SkMacHashing(pAC, IoC, (int) PortNumber, SK_FALSE);	}	if (pAPort->PromMode != SK_PROM_MODE_NONE) {		(void) SkAddrXmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode);	}	/* Set port's current physical MAC address. */	OutAddr = (SK_U16 *) &pAPort->CurrentMacAddress.a[0];		XM_OUTADDR(IoC, PortNumber, XM_SA, OutAddr);#ifdef xDEBUG	for (i = 0; i < pAPort->NextExactMatchRlmt; i++) {		SK_U8		InAddr8[6];		SK_U16		*InAddr;		/* Get exact match address i from port PortNumber. */		InAddr = (SK_U16 *) &InAddr8[0];				XM_INADDR(IoC, PortNumber, XM_EXM(i), InAddr);				SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,			("SkAddrXmacMcUpdate: MC address %d on Port %u: ",			 "%02x %02x %02x %02x %02x %02x -- %02x %02x %02x %02x %02x %02x\n",				i,				PortNumber,				InAddr8[0],				InAddr8[1],				InAddr8[2],				InAddr8[3],				InAddr8[4],				InAddr8[5],				pAPort->Exact[i].a[0],				pAPort->Exact[i].a[1],				pAPort->Exact[i].a[2],				pAPort->Exact[i].a[3],				pAPort->Exact[i].a[4],				pAPort->Exact[i].a[5]))	}#endif /* DEBUG */	/* Determine return value. */	if (Inexact == 0 && pAPort->PromMode == 0) {		return (SK_MC_FILTERING_EXACT);	}	else {		return (SK_MC_FILTERING_INEXACT);	}	}	/* SkAddrXmacMcUpdate */#endif  /* GENESIS */#ifdef YUKON/****************************************************************************** * *	SkAddrGmacMcUpdate - update the HW MC address table and set the MAC address * * Description: *	This routine enables reception of the addresses contained in a local *	table for a given port. *	It also programs the port's current physical MAC address. * * Notes: *	The return code is only valid for SK_PROM_MODE_NONE. * * Context: *	runtime, pageable *	may be called after SK_INIT_IO * * Returns: *	SK_MC_FILTERING_EXACT *	SK_MC_FILTERING_INEXACT *	SK_ADDR_ILLEGAL_PORT */int	SkAddrGmacMcUpdate(SK_AC	*pAC,		/* adapter context */SK_IOC	IoC,		/* I/O context */SK_U32	PortNumber)	/* Port Number */{#ifndef SK_SLIM	SK_U32		i;	SK_U8		Inexact;#endif	/* not SK_SLIM */	SK_U16		*OutAddr;	SK_ADDR_PORT	*pAPort;	SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("SkAddrGmacMcUpdate on Port %u.\n", PortNumber))		pAPort = &pAC->Addr.Port[PortNumber];#ifdef DEBUG	SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber]))#endif /* DEBUG */	#ifndef SK_SLIM	for (Inexact = 0, i = 0; i < 8; i++) {		Inexact |= pAPort->InexactFilter.Bytes[i];	}		/* Set 64-bit hash register to InexactFilter. */	GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1,		&pAPort->InexactFilter.Bytes[0]);		if (pAPort->PromMode & SK_PROM_MODE_ALL_MC) {								/* Set all bits in 64-bit hash register. */		GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, &OnesHash);				/* Enable Hashing */		SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);	}	else {			/* Enable Hashing. */		SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);	}		if (pAPort->PromMode != SK_PROM_MODE_NONE) {		(void) SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode);	}#else /* SK_SLIM */	/* Set all bits in 64-bit hash register. */	GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, &OnesHash);	/* Enable Hashing */	SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);		(void) SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode);	#endif /* SK_SLIM */		/* Set port's current physical MAC address. */	OutAddr = (SK_U16 *) &pAPort->CurrentMacAddress.a[0];	GM_OUTADDR(IoC, PortNumber, GM_SRC_ADDR_1L, OutAddr);		/* Set port's current logical MAC address. */	OutAddr = (SK_U16 *) &pAPort->Exact[0].a[0];	GM_OUTADDR(IoC, PortNumber, GM_SRC_ADDR_2L, OutAddr);	#ifdef DEBUG	SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("SkAddrGmacMcUpdate: Permanent Physical MAC Address: %02X %02X %02X %02X %02X %02X\n",			pAPort->Exact[0].a[0],			pAPort->Exact[0].a[1],			pAPort->Exact[0].a[2],			pAPort->Exact[0].a[3],			pAPort->Exact[0].a[4],			pAPort->Exact[0].a[5]))		SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("SkAddrGmacMcUpdate: Physical MAC Address: %02X %02X %02X %02X %02X %02X\n",			pAPort->CurrentMacAddress.a[0],			pAPort->CurrentMacAddress.a[1],			pAPort->CurrentMacAddress.a[2],			pAPort->CurrentMacAddress.a[3],			pAPort->CurrentMacAddress.a[4],			pAPort->CurrentMacAddress.a[5]))#endif /* DEBUG */	#ifndef SK_SLIM	/* Determine return value. */	if (Inexact == 0 && pAPort->PromMode == 0) {		return (SK_MC_FILTERING_EXACT);	}	else {		return (SK_MC_FILTERING_INEXACT);	}#else /* SK_SLIM */	return (SK_MC_FILTERING_INEXACT);#endif /* SK_SLIM */	}	/* SkAddrGmacMcUpdate */#endif /* YUKON */#ifndef SK_NO_MAO/****************************************************************************** * *	SkAddrOverride - override a port's MAC address * * Description: *	This routine overrides the MAC address of one port. * * Context: *	runtime, pageable *	may be called after SK_INIT_IO * * Returns: *	SK_ADDR_SUCCESS if successful. *	SK_ADDR_DUPLICATE_ADDRESS if duplicate MAC address. *	SK_ADDR_MULTICAST_ADDRESS if multicast or broadcast address. *	SK_ADDR_TOO_EARLY if SK_INIT_IO was not executed before. */int	SkAddrOverride(SK_AC		*pAC,				/* adapter context */SK_IOC		IoC,				/* I/O context */SK_U32		PortNumber,			/* Port Number */SK_MAC_ADDR	SK_FAR *pNewAddr,	/* new MAC address */int			Flags)				/* logical/physical MAC address */{#ifndef SK_NO_RLMT	SK_EVPARA	Para;#endif /* !SK_NO_RLMT */	SK_U32		NetNumber;	SK_U32		i;	SK_U16		SK_FAR *OutAddr;#ifndef SK_NO_RLMT	NetNumber = pAC->Rlmt.Port[PortNumber].Net->NetNumber;#else	NetNumber = 0;#endif /* SK_NO_RLMT */#if (!defined(SK_SLIM) || defined(DEBUG))	if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) {		return (SK_ADDR_ILLEGAL_PORT);	}#endif /* !SK_SLIM || DEBUG */	if (pNewAddr != NULL && (pNewAddr->a[0] & SK_MC_BIT) != 0) {		return (SK_ADDR_MULTICAST_ADDRESS);	}	if (!pAC->Addr.Net[NetNumber].CurrentMacAddressSet) {		return (SK_ADDR_TOO_EARLY);	}	if (Flags & SK_ADDR_SET_LOGICAL) {	/* Activate logical MAC address. */		/* Parameter *pNewAddr is ignored. */		for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) {			if (!pAC->Addr.Port[i].CurrentMacAddressSet) {				return (SK_ADDR_TOO_EARLY);			}		}#ifndef SK_NO_RLMT		/* Set PortNumber to number of net's active port. */		PortNumber = pAC->Rlmt.Net[NetNumber].			Port[pAC->Addr.Net[NetNumber].ActivePort]->PortNumber;#endif /* !SK_NO_RLMT */		pAC->Addr.Port[PortNumber].Exact[0] =			pAC->Addr.Net[NetNumber].CurrentMacAddress;		/* Write address to first exact match entry of active port. */		(void) SkAddrMcUpdate(pAC, IoC, PortNumber);	}	else if (Flags & SK_ADDR_CLEAR_LOGICAL) {		/* Deactivate logical MAC address. */		/* Parameter *pNewAddr is ignored. */		for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) {			if (!pAC->Addr.Port[i].CurrentMacAddressSet) {				return (SK_ADDR_TOO_EARLY);			}		}#ifndef SK_NO_RLMT		/* Set PortNumber to number of net's active port. */		PortNumber = pAC->Rlmt.Net[NetNumber].			Port[pAC->Addr.Net[NetNumber].ActivePort]->PortNumber;#endif /* !SK_NO_RLMT */		for (i = 0; i < SK_MAC_ADDR_LEN; i++ ) {			pAC->Addr.Port[PortNumber].Exact[0].a[i] = 0;		}		/* Write address to first exact match entry of active port. */		(void) SkAddrMcUpdate(pAC, IoC, PortNumber);	}	else if (Flags & SK_ADDR_PHYSICAL_ADDRESS) {	/* Physical MAC address. */		if (SK_ADDR_EQUAL(pNewAddr->a,			pAC->Addr.Net[NetNumber].CurrentMacAddress.a)) {			return (SK_ADDR_DUPLICATE_ADDRESS);		}		for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) {			if (!pAC->Addr.Port[i].CurrentMacAddressSet) {				return (SK_ADDR_TOO_EARLY);			}			if (SK_ADDR_EQUAL(pNewAddr->a,				pAC->Addr.Port[i].CurrentMacAddress.a)) {				if (i == PortNumber) {					return (SK_ADDR_SUCCESS);				}				else {					return (SK_ADDR_DUPLICATE_ADDRESS);				}			}		}		pAC->Addr.Port[PortNumber].PreviousMacAddress =			pAC->Addr.Port[PortNumber].CurrentMacAddress;		pAC->Addr.Port[PortNumber].CurrentMacAddress = *pNewAddr;		/* Change port's physical MAC address. */		OutAddr = (SK_U16 SK_FAR *) pNewAddr;#ifdef GENESIS		if (pAC->GIni.GIGenesis) {			XM_OUTADDR(IoC, PortNumber, XM_SA, OutAddr);		}#endif /* GENESIS */#ifdef YUKON		if (!pAC->GIni.GIGenesis) {			GM_OUTADDR(IoC, PortNumber, GM_SRC_ADDR_1L, OutAddr);		}#endif /* YUKON */#ifndef SK_NO_RLMT		/* Report address change to RLMT. */		Para.Para32[0] = PortNumber;		Para.Para32[0] = -1;		SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_PORT_ADDR, Para);#endif /* !SK_NO_RLMT */	}	else {	/* Logical MAC address. */		if (SK_ADDR_EQUAL(pNewAddr->a,			pAC->Addr.Net[NetNumber].CurrentMacAddress.a)) {			return (SK_ADDR_SUCCESS);		}				for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) {			if (!pAC->Addr.Port[i].CurrentMacAddressSet) {				return (SK_ADDR_TOO_EARLY);			}

⌨️ 快捷键说明

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