source: azure_iot_hub/trunk/asp3_dcre/tinet/netapp/tcp_echo_cli.c@ 389

Last change on this file since 389 was 389, checked in by coas-nagasima, 5 years ago

ビルドが通るよう更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 12.7 KB
Line 
1/*
2 * TINET (TCP/IP Protocol Stack)
3 *
4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering
5 * Tomakomai National College of Technology, JAPAN
6 *
7 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
8 * によって公表されている GNU General Public License の Version 2 に記
9 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
10 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
11 * 利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次の条件を満たすこと.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 *
26 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
27 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
28 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
29 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
30 *
31 * @(#) $Id$
32 */
33
34/*
35 * TCP ECHO クライアント
36 *
37 * ・送受信タスク分離型
38 * ・ノンブロッキングコール
39 * ・省コピー API
40 * ・IPv4
41 * ・IPv6
42 */
43
44#include <stdlib.h>
45
46#ifdef TARGET_KERNEL_ASP
47
48#include <kernel.h>
49#include <sil.h>
50#include <t_syslog.h>
51#include "kernel_cfg.h"
52#include "tinet_cfg.h"
53
54#endif /* of #ifdef TARGET_KERNEL_ASP */
55
56#ifdef TARGET_KERNEL_JSP
57
58#include <t_services.h>
59#include "kernel_id.h"
60#include "tinet_id.h"
61
62#endif /* of #ifdef TARGET_KERNEL_JSP */
63
64#include <netinet/in.h>
65#include <netinet/in_itron.h>
66
67#include <netapp/netapp.h>
68#include <netapp/netapp_var.h>
69#include <netapp/tcp_echo_cli.h>
70
71#ifdef USE_TCP_ECHO_CLI
72
73/* echo サーバのポート番号 */
74
75#define ECHO_SRV_PORTNO UINT_C(7)
76
77/* 緊急データの送信 */
78
79#ifdef USE_TCP_EXTENTIONS
80
81//#define SND_URG_DATA_SIZE 4
82#define SND_URG_COUNT 10
83
84#endif /* of #ifdef USE_TCP_EXTENTIONS */
85
86/* 送信間隔 */
87
88#ifdef TOPPERS_S810_CLG3_85
89
90//#define SND_DLY (500)
91#define START_DLY (10*SYSTIM_HZ)
92#define SND_ITV (5*SYSTIM_HZ)
93#define SLP_ITV (30*SYSTIM_HZ)
94
95#else /* of #ifdef TOPPERS_S810_CLG3_85 */
96
97//#define SND_DLY (500)
98#define START_DLY (10*SYSTIM_HZ)
99#define SND_ITV (5*SYSTIM_HZ)
100#define SLP_ITV (60*SYSTIM_HZ)
101
102#endif /* of #ifdef TOPPERS_S810_CLG3_85 */
103
104/* 自動実行 */
105
106#if defined(TCP_ECHO_CLI_AUTO_RUN_STR)
107#else
108#if 0
109#if defined(SUPPORT_INET6)
110#define TCP_ECHO_CLI_AUTO_RUN_STR "fd90:cce5:25f6:ff81:201:2ff:fe81:e7c9 - 0"
111#else
112#define TCP_ECHO_CLI_AUTO_RUN_STR "172.25.129.140 - 0"
113#endif
114#endif
115#endif
116
117#if defined(SUPPORT_INET6)
118#if defined(SUPPORT_INET4)
119#define API_PROTO 'n'
120#else
121#define API_PROTO '6'
122#endif
123#else
124#define API_PROTO '4'
125#endif
126
127/*
128 * 全域変数
129 */
130
131bool_t tcp_echo_cli_valid;
132uint_t tcp_echo_cli_scount;
133
134/* TCP 送受信ウィンドバッファ */
135
136#ifndef TCP_CFG_SWBUF_CSAVE
137uint8_t tcp_echo_cli_swbuf[TCP_ECHO_CLI_SWBUF_SIZE];
138#endif
139
140#ifndef TCP_CFG_RWBUF_CSAVE
141uint8_t tcp_echo_cli_rwbuf[TCP_ECHO_CLI_RWBUF_SIZE];
142#endif
143
144#ifdef USE_TCP_NON_BLOCKING
145
146/*
147 * 全域変数
148 */
149
150ER_UINT tcp_echo_cli_nblk_error;
151
152/*
153 * ノンブロッキングコールのコールバック関数
154 */
155
156ER
157callback_nblk_tcp_echo_cli (ID cepid, FN fncd, void *p_parblk)
158{
159 ER error = E_OK;
160
161 tcp_echo_cli_nblk_error = *(ER*)p_parblk;
162
163 switch (fncd) {
164
165 case TFN_TCP_CON_CEP:
166 syscall(sig_sem(SEM_TCP_ECHO_CLI_NBLK_READY));
167 break;
168
169 case TFN_TCP_RCV_BUF:
170 if (tcp_echo_cli_nblk_error < 0)
171 syslog(LOG_NOTICE, "[TEC%c:%02u CBN] error: %s",
172 API_PROTO, cepid, itron_strerror(tcp_echo_cli_nblk_error));
173 syscall(sig_sem(SEM_TCP_ECHO_CLI_NBLK_READY));
174 break;
175
176 case TFN_TCP_CLS_CEP:
177 if (tcp_echo_cli_nblk_error < 0)
178 syslog(LOG_NOTICE, "[TEC%c:%02u CBN] error: %s",
179 API_PROTO, cepid, itron_strerror(tcp_echo_cli_nblk_error));
180 syscall(sig_sem(SEM_TCP_ECHO_CLI_NBLK_READY));
181 break;
182
183 case TFN_TCP_RCV_DAT:
184 if (tcp_echo_cli_nblk_error < 0)
185 syslog(LOG_NOTICE, "[TEC%c:%02u CBN] error: %s",
186 API_PROTO, cepid, itron_strerror(tcp_echo_cli_nblk_error));
187 syscall(sig_sem(SEM_TCP_ECHO_CLI_NBLK_READY));
188 break;
189
190 case TFN_TCP_SND_OOB:
191 if (tcp_echo_cli_nblk_error > 0)
192 syslog(LOG_NOTICE, "[TEC%c:%02u CBN] snd urg: %4u",
193 API_PROTO, cepid, tcp_echo_cli_nblk_error);
194 else
195 syslog(LOG_NOTICE, "[TEC%c:%02u CBN] error: %s",
196 API_PROTO, cepid, itron_strerror(tcp_echo_cli_nblk_error));
197 break;
198
199 case TFN_TCP_ACP_CEP:
200 case TFN_TCP_SND_DAT:
201 case TFN_TCP_GET_BUF:
202 default:
203 error = E_PAR;
204 break;
205 }
206 return error;
207 }
208
209#endif /* of #ifdef USE_TCP_NON_BLOCKING */
210
211/*
212 * getcomd -- コマンドを得る。
213 */
214
215#ifdef TCP_ECHO_CLI_AUTO_RUN_STR
216
217static char *
218getcomd (ID cepid, bool_t retry, char *apip)
219{
220 ER error;
221 char *line = NULL;
222 static char auto_run_str[] = TCP_ECHO_CLI_AUTO_RUN_STR;
223 static int_t count = 0;
224
225 if (retry || (count == 0)) {
226 line = auto_run_str;
227 dly_tsk(3 * 1000);
228 }
229 else {
230 while ((error = rcv_dtq(DTQ_TCP_ECHO_CLI_SND, (intptr_t*)&line)) != E_OK) {
231 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] error: %s", API_PROTO, cepid, itron_strerror(error));
232 dly_tsk(SLP_ITV);
233 }
234 }
235
236 count ++;
237 return line;
238 }
239
240#else /* of #ifdef TCP_ECHO_CLI_AUTO_RUN_STR */
241
242static char *
243getcomd (ID cepid, bool_t retry, char *apip)
244{
245 ER error;
246 char *line = NULL;
247
248 while ((error = rcv_dtq(DTQ_TCP_ECHO_CLI_SND, (intptr_t*)&line)) != E_OK) {
249 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] error: %s", API_PROTO, cepid, itron_strerror(error));
250 dly_tsk(SLP_ITV);
251 }
252
253#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI)
254
255 if (*line == '6') {
256 line ++;
257 *apip = API_PROTO_IPV6;
258 }
259 else if (*line == '4') {
260 line ++;
261 *apip = API_PROTO_IPV4;
262 }
263 else {
264 *apip= DEFAULT_API_PROTO;
265 if (*line && *line != ' ')
266 line ++;
267 }
268
269#else /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
270
271 *apip= DEFAULT_API_PROTO;
272 if (*line && *line != ' ')
273 line ++;
274
275#endif /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
276
277 return line;
278 }
279
280#endif /* of #ifdef TCP_ECHO_CLI_AUTO_RUN_STR */
281
282/*
283 * TCP ECHO クライアント送信タスク
284 */
285
286/*
287 * IP アドレスの指定
288 */
289
290#define ADDR_IPVn 'n'
291#define ADDR_IPV6 '6'
292#define ADDR_IPV4 '4'
293
294void
295tcp_echo_cli_snd_task (intptr_t exinf)
296{
297 ID tskid, cepid;
298 ER error;
299 T_IN_ADDR addr;
300 char *line;
301 int_t rep, count;
302 bool_t retry = false;
303 uint16_t portno;
304 char apip;
305
306#ifdef USE_TCP_EXTENTIONS
307
308 T_TCP_CCEP ccep;
309
310#endif /* of #ifdef USE_TCP_EXTENTIONS */
311
312#ifdef TCP_ECHO_CLI_AUTO_RUN_STR
313 dly_tsk(START_DLY);
314#endif
315 get_tid(&tskid);
316 syslog(LOG_NOTICE, "[TCP%c ECHO CLI SND:%d,%d] started.", DEFAULT_API_PROTO, tskid, (ID)exinf);
317 while (true) {
318 line = skip_blanks(getcomd((ID)exinf, retry, &apip));
319
320#if defined(SUPPORT_INET6) && !defined(SUPPORT_INET4) && !defined(API_CFG_IP4MAPPED_ADDR)
321
322 if (apip == API_PROTO_IPV4) {
323 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] error: E_PAR", API_PROTO, (ID)exinf);
324 retry = true;
325 continue;
326 }
327
328#endif /* of #if defined(SUPPORT_INET6) && !defined(SUPPORT_INET4) && !defined(API_CFG_IP4MAPPED_ADDR) */
329
330 if ((line = lookup_ipaddr(&addr, line, apip)) == NULL) {
331 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] sleep %d.%03u[s], unknown host.",
332 API_PROTO, (ID)exinf, SLP_ITV / SYSTIM_HZ, SLP_ITV % SYSTIM_HZ);
333 dly_tsk(SLP_ITV);
334 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] resume.", API_PROTO, (ID)exinf);
335 retry = true;
336 continue;
337 }
338 else
339 retry = false;
340
341#if defined(SUPPORT_INET6)
342
343#if defined(USE_TCP4_ECHO_CLI)
344
345#else /* of #if defined(USE_TCP4_ECHO_CLI) */
346
347 if (in6_is_addr_ipv4mapped(&addr))
348 apip = API_PROTO_IPV4;
349 else
350 apip = API_PROTO_IPV6;
351
352#endif /* of #if defined(USE_TCP4_ECHO_CLI) */
353
354#else /* of #if defined(SUPPORT_INET6) */
355
356 if (apip == API_PROTO_IPV6) {
357 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] error: E_PAR", API_PROTO, (ID)exinf);
358 retry = true;
359 continue;
360 }
361
362#endif /* of #if defined(SUPPORT_INET6) */
363
364 line = skip_blanks(line);
365 if ('0' <= *line && *line <= '9') { /* Port No */
366 line = get_int(&rep, line);
367 portno = (uint16_t)rep;
368 }
369 else {
370 line ++;
371 portno = ECHO_SRV_PORTNO;
372 }
373
374 line = skip_blanks(line);
375 if ('0' <= *line && *line <= '9') /* Repeat */
376 line = get_int(&rep, line);
377 else {
378 line ++;
379 rep = 1;
380 }
381
382#ifdef USE_TCP_EXTENTIONS
383
384 ccep.cepatr = 0;
385 ccep.sbufsz = TCP_ECHO_CLI_SWBUF_SIZE;
386 ccep.rbufsz = TCP_ECHO_CLI_RWBUF_SIZE;
387
388#ifdef TCP_CFG_SWBUF_CSAVE
389 ccep.sbuf = NADR;
390#else
391 ccep.sbuf = tcp_echo_cli_swbuf;
392#endif
393#ifdef TCP_CFG_RWBUF_CSAVE
394 ccep.rbuf = NADR;
395#else
396 ccep.rbuf = tcp_echo_cli_rwbuf;
397#endif
398#ifdef USE_TCP_NON_BLOCKING
399 ccep.callback = (FP)callback_nblk_tcp_echo_cli;
400#else
401 ccep.callback = NULL;
402#endif
403
404#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI)
405
406 if (apip == API_PROTO_IPV6) {
407 if ((error = alloc_tcp6_cep(&cepid, tskid, &ccep)) != E_OK) {
408 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] error: %s", apip, cepid, itron_strerror(error));
409 continue;
410 }
411 }
412 else {
413 if ((error = alloc_tcp4_cep(&cepid, tskid, &ccep)) != E_OK) {
414 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] error: %s", apip, cepid, itron_strerror(error));
415 continue;
416 }
417 }
418
419#else /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
420
421 if ((error = ALLOC_TCP_CEP(&cepid, tskid, &ccep)) != E_OK) {
422 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] error: %s", apip, cepid, itron_strerror(error));
423 continue;
424 }
425
426#endif /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
427
428#else /* of #ifdef USE_TCP_EXTENTIONS */
429
430#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI)
431
432 if (apip == API_PROTO_IPV6)
433 cepid = (ID)exinf;
434 else
435 cepid = TCP4_ECHO_CLI_CEPID;
436
437#else /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
438
439 cepid = (ID)exinf;
440
441#endif /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
442
443#endif /* of #ifdef USE_TCP_EXTENTIONS */
444
445 tcp_echo_cli_valid = true;
446 count = 0;
447 while (rep == 0 || count < rep) {
448 if (!tcp_echo_cli_valid) {
449 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] canceled.", apip, cepid);
450 break;
451 }
452
453 count ++;
454 if (rep == 0) {
455 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] start: repeat: %d", apip, cepid, count);
456 error = tcp_echo_cli_snd(cepid, &addr, portno, apip);
457 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] finsh: repeat: %d", apip, cepid, count);
458 }
459 else {
460 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] start: repeat: %d/%d", apip, cepid, count, rep);
461 error = tcp_echo_cli_snd(cepid, &addr, portno, apip);
462 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] finsh: repeat: %d/%d", apip, cepid, count, rep);
463 }
464
465 if (error != E_OK) {
466 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] sleep %d.%03u[s], error: %s",
467 apip, cepid, SLP_ITV / SYSTIM_HZ, SLP_ITV % SYSTIM_HZ, itron_strerror(error));
468 tslp_tsk(SLP_ITV);
469 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] resume.", apip, cepid);
470 }
471
472#if defined(SND_ITV)
473#if SND_ITV > 0
474 if (count < rep) {
475 uint_t itv;
476
477 itv = SND_ITV;
478 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] interval: %d[s].", apip, cepid, itv / SYSTIM_HZ);
479 syscall(dly_tsk(SND_ITV));
480 }
481#endif
482#endif
483 }
484
485#ifdef USE_TCP_EXTENTIONS
486
487 if ((error = FREE_TCP_CEP(cepid)) != E_OK)
488 syslog(LOG_NOTICE, "[TEC%c:%02u TSK] error: %s", apip, cepid, itron_strerror(error));
489
490#endif /* of #ifdef USE_TCP_EXTENTIONS */
491
492 }
493 }
494
495#endif /* of #ifdef USE_TCP_ECHO_CLI */
Note: See TracBrowser for help on using the repository browser.