📄 ge_arp.c
字号:
/**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-
* GE_arp.c - Ethernet 1000M code. .
*
* Copyright 2001-12 by GDT, Inc
*
* modification history
* --------------------
* 2001-12-14,yxy created.
*
*/
#include <stdio.h>
#include <msgQlib.h>
#include <semLib.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <tickLib.h>
#include <sysLib.h>
#include <taskLib.h>
#include "GE_Arp.h"
#include "GE_CAM.h"
#include "GE_EventStatistic.h"
#include "GE_Global.h"
#include "GE_GlobalP.h"
#include "global.h"
#include "SBSL_MemManage.h"
#include "SBSL_Monitor.h"
#include "SBSL_Timer.h"
#include "GE_Utility.h"
#include "bdcom_860.h"
unsigned short ARP_INTERVAL=30;
unsigned int addrCount;
int GE_ARP_TIMER_ID;
ARP_INFO arpInfo[2];
MSG_Q_ID GE_ArpMsgQId;
SEM_ID GE_ArpSemId;
HASHVALUE hashValue[256];
#define static_table_sums 3
static ULONG static_next_ip[static_table_sums] = { 0xe0000002,
0xe0000005,
0xe0000006 };
static unsigned char static_mac[static_table_sums*6] = { 0x01,0x00,0x5e,0x00,0x00,0x02,
0x01,0x00,0x5e,0x00,0x00,0x05,
0x01,0x00,0x5e,0x00,0x00,0x06 };
unsigned int GE_ARP_DEBUG = 0;
/*******************************************************************************************
*
* ARPinit: initlize the ARP
*/
STATUS GE_ArpInit(void)
{
unsigned int i,j;
if (SBSL_TaskFlagGet(GE_ARP_TASK_CODE)!= SBSL_TASK_UNREGISTER)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ArpInit: GE_ArpInit task has REGISTER!\n");
return ERROR;
}
cam_init();
for (i = 0;i < 256;i++)
{
(IP_MAC_BAND* )hashValue[i].ArpList[0].next=NULL;
(IP_MAC_BAND* )hashValue[i].ArpList[1].next=NULL;
}
for (j = 0; j < 2; j++)
{
arpInfo[j].requestIn = 0;
arpInfo[j].requestOut = 0;
arpInfo[j].replyIn = 0;
arpInfo[j].replyOut = 0;
arpInfo[j].err = 0;
GE_GetPortMac (arpInfo[j].selfPhyAddress,j);
arpInfo[j].selfIpAddress=netIf[j].ipAddr;
}
addrCount=0;
if ((GE_ArpMsgQId = msgQCreate(100,sizeof(TASK_MSG),MSG_Q_PRIORITY )) == NULL)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ArpInit:Creating GE_ArpMsg failed!\n");
return ERROR;
}
if((GE_ArpSemId=semBCreate(SEM_Q_FIFO,SEM_FULL))==NULL)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ArpInit:creat semid failed!\n");
return ERROR;
}
if( SBSL_TaskRegister( GE_ARP_TASK_CODE,
GE_ArpMsgQId,
GE_ArpReinit,
GE_ArpDel)==ERROR )
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ArpInit:tARP task register failed!\n");
return ERROR;
}
GE_ARP_TIMER_ID = SBSL_TimerRequest ( GE_ARP_TASK_CODE,
GE_ArpMsgQId,
ARP_INTERVAL);
if( GE_ARP_TIMER_ID == -1)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ArpInit:Timer request failed!\n");
return ERROR;
}
if(taskSpawn ( TASK_NAME[GE_ARP_TASK_CODE],
GE_ARP_TASK_PRI ,
0,
10000,
(FUNCPTR)GE_Arp,
0,0,0,0,0,0,0,0,0,0)==ERROR)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ArpInit:Creating GE_Arp task failed!\n");
return ERROR;
}
if(GE_ARP_DEBUG)
GE_printf(GE_EVENT,"GE_ArpInit:the arpTask init succeed!\n");
return OK;
}
/********************************************************************************************
* ARP_DEL: Delete the ARP task
*/
STATUS GE_ArpDel (void)
{
if (SBSL_TaskFlagGet(GE_ARP_TASK_CODE)!=SBSL_TASK_STARTED)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM," GE_ArpDel:GE_ArpInit task has not started!\n");
return ERROR;
}
if(taskDelete (SBSL_TaskIdGet(GE_ARP_TASK_CODE))==ERROR )
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM," GE_ArpDel:Delete arpTask failed!");
return ERROR;
}
SBSL_TimerDelete(GE_ARP_TIMER_ID);
if (SBSL_TaskStop(GE_ARP_TASK_CODE) == ERROR)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ArpDel:ALARM!\n");
return ERROR;
}
if(GE_ARP_DEBUG)
GE_printf(GE_EVENT,"GE_ArpDel:Delete task arpTask success!\n");
return OK;
}
/********************************************************************************************
* ARP_reinit: reinit the ARP task
*/
STATUS GE_ArpReinit (void)
{
int i;
if (SBSL_TaskFlagGet(GE_ARP_TASK_CODE)==SBSL_TASK_STARTED)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ArpReinit: task has been started!\n");
return ERROR;
}
GE_ARP_TIMER_ID = SBSL_TimerRequest ( GE_ARP_TASK_CODE,
SBSL_TaskMsgIdGet(GE_ARP_TASK_CODE),
ARP_INTERVAL);
if( GE_ARP_TIMER_ID == -1)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ArpReinit:Timer request failed!\n");
return ERROR;
}
if (taskSpawn ( TASK_NAME[GE_ARP_TASK_CODE],
GE_ARP_TASK_PRI ,
0,
10000,
(FUNCPTR)GE_Arp,
0,0,0,0,0,0,0,0,0,0)== ERROR)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ArpReinit:Creating task failed!\n");
return ERROR;
}
if(GE_ARP_DEBUG)
GE_printf(GE_EVENT,"GE_ArpReinit:Recreating task success!\n");
return OK;
}
/********************************************************************************************
* ARP_implement function
*/
STATUS GE_Arp()
{
TASK_MSG arpMsg;
ULONG ARP_DELAY_COUNT=0;
ULONG ARP_TIME_COUNT=0;
while(BOARD_STATE != BOARD_STATE_NORMAL)
{
taskDelay(30);
}
SBSL_TaskStart(GE_ARP_TASK_CODE,taskIdSelf());
SBSL_TimerStart (GE_ARP_TIMER_ID);
if(GE_ARP_DEBUG)
GE_printf(GE_EVENT,"GE_Arp: Task is running...\n");
while(1)
{
if( ++ARP_DELAY_COUNT == 10)
{
taskDelay(1);
ARP_DELAY_COUNT=0;
}
if(SBSL_TaskMsgIdGet(GE_ARP_TASK_CODE)==NULL)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_Arp:GE_ArpMsgQId==NULL!\n");
return ERROR;
}
while(msgQNumMsgs(GE_ArpMsgQId)>0)
{
if (msgQReceive(GE_ArpMsgQId,
(char *) &arpMsg,
sizeof(TASK_MSG),
NO_WAIT) == ERROR)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_Arp: cannot receive any message !\n" );
break;
}
switch (arpMsg.type)
{
case MONITOR_MSG:
if(GE_ARP_DEBUG)
GE_printf(GE_EVENT,"GE_Arp:receive MONITOR_MSG from tMonitor.\n");
arpMsg.taskCode = GE_ARP_TASK_CODE;
arpMsg.type = MONITOR_MSG_ACK;
arpMsg.length = 0;
memset(arpMsg.msgBuf, 0, 128);
if (msgQSend( SBSL_TaskMsgIdGet(MONITOR_TASK_CODE),
(char *) &arpMsg,
140,
NO_WAIT,
MSG_PRI_URGENT) == ERROR)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_Arp:send MONITOR_MSG_ACK to tMonitor failed!");
break;
}
else
{
if(GE_ARP_DEBUG)
GE_printf(GE_EVENT,"GE_Arp:send MONITOR_MSG_ACK to tMonitor succeed!\n");
}
break;
case TIMER_OVERFLOW_MSG:
if(arpMsg.msgBuf[0]!=GE_ARP_TIMER_ID)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_Arp:TIMER_OVERFLOW_MSG is not belong to tArp!\n");
break;
}
if(GE_ARP_DEBUG)
GE_printf(GE_EVENT,"GE_Arp:receive TIMER_OVERFLOW_MSG from tTimer.\n");
if (SBSL_TimerMsgAck( GE_ARP_TIMER_ID) == ERROR)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_Arp:send TIMER_OVEEFLOW_MSG_ACK to tTIMER failed!\n");
}
else
{
if(GE_ARP_DEBUG)
GE_printf(GE_EVENT,"GE_Arp:send TIMER_OVEEFLOW_MSG_ACK to tTIMER succeed!\n");
}
SBSL_TimerStart (GE_ARP_TIMER_ID);
if(GE_ArpTimer()==ERROR)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_Arp:GE_ArpTime deal failed!\n");
break;
}
break;
case SYS_ARP_ENTRY_REQUEST:
if(GE_ARP_DEBUG)
GE_printf(GE_EVENT,"GE_Arp:tARP receive SYS_ARP_ENTRY_REQUEST from BDCOM.\n");
if( GE_Arp_entry_index((char*)&arpMsg)==OK)
{
if(GE_ARP_DEBUG)
GE_printf(GE_EVENT,"GE_Arp:GE_Arp_entry_index succeed!\n");
break;
}
else
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_Arp:GE_Arp_entry_index failed!\n");
break;
}
break;
default:
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_Arp:receice type:%d:,Invalid!\n",arpMsg.type);
break;
}
}
GE_ReadOutfpgaReqfifo();
}
return OK;
}
/***************************************************************************************
* cpu read data from request fifo in OUTFPGA.the bit flag 26 is readable or unreadable .
*
* flag 26 0: no data,unreadable.
* flag 26 1: have data in it,readable.
*
*/
STATUS GE_ReadOutfpgaReqfifo()
{
ULONG OutBuf[10];
ULONG nextIp;
ULONG flag;
ULONG bufLen;
unsigned int i,j;
unsigned char unit;
char errorTimes=0;
IP_MAC_BAND* pEntry;
for(i=0;i<10;i++)
{
taskLock();
flag =*(ULONG*)0x13020014; /*flag 26*/
taskUnlock();
if((flag&0x0000020)==0x00000020)
break;
}
if(i==10)
return ERROR;
for(j=0;j<10;j++)
{
OutBuf[j]=outfpgaRead(0x2E);
if (OutBuf[j]==0xE25C4B89)
break;
}
if(OutBuf[j]==0xE25C4B89)
{
OutBuf[0]=0xE25C4B89;
for(i=1;i<10;i++)
{
OutBuf[i] = outfpgaRead(0x2E);
if (OutBuf[i]==0x1DA3B476)
{
break;
}
}
if(i>9)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ReadOutfpgaReqfifo:Received packet is too long!\n");
return ERROR;
}
}
else
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ReadOutfpgaReqfifo:NOT received pkt head!\n");
return ERROR;
}
bufLen=(4*i-8);
nextIp=OutBuf[2];
unit=(unsigned char) ((OutBuf[1]&0x0F000000)>>24);
pEntry=(IP_MAC_BAND*)GE_Arp_entry_lookup(unit, nextIp);
if(pEntry==NULL)
{
if(GE_Arp_request_packet_generation (unit,nextIp)==ERROR)
{
if(GE_ARP_DEBUG)
GE_printf(GE_ALARM,"GE_ReadOutfpgaReqfifo:Generation a arp packet failed!\n");
return ERROR;
}
}
else
{
if(semTake(GE_ArpSemId,WAIT_FOREVER)==ERROR)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -