source: azure_iot_hub/trunk/asp3_dcre/tinet/net/net_buf.c@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • 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: net_buf.c 388 2019-05-22 11:25:18Z 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_endian.h>
72#include <net/net_buf.h>
73#include <net/net_count.h>
74
75#include <netinet/in.h>
76#include <netinet/in_var.h>
77#include <netinet/ip.h>
78#include <netinet/ip_var.h>
79#include <netinet/tcp.h>
80#include <netinet/tcp_var.h>
81
82#ifndef NOUSE_MPF_NET_BUF
83
84/*
85 * 関数
86 */
87
88extern const char *itron_strerror (ER ercd);
89
90/*
91 * 変数
92 */
93
94static T_NET_BUF_ENTRY net_buf_table[] = {
95
96#if defined(NUM_MPF_NET_BUF6_65536) && NUM_MPF_NET_BUF6_65536 > 0
97 {
98 MPF_NET_BUF6_65536,
99 IF_IP6_HDR_SIZE + 65536,
100
101#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
102
103 NUM_MPF_NET_BUF6_65536,
104
105#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
106
107 },
108#endif /* of #if defined(NUM_MPF_NET_BUF6_65536) && NUM_MPF_NET_BUF6_65536 > 0 */
109
110#if defined(NUM_MPF_NET_BUF6_REASSM) && NUM_MPF_NET_BUF6_REASSM > 0
111
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
124#else /* of #if defined(NUM_MPF_NET_BUF6_REASSM) && NUM_MPF_NET_BUF6_REASSM > 0 */
125
126#if defined(NUM_MPF_NET_BUF4_REASSM) && NUM_MPF_NET_BUF4_REASSM > 0
127
128 {
129 MPF_NET_BUF_REASSM,
130 IP4_CFG_FRAG_REASSM_SIZE,
131
132#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
133
134 NUM_MPF_NET_BUF4_REASSM,
135
136#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
137
138 },
139
140#endif /* of #if defined(NUM_MPF_NET_BUF4_REASSM) && NUM_MPF_NET_BUF4_REASSM > 0 */
141
142#endif /* of #if defined(NUM_MPF_NET_BUF6_REASSM) && NUM_MPF_NET_BUF6_REASSM > 0 */
143
144#if defined(NUM_MPF_NET_BUF_IF_PDU) && NUM_MPF_NET_BUF_IF_PDU > 0
145 {
146 MPF_NET_BUF_IF_PDU,
147 IF_PDU_SIZE,
148
149#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
150
151 NUM_MPF_NET_BUF_IF_PDU,
152
153#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
154
155 },
156#endif /* of #if defined(NUM_MPF_NET_BUF_IF_PDU) && NUM_MPF_NET_BUF_IF_PDU > 0 */
157
158#if defined(NUM_MPF_NET_BUF_IPV6_MMTU) && NUM_MPF_NET_BUF_IPV6_MMTU > 0
159 {
160 MPF_NET_BUF_IPV6_MMTU,
161 IF_HDR_SIZE + IPV6_MMTU,
162
163#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
164
165 NUM_MPF_NET_BUF_IPV6_MMTU,
166
167#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
168
169 },
170#endif /* of #if defined(NUM_MPF_NET_BUF_IPV6_MMTU) && NUM_MPF_NET_BUF_IPV6_MMTU > 0 */
171
172#if defined(NUM_MPF_NET_BUF_1024) && NUM_MPF_NET_BUF_1024 > 0
173 {
174 MPF_NET_BUF_1024,
175 UINT_C(1024),
176
177#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
178
179 NUM_MPF_NET_BUF_1024,
180
181#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
182
183 },
184#endif /* of #if defined(NUM_MPF_NET_BUF_1024) && NUM_MPF_NET_BUF_1024 > 0 */
185
186#if defined(NUM_MPF_NET_BUF_IP_MSS) && NUM_MPF_NET_BUF_IP_MSS > 0
187 {
188 MPF_NET_BUF_IP_MSS,
189 IF_HDR_SIZE + IP4_MSS,
190
191#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
192
193 NUM_MPF_NET_BUF_IP_MSS,
194
195#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
196
197 },
198#endif /* of #if defined(NUM_MPF_NET_BUF_IP_MSS) && NUM_MPF_NET_BUF_IP_MSS > 0 */
199
200#if defined(NUM_MPF_NET_BUF_512) && NUM_MPF_NET_BUF_512 > 0
201 {
202 MPF_NET_BUF_512,
203 UINT_C(512),
204
205#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
206
207 NUM_MPF_NET_BUF_512,
208
209#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
210
211 },
212#endif /* of #if defined(NUM_MPF_NET_BUF_512) && NUM_MPF_NET_BUF_512 > 0 */
213
214#if defined(NUM_MPF_NET_BUF_256) && NUM_MPF_NET_BUF_256 > 0
215 {
216 MPF_NET_BUF_256,
217 UINT_C(256),
218
219#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
220
221 NUM_MPF_NET_BUF_256,
222
223#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
224
225 },
226#endif /* of #if defined(NUM_MPF_NET_BUF_256) && NUM_MPF_NET_BUF_256 > 0 */
227
228#if defined(NUM_MPF_NET_BUF_128) && NUM_MPF_NET_BUF_128 > 0
229 {
230 MPF_NET_BUF_128,
231 UINT_C(128),
232
233#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
234
235 NUM_MPF_NET_BUF_128,
236
237#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
238
239 },
240#endif /* of #if defined(NUM_MPF_NET_BUF_128) && NUM_MPF_NET_BUF_128 > 0 */
241
242#if defined(_IP6_CFG)
243
244#if defined(NUM_MPF_NET_BUF_CSEG) && NUM_MPF_NET_BUF_CSEG > 0
245 {
246 MPF_NET_BUF_CSEG,
247 IF_HDR_SIZE + IP_HDR_SIZE + TCP_HDR_SIZE,
248
249#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
250
251 NUM_MPF_NET_BUF_CSEG,
252
253#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
254
255 },
256#endif /* of #if defined(NUM_MPF_NET_BUF_CSEG) && NUM_MPF_NET_BUF_CSEG > 0 */
257
258#endif /* of #if defined(_IP6_CFG) */
259
260#if defined(NUM_MPF_NET_BUF_64) && NUM_MPF_NET_BUF_64 > 0
261 {
262 MPF_NET_BUF_64,
263 UINT_C(64),
264
265#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
266
267 NUM_MPF_NET_BUF_64,
268
269#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
270
271 },
272#endif /* of #if defined(NUM_MPF_NET_BUF_64) && NUM_MPF_NET_BUF_64 > 0 */
273
274#if defined(_IP4_CFG) && !defined(_IP6_CFG)
275
276#if defined(NUM_MPF_NET_BUF_CSEG) && NUM_MPF_NET_BUF_CSEG > 0
277 {
278 MPF_NET_BUF_CSEG,
279 IF_HDR_SIZE + IP_HDR_SIZE + TCP_HDR_SIZE,
280
281#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
282
283 NUM_MPF_NET_BUF_CSEG,
284
285#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
286
287 },
288#endif /* of #if defined(NUM_MPF_NET_BUF_CSEG) && NUM_MPF_NET_BUF_CSEG > 0 */
289
290#endif /* of #if defined(_IP4_CFG) && !defined(_IP6_CFG) */
291
292 };
293
294#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
295
296/*
297 * nbuf_get_tbl -- ネットワークバッファ管理表を獲得する。
298 *
299 * 注意: ネットワーク統計情
300報の計測用
301 */
302
303const T_NET_BUF_ENTRY *
304nbuf_get_tbl (void)
305{
306 return net_buf_table;
307 }
308
309/*
310 * nbuf_get_tbl_size -- ネットワークバッファ管理エントリ数を獲得する。
311 *
312 * 注意: ネットワーク統計情
313報の計測用
314 */
315
316uint_t
317nbuf_get_tbl_size (void)
318{
319 return sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY);
320 }
321
322#endif /* of #if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF */
323
324/*
325 * tget_net_buf_up -- 大きなサイズの方向に探索して、ネットワークバッファを獲得する。
326 */
327
328static ER
329tget_net_buf_up (T_NET_BUF **buf, uint_t minlen, uint_t maxlen, TMO tmout)
330{
331 int_t ix, req_ix;
332 ER error = E_OK;
333
334 /* 最適なサイズの固定長メモリプールを探す。*/
335 ix = sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY);
336 while (ix -- > 0 && minlen > net_buf_table[ix].size)
337 ;
338 req_ix = ix;
339
340 NET_COUNT_NET_BUF(net_buf_table[req_ix].requests, 1);
341
342 while (1) {
343 if ((error = tget_mpf((ID)net_buf_table[ix].index, (void **)buf, ix == 0 ? tmout : TMO_POL)) == E_OK) {
344 (*buf)->idix = (uint8_t)ix;
345 (*buf)->len = (uint16_t)minlen;
346 (*buf)->flags = 0;
347
348#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
349 NET_COUNT_NET_BUF(net_buf_table[ix].allocs, 1);
350 net_buf_table[ix].busies ++;
351#endif
352 return error;
353 }
354 ix --;
355 if (ix < 0 || net_buf_table[ix].size > maxlen)
356 break;
357 }
358
359 syslog(LOG_WARNING, "[BUF] busy, up index:%d,%d[%4d], len:%4d.",
360 (uint16_t)req_ix, ix, net_buf_table[req_ix].size, minlen);
361 *buf = NULL;
362 NET_COUNT_NET_BUF(net_buf_table[req_ix].errors, 1);
363 return error;
364 }
365
366/*
367 * tget_net_buf_down -- 小さなサイズの方向に探索して、ネットワークバッファを獲得する。
368 */
369
370static ER
371tget_net_buf_down (T_NET_BUF **buf, uint_t minlen, uint_t maxlen, TMO tmout)
372{
373 int_t ix, req_ix;
374 ER error = E_OK;
375
376 /* 最適なサイズの固定長メモリプールを探す。*/
377 ix = sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY);
378 while (ix -- > 0 && maxlen > net_buf_table[ix].size)
379 ;
380 req_ix = ix;
381
382 NET_COUNT_NET_BUF(net_buf_table[req_ix].requests, 1);
383
384 while (1) {
385 if ((error = tget_mpf((ID)net_buf_table[ix].index, (void **)buf,
386 ix == sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY) - 1 ? tmout : TMO_POL)) == E_OK) {
387 (*buf)->idix = (uint8_t)ix;
388 (*buf)->len = net_buf_table[ix].size;
389 (*buf)->flags = 0;
390#ifdef IF_ETHER_MULTI_NIC
391 (*buf)->conn_pos = 0;
392#endif
393
394#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
395 NET_COUNT_NET_BUF(net_buf_table[ix].allocs, 1);
396 net_buf_table[ix].busies ++;
397#endif
398 return error;
399 }
400 ix ++;
401 if (ix == sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY) || net_buf_table[ix].size < minlen)
402 break;
403 }
404
405 syslog(LOG_WARNING, "[BUF] busy, down index:%d,%d[%4d], len:%4d.",
406 (uint16_t)req_ix, ix, net_buf_table[req_ix].size, minlen);
407 *buf = NULL;
408 NET_COUNT_NET_BUF(net_buf_table[req_ix].errors, 1);
409 return error;
410 }
411
412/*
413 * tget_net_buf_ex -- ネットワークバッファを獲得する(拡張機能)。
414 */
415
416ER
417tget_net_buf_ex (T_NET_BUF **buf, uint_t minlen, uint_t maxlen, ATR nbatr, TMO tmout)
418{
419 /* 最小サイズが最大サイズを超
420えていたらエラー */
421 if ((nbatr & NBA_SEARCH_DESCENT) != 0 && minlen > maxlen) {
422 syslog(LOG_WARNING, "[NET BUF] E_PAR, minlen=%4d > maxlen=%4d.", minlen, maxlen);
423 return E_PAR;
424 }
425
426 /* 割当て可能な最大のサイズを超
427えていたらエラー */
428 if (minlen > net_buf_table[0].size || maxlen > net_buf_table[0].size) {
429 syslog(LOG_WARNING, "[NET BUF] E_PAR, minlen=%4d or maxlen=%4d > %4d",
430 minlen, maxlen, net_buf_table[0].size);
431 return E_PAR;
432 }
433
434#if defined(SUPPORT_TCP) && defined(TCP_CFG_SWBUF_CSAVE)
435
436 /* TCP で予約したネットワークバッファを取り出す。*/
437 if ((nbatr & NBA_RESERVE_TCP) != 0) {
438 if ((*buf = TCP_PULL_RES_NBUF(nbatr)) != NULL) {
439 return E_OK;
440 }
441 }
442
443#endif /* of #if defined(SUPPORT_TCP) && defined(TCP_CFG_SWBUF_CSAVE) */
444
445 if ((nbatr & NBA_SEARCH_DESCENT) != 0)
446 return tget_net_buf_down(buf, minlen, maxlen, tmout);
447 else if ((nbatr & NBA_SEARCH_ASCENT) != 0)
448 return tget_net_buf_up(buf, minlen, (uint_t)net_buf_table[0].size, tmout);
449 else {
450 syslog(LOG_WARNING, "[NET BUF] E_PAR, nbatr=%08x.", nbatr);
451 return E_PAR;
452 }
453 }
454
455/*
456 * tget_net_buf -- ネットワークバッファを獲得する(互換)。
457 */
458
459ER
460tget_net_buf (T_NET_BUF **buf, uint_t len, TMO tmout)
461{
462 return tget_net_buf_ex(buf, len, (uint_t)net_buf_table[0].size, NBA_SEARCH_ASCENT, tmout);
463 }
464
465/*
466 * rel_net_buf -- ネットワークバッファを返却する。
467 */
468
469ER
470rel_net_buf (T_NET_BUF *buf)
471{
472 ER error = E_OK;
473
474 /* ネットワークバッファの ID の正当性を検証する。*/
475 if ((int_t)buf->idix >= (int_t)(sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY))) {
476 syslog(LOG_WARNING, "[NET BUF] E_ID, ID=%d.", buf->idix);
477 error = E_ID;
478 }
479 else {
480
481#if defined(SUPPORT_TCP) && defined(TCP_CFG_SWBUF_CSAVE)
482
483 /* TCP で、ネットワークバッファを予約する。*/
484 if (TCP_PUSH_RES_NBUF(buf) == NULL)
485 return E_OK;
486
487#endif /* of #if defined(SUPPORT_TCP) && defined(TCP_CFG_SWBUF_CSAVE) */
488
489 /* 固定メモリプールに返す。*/
490
491 int idix = buf->idix;
492#if NET_COUNT_ENABLE & PROTO_FLG_NET_BUF
493 net_buf_table[idix].busies --;
494#endif
495 if ((error = rel_mpf((ID)net_buf_table[idix].index, buf)) != E_OK) {
496 syslog(LOG_WARNING, "[NET BUF] %s, ID=%d.", itron_strerror(error), idix);
497 }
498 }
499 return error;
500 }
501
502/*
503 * rus_net_buf -- ネットワークバッファを再利用する。
504 */
505
506ER
507rus_net_buf (T_NET_BUF *buf)
508{
509 ER error = E_OK;
510
511 if (buf->idix >= sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY)) {
512 syslog(LOG_WARNING, "[NET BUF] E_ID, ID=%d.", buf->idix);
513 error = E_ID;
514 }
515 else {
516 buf->len = net_buf_table[buf->idix].size;
517 buf->flags = 0;
518 error = E_OK;
519 }
520 return error;
521 }
522
523/*
524 * net_buf_siz -- ネットワークバッファのサイズを返す。
525 */
526
527ER_UINT
528net_buf_siz (T_NET_BUF *buf)
529{
530 if (buf->idix >= sizeof(net_buf_table) / sizeof(T_NET_BUF_ENTRY)) {
531 syslog(LOG_WARNING, "[BUF SIZ] E_ID, ID=%d.", buf->idix);
532 return E_ID;
533 }
534 else
535 return (ER_UINT)net_buf_table[buf->idix].size;
536 }
537
538/*
539 * net_buf_max_siz -- ネットワークバッファの最大サイズを返す。
540 */
541
542uint_t
543net_buf_max_siz (void)
544{
545 return (uint_t)net_buf_table[0].size;
546 }
547
548#else
549#include <stdlib.h>
550
551/*
552 * tget_net_buf_ex -- ネットワークバッファを獲得する(拡張機能)。
553 */
554
555ER
556tget_net_buf_ex (T_NET_BUF **buf, uint_t minlen, uint_t maxlen, ATR nbatr, TMO tmout)
557{
558 uint_t len = (minlen > maxlen) ? minlen : maxlen;
559 *buf = (T_NET_BUF *)malloc(sizeof(T_NET_BUF) - sizeof(((T_NET_BUF *)0)->buf) + len);
560 if (*buf == NULL)
561 return E_NOMEM;
562
563 (*buf)->idix = 0;
564 (*buf)->len = (uint16_t)len;
565 (*buf)->flags = 0;
566
567 return E_OK;
568 }
569
570/*
571 * tget_net_buf -- ネットワークバッファを獲得する(互換)。
572 */
573
574ER
575tget_net_buf (T_NET_BUF **buf, uint_t len, TMO tmout)
576{
577 return tget_net_buf_ex(buf, len, len, NBA_SEARCH_ASCENT, tmout);
578 }
579
580
581/*
582 * rel_net_buf -- ネットワークバッファを返却する。
583 */
584
585ER
586rel_net_buf (T_NET_BUF *buf)
587{
588 free(buf);
589
590 return E_OK;
591 }
592
593
594/*
595 * net_buf_max_siz -- ネットワークバッファの最大サイズを返す。
596 */
597
598uint_t
599net_buf_max_siz (void)
600{
601 return (uint_t)IF_PDU_SIZE;
602 }
603
604#endif
Note: See TracBrowser for help on using the repository browser.