source: azure_iot_hub/trunk/asp3_dcre/tinet/netapp/tcp_echo_cli_snd.c@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 13.9 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 * 上記著作権者
8は,以下の (1)~(4) の条件か,Free Software Foundation
9 * によってå…
10¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
14 * 利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22 * 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24 * の無保証規定を掲載すること.
25 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26 * 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®æ¡ä»¶ã‚’満たすこと.
28 * (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
33 * 害からも,上記著作権者
34およびTOPPERSプロジェクトをå…
35è²¬ã™ã‚‹ã“と.
36 *
37 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
38お
39 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
40 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
41 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
42 *
43 * @(#) $Id: tcp_echo_cli_snd.c 388 2019-05-22 11:25:18Z coas-nagasima $
44 */
45
46/*
47 * TCP ECHO クライアント送信関数
48 */
49
50#include <stdlib.h>
51
52#ifdef TARGET_KERNEL_ASP
53
54#include <kernel.h>
55#include <sil.h>
56#include <t_syslog.h>
57#include "kernel_cfg.h"
58
59#endif /* of #ifdef TARGET_KERNEL_ASP */
60
61#ifdef TARGET_KERNEL_JSP
62
63#include <t_services.h>
64#include "kernel_id.h"
65
66#endif /* of #ifdef TARGET_KERNEL_JSP */
67
68#include <netinet/in.h>
69#include <netinet/in_itron.h>
70
71#include <netapp/netapp.h>
72#include <netapp/netapp_var.h>
73#include <netapp/tcp_echo_cli.h>
74
75#ifdef USE_TCP_ECHO_CLI
76
77/* 表示 */
78
79//#define SHOW_TIME_OUT
80//#define SHOW_SND_COUNT
81
82/* タイムアウト */
83
84#ifdef TOPPERS_S810_CLG3_85
85
86#define CON_TMO TMO_FEVR
87//#define CON_TMO (60*SYSTIM_HZ)
88//#define SND_TMO TMO_FEVR
89#define SND_TMO (30*SYSTIM_HZ)
90
91#else /* of #ifdef TOPPERS_S810_CLG3_85 */
92
93#define CON_TMO TMO_FEVR
94//#define CON_TMO (60*SYSTIM_HZ)
95//#define SND_TMO TMO_FEVR
96#define SND_TMO (30*SYSTIM_HZ+(netapp_rand()%SYSTIM_HZ)*30)
97
98#endif /* of #ifdef TOPPERS_S810_CLG3_85 */
99
100#ifdef USE_TCP_NON_BLOCKING
101
102/*
103 * 変数
104 */
105
106#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI)
107
108static T_IPV4EP nblk_src4 = {
109 IPV4_ADDRANY,
110 TCP_PORTANY,
111 };
112static T_IPV4EP nblk_dst4;
113
114#endif /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
115
116static T_IPEP nblk_src = {
117 IP_ADDRANY,
118 TCP_PORTANY,
119 };
120static T_IPEP nblk_dst;
121
122#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI)
123
124/*
125 * tcp4_active_open -- 能動オープンを実行する。
126 *
127 * USE_TCP_NON_BLOCKING ON
128 */
129
130static ER
131tcp4_active_open (ID cepid, T_IN4_ADDR ipaddr, uint16_t portno)
132{
133 ER error;
134 SYSTIM time;
135
136 nblk_dst4.ipaddr = ipaddr;
137 nblk_dst4.portno = portno;
138
139 if ((error = tcp_con_cep(cepid, &nblk_src4, &nblk_dst4, TMO_NBLK)) != E_WBLK) {
140 syslog(LOG_NOTICE, "[TEC4:%02u CON] error: %s", cepid, itron_strerror(error));
141 return error;
142 }
143
144 /* 接続が完了するまで待
145つ。*/
146 syscall(wai_sem(SEM_TCP_ECHO_CLI_NBLK_READY));
147
148 if ((error = tcp_echo_cli_nblk_error) != E_OK) {
149 syslog(LOG_NOTICE, "[TEC4:%02u CON] error: %s", cepid, itron_strerror(tcp_echo_cli_nblk_error));
150 return error;
151 }
152
153 get_tim(&time);
154 syslog(LOG_NOTICE, "[TEC4:%02u CON] conct: %7lu, to: %s.%u",
155 cepid, time / SYSTIM_HZ, ip2str(NULL, &nblk_dst4.ipaddr), nblk_dst4.portno);
156 return error;
157 }
158
159#endif /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
160
161/*
162 * tcp_active_open -- 能動オープンを実行する。
163 *
164 * USE_TCP_NON_BLOCKING ON
165 */
166
167static ER
168tcp_active_open (ID cepid, T_IN_ADDR *ipaddr, uint16_t portno, char apip)
169{
170 ER error;
171 SYSTIM time;
172
173 nblk_dst.ipaddr = *ipaddr;
174 nblk_dst.portno = portno;
175
176 if ((error = TCP_CON_CEP(cepid, &nblk_src, &nblk_dst, TMO_NBLK)) != E_WBLK) {
177 if (error == E_PAR || error == E_ID)
178 syslog(LOG_NOTICE, "[TEC%c:%02u CON] error: %s, API: IPv%c, addr: %s",
179 apip, cepid, itron_strerror(error), apip, IP2STR(NULL, ipaddr));
180 else
181 syslog(LOG_NOTICE, "[TEC%c:%02u CON] error: %s",
182 apip, cepid, itron_strerror(error));
183 return error;
184 }
185
186 /* 接続が完了するまで待
187つ。*/
188 syscall(wai_sem(SEM_TCP_ECHO_CLI_NBLK_READY));
189
190 if ((error = tcp_echo_cli_nblk_error) != E_OK) {
191 syslog(LOG_NOTICE, "[TEC%c:%02u CON] error: %s",
192 apip, cepid, itron_strerror(tcp_echo_cli_nblk_error));
193 return error;
194 }
195
196 get_tim(&time);
197 syslog(LOG_NOTICE, "[TEC%c:%02u CON] conct: %7lu, to: %s.%u",
198 apip, cepid, time / SYSTIM_HZ,
199 IP2STR(NULL, &nblk_dst.ipaddr), nblk_dst.portno);
200 return error;
201 }
202
203/*
204 * tcp_echo_cli_snd -- ECHO/TCP サーバにメッセージを送信する。
205 *
206 * USE_TCP_NON_BLOCKING ON
207 */
208
209ER
210tcp_echo_cli_snd (ID cepid, T_IN_ADDR *ipaddr, uint16_t portno, char apip)
211{
212 static char smsg[SND_BUF_SIZE];
213
214 ER_UINT slen;
215 ER error;
216 uint32_t total;
217 uint16_t soff, echo, rep;
218 char *p, pat;
219
220#ifdef SND_URG_DATA_SIZE
221 int_t urg = SND_URG_COUNT;
222#endif
223
224 p = smsg;
225 for (rep = NUM_REP_PAT; rep -- > 0; )
226 for (pat = PAT_BEGIN; pat <= PAT_END; pat ++)
227 *p ++ = pat;
228
229#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI)
230
231 if (apip == API_PROTO_IPV6) {
232 if ((error = tcp_active_open(cepid, ipaddr, portno, apip)) != E_OK)
233 return error;
234 }
235 else if (in6_is_addr_ipv4mapped(ipaddr)) {
236 if ((error = tcp4_active_open(cepid, ntohl(ipaddr->s6_addr32[3]), portno)) != E_OK)
237 return error;
238 }
239 else {
240 if ((error = tcp_active_open(cepid, ipaddr, portno, apip)) != E_OK)
241 return error;
242 }
243
244#else /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
245
246 if ((error = tcp_active_open(cepid, ipaddr, portno, apip)) != E_OK)
247 return error;
248
249#endif /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
250
251 if ((error = psnd_dtq(DTQ_TCP_ECHO_CLI_RCV, (intptr_t)cepid)) != E_OK) {
252 syslog(LOG_NOTICE, "[TEC%c:%02u DTQ] error: %s", apip, cepid, itron_strerror(error));
253 goto cls_ret;
254 }
255
256 tcp_echo_cli_scount = total = 0;
257 for (echo = NUM_ECHO; echo -- > 0; ) {
258 soff = 0;
259 while (soff < SND_BUF_SIZE) {
260#ifdef SHOW_TIME_OUT
261 syslog(LOG_NOTICE, "[TEC%c:%02u SND] tmo: %7lu", apip, cepid, SND_TMO);;
262#endif/* of #ifdef SHOW_TIME_OUT */
263 if ((slen = tcp_snd_dat(cepid, smsg + soff, sizeof(smsg) - soff, SND_TMO)) < 0) {
264 syslog(LOG_NOTICE, "[TEC%c:%02u SND] error: %s",
265 apip, cepid, itron_strerror(slen));
266 error = slen;
267 goto cls_ret;
268 }
269 soff += (uint16_t)slen;
270 total += slen;
271 tcp_echo_cli_scount ++;
272#ifdef SHOW_SND_COUNT
273 syslog(LOG_NOTICE, "[TEC%c:%02u SND] count: %7lu, len: %4u, off: %4u",
274 apip, cepid, tcp_echo_cli_scount, (uint16_t)slen, soff);
275#endif/* of #ifdef SHOW_SND_COUNT */
276
277#ifdef SND_URG_DATA_SIZE
278 if (urg) {
279 if (urg == 1) {
280 if ((error = tcp_snd_oob(cepid, smsg, SND_URG_DATA_SIZE, TMO_NBLK)) != E_WBLK)
281 syslog(LOG_NOTICE, "[TEC%c:%02u OOB] error: %s",
282 apip, cepid, itron_strerror(error));
283 }
284 urg --;
285 }
286#endif/* of #ifdef SND_URG_DATA_SIZE */
287
288#if defined(SND_DLY)
289#if SND_DLY > 0
290 syscall(dly_tsk(SND_DLY + netapp_rand() % SYSTIM_HZ));
291#endif
292#endif
293 }
294 }
295
296cls_ret:
297 if ((error = tcp_sht_cep(cepid)) < 0)
298 syslog(LOG_NOTICE, "[TEC%c:%02u SHT] error: %s", apip, cepid, itron_strerror(error));
299
300 /* 受信が完了するまで待
301つ。*/
302 syscall(slp_tsk());
303
304 return error;
305 }
306
307#else /* of #ifdef USE_TCP_NON_BLOCKING */
308
309#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI)
310
311/*
312 * tcp4_active_open -- 能動オープンを実行する。
313 *
314 * USE_TCP_NON_BLOCKING OFF
315 */
316
317static ER
318tcp4_active_open (ID cepid, T_IN4_ADDR ipaddr, uint16_t portno)
319{
320 static T_IPV4EP src = {
321 IPV4_ADDRANY,
322 TCP_PORTANY,
323 };
324
325 T_IPV4EP dst;
326 ER error;
327 SYSTIM time;
328
329 dst.ipaddr = ipaddr;
330 dst.portno = portno;
331
332#ifdef SHOW_TIME_OUT
333 syslog(LOG_NOTICE, "[TEC%c:%02u CON] tmo: %7lu", API_PROTO_IPV4, cepid, CON_TMO);
334#endif /* of #ifdef SHOW_TIME_OUT */
335 if ((error = tcp_con_cep(cepid, &src, &dst, CON_TMO)) != E_OK) {
336 syslog(LOG_NOTICE, "[TEC%c:%02u CON] error: %s, addr: %s",
337 API_PROTO_IPV4, cepid, itron_strerror(error), ip2str(NULL, &ipaddr));
338 return error;
339 }
340
341 get_tim(&time);
342 syslog(LOG_NOTICE, "[TEC%c:%02u CON] conct: %7lu, to: %s.%u",
343 API_PROTO_IPV4, cepid, time / SYSTIM_HZ, ip2str(NULL, &dst.ipaddr), dst.portno);
344 return error;
345 }
346
347#endif /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
348
349/*
350 * tcp_active_open -- 能動オープンを実行する。
351 *
352 * USE_TCP_NON_BLOCKING OFF
353 */
354
355static ER
356tcp_active_open (ID cepid, T_IN_ADDR *ipaddr, uint16_t portno, char apip)
357{
358 static T_IPEP src = {
359 IP_ADDRANY,
360 TCP_PORTANY,
361 };
362
363 T_IPEP dst;
364 ER error;
365 SYSTIM time;
366
367 dst.ipaddr = *ipaddr;
368 dst.portno = portno;
369
370#ifdef SHOW_TIME_OUT
371 syslog(LOG_NOTICE, "[TEC%c:%02u CON] tmo: %7lu", apip, cepid, CON_TMO);
372#endif /* of #ifdef SHOW_TIME_OUT */
373 if ((error = TCP_CON_CEP(cepid, &src, &dst, CON_TMO)) != E_OK) {
374 if (error == E_PAR || error == E_ID)
375 syslog(LOG_NOTICE, "[TEC%c:%02u CON] error: %s, API: IPv%c, addr: %s",
376 apip, cepid, itron_strerror(error), apip, IP2STR(NULL, ipaddr));
377 else
378 syslog(LOG_NOTICE, "[TEC%c:%02u CON] error: %s", apip, cepid, itron_strerror(error));
379 return error;
380 }
381
382 get_tim(&time);
383 syslog(LOG_NOTICE, "[TEC%c:%02u CON] conct: %7lu, to: %s.%u",
384 apip, cepid, time / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno);
385 return error;
386 }
387
388/*
389 * tcp_echo_cli_snd -- ECHO/TCP サーバにメッセージを送信する。
390 *
391 * USE_TCP_NON_BLOCKING OFF
392 */
393
394ER
395tcp_echo_cli_snd (ID cepid, T_IN_ADDR *ipaddr, uint16_t portno, char apip)
396{
397 static char smsg[SND_BUF_SIZE];
398
399 ER_UINT slen;
400 ER error;
401 uint32_t total;
402 uint16_t soff, echo, rep;
403 char *p, pat;
404
405#ifdef SND_URG_DATA_SIZE
406 int_t urg = SND_URG_COUNT;
407#endif
408
409 p = smsg;
410 for (rep = NUM_REP_PAT; rep -- > 0; )
411 for (pat = PAT_BEGIN; pat <= PAT_END; pat ++)
412 *p ++ = pat;
413
414#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI)
415
416 if (apip == API_PROTO_IPV6) {
417 if ((error = tcp_active_open(cepid, ipaddr, portno, apip)) != E_OK)
418 return error;
419 }
420 else if (in6_is_addr_ipv4mapped(ipaddr)) {
421 if ((error = tcp4_active_open(cepid, ntohl(ipaddr->s6_addr32[3]), portno)) != E_OK)
422 return error;
423 }
424 else {
425 if ((error = tcp_active_open(cepid, ipaddr, portno, apip)) != E_OK)
426 return error;
427 }
428
429#else /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
430
431 if ((error = tcp_active_open(cepid, ipaddr, portno, apip)) != E_OK)
432 return error;
433
434#endif /* of #if defined(SUPPORT_INET6) && defined(SUPPORT_INET4) && defined(USE_TCP4_ECHO_CLI) */
435
436 if ((error = psnd_dtq(DTQ_TCP_ECHO_CLI_RCV, (intptr_t)cepid)) != E_OK) {
437 syslog(LOG_NOTICE, "[TEC%c:%02u DTQ] error: %s", apip, cepid, itron_strerror(error));
438 goto cls_ret;
439 }
440
441 tcp_echo_cli_scount = total = 0;
442 for (echo = NUM_ECHO; echo -- > 0; ) {
443 soff = 0;
444 while (soff < SND_BUF_SIZE) {
445#ifdef SHOW_TIME_OUT
446 syslog(LOG_NOTICE, "[TEC%c:%02u SND] tmo: %7lu", apip, cepid, SND_TMO);
447#endif /* of #ifdef SHOW_TIME_OUT */
448 if ((slen = tcp_snd_dat(cepid, smsg + soff, sizeof(smsg) - soff, SND_TMO)) < 0) {
449 syslog(LOG_NOTICE, "[TEC%c:%02u SND] error: %s", apip, cepid, itron_strerror(slen));
450 error = slen;
451 goto cls_ret;
452 }
453 soff += (uint16_t)slen;
454 total += slen;
455 tcp_echo_cli_scount ++;
456#ifdef SHOW_SND_COUNT
457 syslog(LOG_NOTICE, "[TEC%c:%02u SND] count: %7lu, len: %4u",
458 apip, cepid, tcp_echo_cli_scount, (uint16_t)slen);
459#endif /* of #ifdef SHOW_SND_COUNT */
460
461#ifdef SND_URG_DATA_SIZE
462 if (urg > 0) {
463 if (urg == 1) {
464#ifdef SHOW_TIME_OUT
465 syslog(LOG_NOTICE, "[TEC%c:%02u SND] tmo: %7lu", apip, cepid, SND_TMO);
466#endif /* of #ifdef SHOW_TIME_OUT */
467 if ((slen = tcp_snd_oob(cepid, smsg, SND_URG_DATA_SIZE, SND_TMO)) >= 0)
468 syslog(LOG_NOTICE, "[TEC%c:%02u SND] urg: %7lu",
469 apip, cepid, (uint16_6)slen);
470 else
471 syslog(LOG_NOTICE, "[TEC%c:%02u OOB] error: %s",
472 apip, cepid, itron_strerror(slen));
473 }
474 urg --;
475 }
476#endif /* of #ifdef SND_URG_DATA_SIZE */
477
478#if defined(SND_DLY)
479#if SND_DLY > 0
480 syscall(dly_tsk(SND_DLY + netapp_rand() % SYSTIM_HZ));
481#endif
482#endif
483 }
484 }
485
486cls_ret:
487 if ((error = tcp_sht_cep(cepid)) < 0)
488 syslog(LOG_NOTICE, "[TEC%c:%02u SHT] error: %s", apip, cepid, itron_strerror(error));
489
490 /* 受信が完了するまで待
491つ。*/
492 syscall(slp_tsk());
493
494 return error;
495 }
496
497#endif /* of #ifdef USE_TCP_NON_BLOCKING */
498
499#endif /* of #ifdef USE_TCP_ECHO_CLI */
Note: See TracBrowser for help on using the repository browser.