forked from Free60Project/xell
/
network.c
136 lines (103 loc) · 2.41 KB
/
network.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include "time.h"
#include "lwipopts.h"
#include "lwip/debug.h"
#include "lwip/mem.h"
#include "lwip/memp.h"
#include "lwip/sys.h"
#include "lwip/stats.h"
#include "lwip/ip.h"
#include "lwip/udp.h"
#include "lwip/tcp.h"
#include "netif/etharp.h"
struct netif netif;
static tb_t now, last_tcp, last_dhcp;
extern void enet_poll(struct netif *netif);
extern err_t enet_init(struct netif *netif);
extern void httpd_start(void);
void network_poll();
void network_init()
{
struct ip_addr ipaddr, netmask, gw;
printf("trying to initialize network...\n");
#ifdef STATS
stats_init();
#endif /* STATS */
mem_init();
memp_init();
pbuf_init();
netif_init();
ip_init();
udp_init();
tcp_init();
etharp_init();
printf("ok now the NIC\n");
if (!netif_add(&netif, &ipaddr, &netmask, &gw, NULL, enet_init, ip_input))
{
printf("netif_add failed!\n");
return;
}
netif_set_default(&netif);
dhcp_start(&netif);
mftb(&last_tcp);
mftb(&last_dhcp);
printf("\nWaiting for DHCP");
int i;
for (i=0; i<10; i++) {
mdelay(500);
network_poll();
printf(".");
if (netif.ip_addr.addr)
break;
}
if (netif.ip_addr.addr) {
printf("%u.%u.%u.%u\n",
(netif.ip_addr.addr >> 24) & 0xFF,
(netif.ip_addr.addr >> 16) & 0xFF,
(netif.ip_addr.addr >> 8) & 0xFF,
(netif.ip_addr.addr >> 0) & 0xFF);
printf("\n");
} else {
printf("failed.\n\n");
IP4_ADDR(&ipaddr, 10, 0, 120, 209);
IP4_ADDR(&gw, 10, 0, 120, 1);
IP4_ADDR(&netmask, 255, 255, 255, 0);
netif_set_addr(&netif, &ipaddr, &netmask, &gw);
netif_set_up(&netif);
}
printf("starting httpd server..");
httpd_start();
printf("ok!\n");
}
void print_network_config()
{
#define NTOA(ip) (int)((ip.addr>>24)&0xff), (int)((ip.addr>>16)&0xff), (int)((ip.addr>>8)&0xff), (int)(ip.addr&0xff)
printf(" * XeLL network config: %d.%d.%d.%d / %d.%d.%d.%d\n",
NTOA(netif.ip_addr), NTOA(netif.netmask));
}
void network_poll()
{
mftb(&now);
enet_poll(&netif);
if (tb_diff_msec(&now, &last_tcp) >= 100)
{
mftb(&last_tcp);
tcp_tmr();
}
if (tb_diff_msec(&now, &last_dhcp) >= DHCP_FINE_TIMER_MSECS)
{
mftb(&last_dhcp);
dhcp_fine_tmr();
}
}
char *network_boot_server_name()
{
if (netif.dhcp && netif.dhcp->boot_server_name)
return netif.dhcp->boot_server_name;
return "10.0.120.78";
}
char *network_boot_file_name()
{
if (netif.dhcp && netif.dhcp->boot_file_name)
return netif.dhcp->boot_file_name;
return "/tftpboot/xenon";
}