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

📄 myfirewall.c

📁 基于FPGA的防火墙系统设计.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
  	
  	MYFIREWALL_Read_Hint();
  	CMD_Signal = Addr_Read_In_8bit();
  	
  	switch(CMD_Signal)
  	{
  		case 1: {Read_Value = MYFIREWALL_Read_Reg(BaseAddress, SHORT_PKT_SIZE);
  			         xil_printf("The SHORT_PKT_SIZE is %d\r\n", Read_Value);
  			         }break;
  			         
  		case 2: {Read_Value = MYFIREWALL_Read_Reg(BaseAddress, LONG_PKT_SIZE);
  			         xil_printf("The LONG_PKT_SIZE is %d\r\n", Read_Value);
  			         }break;
  			         
  		case 3: {Read_Value = MYFIREWALL_Read_Reg(BaseAddress, SHORT_PKT_CNT);
  			         xil_printf("The SHORT_PKT_CNT is %d\r\n", Read_Value);
  			         }break;
  			         
  		case 4: {Read_Value = MYFIREWALL_Read_Reg(BaseAddress, LONG_PKT_CNT);
  			         xil_printf("The LONG_PKT_CNT is %d\r\n", Read_Value);
  			         }break;
  			         
  		case 5: {xil_printf("Please input the cam address to be read(0-255):\r\n");
  			         CAM_Address = Addr_Read_In_8bit();
  			         CAM_Data = MYFIREWALL_Read_CAM(BaseAddress, CAM_Address);
  			         xil_printf("The CAM content is %d\r\n", CAM_Data);
  			         }break;
  			         
  		case 6: {Read_Value = MYFIREWALL_Read_Reg(BaseAddress, RESULT_TABLE_CONTROL);
  			         xil_printf("The RESULT_TABLE_CONTROL is %d\r\n", Read_Value);
  			         }break;
  			         
  		case 7: {Read_Value = MYFIREWALL_Read_Reg(BaseAddress, MAC_MASK_CONTROL);
  			         xil_printf("The MAC_MASK_CONTROL is %d\r\n", Read_Value);
  			         }break;
  			         
  		case 8: {Read_Value = MYFIREWALL_Read_Reg(BaseAddress, SAMPLE_DATA);
  			         xil_printf("The SAMPLE_DATA is %d\r\n", Read_Value);
  			         }break;
  			         
  		case 9: {xil_printf("This can not be read\r\n");
  			         }break;
  			         
  		case 10: {xil_printf("This can not be read\r\n");
  			         }break;
  			         
  		case 11: {xil_printf("This can not be read\r\n");
  			         }break;
  			         
  		case 12: {Start_Time = MYFIREWALL_Read_Start_Time(BaseAddress);
  			         xil_printf("The START_TIME is %d\r\n", Start_Time);
  			         }break;
  			         
  		case 13: {Byte_Cnt = MYFIREWALL_Read_Byte_Counter(BaseAddress);
  			  			 xil_printf("The Byte_Cnt is %d\r\n", (Byte_Cnt & 0x07FFFFFF));
  			         }break;
  			         
  		case 14: {Pkt_Cnt =  MYFIREWALL_Read_Pkt_Counter(BaseAddress);
  			  			 xil_printf("The Pkt_Cnt is %d\r\n", (Pkt_Cnt & 0x001FFFFF));
  			  			 }break;
  			  			 
  		case 15: {Current_Time = MYFIREWALL_Read_Current_Time(BaseAddress);
  			  			 xil_printf("The Current_Time is %d\r\n", Current_Time);
  			  			 }break;
  		case 16: {MYFIREWALL_Read_MAC_Addr(BaseAddress, &MAC_Addr0, &MAC_Addr1, &MAC_Addr2, &MAC_Addr3, &MAC_Addr4, &MAC_Addr5);
  			         xil_printf("The MAC address is: %d.%d.%d.%d.%d.%d\r\n",  MAC_Addr0, MAC_Addr1, MAC_Addr2, MAC_Addr3,  MAC_Addr4,  MAC_Addr5);  			
  		
  			}break;
  		default: xil_printf("Wrong Input!\r\n");
  			       break;
  		
  		}  	
  	
  	}
  	
  	
void MYFIREWALL_Write_Operation(Xuint32 BaseAddress)
  {
  	Xuint8  CMD_Signal;
  	
  	Xuint16 Write_Value;
  	
  	Xuint8  CAM_Address, Filter_Select;
    Xuint32 CAM_Data;
    

    Xuint32 Start_Time;
    Xuint32 Current_Time;
    
    Xuint32 Byte_Cnt;
    Xuint32 Pkt_Cnt;
    
    Xuint8  MAC_Addr0;
    Xuint8  MAC_Addr1;
    Xuint8  MAC_Addr2;
    Xuint8  MAC_Addr3;
    Xuint8  MAC_Addr4;
    Xuint8  MAC_Addr5;
  	
  	MYFIREWALL_Write_Hint();
  	
  	CMD_Signal = Addr_Read_In_8bit();
  	
  	switch(CMD_Signal)
  	{
  		case 1: {xil_printf("Input the SHORT_PKT_SIZE value:\r\n");
  			         Write_Value = Value_Read_In_16bit();
						xil_printf("WRITE_VALUE:%d\r\n",Write_Value);
						MYFIREWALL_Write_Reg(BaseAddress, SHORT_PKT_SIZE, Write_Value);
						
                 xil_printf("The operation is done!\r\n");
  			         }break;
  			         
  		case 2: {xil_printf("Input the LONG_PKT_SIZE value:\r\n");
  			         Write_Value = Value_Read_In_16bit();
                 MYFIREWALL_Write_Reg(BaseAddress, LONG_PKT_SIZE, Write_Value);
                 xil_printf("The operation is done!\r\n");
  			         }break;
  			  			         
  		case 3: {xil_printf("This register can not be written!\r\n");
  			         }break;
  			         
  		case 4: {xil_printf("This register can not be written!\r\n");
  			         }break;
 
  			         
  		case 5: {xil_printf("Please input the cam address to be read(0-255):\r\n");
  			         CAM_Address = Addr_Read_In_8bit();
  			         xil_printf("Please select the input IP:\r\n");
  			         xil_printf("press 1 : dport\r\n");
  			         xil_printf("      2 : sport\r\n");
                 xil_printf("      3 : dport & sport\r\n");
  			         xil_printf("      4 : dip\r\n");
  			         xil_printf("      8 : sip\r\n");
  			         Filter_Select = Addr_Read_In_8bit();
  			         xil_printf("Please input the CAM Data:\r\n");
  			         CAM_Data = IP_Port_Read_In_32bit();
  			         MYFIREWALL_Write_CAM(BaseAddress, CAM_Data, Filter_Select, CAM_Address);
  			         xil_printf("The operation is done!\r\n");
  			         }break;
  			         
  		case 6: {xil_printf("Input the RESULT_TABLE_CONTROL value:\r\n");
  			         Write_Value = Value_Read_In_16bit();
                 MYFIREWALL_Write_Reg(BaseAddress, RESULT_TABLE_CONTROL, Write_Value);
                 xil_printf("The operation is done!\r\n");
  			         }break;
  			         
  		case 7: {xil_printf("Input the MAC_MASK_CONTROL value:\r\n");
  			         Write_Value = Value_Read_In_16bit();
                 MYFIREWALL_Write_Reg(BaseAddress, MAC_MASK_CONTROL, Write_Value);
                 xil_printf("The operation is done!\r\n");
  			         }break;
  			         
  		case 8: {xil_printf("Input the SAMPLE_DATA value:\r\n");
  			         Write_Value = Value_Read_In_16bit();
                 MYFIREWALL_Write_Reg(BaseAddress, SAMPLE_DATA, Write_Value);
                 xil_printf("The operation is done!\r\n");
  			         }break;
  			         
  		case 9: {xil_printf("Input the SD_SLECT value:\r\n");
  			         Write_Value = Value_Read_In_16bit();
                 MYFIREWALL_Write_Reg(BaseAddress, SD_SLECT, Write_Value);
                 xil_printf("The operation is done!\r\n");
  			         }break;
  			         
  		case 10: {xil_printf("Input the INIT_START value:\r\n");
  			         Write_Value = Value_Read_In_16bit();
                 MYFIREWALL_Write_Reg(BaseAddress, INIT_START, Write_Value);
                 xil_printf("The operation is done!\r\n");
  			         }break;
  			         
  		case 11: {xil_printf("Input the PPC_READ_ADDR value:\r\n");
  			         Write_Value = Value_Read_In_16bit();
                 MYFIREWALL_Write_Reg(BaseAddress, PPC_READ_ADDR, Write_Value);
                 xil_printf("The operation is done!\r\n");
  			         }break;
  			         
  		case 12: {xil_printf("This register can not be written!\r\n");
  			         }break;
  			         
  		case 13: {xil_printf("This register can not be written!\r\n");
  			         }break;
  			         
  		case 14: {xil_printf("This register can not be written!\r\n");
  			  			 }break;
  			  			 
  		case 15: {xil_printf("This register can not be written!\r\n");
  			  			 }break;
  			  			 
  		case 16: {xil_printf("Input the MAC address:\r\n");
  			         (MAC_Addr0) = Addr_Read_In_8bit();
  			         (MAC_Addr1) = Addr_Read_In_8bit();
  			         (MAC_Addr2) = Addr_Read_In_8bit();
  			         (MAC_Addr3) = Addr_Read_In_8bit();
  			         (MAC_Addr4) = Addr_Read_In_8bit();
  			         (MAC_Addr5) = Addr_Read_In_8bit();
  			         MYFIREWALL_Write_MAC_Addr(BaseAddress, MAC_Addr0, MAC_Addr1, MAC_Addr2, MAC_Addr3, MAC_Addr4, MAC_Addr5);
  			         xil_printf("The operation is done!\r\n");
  			}break;
  		default: xil_printf("Wrong Input!\r\n");
  			       break;
  		
  		}  	
  	
  	}  	
  	
Xuint16 MYFIREWALL_Search_Filter_Rule()
{
	Xuint16 Mode_Select;
	Xuint32 Data;
	
	Xuint16  address;
	Xuint8  Search_Flag;
	
	xil_printf("please input the Filter_Mode\r\n");
	xil_printf("press 1 : dport\r\n");
  xil_printf("      2 : sport\r\n");
  xil_printf("      3 : dport & sport\r\n");
  xil_printf("      4 : dip\r\n");
  xil_printf("      8 : sip\r\n");
  Mode_Select = Addr_Read_In_8bit();
  Mode_Select = (Mode_Select & 0x000F);  
  
  xil_printf("please input the Filter_Data");
  Data = IP_Port_Read_In_32bit();
  
  switch(Mode_Select)
  {
  	case 1: Data = (Data & 0x0000FFFF); break;
  	case 2: Data = (Data & 0xFFFF0000); break;
  	case 3: 
  	case 4:
  	case 8: break;
  	default: xil_printf("Wrong input!"); break;  //需加入错误情况处理
  	}
  
  Search_Flag = 0;
  
  for(address = 0; address <= 255; address++)
  {
  	if((Filter_Table[address].Filter_Data == Data) && (Filter_Table[address].Filter_Mode_Select == Mode_Select)) 
  	{Search_Flag = 1; 
  	 break;
  		}
  }
  
  if(Search_Flag == 1) 
  	{
  		xil_printf("This rule exists in the rule table, the address is %d", address);
  		
  		if((Filter_Table[address].Handle_Manner & 0x1000) == 0x1000)
  		xil_printf("The handle manner is to drop the packets");
  		else if((Filter_Table[address].Handle_Manner & 0x0800) == 0x0800)
  		xil_printf("The handle manner is to drop part of packets");
  		else xil_printf("The handle manner is to pass the packets");
  		return address;
  		}
  else
  	{
  		xil_printf("This rule is not in the rule table");
  		return 256;
  		}
  
	}
	
	
void MYFIREWALL_Add_Change_Filter_Rule(Xuint32 BaseAddress)
{
	Xuint16 Mode_Select;
	Xuint16 H_Manner;
	Xuint32 Data;
	
	
	Xuint16  address;
	Xuint8  Search_Flag;
	Xuint8  Empty_Flag;
	
	Xuint8 H_M_Select;
	
	xil_printf("please input the Filter_Mode\r\n");
	xil_printf("press 1 : dport\r\n");
  xil_printf("      2 : sport\r\n");
  xil_printf("      3 : dport & sport\r\n");
  xil_printf("      4 : dip\r\n");
  xil_printf("      8 : sip\r\n");
  Mode_Select = Addr_Read_In_8bit();
  Mode_Select = (Mode_Select & 0x000F); 
  
  xil_printf("please input the Filter_Data");
  Data = IP_Port_Read_In_32bit();
  
  xil_printf("please input the handle manner\r\n");
  xil_printf("0 for pass\r\n");
  xil_printf("1 for drop all the packets\r\n");
  xil_printf("2 for drop some of the packets\r\n");
  H_M_Select = Addr_Read_In_8bit();
  
  switch(Mode_Select)
  {
  	case 1: Data = (Data & 0x0000FFFF); break;
  	case 2: Data = (Data & 0xFFFF0000); break;
  	case 3: 
  	case 4:
  	case 8: break;
  	default: xil_printf("Wrong input!"); break;  //需加入错误情况处
  	}
  	
  	switch(H_M_Select)
  	{
  		case 0: H_Manner = 0x0080; break;
  		case 1: H_Manner = 0x0090; break;
  		case 2: H_Manner = 0x0088; break;
  		default: xil_printf("Wrong input!"); break; //需加入错误情况处理
  		}
  
  Search_Flag = 0;
  
  for(address = 0; address <= 255; address++)
  {
  	if(((Filter_Table[address].Filter_Data) == Data) && (Filter_Table[address].Filter_Mode_Select == Mode_Select)) 
  	{Search_Flag = 1; 
  	 break;
  		}
  }
  
  if(Search_Flag == 1) //change a rule
  	{
  		(Filter_Table[address].Handle_Manner) == (H_Manner << 8) + address;
  		MYFIREWALL_Write_Reg(BaseAddress, RESULT_TABLE_CONTROL, (Filter_Table[address].Handle_Manner));
  		}
  else //add a rule
  	{   Empty_Flag = 0;
  		  
  		  for(address = 0; address <= 255; address++)
			  {
			  	if((Filter_Table[address].Filter_Data) == 0x00000000) 
			  	{Empty_Flag = 1; 
			  	 break;
			  		}
			  }
			if(Empty_Flag == 1)
				{
					(Filter_Table[address].Filter_Data) = Data;
					(Filter_Table[address].Filter_Mode_Select) = Mode_Select;
					(Filter_Table[address].Handle_Manner) = (H_Manner << 8) + address;
					
					MYFIREWALL_Write_Reg(BaseAddress, MAC_MASK_CONTROL, (Filter_Table[address].Filter_Mode_Select));
					MYFIREWALL_Write_Reg(BaseAddress, RESULT_TABLE_CONTROL, (Filter_Table[address].Handle_Manner));
          MYFIREWALL_Write_CAM(BaseAddress, (Filter_Table[address].Filter_Data), (Filter_Table[address].Filter_Mode_Select), address);
					
					}
			else 
				{
					xil_printf("The CAM is full of rules, please delete some rules first and add the rule again\r\n");
				}
  		}
	}
	
void MYFIREWALL_Delete_Rule(Xuint32 BaseAddress)
{
	Xuint8 address;
	
	xil_printf("Please input the CAM address where the rule would be deleted");
	address = Addr_Read_In_8bit();

	MYFIREWALL_Write_CAM(BaseAddress, 0x00000000, 0x0000, address);
	}
	
void MYFIREWALL_Flow_Statistic(Xuint32 BaseAddress)
{
	Xuint8  Byte_Pkt;
	Xuint16 CAM_Adress, SD_Select;
	Xuint32 Byte_Pkt_Cnt;
	Xuint32 Counter;
	Xuint32 Start_Time, Current_Time;
	
	
	//
	xil_printf("select what to be selected:\r\n");
	xil_printf("input 1 to select SIP\r\n");
	xil_printf("      2           DIP\r\n");
	xil_printf("      4           SP\r\n");
	xil_printf("      8           DP\r\n");
	
	SD_Select = Addr_Read_In_8bit();
	MYFIREWALL_Write_Reg(BaseAddress, SD_SLECT, SD_Select);
	
	//
	xil_printf("Input the address to do the statistic according to\r\n");
	
	CAM_Adress = Addr_Read_In_8bit();
	MYFIREWALL_Write_Reg(BaseAddress, PPC_READ_ADDR, CAM_Adress);
	
	//
	xil_printf("Input 0 to do the statistic according to the byte flow\r\n");
	xil_printf("Input 1 to do the statistic according to the packet flow\r\n");
	Byte_Pkt = Addr_Read_In_8bit();
	
	if(Byte_Pkt == 0)
		{
			Byte_Pkt_Cnt = MYFIREWALL_Read_Byte_Counter(BaseAddress);
			
			for(Counter = 0; Counter < ST_TIME; Counter++);
			
			Start_Time = MYFIREWALL_Read_Start_Time(BaseAddress);
			Current_Time = MYFIREWALL_Read_Current_Time(BaseAddress);
			Byte_Pkt_Cnt = MYFIREWALL_Read_Byte_Counter(BaseAddress);
			
			xil_printf("The flow this time is %d bytes per second", ((1000 * Byte_Pkt_Cnt) / ((Current_Time - Start_Time)*42)));
			
			}
	else if(Byte_Pkt == 1)
		{
			Byte_Pkt_Cnt = MYFIREWALL_Read_Pkt_Counter(BaseAddress);
			
			for(Counter = 0; Counter < ST_TIME; Counter++);
			
			Start_Time = MYFIREWALL_Read_Start_Time(BaseAddress);
			Current_Time = MYFIREWALL_Read_Current_Time(BaseAddress);
			Byte_Pkt_Cnt = MYFIREWALL_Read_Pkt_Counter(BaseAddress);
			
			xil_printf("The flow this time is %d packets per second", ((1000 * Byte_Pkt_Cnt) / ((Current_Time - Start_Time)*42)));
			
			
			
			}
	else xil_printf("wrong input");
	
	}
	
	
	

⌨️ 快捷键说明

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