/***************************************************************************** * sampleAdmitOnlyTaggedFrame * * DESCRIPTION: * This routine will show how to configure a port to accept only vlan * tagged frames. * This routine assumes that 802.1Q has been enabled for the given port. * * INPUTS: * port - logical port to be configured. * * OUTPUTS: * None. * * RETURNS: * GT_OK - on success * GT_FAIL - on error * * COMMENTS: * Some device support Discard Untagged feature. If so, gprtSetDiscardUntagged * function will do the work. * *******************************************************************************/ GT_STATUS sampleAdmitOnlyTaggedFrame(GT_QD_DEV *dev,GT_LPORT port) { GT_STATUS status; GT_VTU_ENTRY vtuEntry; int i; /* * 0) If device support gprtSetDiscardUntagged, call the function. */ status = gprtSetDiscardUntagged(dev, port, GT_TRUE); switch (status) { case GT_OK: MSG_PRINT(("Done.\n")); return status; case GT_NOT_SUPPORTED: MSG_PRINT(("Try other method.\n")); break; default: MSG_PRINT(("Failure accessing device.\n")); return status; } /* * 1) Add VLAN ID 0xFFF with the given port as a member. */ gtMemSet(&vtuEntry,0,sizeof(GT_VTU_ENTRY)); vtuEntry.DBNum = 0; vtuEntry.vid = 0xFFF; for(i=0; i<dev->numOfPorts; i++) { vtuEntry.vtuData.memberTagP[i] = NOT_A_MEMBER; } vtuEntry.vtuData.memberTagP[port] = MEMBER_EGRESS_TAGGED; if((status = gvtuAddEntry(dev,&vtuEntry)) != GT_OK) { MSG_PRINT(("gvtuAddEntry returned fail.\n")); return status; } /* * 2) Configure the default vid for the given port with VID 0xFFF */ if((status = gvlnSetPortVid(dev,port,0xFFF)) != GT_OK) { MSG_PRINT(("gvlnSetPortVid returned fail.\n")); return status; } return GT_OK; }
static int mv_gtw_set_vlan_in_vtu(unsigned short vlan_id,unsigned int ports_mask) { GT_VTU_ENTRY vtu_entry; unsigned int p; vtu_entry.vid = vlan_id; vtu_entry.DBNum = MV_GTW_VLAN_TO_GROUP(vlan_id); vtu_entry.vidPriOverride = GT_FALSE; vtu_entry.vidPriority = 0; vtu_entry.vidExInfo.useVIDFPri = GT_FALSE; vtu_entry.vidExInfo.vidFPri = 0; vtu_entry.vidExInfo.useVIDQPri = GT_FALSE; vtu_entry.vidExInfo.vidQPri = 0; vtu_entry.vidExInfo.vidNRateLimit = GT_FALSE; ETH_DBG( ETH_DBG_LOAD|ETH_DBG_MCAST|ETH_DBG_VLAN, ("vtu entry: vid=0x%x, port ", vtu_entry.vid)); for(p=0; p<qd_dev->numOfPorts; p++) { if(MV_BIT_CHECK(ports_mask, p)) { ETH_DBG( ETH_DBG_LOAD|ETH_DBG_MCAST|ETH_DBG_VLAN, ("%d ", p)); if(qd_dev->deviceId == GT_88E6061) { /* for 6061 device, no double/provider tag controlling on ingress. */ /* therefore, we need to strip the tag on egress on all ports except cpu port */ /* anyway, if we're using header mode no vlan-tag need to be added here */ vtu_entry.vtuData.memberTagP[p] = MEMBER_EGRESS_UNMODIFIED; } else { vtu_entry.vtuData.memberTagP[p] = MEMBER_EGRESS_UNMODIFIED; } } else { vtu_entry.vtuData.memberTagP[p] = NOT_A_MEMBER; } vtu_entry.vtuData.portStateP[p] = 0; } if(gvtuAddEntry(qd_dev, &vtu_entry) != GT_OK) { printk("gvtuAddEntry failed\n"); return -1; } ETH_DBG( ETH_DBG_LOAD|ETH_DBG_MCAST|ETH_DBG_VLAN, ("\n")); return 0; }
int mv_switch_vlan_in_vtu_set(unsigned short vlan_id, unsigned short db_num, unsigned int ports_mask) { GT_VTU_ENTRY vtu_entry; unsigned int p; memset(&vtu_entry, 0, sizeof(GT_VTU_ENTRY)); vtu_entry.sid = 1; vtu_entry.vid = vlan_id; vtu_entry.DBNum = db_num; vtu_entry.vidPriOverride = GT_FALSE; vtu_entry.vidPriority = 0; vtu_entry.vidExInfo.useVIDFPri = GT_FALSE; vtu_entry.vidExInfo.vidFPri = 0; vtu_entry.vidExInfo.useVIDQPri = GT_FALSE; vtu_entry.vidExInfo.vidQPri = 0; vtu_entry.vidExInfo.vidNRateLimit = GT_FALSE; SWITCH_DBG(SWITCH_DBG_LOAD | SWITCH_DBG_MCAST | SWITCH_DBG_VLAN, ("vtu entry: vid=0x%x, port ", vtu_entry.vid)); for (p = 0; p < qd_dev->numOfPorts; p++) { if (MV_BIT_CHECK(ports_mask, p)) { SWITCH_DBG(SWITCH_DBG_LOAD | SWITCH_DBG_MCAST | SWITCH_DBG_VLAN, ("%d ", p)); vtu_entry.vtuData.memberTagP[p] = MEMBER_EGRESS_UNMODIFIED; } else { vtu_entry.vtuData.memberTagP[p] = NOT_A_MEMBER; } vtu_entry.vtuData.portStateP[p] = 0; } if (gvtuAddEntry(qd_dev, &vtu_entry) != GT_OK) { printk(KERN_ERR "gvtuAddEntry failed\n"); return -1; } SWITCH_DBG(SWITCH_DBG_LOAD | SWITCH_DBG_MCAST | SWITCH_DBG_VLAN, ("\n")); return 0; }
int lr20xx_sw_init(void) { int ret = 0; switchd_open(); swReset(); if((ret = qdStart(SW_CPU_PORT)) != GT_OK) { ERROR(GLOBAL_OUT_GROUP, "initialize 88e6161 failed!\n"); return LR_FAILD; } GT_DOT1Q_MODE dot1qMode; GT_VTU_ENTRY vtuEntry; /* isolate P3 and P4*/ GT_LPORT portList[6]; GT_LPORT cnt = 0; // portList[0] = dev->cpuPortNum; // gvlnSetPortVlanPorts(dev, (GT_U8)SW_CES_PORT, portList, 1); // portList[0] = SW_CES_PORT; // gvlnSetPortVlanPorts(dev, (GT_U8)dev->cpuPortNum, portList, 1); portList[0] = SW_CES_PORT; set_port_isolate_base_port(SW_CPU_PORT, portList, 1); portList[0] = SW_CPU_PORT; set_port_isolate_base_port(SW_CES_PORT, portList, 1); // 设置 P3 和 P4 的802.1Q 模式为secured // dot1qMode = GT_SECURE; // gvlnSetPortVlanDot1qMode(dev, SW_CPU_PORT, dot1qMode); // gvlnSetPortVlanDot1qMode(dev, SW_CES_PORT, dot1qMode); // 添加默认VLAN 1 /* for(int i=0; i<6; i++){ BASE_VLAN_PORT port; // if(i == SW_CPU_PORT) // continue; port.portid = i; port.portAttr.egress = EGRESS_UNTAGGED; gvlnSetPortVid(dev, i, 1); } */ memset(&vtuEntry, 0, sizeof(GT_VTU_ENTRY)); vtuEntry.vid = 1; vtuEntry.vtuData.memberTagP[3] = MEMBER_EGRESS_UNTAGGED; gvtuAddEntry(dev, &vtuEntry); //TODO: serdes 速率设置 smiWriteReg(0x0c, 0, 0x40); smiWriteReg(0x0c, 0x10, 0xc44b); set_port_link_type(SW_CPU_PORT, PORT_LINK_TYPE_TRUNK); set_port_link_type(SW_CES_PORT, PORT_LINK_TYPE_TRUNK); force_link_port(SW_CPU_PORT); force_link_port(SW_CES_PORT); smiWriteReg(0x13,0,0x0d); smiWriteReg(0x13,1,0x03); INFO(GLOBAL_OUT_GROUP, "initialize 88e6161 OK\n"); return ret; }
/***************************************************************************** * sample802_1qSetup * * DESCRIPTION: * This routine will show how to configure the switch device so that it * can be a Home Gateway. This example assumes that all the frames are not * VLAN-Tagged. * 1) to clear VLAN ID Table, * 2) to enable 802.1Q in SECURE mode for each port except CPU port, * 3) to enable 802.1Q in FALL BACK mode for the CPU port. * 4) to add VLAN ID 1 with member port 0 and CPU port * (untagged egress), * 5) to add VLAN ID 2 with member the rest of the ports and CPU port * (untagged egress), * 6) to configure the default vid of each port: * Port 0 have PVID 1, CPU port has PVID 3, and the rest ports have PVID 2. * Note: CPU port's PVID should be unknown VID, so that QuarterDeck can use * VlanTable (header info) for TX. * * * INPUTS: * None. * * OUTPUTS: * None. * * RETURNS: * GT_OK - on success * GT_FAIL - on error * * COMMENTS: * WARNING!! * If you create just two VLAN for this setup, Trailer mode or Header mode * for the CPU port has to be enabled and Ethernet driver which connects to * CPU port should understand VLAN-TAGGING, Trailer mode, or Header mode. * *******************************************************************************/ GT_STATUS sample802_1qSetup(GT_QD_DEV *dev) { GT_STATUS status; GT_DOT1Q_MODE mode; GT_VTU_ENTRY vtuEntry; GT_U16 vid; GT_LPORT port; int i; /* * 1) Clear VLAN ID Table */ if((status = gvtuFlush(dev)) != GT_OK) { MSG_PRINT(("gvtuFlush returned fail.\n")); return status; } /* * 2) Enable 802.1Q for each port as GT_SECURE mode except CPU port. */ mode = GT_SECURE; for(i=0; i<dev->numOfPorts; i++) { port = i; if (port == dev->cpuPortNum) continue; if((status = gvlnSetPortVlanDot1qMode(dev,port, mode)) != GT_OK) { MSG_PRINT(("gvlnSetPortVlanDot1qMode return Failed\n")); return status; } } /* * 3) Enable 802.1Q for CPU port as GT_FALLBACK mode */ if((status = gvlnSetPortVlanDot1qMode(dev, dev->cpuPortNum, GT_FALLBACK)) != GT_OK) { MSG_PRINT(("gvlnSetPortVlanDot1qMode return Failed\n")); return status; } /* * 4) Add VLAN ID 1 with Port 0 and CPU Port as members of the Vlan. */ gtMemSet(&vtuEntry,0,sizeof(GT_VTU_ENTRY)); vtuEntry.DBNum = 0; vtuEntry.vid = 1; for(i=0; i<dev->numOfPorts; i++) { port = i; if((i==0) || (port == dev->cpuPortNum)) vtuEntry.vtuData.memberTagP[port] = MEMBER_EGRESS_UNTAGGED; else vtuEntry.vtuData.memberTagP[port] = NOT_A_MEMBER; } if((status = gvtuAddEntry(dev,&vtuEntry)) != GT_OK) { MSG_PRINT(("gvtuAddEntry returned fail.\n")); return status; } /* * 5) Add VLAN ID 2 with the rest of the Ports and CPU Port as members of * the Vlan. */ gtMemSet(&vtuEntry,0,sizeof(GT_VTU_ENTRY)); vtuEntry.DBNum = 0; vtuEntry.vid = 2; for(i=0; i<dev->numOfPorts; i++) { port = i; if(i == 0) vtuEntry.vtuData.memberTagP[port] = NOT_A_MEMBER; else vtuEntry.vtuData.memberTagP[port] = MEMBER_EGRESS_UNTAGGED; } if((status = gvtuAddEntry(dev,&vtuEntry)) != GT_OK) { MSG_PRINT(("gvtuAddEntry returned fail.\n")); return status; } /* * 6) Configure the default vid for each port. * Port 0 has PVID 1, CPU port has PVID 3, and the rest ports have PVID 2. */ for(i=0; i<dev->numOfPorts; i++) { port = i; if(i==0) vid = 1; else if(port == dev->cpuPortNum) vid = 3; else vid = 2; if((status = gvlnSetPortVid(dev,port,vid)) != GT_OK) { MSG_PRINT(("gvlnSetPortVid returned fail.\n")); return status; } } return GT_OK; }