xref: /nrf52832-nimble/rt-thread/components/net/uip/doc/example-mainloop-with-arp.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero #include "uip.h"
2*10465441SEvalZero #include "uip_arp.h"
3*10465441SEvalZero #include "network-device.h"
4*10465441SEvalZero #include "httpd.h"
5*10465441SEvalZero #include "timer.h"
6*10465441SEvalZero 
7*10465441SEvalZero #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
8*10465441SEvalZero 
9*10465441SEvalZero /*---------------------------------------------------------------------------*/
10*10465441SEvalZero int
main(void)11*10465441SEvalZero main(void)
12*10465441SEvalZero {
13*10465441SEvalZero   int i;
14*10465441SEvalZero   uip_ipaddr_t ipaddr;
15*10465441SEvalZero   struct timer periodic_timer, arp_timer;
16*10465441SEvalZero 
17*10465441SEvalZero   timer_set(&periodic_timer, CLOCK_SECOND / 2);
18*10465441SEvalZero   timer_set(&arp_timer, CLOCK_SECOND * 10);
19*10465441SEvalZero 
20*10465441SEvalZero   network_device_init();
21*10465441SEvalZero   uip_init();
22*10465441SEvalZero 
23*10465441SEvalZero   uip_ipaddr(ipaddr, 192,168,0,2);
24*10465441SEvalZero   uip_sethostaddr(ipaddr);
25*10465441SEvalZero 
26*10465441SEvalZero   httpd_init();
27*10465441SEvalZero 
28*10465441SEvalZero   while(1) {
29*10465441SEvalZero     uip_len = network_device_read();
30*10465441SEvalZero     if(uip_len > 0) {
31*10465441SEvalZero       if(BUF->type == htons(UIP_ETHTYPE_IP)) {
32*10465441SEvalZero 	uip_arp_ipin();
33*10465441SEvalZero 	uip_input();
34*10465441SEvalZero 	/* If the above function invocation resulted in data that
35*10465441SEvalZero 	   should be sent out on the network, the global variable
36*10465441SEvalZero 	   uip_len is set to a value > 0. */
37*10465441SEvalZero 	if(uip_len > 0) {
38*10465441SEvalZero 	  uip_arp_out();
39*10465441SEvalZero 	  network_device_send();
40*10465441SEvalZero 	}
41*10465441SEvalZero       } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
42*10465441SEvalZero 	uip_arp_arpin();
43*10465441SEvalZero 	/* If the above function invocation resulted in data that
44*10465441SEvalZero 	   should be sent out on the network, the global variable
45*10465441SEvalZero 	   uip_len is set to a value > 0. */
46*10465441SEvalZero 	if(uip_len > 0) {
47*10465441SEvalZero 	  network_device_send();
48*10465441SEvalZero 	}
49*10465441SEvalZero       }
50*10465441SEvalZero 
51*10465441SEvalZero     } else if(timer_expired(&periodic_timer)) {
52*10465441SEvalZero       timer_reset(&periodic_timer);
53*10465441SEvalZero       for(i = 0; i < UIP_CONNS; i++) {
54*10465441SEvalZero 	uip_periodic(i);
55*10465441SEvalZero 	/* If the above function invocation resulted in data that
56*10465441SEvalZero 	   should be sent out on the network, the global variable
57*10465441SEvalZero 	   uip_len is set to a value > 0. */
58*10465441SEvalZero 	if(uip_len > 0) {
59*10465441SEvalZero 	  uip_arp_out();
60*10465441SEvalZero 	  network_device_send();
61*10465441SEvalZero 	}
62*10465441SEvalZero       }
63*10465441SEvalZero 
64*10465441SEvalZero #if UIP_UDP
65*10465441SEvalZero       for(i = 0; i < UIP_UDP_CONNS; i++) {
66*10465441SEvalZero 	uip_udp_periodic(i);
67*10465441SEvalZero 	/* If the above function invocation resulted in data that
68*10465441SEvalZero 	   should be sent out on the network, the global variable
69*10465441SEvalZero 	   uip_len is set to a value > 0. */
70*10465441SEvalZero 	if(uip_len > 0) {
71*10465441SEvalZero 	  uip_arp_out();
72*10465441SEvalZero 	  network_device_send();
73*10465441SEvalZero 	}
74*10465441SEvalZero       }
75*10465441SEvalZero #endif /* UIP_UDP */
76*10465441SEvalZero 
77*10465441SEvalZero       /* Call the ARP timer function every 10 seconds. */
78*10465441SEvalZero       if(timer_expired(&arp_timer)) {
79*10465441SEvalZero 	timer_reset(&arp_timer);
80*10465441SEvalZero 	uip_arp_timer();
81*10465441SEvalZero       }
82*10465441SEvalZero     }
83*10465441SEvalZero   }
84*10465441SEvalZero   return 0;
85*10465441SEvalZero }
86*10465441SEvalZero /*---------------------------------------------------------------------------*/
87