📄 skaddr.c
字号:
* Context: * runtime, pageable * may be called after SK_INIT_DATA * * Returns: * SK_MC_FILTERING_INEXACT * SK_MC_ILLEGAL_ADDRESS */int SkAddrGmacMcAdd(SK_AC *pAC, /* adapter context */SK_IOC IoC, /* I/O context */SK_U32 PortNumber, /* Port Number */SK_MAC_ADDR *pMc, /* multicast address to be added */int Flags) /* permanent/non-permanent */{ int i;#ifndef SK_ADDR_CHEAT SK_U32 HashBit;#endif /* !defined(SK_ADDR_CHEAT) */ if (!(pMc->a[0] & SK_MC_BIT)) { /* Hashing only possible with multicast addresses. */ return (SK_MC_ILLEGAL_ADDRESS); }#ifndef SK_ADDR_CHEAT /* Compute hash value of address. */ HashBit = SkGmacMcHash(&pMc->a[0]); if (Flags & SK_ADDR_PERMANENT) { /* permanent => RLMT */ /* Add bit to InexactRlmtFilter. */ pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[HashBit / 8] |= 1 << (HashBit % 8); /* Copy bit to InexactFilter. */ for (i = 0; i < 8; i++) { pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |= pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[i]; }#ifdef DEBUG SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, ("GMAC InexactRlmtFilter: %02X %02X %02X %02X %02X %02X %02X %02X\n", pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[0], pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[1], pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[2], pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[3], pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[4], pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[5], pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[6], pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[7]))#endif /* DEBUG */ } else { /* not permanent => DRV */ /* Add bit to InexactDrvFilter. */ pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[HashBit / 8] |= 1 << (HashBit % 8); /* Copy bit to InexactFilter. */ for (i = 0; i < 8; i++) { pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |= pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[i]; }#ifdef DEBUG SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, ("GMAC InexactDrvFilter: %02X %02X %02X %02X %02X %02X %02X %02X\n", pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[0], pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[1], pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[2], pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[3], pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[4], pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[5], pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[6], pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[7]))#endif /* DEBUG */ }#else /* SK_ADDR_CHEAT */ /* Set all bits in InexactFilter. */ for (i = 0; i < 8; i++) { pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] = 0xFF; }#endif /* SK_ADDR_CHEAT */ return (SK_MC_FILTERING_INEXACT);} /* SkAddrGmacMcAdd *//****************************************************************************** * * SkAddrMcUpdate - 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. * * It calls either SkAddrXmacMcUpdate or SkAddrGmacMcUpdate, according * to the adapter in use. The real work is done there. * * 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 SkAddrMcUpdate(SK_AC *pAC, /* adapter context */SK_IOC IoC, /* I/O context */SK_U32 PortNumber) /* Port Number */{ int ReturnCode; if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { return (SK_ADDR_ILLEGAL_PORT); } if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { ReturnCode = SkAddrXmacMcUpdate(pAC, IoC, PortNumber); } else { ReturnCode = SkAddrGmacMcUpdate(pAC, IoC, PortNumber); } return (ReturnCode);} /* SkAddrMcUpdate *//****************************************************************************** * * 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, 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, PortNumber, SK_TRUE); } else { /* Disable Hashing */ SkMacHashing(pAC, IoC, 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 *//****************************************************************************** * * 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 */{ SK_U32 i; SK_U8 Inexact; 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 */ 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, PortNumber, SK_TRUE); } else { /* Enable Hashing. */ SkMacHashing(pAC, IoC, PortNumber, SK_TRUE); } if (pAPort->PromMode != SK_PROM_MODE_NONE) { (void) SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode); } /* 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 */ /* Determine return value. */ if (Inexact == 0 && pAPort->PromMode == 0) { return (SK_MC_FILTERING_EXACT); } else { return (SK_MC_FILTERING_INEXACT); }} /* SkAddrGmacMcUpdate *//****************************************************************************** * * 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 *pNewAddr, /* new MAC address */int Flags) /* logical/physical MAC address */{ SK_EVPARA Para; SK_U32 NetNumber; SK_U32 i; SK_U16 *OutAddr; NetNumber = pAC->Rlmt.Port[PortNumber].Net->NetNumber; if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { return (SK_ADDR_ILLEGAL_PORT); } 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); } } /* Set PortNumber to number of net's active port. */ PortNumber = pAC->Rlmt.Net[NetNumber]. Port[pAC->Addr.Net[NetNumber].ActivePort]->PortNumber; 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); } } /* Set PortNumber to number of net's active port. */ PortNumber = pAC->Rlmt.Net[NetNumber]. Port[pAC->Addr.Net[NetNumber].ActivePort]->PortNumber; 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)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -