comparison src/g23m-fad/app/app_cmds.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
comparison
equal deleted inserted replaced
0:b6a5e36de839 1:d393cd9bb723
1 /*
2 +------------------------------------------------------------------------------
3 | File: app_cmds.c
4 +------------------------------------------------------------------------------
5 | Copyright 2004 Texas Instruments Berlin, AG
6 | All rights reserved.
7 |
8 | This file is confidential and a trade secret of Texas
9 | Instruments Berlin, AG
10 | The receipt of or possession of this file does not convey
11 | any rights to reproduce or disclose its contents or to
12 | manufacture, use, or sell anything it may describe, in
13 | whole, or in part, without the specific written consent of
14 | Texas Instruments Berlin, AG.
15 +-----------------------------------------------------------------------------
16 | Purpose : Example application for TCP/IP and Socket API -- command parser.
17 +-----------------------------------------------------------------------------
18 */
19
20
21 #define APP_CMDS_C
22
23 #ifdef FF_GPF_TCPIP
24
25 #define ENTITY_APP
26
27 /*==== INCLUDES =============================================================*/
28
29 #include <string.h> /* String functions, e. g. strncpy(). */
30 #include <ctype.h>
31 #include <stdlib.h>
32 #ifndef _SIMULATION_
33 #include "typedefs.h" /* Condat data types. */
34 #endif /* _SIMULATION_ */
35 #include "vsi.h" /* A lot of macros. */
36 #ifndef _SIMULATION_
37 #include "custom.h"
38 #include "gsm.h" /* A lot of macros. */
39 //#include "prim.h" /* Definitions of used SAP and directions. */
40 #include "pei.h" /* PEI interface. */
41 #include "tools.h" /* Common tools. */
42 #endif /* _SIMULATION_ */
43 #include "prim.h" /* Definitions of used SAP and directions. */
44 #include "socket_api.h" /* Socket API. */
45 #include "app.h" /* Global entity definitions. */
46
47
48
49 char custom_apn[SOCK_MAX_APN_LEN+1];
50 char custom_user_id[SOCK_MAX_USERID_LEN+1];
51 char custom_password[SOCK_MAX_PASSWORD_LEN+1];
52
53 BOOL custom_apn_valid = FALSE;
54 /*==== Local defines =========================================================*/
55
56 #define MAX_TOKENS 4 /* Maximum number of tokens to search for;
57 * first token is the command name, last token
58 * the rest of the line. */
59
60
61
62
63 /*==== Local data ============================================================*/
64
65 /* Type of command table entry. */
66 typedef struct APP_CMD_ENTRY app_cmd_entry_t ;
67
68 /* Type of some application core functions. */
69 typedef void (*core_func_t)(int prov, int n, int reps) ;
70
71 /* Type of command handler functions. */
72 typedef char *(*cmd_handler_t)(app_cmd_entry_t *cmd_entry_ptr,
73 char *param1,
74 char *param2,
75 char *param3,
76 core_func_t core_func) ;
77
78 /* Struct for command table entry. */
79 struct APP_CMD_ENTRY {
80 char *cmd_name ; /* Command string. */
81 cmd_handler_t cmd_func ; /* Command handler function. */
82 core_func_t core_func ; /* Related core function (if applicable). */
83 char *cmd_usage ; /* Command usage string (informative only). */
84 } ;
85
86 static char *app_cmd_data(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
87 static char *app_cmd_echo(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
88 static char *app_cmd_tcpsrv(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
89 static char *app_cmd_dnsquery(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
90 static char *app_cmd_server(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
91 static char *app_cmd_shutdown(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
92 static char *app_cmd_pstat(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
93 static char *app_cmd_help(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
94 static char *app_cmd_buffer(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
95 static char *app_cmd_port(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
96 static char *app_cmd_bearer(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
97 static char *app_cmd_xon(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
98 static char *app_cmd_xoff(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
99 static char *app_cmd_open_bearer(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
100 static char *app_cmd_close_bearer(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
101 static char *app_cmd_set_provider(app_cmd_entry_t *, char *, char *, char *, core_func_t) ;
102
103
104 /* Command handler table. */
105 static app_cmd_entry_t app_cmd_table[] = {
106 { "tcpdl", app_cmd_data, app_start_tcpdl, "[Provider][size] [reps]" },
107 { "tcpul", app_cmd_data, app_start_tcpul, "[Provider][size] [reps]" },
108 { "udpdl", app_cmd_data, app_start_udpdl, "[Provider][size] [reps]" },
109 { "udpul", app_cmd_data, app_start_udpul, "[Provider][size] [reps]" },
110 { "tcpecho", app_cmd_echo, app_start_tcpecho, "[Provider][items] [reps]" },
111 { "udpecho", app_cmd_echo, app_start_udpecho, "[Provider] [items] [reps]" },
112 { "tcpsrv", app_cmd_tcpsrv, app_start_tcpsrv, "[Provider][port] [repeat]" },
113 { "dnsquery", app_cmd_dnsquery, 0, "[Provider][times] [fqdn]" },
114 { "server", app_cmd_server, 0, "[server-address]" },
115 { "port", app_cmd_port, 0, "[portnumber]" },
116 { "buffer", app_cmd_buffer, 0, "[bufsize]" },
117 { "bearer", app_cmd_bearer, 0, "[gsm|gprs|best|none]" },
118 { "shutdown", app_cmd_shutdown, 0, "" },
119 { "stat", app_cmd_pstat, 0, "" },
120 { "help", app_cmd_help, 0, "" },
121 { "xon", app_cmd_xon, 0, "" },
122 { "xoff", app_cmd_xoff, 0, "" },
123 { "open_bearer", app_cmd_open_bearer,app_open_bearer,"[Provider]" },
124 { "close_bearer", app_cmd_close_bearer,0, "[Provider]" },
125 { "set_provider", app_cmd_set_provider, 0,"[apn] [user_id] [password]" },
126 { 0, 0, 0, 0},
127 } ;
128
129 /*============ Support functions =============================================*/
130 static U32 get_provider(char *param)
131 {
132 U32 prov = APP_PROV_DEFAULT;
133 if(param)
134 {
135 prov = atoi(param) ;
136 if( (prov EQ 0) OR (!(prov < APP_PROV_INVALID)) )
137 {
138 TRACE_EVENT("ERROR: unkown provider - setting to default");
139 prov = APP_PROV_DEFAULT;
140 }
141 }
142 return prov;
143 }
144
145 static U32 get_item(char *param, U32 default_item, BOOL can_null)
146 {
147 U32 item = default_item;
148 if (param)
149 {
150 item = atoi(param);
151 if (!can_null AND item EQ 0)
152 {
153 TRACE_EVENT("ERROR: item is 0, setting to default");
154 item = default_item;
155 }
156 }
157 return item;
158 }
159
160
161 /*==== Command handler functions =============================================*/
162
163 static char *app_cmd_data(app_cmd_entry_t *cmd_entry_ptr,
164 char *param1, char *param2, char *param3, core_func_t core_func)
165 {
166 U32 prov = get_provider(param1);
167 U32 size = get_item(param2, APP_DEF_DOWNLOAD_SIZE,TRUE);
168 U32 reps = get_item(param3, APP_DEF_DOWNLOAD_REPS,FALSE);
169
170 TRACE_FUNCTION("app_cmd_data()") ;
171 core_func(prov,size, reps) ;
172 return 0 ;
173 }
174
175
176 static char *app_cmd_echo(app_cmd_entry_t *cmd_entry_ptr,
177 char *param1, char *param2, char *param3, core_func_t core_func)
178 {
179 U32 prov = get_provider(param1);
180 U32 size = get_item(param2, APP_DEF_ECHO_ITEMS,TRUE);
181 U32 reps = get_item(param3, APP_DEF_ECHO_REPS,FALSE);
182
183 TRACE_FUNCTION("app_cmd_echo()") ;
184
185 core_func(prov,size, reps) ;
186 return 0 ;
187 }
188
189
190 static char *app_cmd_tcpsrv(app_cmd_entry_t *cmd_entry_ptr,
191 char *param1, char *param2, char *param3, core_func_t core_func)
192 {
193 U32 prov = get_provider(param1);
194 U32 port = get_item(param2, APP_DEF_TCPSRV_PORT,TRUE);
195 U32 rep = get_item(param3, APP_DEF_TCPSRV_REPEAT,TRUE);
196
197 TRACE_FUNCTION("app_cmd_tcpsrv()") ;
198
199 app_start_tcpsrv(prov,port, rep) ;
200 return 0 ;
201 }
202
203
204 static char *app_cmd_dnsquery(app_cmd_entry_t *cmd_entry_ptr,
205 char *param1, char *param2, char *param3, core_func_t core_func)
206 {
207 U32 prov = get_provider(param1);
208 int times = get_item(param2, APP_DEF_DNSQUERY_TIMES,FALSE);
209
210 app_start_dnsquery(prov,times, param3) ;
211 return 0 ;
212 }
213
214
215 static char *app_cmd_server(app_cmd_entry_t *cmd_entry_ptr,
216 char *param1, char *param2, char *param3, core_func_t core_func)
217 {
218 app_server(param1) ;
219 return 0 ;
220 }
221
222
223 static char *app_cmd_buffer(app_cmd_entry_t *cmd_entry_ptr,
224 char *param1, char *param2, char *param3, core_func_t core_func)
225 {
226 app_buffer(param1) ;
227 return 0 ;
228 }
229
230
231 static char *app_cmd_port(app_cmd_entry_t *cmd_entry_ptr,
232 char *param1, char *param2, char *param3, core_func_t core_func)
233 {
234 app_port(param1) ;
235 return 0 ;
236 }
237
238
239 static char *app_cmd_shutdown(app_cmd_entry_t *cmd_entry_ptr,
240 char *param1, char *param2, char *param3, core_func_t core_func)
241 {
242 app_shutdown() ;
243 return 0 ;
244 }
245
246
247 static char *app_cmd_bearer(app_cmd_entry_t *cmd_entry_ptr,
248 char *param1, char *param2, char *param3, core_func_t core_func)
249 {
250 app_bearer(param1) ;
251 return 0 ;
252 }
253
254
255 static char *app_cmd_pstat(app_cmd_entry_t *cmd_entry_ptr,
256 char *param1, char *param2, char *param3, core_func_t core_func)
257 {
258 app_pstat() ;
259 return 0 ;
260 }
261
262
263 static char *app_cmd_xon(app_cmd_entry_t *cmd_entry_ptr,
264 char *param1, char *param2, char *param3, core_func_t core_func)
265 {
266 app_switch_flow(1) ;
267 return 0 ;
268 }
269
270
271 static char *app_cmd_xoff(app_cmd_entry_t *cmd_entry_ptr,
272 char *param1, char *param2, char *param3, core_func_t core_func)
273 {
274 app_switch_flow(0) ;
275 return 0 ;
276 }
277
278
279 static char *app_cmd_help(app_cmd_entry_t *cmd_entry_ptr,
280 char *param1, char *param2, char *param3, core_func_t core_func)
281 {
282 TRACE_EVENT("Available commands:") ;
283 for (cmd_entry_ptr = &app_cmd_table[0];
284 cmd_entry_ptr->cmd_func;
285 cmd_entry_ptr++)
286 {
287 TRACE_EVENT_P2(" %s %s",
288 cmd_entry_ptr->cmd_name, cmd_entry_ptr->cmd_usage) ;
289 }
290 return 0 ;
291 }
292
293
294 static char *app_cmd_open_bearer(app_cmd_entry_t *cmd_entry_ptr, char *param1,
295 char *param2, char *param3, core_func_t core_func)
296 {
297 U32 prov = get_provider(param1);
298
299 TRACE_FUNCTION("app_cmd_open_bearer()") ;
300 core_func(prov, 0, 0);
301 return 0;
302 }
303
304 static char *app_cmd_close_bearer(app_cmd_entry_t *cmd_entry_ptr, char *param1,
305 char *param2, char *param3, core_func_t core_func)
306 {
307 TRACE_FUNCTION("app_cmd_close_bearer()") ;
308 app_close_bearer();
309 return 0;
310 }
311
312 static char *app_cmd_set_provider(app_cmd_entry_t *cmd_entry_ptr, char *param1,
313 char *param2, char *param3, core_func_t core_func)
314 {
315 /* To indicate presence of valid Custom APN */
316 custom_apn_valid = TRUE;
317
318 /* Set the APN string sent by the user */
319 strcpy(custom_apn, param1);
320
321 /* Set used ID sent by the user */
322 strcpy(custom_user_id, param2);
323
324 /* Set used ID sent by the user */
325 strcpy(custom_password, param3);
326
327 return 0;
328
329 }
330
331 /*==== Local functions =======================================================*/
332
333 static char **app_tokenize_cmd(char *command)
334 {
335 /* Three tokens will be enough: command name, parameter 1, parameter 2. Empty
336 * tokens will be NULL. */
337 static char *cmd_token[MAX_TOKENS] ;
338 char *cur ; /* Pointer to current character. */
339
340 int cur_tok ; /* Current token number. */
341
342
343 cur = command ;
344 cur_tok = 0 ;
345 do
346 {
347 while (isspace(*cur)) /* FALSE also for NUl character. */
348 {
349 cur++ ; /* Skip whitespace. */
350 }
351 if (!*cur) /* String terminated. */
352 {
353 cmd_token[cur_tok] = 0 ; /* No token here and stop. */
354 break ;
355 }
356 cmd_token[cur_tok++] = cur ;
357 cmd_token[cur_tok] = 0 ;
358 while (*cur && !isspace(*cur))
359 {
360 cur++ ; /* Skip non-whitespace. */
361 }
362 if (*cur) *cur++ = 0 ; /* Zero-terminate token if not end of string. */
363 }
364 while (cur_tok < MAX_TOKENS) ;
365
366 return cmd_token ;
367 }
368
369 #if !defined (FF_GPF_TCPIP) && !defined (CO_TCPIP_TESTAPP)
370 char *string_to_lower(char *s)
371 {
372 char *tmp ;
373
374 for (tmp = s; *tmp; tmp++)
375 {
376 *tmp = tolower(*tmp) ;
377 }
378 return s ;
379 }
380 #endif /* #if !defined (FF_GPF_TCPIP) && !defined (CO_TCPIP_TESTAPP) */
381
382
383 /*==== Exported functions ====================================================*/
384
385 /** Parse a command and execute it if it is valid. Return appropriate error
386 * message if the command is invalid or fails.
387 *
388 * @param command command line to execute
389 * @return an error message or NULL on success
390 */
391 char *app_handle_command_tcpip(char *command)
392 {
393 char **tokened_cmd ; /* Tokenized command line. */
394 int cmd_index ;
395
396 TRACE_FUNCTION("app_handle_command_tcpip()") ;
397
398 tokened_cmd = app_tokenize_cmd(command) ;
399 if (!tokened_cmd[0])
400 {
401 return "ERROR: empty command line" ;
402 }
403
404 string_to_lower(tokened_cmd[0]) ; /* convert to lower char */
405 cmd_index = 0 ;
406 while (app_cmd_table[cmd_index].cmd_name)
407 {
408 if (!strcmp(tokened_cmd[0], app_cmd_table[cmd_index].cmd_name))
409 {
410 TRACE_EVENT_P4("Call %s(%s, %s, %s)", app_cmd_table[cmd_index].cmd_name,
411 tokened_cmd[1] ? tokened_cmd[1] : "(null)",
412 tokened_cmd[2] ? tokened_cmd[2] : "(null)",
413 tokened_cmd[3] ? tokened_cmd[3] : "(null)") ;
414 return app_cmd_table[cmd_index].cmd_func(&app_cmd_table[cmd_index],
415 tokened_cmd[1],
416 tokened_cmd[2],
417 tokened_cmd[3],
418 app_cmd_table[cmd_index].core_func) ;
419 }
420 cmd_index++ ;
421 }
422 return "ERROR: command not recognized" ;
423 }
424
425 /* This is onoy for the case that the macro UI_TRACE() is undefined, in which
426 * case the linker bemoans it as missing. */
427
428
429 #endif /* FF_GPF_TCPIP */
430
431 /* EOF */