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

📄 tcpip.c

📁 包括EPA协议栈
💻 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 + -