www.pudn.com > uCOSII上实现的tcpip.rar > ztask.c


#include "include/zarch.h"
#include "include/ztask.h"
#include "include/znetif.h"
#include "include/zbuffer.h"
#include "include/zeth.h"
#include "include/zarp.h"
#include "include/zipv4.h"
#include "include/ztcp.h"

task_t	znet_task_id;
u8_t	znet_state;

sys_sem_t	znet_sem;
sys_sem_t	znet_sem_tmr;

static void znetif_rx(znetif_t *pnetif, zbuffer_t *pbuffer);
void change_led2(void);

void znet_task(void *pdata)
{
	u8_t	err;
	zbuffer_t	*pbuffer;
	
	printf("ZNet(tcp/ip stack) now working....\n");
	znet_sem = sys_new_sem(0);
	znet_sem_tmr = sys_new_sem(1);
	tcp_ticks = 0;
	sys_enter_critical();
	znet_state |= ZNET_START;
	sys_exit_critical();
	
	for(;;)
	{
		for(;;)
		{
			pbuffer = znetif_read(&default_netif);
			if ( pbuffer == NULL)
			{
				sys_enter_critical();
				znet_state &= ~ZNET_RUNNING;	
				sys_wait_sem(znet_sem, 0, &err);	/*enter sleep state*/
			}
			else
				break;
		}
				
		sys_enter_critical();
		znet_state |= ZNET_RUNNING;
		sys_exit_critical();
	
		sys_wait_sem(znet_sem_tmr, 0, &err);
		led_change(0);
		znetif_rx(&default_netif, pbuffer);
		sys_signal_sem(znet_sem_tmr);
	}
	
}

static void znetif_rx(znetif_t *pnetif, zbuffer_t *pbuffer)
{
	eth_header_t *pheader;
	zbuffer_t	*p;

	pheader = (eth_header_t *)pbuffer->pdata;

	switch( pheader->eth_type )
	{
   	case ETHTYPE_IP:
	        ip_input(pnetif, pbuffer);	
			break;
    case ETHTYPE_ARP:
			p = arp_arp_input(pnetif, pbuffer);
			if (p != NULL)
			{
				pnetif->netif_tx(pnetif, p);
				zbuffer_delete(p);
				return;
			}
			zbuffer_delete(pbuffer);
			break;
	default:
			zbuffer_delete(pbuffer);
			break;
	}
	return;
}