source: EcnlProtoTool/trunk/asp3_dcre/tinet/netapp/udp_echo_srv.c@ 321

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

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.4 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 * 上記著作権者は,以下の (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 * UDP ECHO サーバ
36 */
37
38#include <string.h>
39
40#ifdef TARGET_KERNEL_ASP
41
42#include <kernel.h>
43#include <sil.h>
44#include <t_syslog.h>
45#include "kernel_cfg.h"
46
47#endif /* of #ifdef TARGET_KERNEL_ASP */
48
49#ifdef TARGET_KERNEL_JSP
50
51#include <t_services.h>
52#include "kernel_id.h"
53#include "tinet_id.h"
54
55#endif /* of #ifdef TARGET_KERNEL_JSP */
56
57#include <tinet_defs.h>
58#include <tinet_config.h>
59
60#include <net/net.h>
61#include <net/net_timer.h>
62
63#include <netinet/in.h>
64#include <netinet/in_itron.h>
65
66#include <netapp/netapp.h>
67#include <netapp/netapp_var.h>
68#include <netapp/echo.h>
69
70#ifdef USE_UDP_ECHO_SRV
71
72/*
73 * 受信タイムアウト
74 */
75
76#define RCV_TMOUT TMO_FEVR
77//#define RCV_TMOUT (30*ULONG_C(1000))
78
79#define BUF_SIZE 2048
80
81static char echo_rcv_buf[BUF_SIZE];
82static T_IPEP dst;
83
84#ifdef USE_UDP_CALL_BACK
85
86/*
87 * コールバック関数
88 */
89
90ER
91callback_udp_echo_srv (ID cepid, FN fncd, void *p_parblk)
92{
93 ER_UINT len;
94 SYSTIM now;
95
96 if ((len = UDP_RCV_DAT(cepid, &dst, echo_rcv_buf, sizeof(echo_rcv_buf), TMO_FEVR)) >= 0) {
97 echo_rcv_buf[len] = '\0';
98 get_tim(&now);
99 syslog(LOG_NOTICE, "[UES:%02d UCB] received, %6ld, from: %s.%d,\n"
100 " msg: '%s'",
101 cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno, echo_rcv_buf);
102 if (len > 0) {
103 len = UDP_SND_DAT(cepid, &dst, echo_rcv_buf, len, TMO_FEVR);
104 get_tim(&now);
105 if (len >= 0)
106 syslog(LOG_NOTICE, "[UES:%02d UCB] sent, %6ld, len: %d",
107 cepid, now / SYSTIM_HZ, len);
108 else
109 syslog(LOG_NOTICE, "[UES:%02d UCB] send error, %6ld: %s",
110 cepid, now / SYSTIM_HZ, itron_strerror(len));
111 }
112 len = E_OK;
113 }
114 else {
115 get_tim(&now);
116 syslog(LOG_NOTICE, "[UES:%02d UCB] recv error, %6ld: %s",
117 cepid, now / SYSTIM_HZ, itron_strerror(len));
118 }
119
120 return len;
121 }
122
123#else /* of #ifdef USE_UDP_CALL_BACK */
124
125#ifdef USE_UDP_NON_BLOCKING
126
127/*
128 * 変数
129 */
130
131static ER_UINT nblk_len;
132
133/*
134 * ノンブロッキングコールのコールバック関数
135 */
136
137ER
138callback_nblk_udp_echo_srv (ID cepid, FN fncd, void *p_parblk)
139{
140 SYSTIM now;
141
142 get_tim(&now);
143 nblk_len = *(ER_UINT*)p_parblk;
144 if (nblk_len < 0) { /* 0 以下の場合は、エラーコード */
145 syslog(LOG_NOTICE, "[UES:%02d CBR] error, %6ld: %s, fncd: %s",
146 cepid, now / SYSTIM_HZ, itron_strerror(nblk_len), in_strtfn(fncd));
147 }
148 else if (fncd == TFN_UDP_RCV_DAT) {
149 echo_rcv_buf[nblk_len] = '\0';
150 syslog(LOG_NOTICE, "[UES:%02d CBR] received, %6ld, from: %s.%d,\n"
151 " msg: '%s'",
152 cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno, echo_rcv_buf);
153 }
154 syscall(wup_tsk(UDP_ECHO_SRV_TASK));
155 return E_OK;
156 }
157
158/*
159 * UDP ECHO サーバ
160 */
161
162ER
163udp_echo_srv (ID cepid)
164{
165 ER error;
166 SYSTIM now;
167
168 if ((error = UDP_RCV_DAT(cepid, &dst, echo_rcv_buf, sizeof(echo_rcv_buf), TMO_NBLK)) != E_WBLK) {
169 get_tim(&now);
170 syslog(LOG_NOTICE, "[UES:%02d RCV] recv error, %6ld: %s", cepid, now / SYSTIM_HZ, itron_strerror(error));
171 return error;
172 }
173
174 syscall(slp_tsk());
175 if (nblk_len < 0)
176 error = nblk_len;
177 else {
178 if ((error = UDP_SND_DAT(cepid, &dst, echo_rcv_buf, nblk_len, TMO_NBLK)) != E_WBLK) {
179 get_tim(&now);
180 syslog(LOG_NOTICE, "[UES:%02d SND] send error, %6ld: %s",
181 cepid, now / SYSTIM_HZ, itron_strerror(error));
182 return error;
183 }
184
185 syscall(slp_tsk());
186 if (nblk_len < 0)
187 error = nblk_len;
188 else {
189 get_tim(&now);
190 syslog(LOG_NOTICE, "[UES:%02d SND] sent, %6ld, len: %d", cepid, now / SYSTIM_HZ, nblk_len);
191 error = E_OK;
192 }
193 }
194
195 return error;
196 }
197
198#else /* of #ifdef USE_UDP_NON_BLOCKING */
199
200/*
201 * UDP ECHO サーバ
202 */
203
204ER
205udp_echo_srv (ID cepid)
206{
207 ER_UINT len;
208 SYSTIM now;
209
210 if ((len = UDP_RCV_DAT(cepid, &dst, echo_rcv_buf, sizeof(echo_rcv_buf), RCV_TMOUT)) >= 0) {
211 get_tim(&now);
212 echo_rcv_buf[len] = '\0';
213 syslog(LOG_NOTICE, "[UES:%02d RCV] received, %6ld, from: %s.%d,\n"
214 " msg: '%s'",
215 cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno, echo_rcv_buf);
216 if (len > 0) {
217 len = UDP_SND_DAT(cepid, &dst, echo_rcv_buf, len, TMO_FEVR);
218 get_tim(&now);
219 if (len >= 0)
220 syslog(LOG_NOTICE, "[UES:%02d SND] sent, %6ld, len: %d",
221 cepid, now / SYSTIM_HZ, (uint16_t)len);
222 else
223 syslog(LOG_NOTICE, "[UES:%02d SND] send error, %6ld: %s",
224 cepid, now / SYSTIM_HZ, itron_strerror(len));
225 }
226 }
227 else {
228 get_tim(&now);
229 syslog(LOG_NOTICE, "[UES:%02d RCV] recv error, %6ld: %s", cepid, now / SYSTIM_HZ, itron_strerror(len));
230 }
231
232 return len >= 0 || len == E_TMOUT ? E_OK : len;
233 }
234
235#endif /* of #ifdef USE_UDP_NON_BLOCKING */
236
237/*
238 * UDP ECHO サーバタスク
239 */
240
241#ifdef USE_UDP_EXTENTIONS
242
243void
244udp_echo_srv_task (intptr_t exinf)
245{
246 ID tskid, cepid;
247 ER error;
248 T_UDP_CCEP ccep;
249
250 get_tid(&tskid);
251 syslog(LOG_NOTICE, "[UDP ECHO SRV:%d,%d] started.", tskid, (ID)exinf);
252 while (true) {
253
254 syscall(slp_tsk());
255
256 ccep.cepatr = UINT_C(0);
257 ccep.myaddr.portno = UINT_C(7);
258
259#if defined(SUPPORT_INET4)
260 ccep.myaddr.ipaddr = IPV4_ADDRANY;
261#endif
262
263#if defined(SUPPORT_INET6)
264 memcpy(&ccep.myaddr.ipaddr, &ipv6_addrany, sizeof(T_IN6_ADDR));
265#endif
266
267#ifdef USE_UDP_NON_BLOCKING
268 ccep.callback = (FP)callback_nblk_udp_echo_srv;
269#else
270 ccep.callback = NULL;
271#endif
272
273 if ((error = alloc_udp_cep(&cepid, tskid, &ccep)) != E_OK) {
274 syslog(LOG_NOTICE, "[UES:%02d TSK] CEP create error: %s", cepid, itron_strerror(error));
275 continue;
276 }
277
278 while (error == E_OK) {
279 if ((error = udp_echo_srv(cepid)) != E_OK) {
280 if ((error = free_udp_cep(cepid, !(error == E_NOEXS || error == E_DLT))) != E_OK)
281 syslog(LOG_NOTICE, "[UEC:%02d TSK] CEP delete error: %s", cepid, itron_strerror(error));
282 break;
283 }
284 }
285
286 }
287 slp_tsk();
288 }
289
290#else /* of #ifdef USE_UDP_EXTENTIONS */
291
292void
293udp_echo_srv_task (intptr_t exinf)
294{
295 ID tskid;
296 ER error = E_OK;
297
298 get_tid(&tskid);
299 syslog(LOG_NOTICE, "[UDP ECHO SRV:%d,%d] started.", tskid, (ID)exinf);
300 while (error == E_OK) {
301 error = udp_echo_srv((ID)exinf);
302 }
303 slp_tsk();
304 }
305
306#endif /* of #ifdef USE_UDP_EXTENTIONS */
307
308#endif /* of #ifdef USE_UDP_CALL_BACK */
309
310#endif /* of #ifdef USE_UDP_ECHO_SRV */
Note: See TracBrowser for help on using the repository browser.