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

📄 vp_filter.c

📁 开发Inetl IXP2400平台所必须的硬件诊断和测试程序。该软件包支持的功能包括CPU基本功能检测
💻 C
📖 第 1 页 / 共 3 页
字号:
					}
				}

	
				  loop_count++;

				if (forever && KEYPRESS)
				{
					break;
				}
			}
			while ((loop_count != loop) || forever);
			
			if (loop == 0)
			{
				counter = loop_count;
			}
			else
			{
				counter = loop;
			}

		    switch(test_param)
			{
			case 'l': 
			case 'p':
			case '3':
						expected_num_pkts = counter*6;
						break;
			case '2':
						expected_num_pkts = counter*9;
						break;
			}
			MSG("\nexpected_num_pkts = %d\n",expected_num_pkts,0,0);

			switch(ports)
			{
		       case 0:
		       case 1:
		       case 2:
		       case 3:  if (!cflag) 
						{ 
							if ((pass_port[ports] != expected_num_pkts) || (pass_port[ports] == 0))
							{
								eprintf("\nDid not Receive expected number of packets on port %d\n", ports);
								eprintf("Packets Received = %d\n",pass_port[ports]);
								flag = ERROR;
								rxflag[ports] = ERROR;
							}
							else
							{
								eprintf("\nReceived on Port %d : %d\n",ports,pass_port[ports]);
								flag = OK;
							}
						}
						else
						{
							if ((pass_port[rxport[ports]] != expected_num_pkts) || (pass_port[rxport[ports]] == 0))
							{
								eprintf("\nDid not Receive expected number of packets on port %d\n", rxport[ports]);
								eprintf("Packets Received on port %d = %d\n",rxport[ports],pass_port[rxport[ports]]);
								flag = ERROR;
								rxflag[ports] = ERROR;
							}
							else
							{
								eprintf("\nReceived on Port %d : %d\n",rxport[ports],pass_port[rxport[ports]]);
								flag = OK;
							}
						}
						break;

		       case 4:  eprintf("\n");
						if (!cflag)
						{
							for (ctr=0; ctr<4; ctr++)
							{
								if ((pass_port[ctr] != expected_num_pkts) || (pass_port[ports] == 0))
								{
									eprintf("\nDid not Receive expected number of packets on port %d\n", ctr);
									eprintf("Packets Received = %d\n",pass_port[ctr]);
									rxflag[ctr] = ERROR;
									flag = ERROR;
								}
								if (pass_port[ctr] == expected_num_pkts)
								{
									eprintf("Received %d packets on Port %d\n",pass_port[ctr],ctr);
								}
							}
						}
						else
						{
							for (ctr=0; ctr<2; ctr++)
							{
								if ((pass_port[ctr*2+1] != expected_num_pkts) || (pass_port[ports] == 0))
								{
									eprintf("\nDid not Receive expected number of packets on port %d\n", ctr*2+1);
									eprintf("Packets Received = %d\n",pass_port[ctr*2+1]);
									rxflag[ctr*2+1] = ERROR;
									flag = ERROR;
								}
								if (pass_port[ctr*2+1] == expected_num_pkts)
								{
									eprintf("Received %d packets on Port %d\n",pass_port[ctr*2+1],ctr*2+1);
								}
							}
						}
						
						break;
						
			   default:   eprintf("This is bad value for port number \n");
								break;
			}

		}
		eprintf("\n");

		if(dcache_status != 0)	// if dcache was originally ON
		{
			dcache_on();
		}

		if (loop == 0)
			loop = loop_count;

		test_passed = verify_vpse_filter(cflag);
	
		if (test_passed)
		{
			switch(test_param)
			{
			case 'l':
				eprintf("\nVLAN filtering test...PASSED\n");
				break;
			case 'p':
				eprintf("\nPAUSE filtering test...PASSED\n");
			case '2':
				eprintf("\nRMON test for the following Registers ...PASSED\n");
				eprintf("Rx Tagged / Tx Tagged\n");
				break;
			case '3':
				eprintf("\nRMON test for the following Registers ...PASSED\n");
				eprintf("Rx PauseMacControlReceivedCounter / TxPauseFrames\n");
				break;

			default:
				eprintf("Invalid parameters. \n");
				return INVALID_PARAMETERS;
			}

			Set_LED("MAFP");
			slowport_code[0] = SP_XSC;
			slowport_code[1] = SP_PASS;
			dump_slowport(slowport_code, 2, SP_NON_FATAL);
		} 
		else
		{
			if (mailbox_value == INIT_ERROR)
			{
				eprintf("The slave NPU did not succeed in loading the microcode to its microengines\n");
			}
			else if (mailbox_value == NOT_RECEIVED)
			{
				eprintf("There was no sign that the expected packet was received\n");
			}
			else if (mailbox_value == ERROR_PATTERN)
			{
				eprintf("mailbox = 0x%x\n",mailbox_value);
				eprintf("The packet received was not the same as the packet transmitted.\n");
			}
			else if (mailbox_value == INCORRECT_SIZE)
			{
				eprintf("mailbox = 0x%x\n",mailbox_value);
				eprintf("The packet received was not the same size as the packet transmitted.\n");
			}
			else if (mailbox_value == VLAN_FILTER_FAILED)
			{
				eprintf("mailbox = 0x%x\n",mailbox_value);
				eprintf("The Vlan packet was not filtered.\n");
			}
			else if (mailbox_value == PAUSE_FILTER_FAILED)
			{
				eprintf("mailbox = 0x%x\n",mailbox_value);
				eprintf("The Pause packet was not filtered.\n");
			}

			switch(test_param)
			{
			case 'l':
				strcpy(syslog.desc, "VLAN Filtering test FAILED!\n");
				eprintf("VLAN Filtering test FAILED!");
				break;
			case 'p':
				strcpy(syslog.desc, "PAUSE Filtering test FAILED!\n");
				eprintf("PAUSE Filtering test FAILED!");
			case '2':
				strcpy(syslog.desc, "Rx Tagged/Tx Tagged test FAILED!\n");
				eprintf("Rx Tagged/Tx Tagged statistics test FAILED!");
				break;
			case '3':
				strcpy(syslog.desc, "Pause statistics test FAILED!\n");
				eprintf("RMON: PAUSE statistics test FAILED!");
				break;
			}

			// prepare structure for dumping
			syslog.type = TYPE_ERROR;
			syslog.source_comp = MASTER_DIAG;	// Determine master/slave
		

			// write to syslog
			syslog_dump(&syslog, sizeof(SYSLOG_DATA));

			Set_LED("LswF");
			slowport_code[0] = SP_XSC;
			slowport_code[1] = SP_FAIL;
			dump_slowport(slowport_code, 2, SP_NON_FATAL);
			acL->Err = ERROR;
		}		

		Clear_All_ME();
	}
	else
	{
		eprintf("\nThis test cannot be run directly on the Slave console\n");
		return DONE;	// To indicate that the slave does not do this.
	}
	return DONE;
}

short verify_vpse_filter(UINT32 cflag)
{
	UINT32 rxVlanpkts[4],rxPausepkts[4],dropped[4];
	UINT32 txVlanpkts[4],txPausepkts[4];
	short test_passed = 1,iteration,port,port_ctr,res=0;
	
	if (ports == 4)
		if (!cflag)
			iteration = 4;
		else
			iteration = 2;
	else
		iteration = 1;

	spConfig();
    for(port=0; port<4;port++)
    {
		/* Reading the total packets received */
		rxVlanpkts[port] = reg_read(((port*PORTSZ)+VLAN_TAG));  
		rxPausepkts[port] = reg_read(((port*PORTSZ)+RX_PAUSE_MAC_CTL));  
		txVlanpkts[port] = reg_read(((port*PORTSZ)+TX_VLAN_TAG));  
		txPausepkts[port] = reg_read(((port*PORTSZ)+TX_PAUSE_FRAME));  
		dropped[port] = reg_read(port+PORT0_RXFIFO_PKT_DROP);  
	}
	spRestore();

	for(port_ctr=0; port_ctr<iteration;port_ctr++)
	{
		if ((!cflag) && (ports == 4))
			port = port_ctr;
		if ((cflag) && (ports == 4))
		{
			port = port_ctr*2;
			port = rxport[port];
		}
		if ((!cflag) && (ports != 4))
			port = ports;
		if ((cflag) && (ports != 4))
			port = rxport[ports];

		switch (test_param)
		{
		case 'l':
		
				eprintf("RX VLAN Tagged pkts = %d on port %d\n",rxVlanpkts[port],port);
				eprintf("Dropped VLAN pkts = %d on port %d\n",dropped[port],port);

				if ((VCount[port] != 0) || 
					(dropped[port] != (loop*EXP_DROPPED_PKTS)))
				{
					eprintf("VLAN filtering test ERROR , Port %d\n",port);
					test_passed = 0;
				}
				else 
					res|= 1<<port_ctr;

		break;

		case 'p':
				eprintf("\nRX Pause pkts = %d on port %d\n",rxPausepkts[port],port);
				eprintf("Dropped Pause pkts = %d on port %d\n",dropped[port],port);
	
				if ((PCount[port] != 0) || 
					(dropped[port] != (loop*EXP_DROPPED_PKTS)))
				{
					eprintf("Pause packet filtering test ERROR , Port %d\n",port);
					test_passed = 0;
				}
				else 
					res|= 1<<port_ctr;


				break;

		case '2':
				eprintf("\nRX VLAN Tagged pkts = %d on port %d\n",rxVlanpkts[port],port);
	
				if (rxVlanpkts[port] != (loop*VLAN_PKTS)) 
				{
					eprintf("%s    port=%d\n ", ERR_STR(RX_TAGGED_ERR),port);
					test_passed = 0;
				}
				if (cflag)
					port=rxport[port];

				eprintf("TX VLAN Tagged pkts = %d on port %d\n",txVlanpkts[port],port);

				if (txVlanpkts[port] != (loop*VLAN_PKTS)) 
				{
					eprintf("%s    port=%d\n ", ERR_STR(TX_TAGGED_ERR),port);
					test_passed = 0;
				}
				else 
					res|= 1<<port_ctr;


				break;
		case '3':
				eprintf("\nRX PAUSE pkts = %d on port %d\n",rxPausepkts[port],port);
	
				if (rxPausepkts[port] != (loop*PAUSE_PKTS)) 
				{
					eprintf("Bad value in PauseMacControlReceivedCounter register,  port=%d\n ",port);
					test_passed = 0;
				}
				if (cflag)
					port=rxport[port];

				eprintf("TX PAUSE pkts = %d on port %d\n",txPausepkts[port],port);

				if (txPausepkts[port] != (loop*PAUSE_PKTS)) 
				{
					eprintf("%s    port=%d\n ", ERR_STR(TX_PAUSEMACCONTROL_ERR),port);
					test_passed = 0;
				}
				else 
					res|= 1<<port_ctr;


				break;


		default: 
				eprintf("Illegal Test parameter\n");
				test_passed = 0;
				break;
		}

	}

	if ((res == 0xF) && (ports == 0x4) && (!cflag))
		test_passed = 1;
	else
		if ((res == 0x3) && (ports == 0x4) && cflag)
			test_passed = 1;
		else
			if ((res == 0x1) && (ports != 0x4))
				test_passed = 1;
			else
				test_passed = 0;

	return test_passed;
}


void get_packets_for_vpse_filter_test()
{
	if ((test_param == 'l') || (test_param == '2'))//vlan
	{
		pl_sys_lb_data64_0 = vlan64_0;
	}
	else if ((test_param == 'p') || (test_param == '3')) //pause
	{
		pl_sys_lb_data64_0 = pause64_0;
	}

	pl_sys_lb_data64_1 = pl_sys_lb_data64_0;
	pl_sys_lb_data64_2 = pl_sys_lb_data64_0;
	pl_sys_lb_data64_3 = pl_sys_lb_data64_0;

	pl_sys_lb_data96_0 = data96_0;
	pl_sys_lb_data96_1 = data96_1;
	pl_sys_lb_data96_2 = data96_2;
	pl_sys_lb_data96_3 = data96_3;

	pl_sys_lb_data138_0 = data138_0;
	pl_sys_lb_data138_1 = data138_1;
	pl_sys_lb_data138_2 = data138_2;
	pl_sys_lb_data138_3 = data138_3;

}


void get_vpse_error(UINT32 pkt_size, UINT32 exp_pkt_sz, UINT32 *mailbox_value)
{
	switch (test_param)
	{
	case 'l':
			if ((pkt_size == 0x3C) && (exp_pkt_sz == 0x84))
				*mailbox_value = VLAN_FILTER_FAILED;
			break;
	case 'p':
			if ((pkt_size == 0x3C) && (exp_pkt_sz == 0x84))
				*mailbox_value = PAUSE_FILTER_FAILED;
			break;
	}
}





⌨️ 快捷键说明

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