source: EcnlProtoTool/trunk/asp3_dcre/tinet/netapp/tcp_echo_srv1.c@ 270

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

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 21.2 KB
Line 
1/*
2 * TINET (TCP/IP Protocol Stack)
3 *
4 * Copyright (C) 2001-2009 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_srv1.c 270 2017-02-09 04:03:47Z coas-nagasima $
44 */
45
46/*
47 * TCP ECHO サーバ #1
48 *
49 * ・送受信タスク同一型
50 * ・ノンブロッキングコール
51 * ・省コピー API
52 * ・IPv4/IPv6
53 * ・緊急データの受信
54 */
55
56#include <string.h>
57
58#ifdef TARGET_KERNEL_ASP
59
60#include <kernel.h>
61#include <sil.h>
62#include <t_syslog.h>
63#include "kernel_cfg.h"
64#include "tinet_cfg.h"
65
66#endif /* of #ifdef TARGET_KERNEL_ASP */
67
68#ifdef TARGET_KERNEL_JSP
69
70#include <t_services.h>
71#include "kernel_id.h"
72#include "tinet_id.h"
73
74#endif /* of #ifdef TARGET_KERNEL_JSP */
75
76#include <tinet_defs.h>
77#include <tinet_config.h>
78
79#include <net/if.h>
80#include <net/if_ppp.h>
81#include <net/if_loop.h>
82#include <net/ethernet.h>
83#include <net/net.h>
84#include <net/net_timer.h>
85
86#include <netinet/in.h>
87#include <netinet/in_itron.h>
88#include <netinet/ip.h>
89#include <netinet/ip6.h>
90#include <netinet/tcp.h>
91
92#include <netapp/netapp.h>
93#include <netapp/netapp_var.h>
94#include <netapp/echo.h>
95
96#ifdef USE_TCP_ECHO_SRV1
97
98/*
99 * 表示
100 */
101
102//#define SHOW_RCV_RANGE
103
104/*
105 * コネクション切断方法の指定
106 */
107
108#define USE_TCP_SHT_CEP
109
110/*
111 * タイムアウト
112 */
113
114//#define CLS_TMO TMO_FEVR /* Close Wait は標準で 60秒 */
115#define CLS_TMO (70*SYSTIM_HZ+(net_rand()%SYSTIM_HZ)*10)
116//#define RCV_TMO TMO_FEVR
117#define RCV_TMO (30*SYSTIM_HZ+(net_rand()%SYSTIM_HZ)*30)
118//#define SND_TMO TMO_FEVR
119#define SND_TMO (40*SYSTIM_HZ+(net_rand()%SYSTIM_HZ)*20)
120
121/*
122 * å…
123¨åŸŸå¤‰æ•°
124 */
125
126/* TCP 送受信ウィンドバッファ */
127
128#ifndef TCP_CFG_SWBUF_CSAVE
129uint8_t tcp_echo_srv_swbuf[NUM_TCP_ECHO_SRV_TASKS][TCP_ECHO_SRV_SWBUF_SIZE];
130#endif
131
132#ifndef TCP_CFG_RWBUF_CSAVE
133uint8_t tcp_echo_srv_rwbuf[NUM_TCP_ECHO_SRV_TASKS][TCP_ECHO_SRV_RWBUF_SIZE];
134#endif
135
136/*
137 * 変数
138 */
139
140/*
141 * 注意:
142 *
143 * BUF_SIZE は TCP の
144 * 送信ウインドウバッファサイズ + 受信ウインドウバッファサイズの
145 * 3/2 倍以上の大きさがなければ、デッドロックする可能性がある。
146 */
147
148#define BUF_SIZE ((TCP_ECHO_SRV_SWBUF_SIZE + \
149 TCP_ECHO_SRV_RWBUF_SIZE) * 3 / 2)
150
151static T_IPEP dst; /* 接続相手 */
152
153#ifdef USE_TCP_NON_BLOCKING
154
155static char buffer[BUF_SIZE];
156static ER nblk_error = E_OK;
157static ER_UINT nblk_slen = 0;
158static ER_UINT nblk_rlen = 0;
159
160#else /* of #ifdef USE_TCP_NON_BLOCKING */
161
162#ifdef USE_COPYSAVE_API
163
164#else /* of #ifdef USE_COPYSAVE_API */
165
166static char buffer[BUF_SIZE];
167
168#endif /* of #ifdef USE_COPYSAVE_API */
169
170#endif /* of #ifdef USE_TCP_NON_BLOCKING */
171
172#ifdef USE_TCP_NON_BLOCKING
173
174/*
175 * ノンブロッキングコールのコールバック関数
176 */
177
178ER
179callback_nblk_tcp_echo_srv (ID cepid, FN fncd, void *p_parblk)
180{
181 ER error = E_OK;
182
183 switch (fncd) {
184
185 case TFN_TCP_ACP_CEP:
186 nblk_error = *(ER*)p_parblk;
187 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
188 break;
189
190 case TFN_TCP_RCV_DAT:
191 if ((nblk_rlen = *(ER*)p_parblk) < 0)
192 syslog(LOG_NOTICE, "[TES:%02d CBN] recv error: %s", cepid, itron_strerror(nblk_rlen));
193 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
194 break;
195
196 case TFN_TCP_SND_DAT:
197 if ((nblk_slen = *(ER*)p_parblk) < 0)
198 syslog(LOG_NOTICE, "[TES:%02d CBN] send error: %s", cepid, itron_strerror(nblk_slen));
199 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
200 break;
201
202 case TFN_TCP_CLS_CEP:
203 if ((nblk_error = *(ER*)p_parblk) < 0)
204 syslog(LOG_NOTICE, "[TES:%02d CBN] close error: %s", cepid, itron_strerror(nblk_error));
205 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
206 break;
207
208 case TFN_TCP_RCV_BUF:
209 if ((nblk_rlen = *(ER*)p_parblk) < 0)
210 syslog(LOG_NOTICE, "[TES:%02d CBN] rbuf error: %s", cepid, itron_strerror(nblk_rlen));
211 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
212 break;
213
214 case TFN_TCP_GET_BUF:
215 if ((nblk_slen = *(ER*)p_parblk) < 0)
216 syslog(LOG_NOTICE, "[TES:%02d CBN] sbuf error: %s", cepid, itron_strerror(nblk_slen));
217 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
218 break;
219
220#ifdef USE_TCP_EXTENTIONS
221
222 case TEV_TCP_RCV_OOB:
223 if ((nblk_rlen = *(ER*)p_parblk) < 0)
224 syslog(LOG_NOTICE, "[TES:%02d OOB] callback error: %s", cepid, itron_strerror(nblk_rlen));
225 else if (nblk_rlen > 0) {
226 char ch;
227
228 if ((nblk_rlen = tcp_rcv_oob(cepid, &ch, sizeof(ch))) > 0)
229 syslog(LOG_NOTICE, "[TES:%02d OOB] recv oob: 0x%02x", cepid, ch);
230 else if (nblk_rlen < 0)
231 syslog(LOG_NOTICE, "[TES:%02d OOB] recv error: %s", cepid, itron_strerror(nblk_rlen));
232 }
233 break;
234
235#endif /* of #ifdef USE_TCP_EXTENTIONS */
236
237 case TFN_TCP_CON_CEP:
238 case TFN_TCP_SND_OOB:
239 default:
240 error = E_PAR;
241 break;
242 }
243 return error;
244 }
245
246#ifdef USE_COPYSAVE_API
247
248static ER
249tcp_echo_srv (ID cepid, ID repid)
250{
251 ER error;
252 SYSTIM now;
253 uint32_t total;
254 uint16_t rblen, sblen, rlen, slen, soff, scount, rcount;
255 char *rbuf, *sbuf, head, tail;
256
257 if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_NBLK)) != E_WBLK) {
258 syslog(LOG_NOTICE, "[TES:%02d ACP] error: %s", cepid, itron_strerror(error));
259 return error;
260 }
261
262 /* 相手から接続されるまで待
263つ。*/
264 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
265
266 if (nblk_error == E_OK) {
267 syscall(get_tim(&now));
268 syslog(LOG_NOTICE, "[TES:%02d ACP] connected: %6lu, from: %s.%u",
269 cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno);
270 }
271 else {
272 syslog(LOG_NOTICE, "[TES:%02d ACP] error: %s", cepid, itron_strerror(nblk_error));
273 return nblk_error;
274 }
275
276#ifdef USE_TCP_EXTENTIONS
277 if ((error = free_tcp_rep(repid, true)) != E_OK)
278 syslog(LOG_NOTICE, "[TES:%02d DEL] REP delete error: %s", cepid, itron_strerror(error));
279#endif /* of #ifdef USE_TCP_EXTENTIONS */
280
281 rlen = scount = rcount = total = 0;
282 while (true) {
283 if ((error = tcp_rcv_buf(cepid, (void**)&rbuf, TMO_NBLK)) != E_WBLK) {
284 syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s", cepid, itron_strerror(error));
285 break;
286 }
287
288 /* 受信するまで待
289つ。*/
290 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
291
292 if (nblk_rlen < 0) { /* エラー */
293 syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s",
294 cepid, itron_strerror(nblk_rlen));
295 break;
296 }
297 else if (nblk_rlen == 0) /* 受信終了 */
298 break;
299
300 rblen = nblk_rlen;
301
302 /* バッファの残りにより、受信長を調整する。*/
303 if (rblen > BUF_SIZE - rlen)
304 rblen = BUF_SIZE - rlen;
305 total += rblen;
306 rlen = rblen;
307
308 head = *rbuf;
309 tail = *(rbuf + rblen - 1);
310 rcount ++;
311
312#ifdef SHOW_RCV_RANGE
313 syslog(LOG_NOTICE, "[TES:%02d RCV] "
314 "rcount: %4d, len: %4d, data %02x -> %02x",
315 cepid, rcount, rblen, head, tail);
316#endif /* of #ifdef SHOW_RCV_RANGE */
317
318 memcpy(buffer, rbuf, rblen);
319
320 if ((error = tcp_rel_buf(cepid, rlen)) < 0) {
321 syslog(LOG_NOTICE, "[TES:%02d REL] error: %s",
322 cepid, itron_strerror(error));
323 break;
324 }
325
326 soff = 0;
327 while (rlen > 0) {
328
329 if ((error = tcp_get_buf(cepid, (void**)&sbuf, TMO_NBLK)) != E_WBLK) {
330 syslog(LOG_NOTICE, "[TES:%02d GET] error: %s",
331 cepid, itron_strerror(error));
332 goto err_fin;
333 }
334
335 /* 送信バッファの獲得が完了するまで待
336つ。*/
337 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
338
339 if (nblk_slen < 0) {
340 syslog(LOG_NOTICE, "[TES:%02d GET] error: %s",
341 cepid, itron_strerror(nblk_slen));
342 goto err_fin;
343 }
344
345 sblen = nblk_slen;
346 scount ++;
347 slen = sblen < rlen ? sblen : rlen;
348 memcpy(sbuf, buffer + soff, slen);
349
350 if ((error = tcp_snd_buf(cepid, slen)) != E_OK) {
351 syslog(LOG_NOTICE, "[TES:%02d SND] error: %s",
352 cepid, itron_strerror(error));
353 goto err_fin;
354 }
355#ifdef SHOW_RCV_RANGE
356 syslog(LOG_NOTICE, "[TES:%02d SND] scount: %4d, len: %4d",
357 cepid, scount, slen);
358#endif /* of #ifdef SHOW_RCV_RANGE */
359
360 rlen -= slen;
361 soff += slen;
362 }
363 }
364err_fin:
365
366#ifdef USE_TCP_SHT_CEP
367 if ((error = tcp_sht_cep(cepid)) != E_OK)
368 syslog(LOG_NOTICE, "[TES:%02d SHT] error: %s", cepid, itron_strerror(error));
369#endif /* of #ifdef USE_TCP_SHT_CEP */
370
371 if ((error = tcp_cls_cep(cepid, TMO_NBLK)) != E_WBLK)
372 syslog(LOG_NOTICE, "[TES:%02d CLS] error: %s", cepid, itron_strerror(error));
373
374 /* 開放が完了するまで待
375つ。*/
376 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
377
378 syscall(get_tim(&now));
379 syslog(LOG_NOTICE, "[TES:%02d FIN] finished: %6lu, snd: %4u, rcv: %4u, len: %lu",
380 cepid, now / SYSTIM_HZ, scount, rcount, total);
381
382 return error == E_WBLK ? E_OK : error;
383 }
384
385#else /* of #ifdef USE_COPYSAVE_API */
386
387static ER
388tcp_echo_srv (ID cepid, ID repid)
389{
390 SYSTIM now;
391 ER error;
392 uint32_t total;
393 uint16_t rlen, slen, soff, scount, rcount;
394 char head, tail;
395
396 if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_NBLK)) != E_WBLK) {
397 syslog(LOG_NOTICE, "[TES:%02d ACP] error: %s", cepid, itron_strerror(error));
398 return error;
399 }
400
401 /* 相手から接続されるまで待
402つ。*/
403 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
404
405 if (nblk_error == E_OK) {
406 syscall(get_tim(&now));
407 syslog(LOG_NOTICE, "[TES:%02d ACP] connected: %6lu, from: %s.%u",
408 cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno);
409 }
410 else {
411 syslog(LOG_NOTICE, "[TES:%02d ACP] error: %s", cepid, itron_strerror(nblk_error));
412 return nblk_error;
413 }
414
415#ifdef USE_TCP_EXTENTIONS
416 if ((error = free_tcp_rep(repid, true)) != E_OK)
417 syslog(LOG_NOTICE, "[TES:%02d DEL] REP delete error: %s", cepid, itron_strerror(error));
418#endif /* of #ifdef USE_TCP_EXTENTIONS */
419
420 scount = rcount = total = 0;
421 while (true) {
422 if ((error = tcp_rcv_dat(cepid, buffer, BUF_SIZE - 1, TMO_NBLK)) != E_WBLK) {
423 syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s",
424 cepid, itron_strerror(error));
425 break;
426 }
427
428 /* 受信完了まで待
429つ。*/
430 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
431
432 if (nblk_rlen < 0) {
433 syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s",
434 cepid, itron_strerror(nblk_rlen));
435 break;
436 }
437 else if (nblk_rlen == 0)
438 break;
439
440 rlen = nblk_rlen;
441 head = *buffer;
442 tail = *(buffer + rlen - 1);
443 rcount ++;
444
445#ifdef SHOW_RCV_RANGE
446 syslog(LOG_NOTICE, "[TES:%02d RCV] rcount: %4d, len: %4d, data %02x -> %02x",
447 cepid, rcount, rlen, head, tail);
448#endif /* of #ifdef SHOW_RCV_RANGE */
449
450 total += rlen;
451 soff = 0;
452 while (rlen > 0) {
453 scount ++;
454 if ((error = tcp_snd_dat(cepid, &buffer[soff], rlen, TMO_NBLK)) != E_WBLK) {
455 syslog(LOG_NOTICE, "[TES:%02d SND] error: %s",
456 cepid, itron_strerror(error));
457 goto err_fin;
458 }
459
460 /* 送信完了まで待
461つ。*/
462 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
463
464 if (nblk_slen < 0) {
465 syslog(LOG_NOTICE, "[TES:%02d SND] error: %s",
466 cepid, itron_strerror(nblk_slen));
467 goto err_fin;
468 }
469
470 slen = nblk_slen;
471
472#ifdef SHOW_RCV_RANGE
473 syslog(LOG_NOTICE, "[TES:%02d SND] scount: %4d, len: %4d",
474 cepid, scount, slen);
475#endif /* of #ifdef SHOW_RCV_RANGE */
476
477 rlen -= slen;
478 soff += slen;
479 }
480 }
481err_fin:
482
483#ifdef USE_TCP_SHT_CEP
484 if ((error = tcp_sht_cep(cepid)) != E_OK)
485 syslog(LOG_NOTICE, "[TES:%02d SHT] error: %s", cepid, itron_strerror(error));
486#endif /* of #ifdef USE_TCP_SHT_CEP */
487
488 if ((error = tcp_cls_cep(cepid, TMO_NBLK)) != E_WBLK)
489 syslog(LOG_NOTICE, "[TES:%02d CLS] error: %s", cepid, itron_strerror(error));
490
491 /* 開放が完了するまで待
492つ。*/
493 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
494
495 syscall(get_tim(&now));
496 syslog(LOG_NOTICE, "[TES:%02d FIN] finished: %6lu, snd: %4u, rcv: %4u, len: %lu",
497 cepid, now / SYSTIM_HZ, scount, rcount, total);
498
499 return error == E_WBLK ? E_OK : error;
500 }
501
502#endif /* of #ifdef USE_COPYSAVE_API */
503
504#else /* of #ifdef USE_TCP_NON_BLOCKING */
505
506#ifdef USE_COPYSAVE_API
507
508static ER
509tcp_echo_srv (ID cepid, ID repid)
510{
511 ER_UINT rblen, sblen;
512 SYSTIM now;
513 ER error;
514 uint32_t total;
515 uint16_t rlen, slen, soff, scount, rcount;
516 char *rbuf, *sbuf, head, tail;
517
518 if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_FEVR)) != E_OK) {
519 syslog(LOG_NOTICE, "[TES:%02d ACP] error: %s", cepid, itron_strerror(error));
520 return error;
521 }
522
523#ifdef USE_TCP_EXTENTIONS
524 if ((error = free_tcp_rep(repid, true)) != E_OK)
525 syslog(LOG_NOTICE, "[TES:%02d DEL] REP delete error: %s", cepid, itron_strerror(error));
526#endif /* of #ifdef USE_TCP_EXTENTIONS */
527
528 scount = rcount = total = 0;
529 syscall(get_tim(&now));
530 syslog(LOG_NOTICE, "[TES:%02d ACP] connected: %6lu, from: %s.%u",
531 cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno);
532 while (true) {
533 if ((rblen = tcp_rcv_buf(cepid, (void**)&rbuf, RCV_TMO)) <= 0) {
534 if (rblen != E_OK)
535 syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s",
536 cepid, itron_strerror(rblen));
537 break;
538 }
539
540 head = *rbuf;
541 tail = *(rbuf + rblen - 1);
542 rcount ++;
543
544 //syslog(LOG_NOTICE, "[TES:%02d RCV] len: %4d", cepid, (uint16_t)rblen);
545#ifdef SHOW_RCV_RANGE
546 syslog(LOG_NOTICE, "[TES:%02d RCV] rcount: %4d, len: %4d, data %02x -> %02x",
547 cepid, rcount, (uint16_t)rblen, head, tail);
548#endif /* of #ifdef SHOW_RCV_RANGE */
549
550 rlen = (uint16_t)rblen;
551 total += rblen;
552 soff = 0;
553 while (rlen > 0) {
554
555 if ((sblen = tcp_get_buf(cepid, (void**)&sbuf, SND_TMO)) < 0) {
556 syslog(LOG_NOTICE, "[TES:%02d GET] error: %s",
557 cepid, itron_strerror(sblen));
558 goto err_fin;
559 }
560
561 //syslog(LOG_NOTICE, "[TES:%02d SND] len: %4d", cepid, (uint16_t)sblen);
562 scount ++;
563 slen = rlen < (uint16_t)sblen ? rlen : (uint16_t)sblen;
564 memcpy(sbuf, rbuf + soff, slen);
565 if ((error = tcp_snd_buf(cepid, slen)) != E_OK) {
566 syslog(LOG_NOTICE, "[TES:%02d SND] error: %s",
567 cepid, itron_strerror(error));
568 goto err_fin;
569 }
570#ifdef SHOW_RCV_RANGE
571 syslog(LOG_NOTICE, "[TES:%02d SND] scount: %4d, len: %4d", cepid, scount, slen);
572#endif /* of #ifdef SHOW_RCV_RANGE */
573
574 rlen -= slen;
575 soff += slen;
576 }
577
578 if ((error = tcp_rel_buf(cepid, rblen)) < 0) {
579 syslog(LOG_NOTICE, "[TES:%02d REL] error: %s", cepid, itron_strerror(error));
580 break;
581 }
582 }
583err_fin:
584
585#ifdef USE_TCP_SHT_CEP
586 if ((error = tcp_sht_cep(cepid)) != E_OK)
587 syslog(LOG_NOTICE, "[TES:%02d SHT] error: %s", cepid, itron_strerror(error));
588#endif /* of #ifdef USE_TCP_SHT_CEP */
589
590 if ((error = tcp_cls_cep(cepid, CLS_TMO)) != E_OK)
591 syslog(LOG_NOTICE, "[TES:%02d CLS] error: %s", cepid, itron_strerror(error));
592
593 syscall(get_tim(&now));
594 syslog(LOG_NOTICE, "[TES:%02d FIN] finished: %6lu, snd: %4u, rcv: %4u, len: %lu",
595 cepid, now / SYSTIM_HZ, scount, rcount, total);
596
597 return error;
598 }
599
600#else /* of #ifdef USE_COPYSAVE_API */
601
602/*
603 * tcp_echo_srv -- TCP エコーサーバ
604 */
605
606static ER
607tcp_echo_srv (ID cepid, ID repid)
608{
609 ER_UINT rlen, slen;
610 ER error = E_OK;
611 SYSTIM now;
612 uint32_t total;
613 uint16_t soff, scount, rcount;
614
615 if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_FEVR)) != E_OK) {
616 syslog(LOG_NOTICE, "[TES:%02d ACP] error: %s", cepid, itron_strerror(error));
617 return error;
618 }
619
620#ifdef USE_TCP_EXTENTIONS
621 if ((error = free_tcp_rep(repid, true)) != E_OK)
622 syslog(LOG_NOTICE, "[TES:%02d DEL] REP delete error: %s", cepid, itron_strerror(error));
623#endif /* of #ifdef USE_TCP_EXTENTIONS */
624
625 scount = rcount = total = 0;
626 syscall(get_tim(&now));
627 syslog(LOG_NOTICE, "[TES:%02d ACP] connected: %6lu, from: %s.%u",
628 cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno);
629 while (true) {
630 if ((rlen = tcp_rcv_dat(cepid, buffer, BUF_SIZE - 1, RCV_TMO)) <= 0) {
631 if (rlen != E_OK)
632 syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s",
633 cepid, itron_strerror(rlen));
634 break;
635 }
636
637 rcount ++;
638#ifdef SHOW_RCV_RANGE
639 syslog(LOG_NOTICE, "[TES:%02d RCV] rcount: %4d, len: %4d, data %02x -> %02x",
640 cepid, rcount, (uint16_t)rlen, *buffer, *(buffer + rlen - 1));
641#endif /* of #ifdef SHOW_RCV_RANGE */
642
643 total += rlen;
644 soff = 0;
645 while (rlen > 0) {
646 scount ++;
647 if ((slen = tcp_snd_dat(cepid, &buffer[soff], rlen, SND_TMO)) < 0) {
648 syslog(LOG_NOTICE, "[TES:%02d SND] error: %s",
649 cepid, itron_strerror(slen));
650 goto err_fin;
651 }
652#ifdef SHOW_RCV_RANGE
653 syslog(LOG_NOTICE, "[TES:%02d SND] scount: %4d, len: %4d", cepid, scount, (uint16_t)slen);
654#endif /* of #ifdef SHOW_RCV_RANGE */
655
656 rlen -= slen;
657 soff += slen;
658 }
659 }
660err_fin:
661
662#ifdef USE_TCP_SHT_CEP
663 if ((error = tcp_sht_cep(cepid)) != E_OK)
664 syslog(LOG_NOTICE, "[TES:%02d SHT] error: %s", cepid, itron_strerror(error));
665#endif /* of #ifdef USE_TCP_SHT_CEP */
666
667 if ((error = tcp_cls_cep(cepid, CLS_TMO)) != E_OK)
668 syslog(LOG_NOTICE, "[TES:%02d CLS] error: %s", cepid, itron_strerror(error));
669
670 syscall(get_tim(&now));
671 syslog(LOG_NOTICE, "[TES:%02d FIN] finished: %6lu, snd: %4u, rcv: %4u, len: %lu",
672 cepid, now / SYSTIM_HZ, scount, rcount, total);
673
674 return error;
675 }
676
677#endif /* of #ifdef USE_COPYSAVE_API */
678
679#endif /* of #ifdef USE_TCP_NON_BLOCKING */
680
681#ifdef USE_TCP_EXTENTIONS
682
683/*
684 * get_tcp_rep -- TCP 受付口を獲得する。
685 */
686
687static ER
688get_tcp_rep (ID *repid)
689{
690 ID tskid;
691 T_TCP_CREP crep;
692
693 get_tid(&tskid);
694
695 crep.repatr = UINT_C(0);
696 crep.myaddr.portno = UINT_C(7);
697
698#if defined(SUPPORT_INET4)
699 crep.myaddr.ipaddr = IPV4_ADDRANY;
700#endif
701
702#if defined(SUPPORT_INET6)
703 memcpy(&crep.myaddr.ipaddr, &ipv6_addrany, sizeof(T_IN6_ADDR));
704#endif
705
706 return alloc_tcp_rep(repid, tskid, &crep);
707 }
708
709/*
710 * get_tcp_cep -- TCP 通信端点とを獲得する。
711 */
712
713static ER
714get_tcp_cep (ID *cepid)
715{
716 ID tskid;
717 T_TCP_CCEP ccep;
718
719 get_tid(&tskid);
720
721 ccep.cepatr = UINT_C(0);
722 ccep.sbufsz = TCP_ECHO_SRV_SWBUF_SIZE;
723 ccep.rbufsz = TCP_ECHO_SRV_RWBUF_SIZE;
724
725#ifdef TCP_CFG_SWBUF_CSAVE
726 ccep.sbuf = NADR;
727#else
728 ccep.sbuf = tcp_echo_srv_swbuf;
729#endif
730#ifdef TCP_CFG_RWBUF_CSAVE
731 ccep.rbuf = NADR;
732#else
733 ccep.rbuf = tcp_echo_srv_rwbuf;
734#endif
735#ifdef USE_TCP_NON_BLOCKING
736 ccep.callback = (FP)callback_nblk_tcp_echo_srv;
737#else
738 ccep.callback = NULL;
739#endif
740
741 return alloc_tcp_cep(cepid, tskid, &ccep);
742 }
743
744/*
745 * tcp_echo_srv_task -- TCP エコーサーバタスク
746 */
747
748void
749tcp_echo_srv_task (intptr_t exinf)
750{
751 ID tskid, cepid, repid;
752 ER error = E_OK;
753
754 syscall(get_tid(&tskid));
755 syslog(LOG_NOTICE, "[TCP ECHO SRV:%d] started.", tskid);
756 while (true) {
757
758 syscall(slp_tsk());
759 if ((error = get_tcp_cep (&cepid)) != E_OK) {
760 syslog(LOG_NOTICE, "[TES:00 EXT] CEP create error: %s", itron_strerror(error));
761 continue;
762 }
763
764 while (true) {
765
766 if ((error = get_tcp_rep (&repid)) != E_OK) {
767 syslog(LOG_NOTICE, "[TES:00 EXT] REP create error: %s", itron_strerror(error));
768 break;
769 }
770 else if ((error = tcp_echo_srv(cepid, repid)) != E_OK) {
771 error = free_tcp_rep(repid, error != E_DLT);
772 break;
773 }
774 }
775
776 if ((error = free_tcp_cep(cepid)) != E_OK)
777 syslog(LOG_NOTICE, "[TES:%02d EXT] CEP delete error: %s", cepid, itron_strerror(error));
778
779 }
780 }
781
782#else /* of #ifdef USE_TCP_EXTENTIONS */
783
784/*
785 * tcp_echo_srv_task -- TCP エコーサーバタスク
786 */
787
788void
789tcp_echo_srv_task(intptr_t exinf)
790{
791 ID tskid;
792 ER error;
793
794 syscall(get_tid(&tskid));
795 syslog(LOG_NOTICE, "[TCP ECHO SRV:%d,%d] started.", tskid, (ID)exinf);
796 while (true) {
797 while ((error = tcp_echo_srv((ID)exinf, TCP_ECHO_SRV_REPID)) == E_OK)
798 ;
799 syslog(LOG_NOTICE, "[TES:%02d] goto sleep 60[s], error: %s", (ID)exinf, itron_strerror(error));
800 tslp_tsk(60 * 1000);
801 }
802 }
803
804#endif /* of #ifdef USE_TCP_EXTENTIONS */
805
806#endif /* of #ifdef USE_TCP_ECHO_SRV1 */
Note: See TracBrowser for help on using the repository browser.