source: EcnlProtoTool/trunk/asp3_dcre/tinet/net/net_buf.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: 12.7 KB
RevLine 
[270]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: net_buf.c 270 2017-02-09 04:03:47Z coas-nagasima $
44 */
45
46#ifdef TARGET_KERNEL_ASP
47
48#include <kernel.h>
49#include <sil.h>
50#include <t_syslog.h>
51#include "kernel_cfg.h"
52
53#endif /* of #ifdef TARGET_KERNEL_ASP */
54
55#ifdef TARGET_KERNEL_JSP
56
57#include <s_services.h>
58#include <t_services.h>
59#include "kernel_id.h"
60
61#endif /* of #ifdef TARGET_KERNEL_JSP */
62
63#include <tinet_defs.h>
64#include <tinet_config.h>
65
66#include <net/if.h>
67#include <net/if_loop.h>
68#include <net/if_ppp.h>
69#include <net/ethernet.h>
70#include <net/net.h>
71#include <net/net_buf.h>
72#include <net/net_count.h>
73
74#include <netinet/in.h>
75#include <netinet/in_var.h>
76#include <netinet6/in6.h>
77#include <netinet/ip.h>
78#include <netinet/ip_var.h>
79#include <netinet/ip6.h>
80#include <netinet6/ip6_var.h>
81#include <netinet/tcp.h>
82#include <netinet/tcp_timer.h>
83#include <netinet/tcp_var.h>
84
85/*
86 * 関数
87 */
88
89extern const char *itron_strerror (ER ercd);
90
91/*
92 * 変数
93 */
94
95static T_NET_BUF_ENTRY net_buf_table[] = {
96
97#if defined(NUM_MPF_NET_BUF6_65536) && NUM_MPF_NET_BUF6_65536 > 0
98 {
99 MPF_NET_BUF6_65536,
100 IF_IP6_HDR_SIZE + 65536,
101
102#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
103
104 NUM_MPF_NET_BUF6_65536,
105
106#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
107
108 },
109#endif /* of #if defined(NUM_MPF_NET_BUF6_65536) && NUM_MPF_NET_BUF6_65536 > 0 */
110
111#if defined(NUM_MPF_NET_BUF6_REASSM) && NUM_MPF_NET_BUF6_REASSM > 0
112 {
113 MPF_NET_BUF_REASSM,
114 IP6_CFG_FRAG_REASSM_SIZE,
115
116#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
117
118 NUM_MPF_NET_BUF6_REASSM,
119
120#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
121
122 },
123#endif /* of #if defined(NUM_MPF_NET_BUF6_REASSM) && NUM_MPF_NET_BUF6_REASSM > 0 */
124
125#if defined(NUM_MPF_NET_BUF4_REASSM) && NUM_MPF_NET_BUF4_REASSM > 0
126 {
127 MPF_NET_BUF_REASSM,
128 IP4_CFG_FRAG_REASSM_SIZE,
129
130#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
131
132 NUM_MPF_NET_BUF4_REASSM,
133
134#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
135
136 },
137#endif /* of #if defined(NUM_MPF_NET_BUF4_REASSM) && NUM_MPF_NET_BUF4_REASSM > 0 */
138
139#if defined(NUM_MPF_NET_BUF_IF_PDU) && NUM_MPF_NET_BUF_IF_PDU > 0
140 {
141 MPF_NET_BUF_IF_PDU,
142 IF_PDU_SIZE,
143
144#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
145
146 NUM_MPF_NET_BUF_IF_PDU,
147
148#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
149
150 },
151#endif /* of #if defined(NUM_MPF_NET_BUF_IF_PDU) && NUM_MPF_NET_BUF_IF_PDU > 0 */
152
153#if defined(NUM_MPF_NET_BUF_IPV6_MMTU) && NUM_MPF_NET_BUF_IPV6_MMTU > 0
154 {
155 MPF_NET_BUF_IPV6_MMTU,
156 IF_HDR_SIZE + IPV6_MMTU,
157
158#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
159
160 NUM_MPF_NET_BUF_IPV6_MMTU,
161
162#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
163
164 },
165#endif /* of #if defined(NUM_MPF_NET_BUF_IPV6_MMTU) && NUM_MPF_NET_BUF_IPV6_MMTU > 0 */
166
167#if defined(NUM_MPF_NET_BUF_1024) && NUM_MPF_NET_BUF_1024 > 0
168 {
169 MPF_NET_BUF_1024,
170 UINT_C(1024),
171
172#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
173
174 NUM_MPF_NET_BUF_1024,
175
176#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
177
178 },
179#endif /* of #if defined(NUM_MPF_NET_BUF_1024) && NUM_MPF_NET_BUF_1024 > 0 */
180
181#if defined(NUM_MPF_NET_BUF_IP_MSS) && NUM_MPF_NET_BUF_IP_MSS > 0
182 {
183 MPF_NET_BUF_IP_MSS,
184 IF_HDR_SIZE + IP4_MSS,
185
186#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
187
188 NUM_MPF_NET_BUF_IP_MSS,
189
190#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
191
192 },
193#endif /* of #if defined(NUM_MPF_NET_BUF_IP_MSS) && NUM_MPF_NET_BUF_IP_MSS > 0 */
194
195#if defined(NUM_MPF_NET_BUF_512) && NUM_MPF_NET_BUF_512 > 0
196 {
197 MPF_NET_BUF_512,
198 UINT_C(512),
199
200#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
201
202 NUM_MPF_NET_BUF_512,
203
204#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
205
206 },
207#endif /* of #if defined(NUM_MPF_NET_BUF_512) && NUM_MPF_NET_BUF_512 > 0 */
208
209#if defined(NUM_MPF_NET_BUF_256) && NUM_MPF_NET_BUF_256 > 0
210 {
211 MPF_NET_BUF_256,
212 UINT_C(256),
213
214#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
215
216 NUM_MPF_NET_BUF_256,
217
218#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
219
220 },
221#endif /* of #if defined(NUM_MPF_NET_BUF_256) && NUM_MPF_NET_BUF_256 > 0 */
222
223#if defined(NUM_MPF_NET_BUF_128) && NUM_MPF_NET_BUF_128 > 0
224 {
225 MPF_NET_BUF_128,
226 UINT_C(128),
227
228#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
229
230 NUM_MPF_NET_BUF_128,
231
232#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
233
234 },
235#endif /* of #if defined(NUM_MPF_NET_BUF_128) && NUM_MPF_NET_BUF_128 > 0 */
236
237#if defined(SUPPORT_INET4)
238
239#if defined(NUM_MPF_NET_BUF_64) && NUM_MPF_NET_BUF_64 > 0
240 {
241 MPF_NET_BUF_64,
242 UINT_C(64),
243
244#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
245
246 NUM_MPF_NET_BUF_64,
247
248#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
249
250 },
251#endif /* of #if defined(NUM_MPF_NET_BUF_64) && NUM_MPF_NET_BUF_64 > 0 */
252
253#endif /* of #if defined(SUPPORT_INET4) */
254
255#if defined(NUM_MPF_NET_BUF_CSEG) && NUM_MPF_NET_BUF_CSEG > 0
256 {
257 MPF_NET_BUF_CSEG,
258 IF_HDR_SIZE + IP_HDR_SIZE + TCP_HDR_SIZE,
259
260#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
261
262 NUM_MPF_NET_BUF_CSEG,
263
264#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
265
266 },
267#endif /* of #if defined(NUM_MPF_NET_BUF_CSEG) && NUM_MPF_NET_BUF_CSEG > 0 */
268
269 };
270
271#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
272
273/*
274 * nbuf_get_tbl -- ネットワークバッファ管理表を獲得する。
275 *
276 * 注意: ネットワーク統計情
277報の計測用
278 */
279
280const T_NET_BUF_ENTRY *
281nbuf_get_tbl (void)
282{
283 return net_buf_table;
284 }
285
286/*
287 * nbuf_get_tbl_size -- ネットワークバッファ管理エントリ数を獲得する。
288 *
289 * 注意: ネットワーク統計情
290報の計測用
291 */
292
293uint_t
294nbuf_get_tbl_size (void)
295{
296 return sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY);
297 }
298
299#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
300
301/*
302 * tget_net_buf_up -- 大きなサイズの方向に探索して、ネットワークバッファを獲得する。
303 */
304
305static ER
306tget_net_buf_up (T_NET_BUF **buf, uint_t minlen, uint_t maxlen, TMO tmout)
307{
308 int_t ix, req_ix;
309 ER error = E_OK;
310
311 /* 最適なサイズの固定長メモリプールを探す。*/
312 ix = sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY);
313 while (ix -- > 0 && minlen > net_buf_table[ix].size)
314 ;
315 req_ix = ix;
316
317 NET_COUNT_NET_BUF(net_buf_table[req_ix].requests, 1);
318
319 while (1) {
320 if ((error = tget_mpf((ID)net_buf_table[ix].index, (void*)buf, ix == 0 ? tmout : TMO_POL)) == E_OK) {
321 (*buf)->idix = (uint8_t)ix;
322 (*buf)->len = (uint16_t)minlen;
323 (*buf)->flags = 0;
324 NET_COUNT_NET_BUF(net_buf_table[ix].allocs, 1);
325 return error;
326 }
327 else if (ix == 0 || net_buf_table[ix].size > maxlen)
328 break;
329 ix --;
330 }
331
332 syslog(LOG_WARNING, "[NET BUF] busy, index=%d, len=%4d.", (uint16_t)req_ix, minlen);
333 *buf = NULL;
334 NET_COUNT_NET_BUF(net_buf_table[req_ix].errors, 1);
335 return error;
336 }
337
338/*
339 * tget_net_buf_down -- 小さなサイズの方向に探索して、ネットワークバッファを獲得する。
340 */
341
342static ER
343tget_net_buf_down (T_NET_BUF **buf, uint_t minlen, uint_t maxlen, TMO tmout)
344{
345 int_t ix, req_ix;
346 ER error = E_OK;
347
348 /* 最適なサイズの固定長メモリプールを探す。*/
349 ix = sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY);
350 while (ix -- > 0 && maxlen > net_buf_table[ix].size)
351 ;
352 req_ix = ix;
353
354 NET_COUNT_NET_BUF(net_buf_table[req_ix].requests, 1);
355
356 while (1) {
357 if ((error = tget_mpf((ID)net_buf_table[ix].index, (void*)buf,
358 ix == sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY) - 1 ? tmout : TMO_POL)) == E_OK) {
359 (*buf)->idix = (uint8_t)ix;
360 (*buf)->len = net_buf_table[ix].size;
361 (*buf)->flags = 0;
362 NET_COUNT_NET_BUF(net_buf_table[ix].allocs, 1);
363 return error;
364 }
365 ix ++;
366 if (ix == sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY) || net_buf_table[ix].size < minlen)
367 break;
368 }
369
370 syslog(LOG_WARNING, "[NET BUF] busy, index=%d, len=%4d.", (uint16_t)req_ix, maxlen);
371 *buf = NULL;
372 NET_COUNT_NET_BUF(net_buf_table[req_ix].errors, 1);
373 return error;
374 }
375
376/*
377 * tget_net_buf_ex -- ネットワークバッファを獲得する(拡張機能)。
378 */
379
380ER
381tget_net_buf_ex (T_NET_BUF **buf, uint_t minlen, uint_t maxlen, ATR nbatr, TMO tmout)
382{
383 /* 最小サイズが最大サイズを超
384えていたらエラー */
385 if ((nbatr & NBA_SEARCH_DESCENT) != 0 && minlen > maxlen) {
386 syslog(LOG_WARNING, "[NET BUF] E_PAR, minlen=%4d > maxlen=%4d.", minlen, maxlen);
387 return E_PAR;
388 }
389
390 /* 割当て可能な最大のサイズを超
391えていたらエラー */
392 if (minlen > net_buf_table[0].size || maxlen > net_buf_table[0].size) {
393 syslog(LOG_WARNING, "[NET BUF] E_PAR, minlen=%4d or maxlen=%4d > %4d",
394 minlen, maxlen, net_buf_table[0].size);
395 return E_PAR;
396 }
397
398 /* TCP で予約したネットワークバッファを取り出す。*/
399 if ((nbatr & NBA_RESERVE_TCP) != 0) {
400 if ((*buf = TCP_PULL_RES_NBUF(nbatr)) != NULL) {
401 return E_OK;
402 }
403 }
404
405 if ((nbatr & NBA_SEARCH_DESCENT) != 0)
406 return tget_net_buf_down(buf, minlen, maxlen, tmout);
407 else if ((nbatr & NBA_SEARCH_ASCENT) != 0)
408 return tget_net_buf_up(buf, minlen, (uint_t)net_buf_table[0].size, tmout);
409 else {
410 syslog(LOG_WARNING, "[NET BUF] E_PAR, nbatr=%08x.", nbatr);
411 return E_PAR;
412 }
413 }
414
415/*
416 * tget_net_buf -- ネットワークバッファを獲得する(互換)。
417 */
418
419ER
420tget_net_buf (T_NET_BUF **buf, uint_t len, TMO tmout)
421{
422 return tget_net_buf_ex(buf, len, (uint_t)net_buf_table[0].size, NBA_SEARCH_ASCENT, tmout);
423 }
424
425/*
426 * rel_net_buf -- ネットワークバッファを返却する。
427 */
428
429ER
430rel_net_buf (T_NET_BUF *buf)
431{
432 ER error = E_OK;
433
434 /* ネットワークバッファの ID の正当性を検証する。*/
435 if ((int_t)buf->idix >= (int_t)(sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY))) {
436 syslog(LOG_WARNING, "[NET BUF] E_ID, ID=%d.", buf->idix);
437 error = E_ID;
438 }
439 else {
440
441 /* TCP で、ネットワークバッファを予約する。*/
442 if (TCP_PUSH_RES_NBUF(buf) == NULL)
443 return E_OK;
444
445 /* 固定メモリプールに返す。*/
446 if ((error = rel_mpf((ID)net_buf_table[buf->idix].index, buf)) != E_OK)
447 syslog(LOG_WARNING, "[NET BUF] %s, ID=%d.", itron_strerror(error), buf->idix);
448 }
449 return error;
450 }
451
452/*
453 * rus_net_buf -- ネットワークバッファを再利用する。
454 */
455
456ER
457rus_net_buf (T_NET_BUF *buf)
458{
459 ER error = E_OK;
460
461 if (buf->idix >= sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY)) {
462 syslog(LOG_WARNING, "[NET BUF] E_ID, ID=%d.", buf->idix);
463 error = E_ID;
464 }
465 else {
466 buf->len = net_buf_table[buf->idix].size;
467 buf->flags = 0;
468 error = E_OK;
469 }
470 return error;
471 }
472
473/*
474 * net_buf_siz -- ネットワークバッファのサイズを返す。
475 */
476
477ER_UINT
478net_buf_siz (T_NET_BUF *buf)
479{
480 if (buf->idix >= sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY)) {
481 syslog(LOG_WARNING, "[BUF SIZ] E_ID, ID=%d.", buf->idix);
482 return E_ID;
483 }
484 else
485 return (ER_UINT)net_buf_table[buf->idix].size;
486 }
487
488/*
489 * net_buf_max_siz -- ネットワークバッファの最大サイズを返す。
490 */
491
492uint_t
493net_buf_max_siz (void)
494{
495 return (uint_t)net_buf_table[0].size;
496 }
Note: See TracBrowser for help on using the repository browser.