📄 skaddr.c
字号:
#endif /* DEBUG */ if (!(Flags & SK_MC_SW_ONLY)) { (void) SkAddrGmacMcUpdate(pAC, IoC, PortNumber); } return (SK_ADDR_SUCCESS);} /* SkAddrGmacMcClear */#ifndef SK_ADDR_CHEAT/****************************************************************************** * * SkGmacMcHash - hash multicast address * * Description: * This routine computes the hash value for a multicast address. * A CRC16 algorithm is used. * * Notes: * * * Context: * runtime, pageable * * Returns: * Hash value of multicast address. */SK_U32 SkGmacMcHash(unsigned char *pMc) /* Multicast address */{ SK_U32 Data; SK_U32 TmpData; SK_U32 Crc; int Byte; int Bit; Crc = 0xFFFFFFFFUL; for (Byte = 0; Byte < 6; Byte++) { /* Get next byte. */ Data = (SK_U32) pMc[Byte]; /* Change bit order in byte. */ TmpData = Data; for (Bit = 0; Bit < 8; Bit++) { if (TmpData & 1L) { Data |= 1L << (7 - Bit); } else { Data &= ~(1L << (7 - Bit)); } TmpData >>= 1; } Crc ^= (Data << 24); for (Bit = 0; Bit < 8; Bit++) { if (Crc & 0x80000000) { Crc = (Crc << 1) ^ GMAC_POLY; } else { Crc <<= 1; } } } return (Crc & ((1 << HASH_BITS) - 1));} /* SkGmacMcHash */#endif /* !SK_ADDR_CHEAT *//****************************************************************************** * * SkAddrMcAdd - add a multicast address to a port * * Description: * This routine enables reception for a given address on the given port. * * It calls either SkAddrXmacMcAdd or SkAddrGmacMcAdd, 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_DATA * * Returns: * SK_MC_FILTERING_EXACT * SK_MC_FILTERING_INEXACT * SK_MC_ILLEGAL_ADDRESS * SK_MC_ILLEGAL_PORT * SK_MC_RLMT_OVERFLOW */int SkAddrMcAdd(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 ReturnCode; if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { return (SK_ADDR_ILLEGAL_PORT); } ReturnCode = SkAddrGmacMcAdd(pAC, IoC, PortNumber, pMc, Flags); return (ReturnCode);} /* SkAddrMcAdd *//****************************************************************************** * * SkAddrGmacMcAdd - add a multicast address to a port * * Description: * This routine enables reception for a given address on the given port. * * Notes: * The return code is only valid for SK_PROM_MODE_NONE. * * 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 */#endif /* !SK_SLIM *//****************************************************************************** * * 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 = SK_ADDR_ILLEGAL_PORT;#if (!defined(SK_SLIM) || defined(DEBUG)) if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { return (SK_ADDR_ILLEGAL_PORT); }#endif /* !SK_SLIM || DEBUG */ ReturnCode = SkAddrGmacMcUpdate(pAC, IoC, PortNumber); return (ReturnCode);} /* SkAddrMcUpdate *//****************************************************************************** * * 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 */#ifndef SK_NO_MAO/****************************************************************************** * * SkAddrOverride - override a port's MAC address * * Description: * This routine overrides the MAC address of one port. * * NOTE: It can be called with pNewAddr set to NULL from the RLMT module! * This is correct in combination with Flags set to SK_ADDR_SET_LOGICAL * or SK_ADDR_CLEAR_LOGICAL. All other calls will be handled as an error * and SK_MC_ILLEGAL_ADDRESS will be returned then. * * 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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -