📄 myfirewall.c
字号:
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 + -