Subversion Repositories svn.mios32

Rev

Rev 829 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
823 philetaylo 1
// $Id: uip_task.c 817 2010-01-09 22:57:32Z tk $
2
/*
3
 * uIP handler as FreeRTOS task
4
 *
5
 * Framework taken from $MIOS32_PATH/modules/uip/doc/example-mainloop-with-arp.c
6
 *
7
 * ==========================================================================
8
 *
9
 *  Copyright (C) 2009 Thorsten Klose (tk@midibox.org)
10
 *  Licensed for personal non-commercial use only.
11
 *  All other rights reserved.
12
 *
13
 * ==========================================================================
14
 */
15
 
16
/////////////////////////////////////////////////////////////////////////////
17
// Include files
18
/////////////////////////////////////////////////////////////////////////////
19
#include <mios32.h>
20
 
21
#include <FreeRTOS.h>
22
#include <task.h>
23
#include <queue.h>
24
 
829 philetaylo 25
#include "pt.h"
26
#include "timer.h"
27
 
823 philetaylo 28
#include "uip.h"
29
#include "uip_arp.h"
829 philetaylo 30
#include "dhcpc.h"
31
#include "ntpclient.h"
32
#include "uip_task.h"
33
 
823 philetaylo 34
#include "network-device.h"
35
 
36
 
37
/////////////////////////////////////////////////////////////////////////////
38
// Task Priorities
39
/////////////////////////////////////////////////////////////////////////////
40
 
41
// lower priority than MIOS32 hooks
42
#define PRIORITY_TASK_UIP       ( tskIDLE_PRIORITY + 2 )
43
 
44
 
45
/////////////////////////////////////////////////////////////////////////////
46
// Local defines
47
/////////////////////////////////////////////////////////////////////////////
48
 
49
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
50
 
51
 
52
/////////////////////////////////////////////////////////////////////////////
53
// Local prototypes
54
/////////////////////////////////////////////////////////////////////////////
55
static void UIP_TASK_Handler(void *pvParameters);
56
static s32 UIP_TASK_StartServices(void);
57
static s32 UIP_TASK_SendDebugMessage_IP(void);
58
 
59
 
60
/////////////////////////////////////////////////////////////////////////////
61
// Local variables
62
/////////////////////////////////////////////////////////////////////////////
63
static u8 services_running;
64
 
65
 
66
/////////////////////////////////////////////////////////////////////////////
67
// Initialize the uIP task
68
/////////////////////////////////////////////////////////////////////////////
69
s32 UIP_TASK_Init(u32 mode)
70
{
71
  if( mode > 0 )
72
    return -1; // only mode 0 supported yet
73
 
2425 tk 74
  xTaskCreate(UIP_TASK_Handler, "uIP", configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK_UIP, NULL);
823 philetaylo 75
 
76
  services_running = 0;
77
 
78
  return 0; // no error
79
}
80
 
81
 
82
 
83
 
84
/////////////////////////////////////////////////////////////////////////////
85
// The uIP Task is executed each mS
86
/////////////////////////////////////////////////////////////////////////////
87
static void UIP_TASK_Handler(void *pvParameters)
88
{
89
  int i;
90
  uip_ipaddr_t ipaddr;
91
  struct timer periodic_timer, arp_timer;
92
 
93
  // Initialise the xLastExecutionTime variable on task entry
94
  portTickType xLastExecutionTime = xTaskGetTickCount();
95
 
96
  // init uIP timers
97
  timer_set(&periodic_timer, CLOCK_SECOND / 2);
98
  timer_set(&arp_timer, CLOCK_SECOND * 10);
99
 
100
  // init the network driver
101
  network_device_init();
102
 
103
  // init uIP
104
  uip_init();
105
  uip_arp_init();
106
 
107
  // set my ethernet address
108
  unsigned char *mac_addr = network_device_mac_addr();
109
  {
110
    int i;
111
    for(i=0; i<6; ++i)
112
      uip_ethaddr.addr[i] = mac_addr[i];
113
  }
114
 
115
#ifndef DONT_USE_DHCP
116
  dhcpc_init(uip_ethaddr.addr, sizeof(uip_ethaddr.addr));
117
  MIOS32_MIDI_SendDebugMessage("[UIP_TASK] DHCP Client requests the IP settings...\n");
118
#else
119
  // set my IP address
120
  uip_ipaddr(ipaddr,
121
         ((MY_IP_ADDRESS)>>24) & 0xff,
122
         ((MY_IP_ADDRESS)>>16) & 0xff,
123
         ((MY_IP_ADDRESS)>> 8) & 0xff,
124
         ((MY_IP_ADDRESS)>> 0) & 0xff);
125
  uip_sethostaddr(ipaddr);
126
 
127
  // set my netmask
128
  uip_ipaddr(ipaddr,
129
         ((MY_NETMASK)>>24) & 0xff,
130
         ((MY_NETMASK)>>16) & 0xff,
131
         ((MY_NETMASK)>> 8) & 0xff,
132
         ((MY_NETMASK)>> 0) & 0xff);
133
  uip_setnetmask(ipaddr);
134
 
135
  // default router
136
  uip_ipaddr(ipaddr,
137
         ((MY_GATEWAY)>>24) & 0xff,
138
         ((MY_GATEWAY)>>16) & 0xff,
139
         ((MY_GATEWAY)>> 8) & 0xff,
140
         ((MY_GATEWAY)>> 0) & 0xff);
141
  uip_setdraddr(ipaddr);
142
 
143
  MIOS32_MIDI_SendDebugMessage("[UIP_TASK] IP Address statically set:\n");
144
 
145
  // start services immediately
146
  UIP_TASK_StartServices();
147
#endif
148
 
149
  // endless loop
150
  while( 1 ) {
151
    vTaskDelayUntil(&xLastExecutionTime, 1 / portTICK_RATE_MS);
152
 
153
    if( !(clock_time_tick() % 100) ) {
154
      // each 100 mS: check availablility of network device
155
      network_device_check();
156
    }
157
 
158
    if( network_device_available() ) {
159
      uip_len = network_device_read();
160
 
161
      if( uip_len > 0 ) {
162
    if(BUF->type == htons(UIP_ETHTYPE_IP) ) {
163
      uip_arp_ipin();
164
      uip_input();
165
 
166
      /* If the above function invocation resulted in data that
167
         should be sent out on the network, the global variable
168
         uip_len is set to a value > 0. */
169
      if( uip_len > 0 ) {
170
        uip_arp_out();
171
        network_device_send();
172
      }
173
    } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
174
      uip_arp_arpin();
175
      /* If the above function invocation resulted in data that
176
         should be sent out on the network, the global variable
177
         uip_len is set to a value > 0. */
178
      if(uip_len > 0) {
179
        network_device_send();
180
      }
181
    }
182
 
183
      } else if(timer_expired(&periodic_timer)) {
184
    timer_reset(&periodic_timer);
185
    for(i = 0; i < UIP_CONNS; i++) {
186
      uip_periodic(i);
187
      /* If the above function invocation resulted in data that
188
         should be sent out on the network, the global variable
189
         uip_len is set to a value > 0. */
190
      if(uip_len > 0) {
191
        uip_arp_out();
192
        network_device_send();
193
      }
194
    }
195
 
196
#if UIP_UDP
197
    for(i = 0; i < UIP_UDP_CONNS; i++) {
198
      uip_udp_periodic(i);
199
      /* If the above function invocation resulted in data that
200
         should be sent out on the network, the global variable
201
         uip_len is set to a value > 0. */
202
      if(uip_len > 0) {
203
        uip_arp_out();
204
        network_device_send();
205
      }
206
    }
207
#endif /* UIP_UDP */
208
 
209
    /* Call the ARP timer function every 10 seconds. */
210
    if(timer_expired(&arp_timer)) {
211
      timer_reset(&arp_timer);
212
      uip_arp_timer();
213
    }
214
      }
215
    }
216
  }
217
}
218
 
219
 
220
/////////////////////////////////////////////////////////////////////////////
221
// used by uIP to print a debug message
222
/////////////////////////////////////////////////////////////////////////////
223
void uip_log(char *msg)
224
{
225
  MIOS32_MIDI_SendDebugMessage(msg);
226
}
227
 
228
 
229
/////////////////////////////////////////////////////////////////////////////
230
// Prints current IP settings
231
/////////////////////////////////////////////////////////////////////////////
232
static s32 UIP_TASK_SendDebugMessage_IP(void)
233
{
234
  uip_ipaddr_t ipaddr;
235
  uip_gethostaddr(&ipaddr);
236
 
237
  MIOS32_MIDI_SendDebugMessage("[UIP_TASK] IP address: %d.%d.%d.%d\n",
238
                   uip_ipaddr1(ipaddr), uip_ipaddr2(ipaddr),
239
                   uip_ipaddr3(ipaddr), uip_ipaddr4(ipaddr));
240
 
241
  uip_ipaddr_t netmask;
242
  uip_getnetmask(&netmask);
243
  MIOS32_MIDI_SendDebugMessage("[UIP_TASK] Netmask: %d.%d.%d.%d\n",
244
                   uip_ipaddr1(netmask), uip_ipaddr2(netmask),
245
                   uip_ipaddr3(netmask), uip_ipaddr4(netmask));
246
 
247
  uip_ipaddr_t draddr;
248
  uip_getdraddr(&draddr);
249
  MIOS32_MIDI_SendDebugMessage("[UIP_TASK] Default Router (Gateway): %d.%d.%d.%d\n",
250
                   uip_ipaddr1(draddr), uip_ipaddr2(draddr),
251
                   uip_ipaddr3(draddr), uip_ipaddr4(draddr));
252
 
253
  return 0; // no error
254
}
255
 
256
 
257
/////////////////////////////////////////////////////////////////////////////
258
// start services
259
/////////////////////////////////////////////////////////////////////////////
260
static s32 UIP_TASK_StartServices(void)
261
{
262
  // print IP settings
263
  UIP_TASK_SendDebugMessage_IP();
264
 
829 philetaylo 265
  // start NTP client (to set clock!)
266
  ntpclient_init();
267
 
823 philetaylo 268
  // start webserver
269
  httpd_init();
270
 
829 philetaylo 271
 
823 philetaylo 272
  // services available now
273
  services_running = 1;
274
 
275
  return 0; // no error
276
}
277
 
278
 
279
/////////////////////////////////////////////////////////////////////////////
280
// Status flag for external functions
281
/////////////////////////////////////////////////////////////////////////////
282
s32 UIP_TASK_ServicesRunning(void)
283
{
284
  return services_running;
285
}
286
 
287
 
288
/////////////////////////////////////////////////////////////////////////////
289
// Called by UDP handler of uIP
290
/////////////////////////////////////////////////////////////////////////////
291
s32 UIP_TASK_UDP_AppCall(void)
292
{
293
  // DHCP client
294
  if( uip_udp_conn->rport == HTONS(DHCPC_SERVER_PORT) || uip_udp_conn->rport == HTONS(DHCPC_CLIENT_PORT) ) {
295
    dhcpc_appcall();
829 philetaylo 296
    // NTP Client
297
  } else if (uip_udp_conn->rport == HTONS(NTP_PORT)) {
298
    ntpclient_appcall();
299
    // DNS Client
823 philetaylo 300
  }
301
  return 0; // no error
302
}
303
 
304
 
305
/////////////////////////////////////////////////////////////////////////////
306
// Called by DHCP client once it got IP addresses
307
/////////////////////////////////////////////////////////////////////////////
829 philetaylo 308
void dhcpc_configured(const struct udp_state *s)
823 philetaylo 309
{
310
  // set IP settings
311
  uip_sethostaddr(s->ipaddr);
312
  uip_setnetmask(s->netmask);
313
  uip_setdraddr(s->default_router);
314
  // start services
315
  UIP_TASK_StartServices();
316
 
317
  // print unused settings
318
  MIOS32_MIDI_SendDebugMessage("[UIP_TASK] Got DNS server %d.%d.%d.%d\n",
319
                   uip_ipaddr1(s->dnsaddr), uip_ipaddr2(s->dnsaddr),
320
                   uip_ipaddr3(s->dnsaddr), uip_ipaddr4(s->dnsaddr));
321
  MIOS32_MIDI_SendDebugMessage("[UIP_TASK] Lease expires in %d hours\n",
322
                   (ntohs(s->lease_time[0])*65536ul + ntohs(s->lease_time[1]))/3600);
323
}
829 philetaylo 324
 
325
 
326
 
2425 tk 327