example-mainloop-with-arp.c

00001 #include "uip.h"
00002 #include "uip_arp.h"
00003 #include "network-device.h"
00004 #include "httpd.h"
00005 #include "timer.h"
00006 
00007 #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
00008 
00009 /*---------------------------------------------------------------------------*/
00010 int
00011 main(void)
00012 {
00013   int i;
00014   uip_ipaddr_t ipaddr;
00015   struct timer periodic_timer, arp_timer;
00016   
00017   timer_set(&periodic_timer, CLOCK_SECOND / 2);
00018   timer_set(&arp_timer, CLOCK_SECOND * 10);
00019   
00020   network_device_init();
00021   uip_init();
00022 
00023   uip_ipaddr(ipaddr, 192,168,0,2);
00024   uip_sethostaddr(ipaddr);
00025 
00026   httpd_init();
00027   
00028   while(1) {
00029     uip_len = network_device_read();
00030     if(uip_len > 0) {
00031       if(BUF->type == htons(UIP_ETHTYPE_IP)) {
00032         uip_arp_ipin();
00033         uip_input();
00034         /* If the above function invocation resulted in data that
00035            should be sent out on the network, the global variable
00036            uip_len is set to a value > 0. */
00037         if(uip_len > 0) {
00038           uip_arp_out();
00039           network_device_send();
00040         }
00041       } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
00042         uip_arp_arpin();
00043         /* If the above function invocation resulted in data that
00044            should be sent out on the network, the global variable
00045            uip_len is set to a value > 0. */
00046         if(uip_len > 0) {
00047           network_device_send();
00048         }
00049       }
00050 
00051     } else if(timer_expired(&periodic_timer)) {
00052       timer_reset(&periodic_timer);
00053       for(i = 0; i < UIP_CONNS; i++) {
00054         uip_periodic(i);
00055         /* If the above function invocation resulted in data that
00056            should be sent out on the network, the global variable
00057            uip_len is set to a value > 0. */
00058         if(uip_len > 0) {
00059           uip_arp_out();
00060           network_device_send();
00061         }
00062       }
00063 
00064 #if UIP_UDP
00065       for(i = 0; i < UIP_UDP_CONNS; i++) {
00066         uip_udp_periodic(i);
00067         /* If the above function invocation resulted in data that
00068            should be sent out on the network, the global variable
00069            uip_len is set to a value > 0. */
00070         if(uip_len > 0) {
00071           uip_arp_out();
00072           network_device_send();
00073         }
00074       }
00075 #endif /* UIP_UDP */
00076       
00077       /* Call the ARP timer function every 10 seconds. */
00078       if(timer_expired(&arp_timer)) {
00079         timer_reset(&arp_timer);
00080         uip_arp_timer();
00081       }
00082     }
00083   }
00084   return 0;
00085 }
00086 /*---------------------------------------------------------------------------*/

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  doxygen 1.4.6