int mv_switch_all_multicasts_del(int db_num) { GT_STATUS status = GT_OK; GT_ATU_ENTRY atu_entry; GT_U8 mc_mac[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; GT_U8 bc_mac[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; memcpy(atu_entry.macAddr.arEther, &mc_mac, 6); atu_entry.DBNum = db_num; while ((status = gfdbGetAtuEntryNext(qd_dev, &atu_entry)) == GT_OK) { /* we don't want to delete the broadcast entry which is the last one */ if (memcmp(atu_entry.macAddr.arEther, &bc_mac, 6) == 0) break; SWITCH_DBG(SWITCH_DBG_MCAST, ("Deleting ATU Entry: db = %d, MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", atu_entry.DBNum, atu_entry.macAddr.arEther[0], atu_entry.macAddr.arEther[1], atu_entry.macAddr.arEther[2], atu_entry.macAddr.arEther[3], atu_entry.macAddr.arEther[4], atu_entry.macAddr.arEther[5])); if (gfdbDelAtuEntry(qd_dev, &atu_entry) != GT_OK) { printk(KERN_ERR "gfdbDelAtuEntry failed\n"); return -1; } memcpy(atu_entry.macAddr.arEther, &mc_mac, 6); atu_entry.DBNum = db_num; } return 0; }
int mv_switch_mac_addr_set(unsigned char *mac_addr, unsigned char db, unsigned int ports_mask, unsigned char op) { GT_ATU_ENTRY mac_entry; memset(&mac_entry, 0, sizeof(GT_ATU_ENTRY)); mac_entry.trunkMember = GT_FALSE; mac_entry.prio = 0; mac_entry.exPrio.useMacFPri = GT_FALSE; mac_entry.exPrio.macFPri = 0; mac_entry.exPrio.macQPri = 0; mac_entry.DBNum = db; mac_entry.portVec = ports_mask; memcpy(mac_entry.macAddr.arEther, mac_addr, 6); if (is_multicast_ether_addr(mac_addr)) mac_entry.entryState.mcEntryState = GT_MC_STATIC; else mac_entry.entryState.ucEntryState = GT_UC_NO_PRI_STATIC; if ((op == 0) || (mac_entry.portVec == 0)) { if (gfdbDelAtuEntry(qd_dev, &mac_entry) != GT_OK) { printk(KERN_ERR "gfdbDelAtuEntry failed\n"); return -1; } } else { if (gfdbAddMacEntry(qd_dev, &mac_entry) != GT_OK) { printk(KERN_ERR "gfdbAddMacEntry failed\n"); return -1; } } return 0; }
int mv_gtw_set_mac_addr_to_switch(unsigned char *mac_addr, unsigned char db, unsigned int ports_mask, unsigned char op) { GT_ATU_ENTRY mac_entry; struct mv_vlan_cfg *nc; /* validate db with VLAN id */ nc = >w_config.vlan_cfg[db]; if(MV_GTW_VLAN_TO_GROUP(nc->vlan_grp_id) != db) { printk("mv_gtw_set_mac_addr_to_switch (invalid db)\n"); return -1; } memset(&mac_entry,0,sizeof(GT_ATU_ENTRY)); mac_entry.trunkMember = GT_FALSE; mac_entry.prio = 0; mac_entry.exPrio.useMacFPri = GT_FALSE; mac_entry.exPrio.macFPri = 0; mac_entry.exPrio.macQPri = 0; mac_entry.DBNum = db; mac_entry.portVec = ports_mask; memcpy(mac_entry.macAddr.arEther,mac_addr,6); if(is_multicast_ether_addr(mac_addr)) mac_entry.entryState.mcEntryState = GT_MC_STATIC; else mac_entry.entryState.ucEntryState = GT_UC_NO_PRI_STATIC; ETH_DBG(ETH_DBG_ALL, ("mv_gateway: db%d port-mask=0x%x, %02x:%02x:%02x:%02x:%02x:%02x ", db, (unsigned int)mac_entry.portVec, mac_entry.macAddr.arEther[0],mac_entry.macAddr.arEther[1],mac_entry.macAddr.arEther[2], mac_entry.macAddr.arEther[3],mac_entry.macAddr.arEther[4],mac_entry.macAddr.arEther[5])); if((op == 0) || (mac_entry.portVec == 0)) { if(gfdbDelAtuEntry(qd_dev, &mac_entry) != GT_OK) { printk("gfdbDelAtuEntry failed\n"); return -1; } ETH_DBG(ETH_DBG_ALL, ("deleted\n")); } else { if(gfdbAddMacEntry(qd_dev, &mac_entry) != GT_OK) { printk("gfdbAddMacEntry failed\n"); return -1; } ETH_DBG(ETH_DBG_ALL, ("added\n")); } return 0; }
/******************************************************************************* * gstpSetMode * * DESCRIPTION: * This routine Enable the Spanning tree. * * INPUTS: * en - GT_TRUE for enable, GT_FALSE for disable. * * OUTPUTS: * None. * * RETURNS: * GT_OK - on success * GT_FAIL - on error * * COMMENTS: * when enabled, this function sets all port to blocking state, and inserts * the BPDU MAC into the ATU to be captured to CPU, on disable all port are * being modified to be in forwarding state. * * GalTis: * *******************************************************************************/ GT_STATUS gstpSetMode ( IN GT_QD_DEV *dev, IN GT_BOOL en ) { GT_STATUS retVal = GT_OK; /* Functions return value. */ GT_ATU_ENTRY atuEntry; /* The ATU entry data to be set */ GT_U32 i, dbNum; DBG_INFO(("gstpSetMode Called.\n")); if(dev->deviceId == GT_88E6051) { DBG_INFO(("Failed.\n")); return GT_FAIL; } if((en == GT_TRUE) && (dev->stpMode == 1)) { DBG_INFO(("OK.\n")); return GT_OK; } switch(dev->deviceId) { case GT_88E6051: case GT_88E6052: dbNum = 1; break; case GT_FF_HG: case GT_FF_EG: case GT_88E6021: case GT_88E6060: case GT_88E6031: case GT_88E6061: case GT_88E6063: case GT_FH_VPN: case GT_88E6083: case GT_88E6153: case GT_88E6181: case GT_88E6183: case GT_88E6093: dbNum = 16; break; case GT_88E6035: case GT_88E6055: case GT_88E6065: dbNum = 64; break; default: if (!IS_IN_DEV_GROUP(dev,DEV_ENHANCED_MULTICAST)) { dbNum = 64; } else { dbNum = 0; retVal = enhancedBPDUSet(dev,en); } break; } for (i=0; i<dbNum; i++) { /* Set the Atu entry parameters. */ atuEntry.macAddr.arEther[0] = 0x01; atuEntry.macAddr.arEther[1] = 0x80; atuEntry.macAddr.arEther[2] = 0xC2; atuEntry.macAddr.arEther[3] = 0x00; atuEntry.macAddr.arEther[4] = 0x00; atuEntry.macAddr.arEther[5] = 0x00; atuEntry.portVec = GT_LPORTVEC_2_PORTVEC((1<<dev->cpuPortNum)); if(IS_IN_DEV_GROUP(dev,DEV_ATU_EXT_PRI)) { if(IS_IN_DEV_GROUP(dev,DEV_FQPRI_IN_TABLE)) { atuEntry.exPrio.useMacFPri = GT_TRUE; atuEntry.exPrio.macFPri = 7; } else { atuEntry.exPrio.useMacFPri = 0; atuEntry.exPrio.macFPri = 0; } atuEntry.exPrio.macQPri = 3; atuEntry.prio = 0; } else { atuEntry.prio = 3; atuEntry.exPrio.useMacFPri = 0; atuEntry.exPrio.macFPri = 0; atuEntry.exPrio.macQPri = 0; } atuEntry.DBNum = (GT_U8)i; atuEntry.entryState.mcEntryState = GT_MC_PRIO_MGM_STATIC; if(en == GT_TRUE) { retVal = gfdbAddMacEntry(dev,&atuEntry); } else { if(dev->stpMode == 0) break; retVal = gfdbDelAtuEntry(dev,&atuEntry); } if (retVal != GT_OK) break; } if(retVal == GT_OK) { if(en == GT_TRUE) dev->stpMode = 1; else dev->stpMode = 2; DBG_INFO(("OK.\n")); } else { dev->stpMode = 0; DBG_INFO(("Failed.\n")); } return retVal; }
GT_STATUS sampleMinimizeCPUTraffic2(GT_QD_DEV *dev, GT_U8* macAddr) { GT_STATUS status; int i; GT_LPORT cpuPort; GT_ATU_ENTRY macEntry; cpuPort = (GT_LPORT)dev->cpuPortNum; /* * Remove CPU port from VLAN Member Table. */ for(i=0; i<dev->numOfPorts; i++) { if (i == cpuPort) continue; if((status = gprtSetARPtoCPU(dev,i,GT_TRUE)) != GT_OK) { MSG_PRINT(("gprtSetARPtoCPU return Failed\n")); return status; } } /* * Set Egress Flood Mode to be Block Unknown DA on CPU Port. */ if((status = gprtSetEgressFlood(dev,cpuPort,GT_BLOCK_EGRESS_UNKNOWN)) != GT_OK) { MSG_PRINT(("gprtSetEgressFlood return Failed\n")); return status; } /* * Add CPU's MAC into address table. * This sample assumes that DBNum is not used. If DBNum is used, * the macEntry has to be added for each DBNum used. */ memset(&macEntry,0,sizeof(GT_ATU_ENTRY)); memcpy(macEntry.macAddr.arEther,macAddr,6); macEntry.portVec = 1 << dev->cpuPortNum; macEntry.prio = 0; /* Priority (2bits). When these bits are used they override any other priority determined by the frame's data */ macEntry.entryState.ucEntryState = GT_UC_STATIC; macEntry.DBNum = 0; macEntry.trunkMember = GT_FALSE; if((status = gfdbAddMacEntry(dev,&macEntry)) != GT_OK) { MSG_PRINT(("gfdbAddMacEntry return Failed\n")); return status; } /* * Delete BroadCast Entry from address table if exists. * This sample assumes that DBNum is not used. If DBNum is used, * the macEntry has to be added for each DBNum used. */ memset(&macEntry,0,sizeof(GT_ATU_ENTRY)); memset(macEntry.macAddr.arEther,0xFF,6); gfdbDelAtuEntry(dev,&macEntry); return GT_OK; }