?? tcpip.c
字號:
#define TCPIP_GLOBALS
#include "tcpip.h"
#undef TCPIP_GLOBALS
#include "ether_dev.h"
#include "AT91R40008.h"
#include "lib_AT91R40008.h"
#include <string.h>
#include "Router.h"
static OS_STK TcpIpStack[STACK_SIZE_TCPIP];
static void* gTcpIpMsgQTbl[MSG_AMOUNT_TCPIP];
static void TcpIpInput(void *pdata);
extern void irq1_asm_irq_handler(void);
extern void irq2_asm_irq_handler(void);
uint8 idx;
void InitNI(void) {
uint8 index;
for (index = 0; index < IP_NI_AMOUNT; ++index) {
gnitbl[index].state = 0;
}
}
uint8 CreatNI(uint32 ip, uint32 mask, uint32 gate, PInputF in, POutputF out, uint8 mac[]) {
// uint8 idx;
// for (idx = 0; idx < IP_NI_AMOUNT; ++idx) {
if(gnitbl[idx].state == 0) {
gnitbl[idx].ip = ip;
gnitbl[idx].mask = mask;
gnitbl[idx].gate = gate;
gnitbl[idx].output = out;
gnitbl[idx].input = in;
gnitbl[idx].hw_id = idx;
gnitbl[idx].arp_idx = idx;
memcpy(gnitbl[idx].mac, mac, 6);
gnitbl[idx].state = 1;
idx++;
if(idx == IP_NI_AMOUNT){
idx = 0;
}
return SYS_NO_ERR;
}
return SYS_NI_NOTVALID;
}
void init_task_net(void)
{
/************************************************************************/
/* init device left netcard */
/************************************************************************/
// init the physical device0
etherdev_init(0);
// open & register external IRQ1 interrupt
AT91F_PIO_CfgPeriph(AT91C_BASE_PIO, AT91C_PIO_P10 ,0); // IRQ1
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_IRQ1,
AT91C_AIC_PRIOR_HIGHEST - 1,
AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL,
irq1_asm_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ1);
/************************************************************************/
/* init device right netcard */
/************************************************************************/
etherdev_init(1);
// open & register external IRQ1 interrupt
// open & register external IRQ2 interrupt
AT91F_PIO_CfgPeriph(AT91C_BASE_PIO, AT91C_PIO_P11 ,0); // IRQ2
AT91F_PIO_CfgPeriph(AT91C_BASE_PIO, AT91C_PIO_P26 ,0); // NCS2
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_IRQ2,
AT91C_AIC_PRIOR_HIGHEST - 2,
AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL,
irq2_asm_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ2);
}
void TcpIpInit(void) {
uint8 mac1[6] = {MAC0, MAC1, MAC2, MAC3, MAC4, MAC5};
uint8 mac2[6] = {MAC6, MAC7, MAC8, MAC9, MAC10,MAC11};
InitNI();
SockInit();
//setup interface1
CreatNI(InetAddr(IP0, IP1, IP2, IP3), InetAddr(MASK0, MASK1, MASK2, MASK3), InetAddr(IP0, IP1, IP2, IP3), LLInput, LLOutput, mac1) ;
//setup interface2
CreatNI(InetAddr(IP4, IP5, IP6, IP7), InetAddr(MASK0, MASK1, MASK2, MASK3), InetAddr(IP4, IP5, IP6, IP7), LLInput, LLOutput, mac2) ;
init_task_net();
RouterInit();
gpTcpIpMsgQ = OSQCreate(gTcpIpMsgQTbl, MSG_AMOUNT_TCPIP);
OSTaskCreate(TcpIpInput, (void*)0, (void*)(&TcpIpStack[STACK_SIZE_TCPIP]), TASK_PRIORITY_TCPIP);
}
static void TcpIpInput(void *pdata) {
PNetIF pni;
uint8 err, ni_num;
uint16 frmtype;
PSock psock;
while(1) {
ni_num = *(uint8 *)OSQPend(gpTcpIpMsgQ, TASK_TIMEOUT_TCPIP, &err);
pni = &gnitbl[ni_num];
psock = GetSock(PROTOCOL_ETHER, 0, 0, 0, pni);
if (!pni || pni ->input(psock)) {
PutSock(psock);
}
memcpy(&psock->dst_mac,psock->buff,6);
memcpy(&psock->src_mac,psock->buff+6,6);
n2h16(psock->payload + 12, &frmtype);
ShiftSock(psock, PROTOCOL_ETHER, PROTOCOL_IP_OR_ARP);
switch(frmtype) {
case IP_TYPE:
err = IPInput(psock);
break;
case ARP_TYPE:
err = ArpInput(psock);
break;
#if PTP_TEST_EN > 0
case 0x8988:
PtpTestInput(psock, &(psock->stamp));
break;
#endif // PTP_TEST_EN
default:
PutSock(psock);
}
#if SYSTEM_VALIDCHK_EN > 0
if(err != 0) {
// Report err
}
#endif // SYSTEM_VALIDCHK_EN
} // while(1)
}
uint8 LLInput(PSock psock) {
uint16 length;
length = EtherInput(psock->buff, SOCK_BUFF_SIZE, psock->pni->hw_id);
if(length) {
psock->length = length;
return IP_NO_ERR;
}
return IP_SOCK_OVERFLOW;
}
uint8 LLOutput(PSock psock) {
uint8 err;
if(psock->blank) {
PutSock(psock);
return IP_SOCK_ILLEGAL;
}
err = EtherOutput(psock->buff, psock->length, psock->pni->hw_id);
PutSock(psock);
return (err);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -