source: EcnlProtoTool/trunk/asp3_dcre/tinet/netapp/tcp_discard_cli.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: 10.8 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_discard_cli.c 270 2017-02-09 04:03:47Z coas-nagasima $
44 */
45
46/*
47 * TCP DISCARD クライアント
48 *
49 * ・ノンブロッキングコール
50 * ・IPv4
51 * ・IPv6
52 */
53
54#include <stdlib.h>
55
56#ifdef TARGET_KERNEL_ASP
57
58#include <kernel.h>
59#include <sil.h>
60#include <t_syslog.h>
61#include "kernel_cfg.h"
62
63#endif /* of #ifdef TARGET_KERNEL_ASP */
64
65#ifdef TARGET_KERNEL_JSP
66
67#include <t_services.h>
68#include "kernel_id.h"
69
70#endif /* of #ifdef TARGET_KERNEL_JSP */
71
72#include <tinet_defs.h>
73#include <tinet_config.h>
74
75#include <net/if.h>
76#include <net/if_ppp.h>
77#include <net/if_loop.h>
78#include <net/ethernet.h>
79#include <net/net.h>
80#include <net/net_var.h>
81#include <net/net_timer.h>
82
83#include <netinet/in.h>
84#include <netinet/in_itron.h>
85#include <netinet/ip.h>
86#include <netinet/ip6.h>
87#include <netinet/tcp.h>
88
89#include <netapp/netapp.h>
90#include <netapp/netapp_var.h>
91#include <netapp/discard.h>
92
93#ifdef USE_TCP_DISCARD_CLI
94
95/* discard サーバのポート番号 */
96
97#define DISCARD_SRV_PORTNO UINT_C(9)
98
99/* 表示 */
100
101/*#define SHOW_RCV_RANGE*/
102
103/*
104 * バッファサイズの定義
105 */
106
107#define NUM_DISCARD 5
108#define NUM_REP_PAT 40
109#define PAT_BEGIN ' '
110#define PAT_END '~'
111#define SND_BUF_SIZE ((PAT_END - PAT_BEGIN + 1) * NUM_REP_PAT)
112
113/*
114 * å…
115¨åŸŸå¤‰æ•°
116 */
117
118bool_t tcp_discard_cli_valid;
119
120/* TCP 送受信ウィンドバッファ */
121
122#ifndef TCP_CFG_SWBUF_CSAVE_ONLY
123uint8_t tcp_discard_cli_swbuf[TCP_DISCARD_CLI_SWBUF_SIZE];
124#endif
125
126#ifdef USE_TCP_NON_BLOCKING
127
128/*
129 * 変数
130 */
131
132static T_IPEP nblk_src = {
133 IP_ADDRANY,
134 TCP_PORTANY,
135 };
136static T_IPEP nblk_dst;
137static ER_UINT nblk_error;
138
139/*
140 * ノンブロッキングコールのコールバック関数
141 */
142
143ER
144callback_nblk_tcp_discard_cli (ID cepid, FN fncd, void *p_parblk)
145{
146 ER error = E_OK;
147
148 nblk_error = *(ER*)p_parblk;
149
150 switch (fncd) {
151
152 case TFN_TCP_CON_CEP:
153 syscall(sig_sem(SEM_TCP_DISCARD_CLI_NBLK_READY));
154 break;
155
156 case TFN_TCP_CLS_CEP:
157 if (nblk_error < 0)
158 syslog(LOG_NOTICE, "[TDC:%02d CBN] close error: %s", cepid, itron_strerror(nblk_error));
159 syscall(sig_sem(SEM_TCP_DISCARD_CLI_NBLK_READY));
160 break;
161
162 case TFN_TCP_ACP_CEP:
163 case TFN_TCP_SND_DAT:
164 case TFN_TCP_GET_BUF:
165 case TFN_TCP_SND_OOB:
166 default:
167 error = E_PAR;
168 break;
169 }
170 return error;
171 }
172
173/*
174 * send_tcp_discard -- DISCARD/TCP サーバにメッセージを送信する。
175 */
176
177static void
178send_tcp_discard (ID cepid, T_IN_ADDR *ipaddr, uint16_t portno)
179{
180 static char smsg[SND_BUF_SIZE];
181
182 ER_UINT slen;
183 ER error;
184 SYSTIM time;
185 uint32_t total;
186 uint16_t soff, discard, rep, scount;
187 uint8_t pat, *p;
188
189 nblk_dst.ipaddr = *ipaddr;
190 nblk_dst.portno = portno;
191
192 p = smsg;
193 for (rep = NUM_REP_PAT; rep -- > 0; )
194 for (pat = PAT_BEGIN; pat <= PAT_END; pat ++)
195 *p ++ = pat;
196
197 if ((error = TCP_CON_CEP(cepid, &nblk_src, &nblk_dst, TMO_NBLK)) != E_WBLK) {
198 syslog(LOG_NOTICE, "[TDC:%02d SND] connect error: %s", cepid, itron_strerror(error));
199 return;
200 }
201
202 /* 接続が完了するまで待
203つ。*/
204 syscall(wai_sem(SEM_TCP_DISCARD_CLI_NBLK_READY));
205
206 if (nblk_error != E_OK)
207 syslog(LOG_NOTICE, "[TDC:%02d SND] connect error: %s", cepid, itron_strerror(nblk_error));
208 else {
209 get_tim(&time);
210 syslog(LOG_NOTICE, "[TDC:%02d SND] connecting: %6ld, to: %s.%d",
211 cepid, time / SYSTIM_HZ, IP2STR(NULL, ipaddr), nblk_dst.portno);
212
213 scount = total = 0;
214 for (discard = NUM_DISCARD; discard -- > 0; ) {
215 soff = 0;
216 while (soff < SND_BUF_SIZE) {
217 if ((slen = tcp_snd_dat(cepid, smsg + soff, sizeof(smsg) - soff, TMO_FEVR)) < 0) {
218 syslog(LOG_NOTICE, "[TDC:%02d SND] send error: %s",
219 cepid, itron_strerror(slen));
220 goto cls_ret;
221 }
222 soff += (uint16_t)slen;
223 total += slen;
224 scount ++;
225
226#ifdef SHOW_RCV_RANGE
227 syslog(LOG_NOTICE, "[TDC:%02d SND] snd: %2d, len: %4d, off: %4d",
228 cepid, scount, (uint16_t)slen, soff);
229#endif /* of #ifdef SHOW_RCV_RANGE */
230
231 syscall(dly_tsk(500 + net_rand() % SYSTIM_HZ));
232 }
233 }
234
235 cls_ret:
236 get_tim(&time);
237 syslog(LOG_NOTICE, "[TDC:%02d SND] finished: %6ld, snd: %4d, len: %ld",
238 cepid, time / SYSTIM_HZ, scount, total);
239
240 if ((error = tcp_sht_cep(cepid)) < 0)
241 syslog(LOG_NOTICE, "[TDC:%02d SND] shutdown error: %s", cepid, itron_strerror(error));
242
243 if ((error = tcp_cls_cep(cepid, TMO_NBLK)) != E_WBLK)
244 syslog(LOG_NOTICE, "[TDC:%02d SND] close error: %s", cepid, itron_strerror(error));
245
246 /* 開放が完了するまで待
247つ。*/
248 syscall(wai_sem(SEM_TCP_DISCARD_CLI_NBLK_READY));
249 }
250 }
251
252#else /* of #ifdef USE_TCP_NON_BLOCKING */
253
254/*
255 * send_tcp_discard -- DISCARD/TCP サーバにメッセージを送信する。
256 */
257
258static void
259send_tcp_discard (ID cepid, T_IN_ADDR *ipaddr, uint16_t portno)
260{
261 static char smsg[SND_BUF_SIZE];
262 static T_IPEP src = {
263 IP_ADDRANY,
264 TCP_PORTANY,
265 };
266
267 T_IPEP dst;
268 ER_UINT slen;
269 ER error;
270 SYSTIM time;
271 uint16_t pat, soff, discard, rep, scount, total;
272 uint8_t *p;
273
274 dst.ipaddr = *ipaddr;
275 dst.portno = portno;
276
277 p = smsg;
278 for (rep = NUM_REP_PAT; rep -- > 0; )
279 for (pat = PAT_BEGIN; pat <= PAT_END; pat ++)
280 *p ++ = pat;
281
282 if ((error = TCP_CON_CEP(cepid, &src, &dst, 60 * 1000)) != E_OK) {
283 syslog(LOG_NOTICE, "[TDC:%02d SND] connect error: %s", cepid, itron_strerror(error));
284 return;
285 }
286
287 get_tim(&time);
288 syslog(LOG_NOTICE, "[TDC:%02d SND] connecting: %6ld, to: %s.%d",
289 cepid, time / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno);
290
291 scount = total = 0;
292 for (discard = NUM_DISCARD; discard -- > 0; ) {
293 soff = 0;
294 while (soff < SND_BUF_SIZE) {
295 if ((slen = tcp_snd_dat(cepid, smsg + soff, sizeof(smsg) - soff, TMO_FEVR)) < 0) {
296 syslog(LOG_NOTICE, "[TDC:%02d SND] send error: %s", cepid, itron_strerror(slen));
297 goto cls_ret;
298 }
299 soff += (uint16_t)slen;
300 total += slen;
301 scount ++;
302
303#ifdef SHOW_RCV_RANGE
304 syslog(LOG_NOTICE, "[TDC:%02d SND] snd: %3d, len: %4d, off: %4d",
305 cepid, scount, (uint16_t)slen, soff);
306#endif /* of #ifdef SHOW_RCV_RANGE */
307
308 syscall(dly_tsk(500 + net_rand() % SYSTIM_HZ));
309 }
310 }
311
312cls_ret:
313 get_tim(&time);
314 syslog(LOG_NOTICE, "[TDC:%02d SND] finished: %6ld, snd: %4d, len: %ld",
315 cepid, time / SYSTIM_HZ, scount, total);
316
317 if ((error = tcp_sht_cep(cepid)) < 0)
318 syslog(LOG_NOTICE, "[TDC:%02d SND] shutdown error: %s", cepid, itron_strerror(error));
319
320 if ((error = tcp_cls_cep(cepid, TMO_FEVR)) < 0)
321 syslog(LOG_NOTICE, "[TDC:%02d SND] close error: %s", cepid, itron_strerror(error));
322 }
323
324#endif /* of #ifdef USE_TCP_NON_BLOCKING */
325
326void
327tcp_discard_cli_task (intptr_t exinf)
328{
329 T_IN_ADDR addr;
330 ID tskid, cepid;
331 int_t rep;
332 uint32_t count;
333 uint16_t portno;
334 uint8_t *line;
335
336#ifdef USE_TCP_EXTENTIONS
337
338 ER error;
339 T_TCP_CCEP ccep;
340
341#endif /* of #ifdef USE_TCP_EXTENTIONS */
342
343 get_tid(&tskid);
344 syslog(LOG_NOTICE, "[TCP DISCARD CLI:%d,%d] started.", tskid, (ID)exinf);
345 while (true) {
346 if (rcv_dtq(DTQ_TCP_DISCARD_CLI, (intptr_t*)&line) == E_OK) {
347 line = skip_blanks(GET_IPADDR(&addr, skip_blanks(line))); /* IP Address */
348
349 if ('0' <= *line && *line <= '9') { /* Port No */
350 line = get_int(&rep, line);
351 portno = (uint16_t)rep;
352 }
353 else {
354 line ++;
355 portno = DISCARD_SRV_PORTNO;
356 }
357
358 line = skip_blanks(line);
359 if ('0' <= *line && *line <= '9') /* Repeat */
360 line = get_int(&rep, line);
361 else
362 rep = 1;
363
364#ifdef USE_TCP_EXTENTIONS
365
366 ccep.cepatr = 0;
367 ccep.sbufsz = TCP_DISCARD_CLI_SWBUF_SIZE;
368 ccep.rbufsz = 0;
369 ccep.rbuf = NADR;
370
371#ifdef TCP_CFG_SWBUF_CSAVE
372 ccep.sbuf = NADR;
373#else
374 ccep.sbuf = tcp_discard_cli_swbuf;
375#endif
376#ifdef USE_TCP_NON_BLOCKING
377 ccep.callback = (FP)callback_nblk_tcp_discard_cli;
378#else
379 ccep.callback = NULL;
380#endif
381
382 if ((error = alloc_tcp_cep(&cepid, tskid, &ccep)) != E_OK) {
383 syslog(LOG_NOTICE, "[TDC:%02d TSK] CEP create error: %s", cepid, itron_strerror(error));
384 continue;
385 }
386
387#else /* of #ifdef USE_TCP_EXTENTIONS */
388
389 cepid = (ID)exinf;
390
391#endif /* of #ifdef USE_TCP_EXTENTIONS */
392
393 tcp_discard_cli_valid = true;
394 for (count = rep; count -- > 0; ) {
395 if (!tcp_discard_cli_valid) {
396 syslog(LOG_NOTICE, "[TDC:%02d TSK] canceled.", (ID)exinf);
397 break;
398 }
399 syslog(LOG_NOTICE, "[TDC:%02d TSK] start: repeat: %d/%d",
400 (ID)exinf, rep - count, rep);
401 send_tcp_discard(cepid, &addr, portno);
402 syslog(LOG_NOTICE, "[TDC:%02d TSK] finished: repeat: %d/%d",
403 (ID)exinf, rep - count, rep);
404 syscall(dly_tsk(500 + net_rand() % SYSTIM_HZ));
405 }
406
407#ifdef USE_TCP_EXTENTIONS
408
409 if ((error = free_tcp_cep(cepid)) != E_OK)
410 syslog(LOG_NOTICE, "[TDC:%02d TSK] CEP delete error: %s", cepid, itron_strerror(error));
411
412#endif /* of #ifdef USE_TCP_EXTENTIONS */
413
414 }
415 }
416 }
417
418#endif /* of #ifdef USE_TCP_DISCARD_CLI */
Note: See TracBrowser for help on using the repository browser.