Subversion Repositories svn.mios32

Rev

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

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