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;
}