1 /*
2 * Copyright (c) 2001, Adam Dunkels.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by Adam Dunkels.
16 * 4. The name of the author may not be used to endorse or promote
17 * products derived from this software without specific prior
18 * written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
21 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
24 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
26 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 * This file is part of the uIP TCP/IP stack.
33 *
34 * $Id: main.c,v 1.16 2006/06/11 21:55:03 adam Exp $
35 *
36 */
37
38
39 #include "uip.h"
40 #include "uip_arp.h"
41 #include "tapdev.h"
42
43 #include "timer.h"
44
45 #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
46
47 #ifndef NULL
48 #define NULL (void *)0
49 #endif /* NULL */
50
51 /*---------------------------------------------------------------------------*/
52 int
main(void)53 main(void)
54 {
55 int i;
56 uip_ipaddr_t ipaddr;
57 struct timer periodic_timer, arp_timer;
58
59 timer_set(&periodic_timer, CLOCK_SECOND / 2);
60 timer_set(&arp_timer, CLOCK_SECOND * 10);
61
62 tapdev_init();
63 uip_init();
64
65 uip_ipaddr(ipaddr, 192,168,0,2);
66 uip_sethostaddr(ipaddr);
67 uip_ipaddr(ipaddr, 192,168,0,1);
68 uip_setdraddr(ipaddr);
69 uip_ipaddr(ipaddr, 255,255,255,0);
70 uip_setnetmask(ipaddr);
71
72 httpd_init();
73
74 /* telnetd_init();*/
75
76 /* hello_world_init();*/
77
78 /* {
79 u8_t mac[6] = {1,2,3,4,5,6};
80 dhcpc_init(&mac, 6);
81 }*/
82
83 /*uip_ipaddr(ipaddr, 127,0,0,1);
84 smtp_configure("localhost", ipaddr);
85 SMTP_SEND("[email protected]", NULL, "[email protected]",
86 "Testing SMTP from uIP",
87 "Test message sent by uIP\r\n");*/
88
89 /*
90 webclient_init();
91 resolv_init();
92 uip_ipaddr(ipaddr, 195,54,122,204);
93 resolv_conf(ipaddr);
94 resolv_query("www.sics.se");*/
95
96
97
98 while(1) {
99 uip_len = tapdev_read();
100 if(uip_len > 0) {
101 if(BUF->type == htons(UIP_ETHTYPE_IP)) {
102 uip_arp_ipin();
103 uip_input();
104 /* If the above function invocation resulted in data that
105 should be sent out on the network, the global variable
106 uip_len is set to a value > 0. */
107 if(uip_len > 0) {
108 uip_arp_out();
109 tapdev_send();
110 }
111 } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
112 uip_arp_arpin();
113 /* If the above function invocation resulted in data that
114 should be sent out on the network, the global variable
115 uip_len is set to a value > 0. */
116 if(uip_len > 0) {
117 tapdev_send();
118 }
119 }
120
121 } else if(timer_expired(&periodic_timer)) {
122 timer_reset(&periodic_timer);
123 for(i = 0; i < UIP_CONNS; i++) {
124 uip_periodic(i);
125 /* If the above function invocation resulted in data that
126 should be sent out on the network, the global variable
127 uip_len is set to a value > 0. */
128 if(uip_len > 0) {
129 uip_arp_out();
130 tapdev_send();
131 }
132 }
133
134 #if UIP_UDP
135 for(i = 0; i < UIP_UDP_CONNS; i++) {
136 uip_udp_periodic(i);
137 /* If the above function invocation resulted in data that
138 should be sent out on the network, the global variable
139 uip_len is set to a value > 0. */
140 if(uip_len > 0) {
141 uip_arp_out();
142 tapdev_send();
143 }
144 }
145 #endif /* UIP_UDP */
146
147 /* Call the ARP timer function every 10 seconds. */
148 if(timer_expired(&arp_timer)) {
149 timer_reset(&arp_timer);
150 uip_arp_timer();
151 }
152 }
153 }
154 return 0;
155 }
156 /*---------------------------------------------------------------------------*/
157 void
uip_log(char * m)158 uip_log(char *m)
159 {
160 printf("uIP log message: %s\n", m);
161 }
162 void
resolv_found(char * name,u16_t * ipaddr)163 resolv_found(char *name, u16_t *ipaddr)
164 {
165 u16_t *ipaddr2;
166
167 if(ipaddr == NULL) {
168 printf("Host '%s' not found.\n", name);
169 } else {
170 printf("Found name '%s' = %d.%d.%d.%d\n", name,
171 htons(ipaddr[0]) >> 8,
172 htons(ipaddr[0]) & 0xff,
173 htons(ipaddr[1]) >> 8,
174 htons(ipaddr[1]) & 0xff);
175 /* webclient_get("www.sics.se", 80, "/~adam/uip");*/
176 }
177 }
178 #ifdef __DHCPC_H__
179 void
dhcpc_configured(const struct dhcpc_state * s)180 dhcpc_configured(const struct dhcpc_state *s)
181 {
182 uip_sethostaddr(s->ipaddr);
183 uip_setnetmask(s->netmask);
184 uip_setdraddr(s->default_router);
185 resolv_conf(s->dnsaddr);
186 }
187 #endif /* __DHCPC_H__ */
188 void
smtp_done(unsigned char code)189 smtp_done(unsigned char code)
190 {
191 printf("SMTP done with code %d\n", code);
192 }
193 void
webclient_closed(void)194 webclient_closed(void)
195 {
196 printf("Webclient: connection closed\n");
197 }
198 void
webclient_aborted(void)199 webclient_aborted(void)
200 {
201 printf("Webclient: connection aborted\n");
202 }
203 void
webclient_timedout(void)204 webclient_timedout(void)
205 {
206 printf("Webclient: connection timed out\n");
207 }
208 void
webclient_connected(void)209 webclient_connected(void)
210 {
211 printf("Webclient: connected, waiting for data...\n");
212 }
213 void
webclient_datahandler(char * data,u16_t len)214 webclient_datahandler(char *data, u16_t len)
215 {
216 printf("Webclient: got %d bytes of data.\n", len);
217 }
218 /*---------------------------------------------------------------------------*/
219