osd-contiki/platform/netsim/net/tapdev-drv.c
oliverschmidt 342e720cfd - Moved all ARP handling to service wrapper (and narrowed interface to low level code).
- Adjusted packet forwarding to moving all ARP handling to service wrapper.

- Unified general coding/formatting style.
2007-03-27 21:47:17 +00:00

57 lines
1.4 KiB
C

#include "contiki-net.h"
#include "net/tapdev.h"
#include "net/uip_arp.h"
static struct uip_eth_addr addr =
{{0x08, 0x12, 0x23, 0x89, 0xa3, 0x94}};
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
PROCESS(tapdev_drv_process, "TAP driver");
void tapdev_drv_request_poll(void);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(tapdev_drv_process, ev, data)
{
PROCESS_BEGIN();
tapdev_init();
uip_setethaddr(addr);
tapdev_drv_request_poll();
while(1) {
PROCESS_WAIT_EVENT();
tapdev_drv_request_poll();
tapdev_drv_request_poll();
uip_len = tapdev_poll();
if(uip_len > 0) {
if(BUF->type == htons(UIP_ETHTYPE_IP)) {
uip_arp_ipin();
uip_len -= sizeof(struct uip_eth_hdr);
/* uip_input();*/
tcpip_input();
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
} else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
uip_arp_arpin();
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if(uip_len > 0) {
tapdev_send();
}
}
}
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/
void
tapdev_drv_request_poll(void)
{
process_poll(&tapdev_drv_process);
}