source: rubycfg_asp/trunk/asp_dcre/tinet/asp_sample/echos6.c@ 313

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

ソースを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 14.8 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: echos6.c 313 2017-07-23 04:50:32Z coas-nagasima $
44 */
45
46/*
47 * IPv6、TCP ECHO サーバ、送受信タスク同一型
48 */
49
50#include <string.h>
51
52#include <kernel.h>
53#include <t_syslog.h>
54#include "kernel_cfg.h"
55#include "tinet_cfg.h"
56
57#include <netinet/in.h>
58#include <netinet/in_itron.h>
59#include <netinet/tcp.h>
60
61#include "echos6.h"
62
63/*
64 * 外部関数の定義
65 */
66
67extern const char *itron_strerror (ER ercd);
68
69/*
70 * 注意:
71 *
72 * BUF_SIZE は TCP の
73 * 送信ウインドウバッファサイズ + 受信ウインドウバッファサイズの
74 * 3/2 倍以上の大きさがなければ、デッドロックする可能性がある。
75 */
76
77#define BUF_SIZE ((TCP_ECHO_SRV_SWBUF_SIZE + \
78 TCP_ECHO_SRV_RWBUF_SIZE) * 3 / 2)
79
80static T_IPV6EP dst;
81
82#ifdef USE_TCP_NON_BLOCKING
83
84static ER nblk_error = E_OK;
85static ER_UINT nblk_slen = 0;
86static ER_UINT nblk_rlen = 0;
87
88#endif /* of #ifdef USE_TCP_NON_BLOCKING */
89
90#ifndef USE_COPYSAVE_API
91
92static uint8_t buffer[BUF_SIZE];
93
94#endif /* of #ifndef USE_COPYSAVE_API */
95
96/*
97 * TCP 送受信バッファ
98 */
99
100uint8_t tcp_echo_srv_swbuf[TCP_ECHO_SRV_SWBUF_SIZE];
101uint8_t tcp_echo_srv_rwbuf[TCP_ECHO_SRV_RWBUF_SIZE];
102
103#ifdef USE_TCP_NON_BLOCKING
104
105/*
106 * ノンブロッキングコールのコールバック関数
107 */
108
109ER
110callback_nblk_tcp_echo_srv (ID cepid, FN fncd, void *p_parblk)
111{
112 ER error = E_OK;
113
114 switch (fncd) {
115
116 case TFN_TCP_ACP_CEP:
117 nblk_error = *(ER*)p_parblk;
118 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
119 break;
120
121 case TFN_TCP_RCV_DAT:
122 if ((nblk_rlen = *(ER_UINT*)p_parblk) < 0)
123 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CBN] recv err: %s", itron_strerror(nblk_rlen));
124 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
125 break;
126
127 case TFN_TCP_SND_DAT:
128 if ((nblk_slen = *(ER_UINT*)p_parblk) < 0)
129 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CBN] send err: %s", itron_strerror(nblk_slen));
130 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
131 break;
132
133 case TFN_TCP_CLS_CEP:
134 if ((nblk_error = *(ER*)p_parblk) < 0)
135 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CBN] clse err: %s", itron_strerror(nblk_error));
136 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
137 break;
138
139 case TFN_TCP_RCV_BUF:
140 if ((nblk_rlen = *(ER_UINT*)p_parblk) < 0)
141 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CBN] rbuf err: %s", itron_strerror(nblk_rlen));
142 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
143 break;
144
145 case TFN_TCP_GET_BUF:
146 if ((nblk_slen = *(ER_UINT*)p_parblk) < 0)
147 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CBN] sbuf err: %s", itron_strerror(nblk_slen));
148 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
149 break;
150
151 case TFN_TCP_CON_CEP:
152 case TFN_TCP_SND_OOB:
153 default:
154 error = E_PAR;
155 break;
156 }
157 return error;
158 }
159
160#ifdef USE_COPYSAVE_API
161
162void
163tcp_echo_srv_task(intptr_t exinf)
164{
165 ID tskid;
166 ER error = E_OK;
167 uint32_t total;
168 uint16_t rblen, sblen, rlen, slen, soff, count;
169 char *rbuf, *sbuf;
170
171 get_tid(&tskid);
172 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK):%d,%d] (copy save API) started.", tskid, (int_t)exinf);
173 while (true) {
174 if ((error = tcp6_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) {
175 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(error));
176 continue;
177 }
178
179 /* 相手から接続されるまで待
180つ。*/
181 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
182
183 if (nblk_error == E_OK)
184 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] connected from %s:%d", ipv62str(NULL, &dst.ipaddr), dst.portno);
185 else {
186 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error));
187 continue;
188 }
189
190 total = rlen = count = 0;
191 while (true) {
192 if ((error = tcp_rcv_buf((int_t)exinf, (void **)&rbuf, TMO_NBLK)) != E_WBLK) {
193 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s", itron_strerror(error));
194 break;
195 }
196
197 /* 受信するまで待
198つ。*/
199 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
200
201 if (nblk_rlen < 0) { /* エラー */
202 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s", itron_strerror(nblk_rlen));
203 break;
204 }
205 else if (nblk_rlen == 0) /* 受信終了 */
206 break;
207
208 rblen = (uint16_t)nblk_rlen;
209
210 /* バッファの残りにより、受信長を調整する。*/
211 if (rblen > BUF_SIZE - rlen)
212 rblen = BUF_SIZE - rlen;
213
214 total += rblen;
215 rlen = rblen;
216 count ++;
217 memcpy(buffer, rbuf, rblen);
218
219 if ((error = tcp_rel_buf((int_t)exinf, rlen)) < 0) {
220 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) REL] error: %s",
221 itron_strerror(error));
222 break;
223 }
224
225 soff = 0;
226 while (rlen > 0) {
227
228 if ((error = tcp_get_buf((int_t)exinf, (void **)&sbuf, TMO_NBLK)) != E_WBLK) {
229 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) GET] error: %s",
230 itron_strerror(error));
231 goto err_fin;
232 }
233
234 /* 送信バッファの獲得が完了するまで待
235つ。*/
236 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
237
238 if (nblk_slen < 0) {
239 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) GET] error: %s",
240 itron_strerror(nblk_slen));
241 goto err_fin;
242 }
243 else
244 /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) GET] len: %d", nblk_slen)*/;
245
246 sblen = (uint16_t)nblk_slen;
247 slen = sblen < rlen ? sblen : rlen;
248 memcpy(sbuf, buffer + soff, slen);
249
250 if ((error = tcp_snd_buf((int_t)exinf, slen)) != E_OK) {
251 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s",
252 itron_strerror(error));
253 goto err_fin;
254 }
255 /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] len: %d", slen);*/
256
257 rlen -= slen;
258 soff += slen;
259 }
260 }
261 err_fin:
262
263 if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
264 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SHT] error: %s", itron_strerror(error));
265
266 if ((error = tcp_cls_cep((int_t)exinf, TMO_NBLK)) != E_WBLK)
267 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CLS] error: %s", itron_strerror(error));
268
269 /* 開放が完了するまで待
270つ。*/
271 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
272
273 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) FIN] finished, total count: %d, len: %d", count, total);
274 }
275 }
276
277#else /* of #ifdef USE_COPYSAVE_API */
278
279void
280tcp_echo_srv_task(intptr_t exinf)
281{
282 ID tskid;
283 ER error;
284 uint32_t total;
285 uint16_t rlen, slen, soff, count;
286
287 get_tid(&tskid);
288 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK):%d,%d] started.", tskid, (int_t)exinf);
289 while (true) {
290 if ((error = tcp6_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) {
291 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(error));
292 continue;
293 }
294
295 /* 相手から接続されるまで待
296つ。*/
297 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
298
299 if (nblk_error == E_OK) {
300 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] connected from %s:%d",
301 ipv62str(NULL, &dst.ipaddr), dst.portno);
302 }
303 else {
304 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error));
305 continue;
306 }
307
308 count = total = 0;
309 while (true) {
310 if ((error = tcp_rcv_dat((int_t)exinf, buffer, BUF_SIZE - 1, TMO_NBLK)) != E_WBLK) {
311 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s",
312 itron_strerror(error));
313 break;
314 }
315
316 /* 受信完了まで待
317つ。*/
318 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
319
320 if (nblk_rlen < 0) {
321 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s",
322 itron_strerror(nblk_rlen));
323 break;
324 }
325 else if (nblk_rlen == 0)
326 break;
327
328 rlen = (uint16_t)nblk_rlen;
329 total += (uint32_t)nblk_rlen;
330 count ++;
331 soff = 0;
332 while (rlen > 0) {
333 if ((error = tcp_snd_dat((int_t)exinf, &buffer[soff], rlen, TMO_NBLK)) != E_WBLK) {
334 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s",
335 itron_strerror(error));
336 goto err_fin;
337 }
338
339 /* 送信完了まで待
340つ。*/
341 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
342
343 if (nblk_slen < 0) {
344 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s",
345 itron_strerror(nblk_slen));
346 goto err_fin;
347 }
348 else
349 /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] len: %4d", nblk_slen)*/;
350
351 slen = (uint16_t)nblk_slen;
352 rlen -= slen;
353 soff += slen;
354 }
355 }
356 err_fin:
357
358 if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
359 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SHT] error: %s", itron_strerror(error));
360
361 if ((error = tcp_cls_cep((int_t)exinf, TMO_NBLK)) != E_WBLK)
362 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CLS] error: %s", itron_strerror(error));
363
364 /* 開放が完了するまで待
365つ。*/
366 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
367
368 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) FIN] finished, total cnt: %d, len: %d", count, total);
369 }
370 }
371
372#endif /* of #ifdef USE_COPYSAVE_API */
373
374#else /* of #ifdef USE_TCP_NON_BLOCKING */
375
376#ifdef USE_COPYSAVE_API
377
378void
379tcp_echo_srv_task(intptr_t exinf)
380{
381 ID tskid;
382 ER_UINT rblen, sblen;
383 ER error = E_OK;
384 uint32_t total;
385 uint16_t rlen, slen, soff, count;
386 char *rbuf, *sbuf;
387
388 get_tid(&tskid);
389 syslog(LOG_NOTICE, "[TCP ECHO SRV:%d,%d] (copy save API) started.", tskid, (int_t)exinf);
390 while (true) {
391 if (tcp6_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_FEVR) != E_OK) {
392 syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] error: %s", itron_strerror(error));
393 continue;
394 }
395
396 total = count = 0;
397 syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] connected from %s:%d", ipv62str(NULL, &dst.ipaddr), dst.portno);
398 while (true) {
399 if ((rblen = tcp_rcv_buf((int_t)exinf, (void **)&rbuf, TMO_FEVR)) <= 0) {
400 if (rblen != E_OK)
401 syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] error: %s", itron_strerror(rblen));
402 break;
403 }
404
405 rlen = (uint16_t)rblen;
406 total += (uint32_t)rblen;
407 count ++;
408 soff = 0;
409 while (rlen > 0) {
410
411 if ((sblen = tcp_get_buf((int_t)exinf, (void **)&sbuf, TMO_FEVR)) < 0) {
412 syslog(LOG_NOTICE, "[TCP ECHO SRV GET] error: %s",
413 itron_strerror(sblen));
414 goto err_fin;
415 }
416 /*syslog(LOG_NOTICE, "[TCP ECHO SRV GET] len: %d", sblen);*/
417
418 slen = rlen < (uint16_t)sblen ? rlen : (uint16_t)sblen;
419 memcpy(sbuf, rbuf + soff, slen);
420 if ((error = tcp_snd_buf((int_t)exinf, slen)) != E_OK) {
421 syslog(LOG_NOTICE, "[TCP ECHO SRV SND] error: %s",
422 itron_strerror(error));
423 goto err_fin;
424 }
425 /*syslog(LOG_NOTICE, "[TCP ECHO SRV SND] len: %d", slen);*/
426
427 rlen -= slen;
428 soff += slen;
429 }
430
431 if ((error = tcp_rel_buf((int_t)exinf, rblen)) < 0) {
432 syslog(LOG_NOTICE, "[TCP ECHO SRV REL] error: %s", itron_strerror(error));
433 break;
434 }
435 }
436 err_fin:
437
438 if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
439 syslog(LOG_NOTICE, "[TCP ECHO SRV SHT] error: %s", itron_strerror(error));
440
441 if ((error = tcp_cls_cep((int_t)exinf, TMO_FEVR)) != E_OK)
442 syslog(LOG_NOTICE, "[TCP ECHO SRV CLS] error: %s", itron_strerror(error));
443
444 syslog(LOG_NOTICE, "[TCP ECHO SRV FIN] finished, total cnt: %d, len: %d", count, total);
445 }
446 }
447
448#else /* of #ifdef USE_COPYSAVE_API */
449
450void
451tcp_echo_srv_task(intptr_t exinf)
452{
453 ID tskid;
454 ER_UINT rlen, slen;
455 ER error = E_OK;
456 uint16_t soff, count, total;
457
458 get_tid(&tskid);
459 syslog(LOG_NOTICE, "[TCP ECHO SRV:%d,%d] started.", tskid, (int_t)exinf);
460 while (true) {
461 if (tcp6_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_FEVR) != E_OK) {
462 syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] error: %s", itron_strerror(error));
463 continue;
464 }
465
466 total = count = 0;
467 syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] connected from %s:%d",
468 ipv62str(NULL, &dst.ipaddr), dst.portno);
469 while (true) {
470 if ((rlen = tcp_rcv_dat((int_t)exinf, buffer, BUF_SIZE - 1, TMO_FEVR)) <= 0) {
471 if (rlen != E_OK)
472 syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] error: %s",
473 itron_strerror(rlen));
474 break;
475 }
476
477 /*syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] count: %4d, len: %4d, data %02x -> %02x",
478 ++ count, (uint16_t)rlen, *buffer, *(buffer + rlen - 1));*/
479 count ++;
480 total += (uint16_t)rlen;
481 soff = 0;
482 while (rlen > 0) {
483 if ((slen = tcp_snd_dat((int_t)exinf, &buffer[soff], rlen, TMO_FEVR)) < 0) {
484 syslog(LOG_NOTICE, "[TCP ECHO SRV SND] error: %s",
485 itron_strerror(slen));
486 goto err_fin;
487 }
488 /*syslog(LOG_NOTICE, "[TCP ECHO SRV SND] len: %d", slen);*/
489 rlen -= slen;
490 soff += (uint16_t)slen;
491 }
492 }
493 err_fin:
494
495 if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
496 syslog(LOG_NOTICE, "[TCP ECHO SRV SHT] error: %s", itron_strerror(error));
497
498 if ((error = tcp_cls_cep((int_t)exinf, TMO_FEVR)) != E_OK)
499 syslog(LOG_NOTICE, "[TCP ECHO SRV CLS] error: %s", itron_strerror(error));
500
501 syslog(LOG_NOTICE, "[TCP ECHO SRV FIN] finished, total cnt: %d, len: %d", count, total);
502 }
503 }
504
505#endif /* of #ifdef USE_COPYSAVE_API */
506
507#endif /* of #ifdef USE_TCP_NON_BLOCKING */
Note: See TracBrowser for help on using the repository browser.