source: EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/tcp_var.h@ 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-chdr
File size: 38.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_var.h 270 2017-02-09 04:03:47Z coas-nagasima $
44 */
45
46/*
47 * Copyright (c) 1982, 1986, 1993, 1994, 1995
48 * The Regents of the University of California. All rights reserved.
49 *
50 * Redistribution and use in source and binary forms, with or without
51 * modification, are permitted provided that the following conditions
52 * are met:
53 * 1. Redistributions of source code must retain the above copyright
54 * notice, this list of conditions and the following disclaimer.
55 * 2. Redistributions in binary form must reproduce the above copyright
56 * notice, this list of conditions and the following disclaimer in the
57 * documentation and/or other materials provided with the distribution.
58 * 3. All advertising materials mentioning features or use of this software
59 * must display the following acknowledgement:
60 * This product includes software developed by the University of
61 * California, Berkeley and its contributors.
62 * 4. Neither the name of the University nor the names of its contributors
63 * may be used to endorse or promote products derived from this software
64 * without specific prior written permission.
65 *
66 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
67 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
68 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
69 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
70 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
71 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
72 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
73 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
74 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
75 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
76 * SUCH DAMAGE.
77 *
78 * @(#)tcp_var.h 8.4 (Berkeley) 5/24/95
79 * $FreeBSD: src/sys/netinet/tcp_var.h,v 1.49.2.1 1999/08/29 16:29:57 peter Exp $
80 */
81
82#ifndef _TCP_VAR_H_
83#define _TCP_VAR_H_
84
85/*
86 * TCP ヘッダ・ペイロードアクセスマクロ
87 */
88
89#define IP_TCP_HDR_SIZE (IP_HDR_SIZE + TCP_HDR_SIZE)
90#define IF_IP_TCP_HDR_SIZE (IF_IP_HDR_SIZE + TCP_HDR_SIZE)
91#define IF_IP_TCP_HDR_OFFSET (IF_IP_HDR_SIZE)
92#define IF_IP_TCP_SDU_OFFSET (IF_IP_TCP_HDR_SIZE)
93
94#define GET_TCP_HDR(nbuf,thoff) ((T_TCP_HDR*)((uint8_t*)((nbuf)->buf) + thoff))
95#define GET_TCP_OPT(nbuf,thoff) ((uint8_t*)((nbuf)->buf) + thoff + TCP_HDR_SIZE)
96#define GET_TCP_SDU(nbuf,thoff) ((uint8_t*)((nbuf)->buf) + thoff + GET_TCP_HDR_SIZE2(nbuf,thoff))
97
98#define GET_TCP_HDR_OFFSET(nbuf) (GET_IF_IP_HDR_SIZE(nbuf))
99
100#define GET_TCP_HDR_SIZE2(nbuf,thoff) (TCP_HDR_LEN(GET_TCP_HDR(nbuf,thoff)->doff))
101#define GET_IP_TCP_HDR_SIZE2(nbuf,thoff) \
102 (GET_IP_HDR_SIZE(GET_IP_HDR(nbuf)) + GET_TCP_HDR_SIZE2(nbuf,thoff))
103#define GET_IF_IP_TCP_HDR_SIZE2(nbuf,thoff) \
104 (IF_HDR_SIZE + GET_IP_TCP_HDR_SIZE2(nbuf,thoff))
105
106/*
107 * TINET 1.1 との互換性のための定義
108 */
109
110#if defined(SUPPORT_INET4)
111
112#define IP4_TCP_HDR_SIZE IP_TCP_HDR_SIZE
113#define IF_IP4_TCP_HDR_SIZE IF_IP_TCP_HDR_SIZE
114#define GET_IP4_TCP_HDR_SIZE(nbuf) GET_IP_TCP_HDR_SIZE(nbuf)
115#define GET_IF_IP4_TCP_HDR_SIZE(nbuf) GET_IF_IP_TCP_HDR_SIZE(nbuf)
116
117#endif /* of #if defined(SUPPORT_INET4) */
118
119/*
120 * TINET 1.3 との互換性のための定義
121 */
122
123#define TMIN_TCP_CREPID TMIN_TCP_REPID
124#define TMIN_TCP_CCEPID TMIN_TCP_CEPID
125#define TNUM_TCP_CREPID TNUM_TCP_REPID
126#define TNUM_TCP_CCEPID TNUM_TCP_CEPID
127
128/*
129 * コールバック関数の定義
130 */
131
132typedef ER (*t_tcp_callback)(ID cepid, FN fncd, void *p_parblk);
133
134/*
135 * TCP 受付口
136 */
137
138/* IPv4 用 TCP 受付口 */
139typedef struct t_tcp4_rep {
140
141 /*
142 * ITRON TCP/IP API、TCP 受付口と同じメンバ
143 */
144 ATR repatr; /* 受付口属性 */
145 T_IPV4EP myaddr; /* 自分のアドレス */
146
147#ifdef TCP_CFG_EXTENTIONS
148 uint16_t flags; /* 受付口フラグ */
149 ID semid_lock; /* 受付口ロック */
150#endif /* of #ifdef TCP_CFG_EXTENTIONS */
151
152 } T_TCP4_REP;
153
154/* IPv6 用 TCP 受付口 */
155typedef struct t_tcp6_rep {
156
157 /*
158 * ITRON TCP/IP API、TCP 受付口と同じメンバ
159 */
160 ATR repatr; /* 受付口属性 */
161 T_IPV6EP myaddr; /* 自分のアドレス */
162
163#ifdef TCP_CFG_EXTENTIONS
164 uint16_t flags; /* 受付口フラグ */
165 ID semid_lock; /* 受付口ロック */
166#endif /* of #ifdef TCP_CFG_EXTENTIONS */
167
168 } T_TCP6_REP;
169
170#if defined(SUPPORT_INET4)
171#define T_TCP_REP T_TCP4_REP
172#endif
173
174#if defined(SUPPORT_INET6)
175#define T_TCP_REP T_TCP6_REP
176#endif
177
178/*
179 * 受付口フラグ
180 */
181
182#define TCP_REP_FLG_DYNAMIC UINT_C(0x0400) /* 動的生成・削除可能受付口。 */
183#define TCP_REP_FLG_VALID UINT_C(0x0800) /* 生成済みで有効な受付口。 */
184
185/*
186 * TCP 通信端点
187 */
188
189typedef uint32_t T_TCP_SEQ;
190typedef uint16_t T_TCP_SEG;
191typedef uint16_t T_TCP_WND;
192
193/*
194 * 通常の IPv4 TCP 通信端点
195 */
196typedef struct t_tcp4_cep {
197
198 /*
199 * ITRON TCP/IP API、TCP 通信端点と同じメンバ
200 */
201 ATR cepatr; /* 通信端点属性 */
202 void *sbuf; /* 送信用ウィンドバッファ */
203 int_t sbufsz; /* 送信用ウィンドバッファサイズ */
204 void *rbuf; /* 受信用ウィンドバッファ */
205 int_t rbufsz; /* 受信用ウィンドバッファサイズ */
206 t_tcp_callback callback; /* コールバック関数 */
207
208 /*
209 * TINET 独自のメンバ
210 */
211 uint32_t flags; /* 通信端点フラグ */
212 ID semid_lock; /* 通信端点ロック */
213 ID est_flgid; /* コネクション状æ…
214‹ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚° */
215 ID snd_flgid; /* 送信イベントフラグ */
216 ID rcv_flgid; /* 受信イベントフラグ */
217 ID snd_tskid; /* 送信タスク識別子 */
218 ID rcv_tskid; /* 受信タスク識別子 */
219 uint8_t *sbuf_rptr; /* 送信用読み出しポインタ */
220 uint8_t *sbuf_wptr; /* 送信用書き込みポインタ */
221 uint8_t *rbuf_rptr; /* 受信用読み出しポインタ */
222 uint8_t *rbuf_wptr; /* 受信用書き込みポインタ */
223 T_TCP_SEQ snd_ssthresh; /* 輻輳ウィンドサイズ(snd_cwnd) */
224 /* のしきい値 */
225 T_TCP_TIME rxtcur; /* 現在の再送タイムアウト */
226 T_TCP_TIME srtt; /* 平滑化された RTT */
227 T_TCP_TIME rttvar; /* 平滑化された分散 */
228 T_TCP_WND snd_cwnd; /* 輻輳ウィンドサイズ */
229
230 /*
231 * 相手の最大受信セグメントサイズ
232 *
233 * オリジナルでは、一般のセグメントの最大サイズ (t_maxseg) と、
234 * オプション付きのセグメントの最大サイズ (t_maxopd) が別に
235 * なっている。これは、現在のインターネットでは、オプション付きの
236 * セグメントのほうが多いからと説明されているためである。
237 * 本実装
238では、最大セグメントサイズオプション以外のオプションは
239 * 実装
240しないので、t_maxseg の使用する。
241 */
242 T_TCP_SEG maxseg;
243
244 int16_t snd_tfn; /* 送信動作中の API 機能コード */
245 int16_t rcv_tfn; /* 受信動作中の API 機能コード */
246
247#ifdef TCP_CFG_NON_BLOCKING
248
249 T_IPV4EP *p_dstaddr; /* 相手のアドレスへのポインタ */
250 T_IPV4EP *p_myaddr; /* 自分のアドレスへのポインタ */
251 int16_t snd_nblk_tfn; /* 送信動作中の API 機能コード */
252 int16_t rcv_nblk_tfn; /* 受信動作中の API 機能コード */
253 void *snd_data; /* 送信データ領域のå…
254ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ */
255 int_t snd_len; /* 送信データ領域の長さ */
256 void *rcv_data; /* 受信データ領域のå…
257ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ */
258 int_t rcv_len; /* 受信データ領域の長さ */
259 void **snd_p_buf; /* 送信バッファへのポインタ */
260 void **rcv_p_buf; /* 受信バッファへのポインタ */
261
262#endif /* of #ifdef TCP_CFG_NON_BLOCKING */
263
264#ifdef TCP_CFG_SWBUF_CSAVE
265 T_NET_BUF *swbufq; /* 送信ウィンドバッファキュー */
266#endif /* of #ifdef TCP_CFG_SWBUF_CSAVE */
267
268 /*
269 * これ以降のメンバーは tcp_init_cep() 関数でゼロクリアーされる。
270 */
271
272 T_TCP_TIME timer[NUM_TCP_TIMERS]; /* TCP のタイマ */
273 T_IPV4EP dstaddr; /* 相手のアドレス */
274 T_IPV4EP myaddr; /* 自分のアドレス */
275 T_TCP4_REP *rep; /* 受付口 */
276 T_NET_BUF *reassq; /* 受信再構成キュー */
277
278#ifdef TCP_CFG_RWBUF_CSAVE
279 T_NET_BUF *rwbufq; /* 受信ウィンドバッファキュー */
280#endif /* of #ifdef TCP_CFG_RWBUF_CSAVE */
281
282#ifdef TCP_CFG_EXTENTIONS
283 T_TCP_HDR *urg_tcph; /* 緊急データå…
284¥ã‚Šã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã® TCP ヘッダ */
285 T_TCP_SEQ snd_up; /* 送信した緊急ポインタ */
286 T_TCP_SEQ rcv_up; /* 受信した緊急ポインタ */
287#endif /* of #ifdef TCP_CFG_EXTENTIONS */
288
289 T_TCP_SEQ snd_una; /* 未確認の最小送信 SEQ つまり */
290 /* 確認された最大送信 SEQ */
291 T_TCP_SEQ snd_max; /* 送信した最大 SEQ */
292 T_TCP_SEQ snd_nxt; /* 次に送信する SEQ */
293 T_TCP_SEQ snd_old_nxt; /* å…
294ƒã® snd_nxt */
295 T_TCP_SEQ snd_wl1; /* 前回ウィンドを更新した SEQ */
296 T_TCP_SEQ snd_wl2; /* 前回ウィンドを更新した ACK */
297 T_TCP_SEQ iss; /* 自分の SEQ の初期値 */
298 T_TCP_SEQ irs; /* 相手の SEQ の初期値 */
299 T_TCP_SEQ rcv_nxt; /* 受信を期待
300している最小の SEQ */
301 T_TCP_SEQ rcv_adv; /* 受信を期待
302している最大の SEQ */
303 T_TCP_SEQ rcv_wnd; /* 受信可能なウィンドサイズ */
304 T_TCP_SEQ rtseq; /* 時間計測を始めた SEQ */
305 T_TCP_SEQ last_ack_sent; /* 最後に送信した ACK */
306 T_TCP_TIME idle; /* アイドル時間 */
307 ER error; /* 非同期に発生したエラー */
308 ER net_error; /* ネットワークのエラー状æ…
309‹ */
310 T_TCP_WND snd_wnd; /* 相手の受信可能ウィンドサイズ */
311 T_TCP_WND max_sndwnd; /* 今までの最大送信ウィンドサイズ */
312 T_TCP_TIME rtt; /* 往復時間 */
313 uint16_t swbuf_count; /* 送信ウィンドバッファの使用中サイズ */
314 uint16_t rwbuf_count; /* 受信ウィンドバッファの使用中サイズ */
315 uint16_t rcv_buf_len; /* tcp_rcv_buf の割当て長 */
316 uint16_t get_buf_len; /* tcp_rcv_buf の割当て長 */
317 uint8_t rxtshift; /* 再送信回数の log(2) */
318 uint8_t fsm_state; /* FSM 状æ…
319‹ */
320 uint8_t dupacks; /* 再送 ACK 数 */
321
322#if defined(TCP_CFG_RWBUF_CSAVE) && defined(TCP_CFG_RWBUF_CSAVE_MAX_QUEUES)
323 uint8_t rwbufq_entries; /* 受信ウィンドバッファキューのエントリ数 */
324#endif /* of #if defined(TCP_CFG_RWBUF_CSAVE) && defined(TCP_CFG_RWBUF_CSAVE_MAX_QUEUES) */
325
326 } T_TCP4_CEP;
327
328/*
329 * Time Wait 用 IPv4 TCP 通信端点
330 */
331typedef struct t_tcp4_twcep {
332 int_t rbufsz; /* 受信用ウィンドバッファサイズ */
333 T_TCP_TIME timer_2msl; /* 2MSL タイマ */
334 T_IPV4EP dstaddr; /* 相手のアドレス */
335 T_IPV4EP myaddr; /* 自分のアドレス */
336 T_TCP_SEQ snd_una; /* 未確認の最小送信 SEQ つまり */
337 /* 確認された最大送信 SEQ */
338 T_TCP_SEQ rcv_nxt; /* 受信を期待
339している最小の SEQ */
340 uint16_t rwbuf_count; /* 受信ウィンドバッファの使用中サイズ */
341 uint8_t fsm_state; /* FSM 状æ…
342‹ */
343
344 } T_TCP4_TWCEP;
345
346/*
347 * 通常の IPv6 TCP 通信端点
348 */
349typedef struct t_tcp6_cep {
350
351 /*
352 * ITRON TCP/IP API、TCP 通信端点と同じメンバ
353 */
354 ATR cepatr; /* 通信端点属性 */
355 void *sbuf; /* 送信用ウィンドバッファ */
356 int_t sbufsz; /* 送信用ウィンドバッファサイズ */
357 void *rbuf; /* 受信用ウィンドバッファ */
358 int_t rbufsz; /* 受信用ウィンドバッファサイズ */
359 t_tcp_callback callback; /* コールバック関数 */
360
361 /*
362 * TINET 独自のメンバ
363 */
364 uint32_t flags; /* 通信端点フラグ */
365 ID semid_lock; /* 通信端点ロック */
366 ID est_flgid; /* コネクション状æ…
367‹ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚° */
368 ID snd_flgid; /* 送信イベントフラグ */
369 ID rcv_flgid; /* 受信イベントフラグ */
370 ID snd_tskid; /* 送信タスク識別子 */
371 ID rcv_tskid; /* 受信タスク識別子 */
372 uint8_t *sbuf_rptr; /* 送信用読み出しポインタ */
373 uint8_t *sbuf_wptr; /* 送信用書き込みポインタ */
374 uint8_t *rbuf_rptr; /* 受信用読み出しポインタ */
375 uint8_t *rbuf_wptr; /* 受信用書き込みポインタ */
376 T_TCP_SEQ snd_ssthresh; /* 輻輳ウィンドサイズ(snd_cwnd) */
377 /* のしきい値 */
378 T_TCP_TIME rxtcur; /* 現在の再送タイムアウト */
379 T_TCP_TIME srtt; /* 平滑化された RTT */
380 T_TCP_TIME rttvar; /* 平滑化された分散 */
381 T_TCP_WND snd_cwnd; /* 輻輳ウィンドサイズ */
382
383 /*
384 * 相手の最大受信セグメントサイズ
385 *
386 * オリジナルでは、一般のセグメントの最大サイズ (t_maxseg) と、
387 * オプション付きのセグメントの最大サイズ (t_maxopd) が別に
388 * なっている。これは、現在のインターネットでは、オプション付きの
389 * セグメントのほうが多いからと説明されているためである。
390 * 本実装
391では、最大セグメントサイズオプション以外のオプションは
392 * 実装
393しないので、t_maxseg の使用する。
394 */
395 T_TCP_SEG maxseg;
396
397 T_IPV6EP *p_dstaddr; /* 相手のアドレスへのポインタ */
398 T_IPV6EP *p_myaddr; /* 自分のアドレスへのポインタ */
399 int16_t snd_tfn; /* 送信動作中の API 機能コード */
400 int16_t rcv_tfn; /* 受信動作中の API 機能コード */
401
402#ifdef TCP_CFG_NON_BLOCKING
403
404 int16_t snd_nblk_tfn; /* 送信動作中の API 機能コード */
405 int16_t rcv_nblk_tfn; /* 受信動作中の API 機能コード */
406 void *snd_data; /* 送信データ領域のå…
407ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ */
408 int_t snd_len; /* 送信データ領域の長さ */
409 void *rcv_data; /* 受信データ領域のå…
410ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ */
411 int_t rcv_len; /* 受信データ領域の長さ */
412 void **snd_p_buf; /* 送信バッファへのポインタ */
413 void **rcv_p_buf; /* 受信バッファへのポインタ */
414
415#endif /* of #ifdef TCP_CFG_NON_BLOCKING */
416
417#ifdef TCP_CFG_SWBUF_CSAVE
418 T_NET_BUF *swbufq; /* 送信ウィンドバッファキュー */
419#endif /* of #ifdef TCP_CFG_SWBUF_CSAVE */
420
421 /*
422 * これ以降のメンバーは tcp_init_cep() 関数でゼロクリアーされる。
423 */
424
425 T_TCP_TIME timer[NUM_TCP_TIMERS]; /* TCP のタイマ */
426 T_IPV6EP dstaddr; /* 相手のアドレス */
427 T_IPV6EP myaddr; /* 自分のアドレス */
428 T_TCP6_REP *rep; /* 受付口 */
429 T_NET_BUF *reassq; /* 受信再構成キュー */
430
431#ifdef TCP_CFG_RWBUF_CSAVE
432 T_NET_BUF *rwbufq; /* 受信ウィンドバッファキュー */
433#endif /* of #ifdef TCP_CFG_RWBUF_CSAVE */
434
435#ifdef TCP_CFG_EXTENTIONS
436 T_TCP_HDR *urg_tcph; /* 緊急データå…
437¥ã‚Šã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã® TCP ヘッダ */
438 T_TCP_SEQ snd_up; /* 送信した緊急ポインタ */
439 T_TCP_SEQ rcv_up; /* 受信した緊急ポインタ */
440#endif /* of #ifdef TCP_CFG_EXTENTIONS */
441
442 T_TCP_SEQ snd_una; /* 未確認の最小送信 SEQ つまり */
443 /* 確認された最大送信 SEQ */
444 T_TCP_SEQ snd_max; /* 送信した最大 SEQ */
445 T_TCP_SEQ snd_nxt; /* 次に送信する SEQ */
446 T_TCP_SEQ snd_old_nxt; /* å…
447ƒã® snd_nxt */
448 T_TCP_SEQ snd_wl1; /* 前回ウィンドを更新した SEQ */
449 T_TCP_SEQ snd_wl2; /* 前回ウィンドを更新した ACK */
450 T_TCP_SEQ iss; /* 自分の SEQ の初期値 */
451 T_TCP_SEQ irs; /* 相手の SEQ の初期値 */
452 T_TCP_SEQ rcv_nxt; /* 受信を期待
453している最小の SEQ */
454 T_TCP_SEQ rcv_adv; /* 受信を期待
455している最大の SEQ */
456 T_TCP_SEQ rcv_wnd; /* 受信可能なウィンドサイズ */
457 T_TCP_SEQ rtseq; /* 時間計測を始めた SEQ */
458 T_TCP_SEQ last_ack_sent; /* 最後に送信した ACK */
459 T_TCP_TIME idle; /* アイドル時間 */
460 ER error; /* 非同期に発生したエラー */
461 ER net_error; /* ネットワークのエラー状æ…
462‹ */
463 T_TCP_WND snd_wnd; /* 相手の受信可能ウィンドサイズ */
464 T_TCP_WND max_sndwnd; /* 今までの最大送信ウィンドサイズ */
465 T_TCP_TIME rtt; /* 往復時間 */
466 uint16_t swbuf_count; /* 送信ウィンドバッファの使用中サイズ */
467 uint16_t rwbuf_count; /* 受信ウィンドバッファの使用中サイズ */
468 uint16_t rcv_buf_len; /* tcp_rcv_buf の割当て長 */
469 uint16_t get_buf_len; /* tcp_rcv_buf の割当て長 */
470 uint8_t rxtshift; /* 再送信回数の log(2) */
471 uint8_t fsm_state; /* FSM 状æ…
472‹ */
473 uint8_t dupacks; /* 再送 ACK 数 */
474
475#if defined(TCP_CFG_RWBUF_CSAVE) && defined(TCP_CFG_RWBUF_CSAVE_MAX_QUEUES)
476 uint8_t rwbufq_entries; /* 受信ウィンドバッファキューのエントリ数 */
477#endif /* of #if defined(TCP_CFG_RWBUF_CSAVE) && defined(TCP_CFG_RWBUF_CSAVE_MAX_QUEUES) */
478
479 } T_TCP6_CEP;
480
481/*
482 * Time Wait 用 IPv6 TCP 通信端点
483 */
484typedef struct t_tcp6_twcep {
485 int_t rbufsz; /* 受信用ウィンドバッファサイズ */
486 T_TCP_TIME timer_2msl; /* 2MSL タイマ */
487 T_IPV6EP dstaddr; /* 相手のアドレス */
488 T_IPV6EP myaddr; /* 自分のアドレス */
489 T_TCP_SEQ snd_una; /* 未確認の最小送信 SEQ つまり */
490 /* 確認された最大送信 SEQ */
491 T_TCP_SEQ iss; /* 自分の SEQ の初期値 */
492 T_TCP_SEQ irs; /* 相手の SEQ の初期値 */
493 T_TCP_SEQ rcv_nxt; /* 受信を期待
494している最小の SEQ */
495 T_TCP_WND snd_wnd; /* 相手の受信可能ウィンドサイズ */
496 uint16_t rwbuf_count; /* 受信ウィンドバッファの使用中サイズ */
497 uint8_t fsm_state; /* FSM 状æ…
498‹ */
499
500 } T_TCP6_TWCEP;
501
502#if defined(SUPPORT_INET4)
503#define T_TCP_CEP T_TCP4_CEP
504#define T_TCP_TWCEP T_TCP4_TWCEP
505#endif /* of #if defined(SUPPORT_INET4) */
506
507#if defined(SUPPORT_INET6)
508#define T_TCP_CEP T_TCP6_CEP
509#define T_TCP_TWCEP T_TCP6_TWCEP
510#endif /* of #if defined(SUPPORT_INET6) */
511
512#define T_TCP_CEP_DEFINED
513
514/*
515 * TCP 通信端点の状æ…
516‹ãƒ•ãƒ©ã‚°
517 */
518
519#define TCP_CEP_FLG_ACK_NOW ULONG_C(0x00000001) /* 直ちに相手に ACK を送る。 */
520#define TCP_CEP_FLG_DEL_ACK ULONG_C(0x00000002) /* ACK を遅
521延する。 */
522#define TCP_CEP_FLG_SENT_FIN ULONG_C(0x00000004) /* FIN を送ってある。 */
523#define TCP_CEP_FLG_NEED_SYN ULONG_C(0x00000008) /* SYN を送信する。 */
524#define TCP_CEP_FLG_NEED_FIN ULONG_C(0x00000010) /* FIN を送信する。 */
525#define TCP_CEP_FLG_FORCE ULONG_C(0x00000020) /* 強制送信。 */
526#define TCP_CEP_FLG_NO_PUSH ULONG_C(0x00000040) /* push しない。 */
527#define TCP_CEP_FLG_NO_DELAY ULONG_C(0x00000080) /* 遅
528延しない。 */
529#define TCP_CEP_FLG_FORCE_CLEAR ULONG_C(0x00000100) /* 強制送信した後フラグをクリアーする。*/
530#define TCP_CEP_FLG_POST_OUTPUT ULONG_C(0x00000200) /* 送信を開始する。 */
531#define TCP_CEP_FLG_RESERVE_OUTPUT ULONG_C(0x00000400) /* 送信を予約する。 */
532#define TCP_CEP_FLG_DYNAMIC ULONG_C(0x00001000) /* 動的生成・削除可能通信端点。 */
533#define TCP_CEP_FLG_VALID ULONG_C(0x00002000) /* 生成済みで有効な通信端点。 */
534#define TCP_CEP_FLG_CLOSE_AFTER_OUTPUT ULONG_C(0x00004000) /* 送信した後コネクションを閉じる。*/
535#define TCP_CEP_FLG_RESTORE_NEXT_OUTPUT ULONG_C(0x00008000) /* 送信した後、snd_nxt をå…
536ƒã«æˆ»ã™ã€‚*/
537
538/* 送受信ウィンドバッファの省コピー機能 */
539#define TCP_CEP_FLG_WBCS_NBUF_REQ ULONG_C(0x00080000) /* ネットワークバッファ割当て要求 */
540#define TCP_CEP_FLG_WBCS_MASK ULONG_C(0x00070000) /* マスク */
541#define TCP_CEP_FLG_WBCS_FREE ULONG_C(0x00000000) /* 送信ウィンドバッファ未使用 */
542#define TCP_CEP_FLG_WBCS_WOPEN_PEND ULONG_C(0x00010000) /* 相手の受信ウィンドの開き待
543ち */
544#define TCP_CEP_FLG_WBCS_NBUF_PEND ULONG_C(0x00020000) /* ネットワークバッファ予約待
545ち */
546#define TCP_CEP_FLG_WBCS_NBUF_RSVD ULONG_C(0x00030000) /* ネットワークバッファ予約済み */
547#define TCP_CEP_FLG_WBCS_NBUF_READY ULONG_C(0x00040000) /* ネットワークバッファ割当て済み */
548#define TCP_CEP_FLG_WBCS_SEND_READY ULONG_C(0x00050000) /* 送信可能 */
549#define TCP_CEP_FLG_WBCS_SENT ULONG_C(0x00060000) /* 送信済みで、ACK待
550ち */
551#define TCP_CEP_FLG_WBCS_ACKED ULONG_C(0x00070000) /* 送信済みで、ACK完了 */
552
553/*
554 * 通信端点イベントフラグ
555 */
556
557#define TCP_CEP_EVT_ESTABLISHED ULONG_C(0x00000001) /* コネクション確立 */
558#define TCP_CEP_EVT_CLOSED ULONG_C(0x00000002) /* 未使用状æ…
559‹ */
560#define TCP_CEP_EVT_SWBUF_READY ULONG_C(0x00000004) /* 送信ウィンドバッファ空き */
561#define TCP_CEP_EVT_RWBUF_READY ULONG_C(0x00000008) /* 送信ウィンドバッファデータあり */
562#define TCP_CEP_EVT_ALL ULONG_C(0xffffffff) /* å…
563¨ã‚¤ãƒ™ãƒ³ãƒˆ */
564
565/*
566 * 追加 API 機能・事象コード
567 */
568
569/* TCP 関係 */
570
571#define TFN_TCP_UNDEF (0)
572
573/*
574 * srtt: 平滑化された RTT
575 * rttvar: 平滑化された分散
576 * rtt: 測定された往復時間
577 *
578 * 平滑化された RTT (srtt) と平滑化された分散 (rttvar) を
579 * 整数型で計算するために、左シフトしてスケールする。
580 * srtt は 2 進小数点以下 3 ビット、
581 * rttvar は 2 進小数点以下 2 ビットを保持する。
582 */
583
584#define TCP_DELTA_SHIFT 2
585 /* 差分 = rtt/8 + srtt*7/8 の計算のためのシフト値 */
586#define TCP_SRTT_SHIFT (TCP_DELTA_SHIFT + 3)
587 /* srtt のシフト値、3(+2)ビット */
588#define TCP_RTTVAR_SHIFT (TCP_DELTA_SHIFT + 2)
589 /* rttvar のシフト値、2(+2)ビット */
590#define TCP_SRTT_SCALE (1<<TCP_SRTT_SHIFT)
591#define TCP_RTTVAR_SCALE (1<<TCP_RTTVAR_SHIFT)
592
593/*
594 * 高速再転送を開始する再送 ACK 数のしきい値
595 */
596
597#define MAX_TCP_REXMT_THRESH 3
598
599/*
600 * 受信再構成キューでの TCP ヘッダ
601 */
602
603typedef struct t_tcp_q_hdr {
604 uint16_t sport; /* 送信å…
605ƒãƒãƒ¼ãƒˆç•ªå· */
606 uint16_t dport; /* 宛å…
607ˆãƒãƒ¼ãƒˆç•ªå· */
608
609 uint32_t seq; /* SEQ 番号 */
610
611 T_NET_BUF *next; /* 次のセグメント、å…
612ƒã¯ ACK 番号(ack) */
613
614 uint8_t doff; /* データオフセット(上位4ビット) */
615 uint8_t flags; /* フラグ(下位6ビット) */
616 uint16_t soff; /* SDU オフセット、å…
617ƒã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚µã‚¤ã‚º(win) */
618
619 uint16_t slen; /* SDU 長、å…
620ƒã¯ãƒã‚§ãƒƒã‚¯ã‚µãƒ (sum) */
621 uint16_t urp; /* 緊急ポインタ(SDU 長補正) */
622 } __attribute__((packed, aligned(2)))T_TCP_Q_HDR;
623
624#define GET_TCP_Q_HDR(nbuf,thoff) ((T_TCP_Q_HDR*)((uint8_t*)((nbuf)->buf) + thoff))
625#define GET_TCP_IP_Q_HDR(nbuf) ((T_TCP_IP_Q_HDR*)GET_IP_HDR(nbuf))
626
627/*
628 * オブジェクト ID の最小値の定義
629 */
630
631#define TMIN_TCP_REPID 1 /* TCP 受付口 ID の最小値 */
632#define TMIN_TCP_CEPID 1 /* TCP 通信端点 ID の最小値 */
633#define TMIN_TCP_TWCEPID 1 /* Time Wait 用 TCP 通信端点 ID の最小値 */
634
635/*
636 * 制御セグメント(データなし)サイズのネットワークバッファ
637 */
638
639typedef struct t_net_buf_cseg {
640 uint16_t len; /* データの長さ */
641 uint8_t idix; /* mpfid のインデックス */
642 uint8_t flags; /* フラグ */
643#ifdef IF_ETHER_NIC_NET_BUF_ALIGN
644 uint8_t nalign[IF_ETHER_NIC_NET_BUF_ALIGN];
645#endif
646#if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
647 uint8_t halign[4 - IF_HDR_ALIGN];
648#endif
649 uint8_t buf[IF_HDR_SIZE + IP_HDR_SIZE + TCP_HDR_SIZE];
650 /* バッファ本体 */
651 } T_NET_BUF_CSEG;
652
653#ifdef SUPPORT_MIB
654
655/*
656 * SNMP の 管理情
657報ベース (MIB)
658 */
659
660typedef struct t_tcp_stats {
661 uint32_t tcpActiveOpens;
662 uint32_t tcpPassiveOpens;
663 uint32_t tcpAttemptFails;
664 uint32_t tcpEstabResets;
665/* uint32_t tcpCurrEstab;*/
666 uint32_t tcpInSegs;
667 uint32_t tcpOutSegs;
668 uint32_t tcpRetransSegs;
669 uint32_t tcpInErrs;
670 uint32_t tcpOutRsts;
671} T_TCP_STATS;
672
673#endif /* of #ifdef SUPPORT_MIB */
674
675/*
676 * 関数シミュレーションマクロ
677 */
678
679#define VAID_TCP_REPID(id) (TMIN_TCP_REPID<=(id)&&(id)<=tmax_tcp_repid)
680#define VAID_TCP_CEPID(id) (TMIN_TCP_CEPID<=(id)&&(id)<=tmax_tcp_cepid)
681
682#define INDEX_TCP_REP(id) ((id)-TMIN_TCP_REPID)
683#define INDEX_TCP_CEP(id) ((id)-TMIN_TCP_CEPID)
684
685#define GET_TCP_REP(id) (&(tcp_rep[INDEX_TCP_REP(id)]))
686#define GET_TCP_CEP(id) (&(tcp_cep[INDEX_TCP_CEP(id)]))
687
688#define GET_TCP_REPID(rep) ((ID)(((rep)-tcp_rep)+TMIN_TCP_REPID))
689#define GET_TCP_CEPID(cep) ((ID)(((cep)-tcp_cep)+TMIN_TCP_CEPID))
690#define GET_TCP_TWCEPID(cep) ((ID)(((cep)-tcp_twcep)+TMIN_TCP_TWCEPID))
691
692#define IS_TFN_TCP_RCV(t) ((t)==TFN_TCP_ACP_CEP||(t)==TFN_TCP_RCV_DAT||\
693 (t)==TFN_TCP_CLS_CEP||\
694 (t)==TFN_TCP_RCV_BUF||(t)==TFN_TCP_REL_BUF||\
695 (t)==TFN_TCP_RCV_OOB)
696
697#define VALID_TFN_TCP_CAN(t) ((t)==TFN_TCP_ACP_CEP||(t)==TFN_TCP_CON_CEP||\
698 (t)==TFN_TCP_CLS_CEP||\
699 (t)==TFN_TCP_SND_DAT||(t)==TFN_TCP_RCV_DAT||\
700 (t)==TFN_TCP_GET_BUF||(t)==TFN_TCP_RCV_BUF||\
701 (t)==TFN_TCP_SND_OOB||\
702 (t)==TFN_TCP_ALL)
703
704#define VALID_URG_POINTER(urg) (TCP_CFG_URG_OFFSET==0||urg!=0)
705
706#define VALID_TCP_CEP(cep) (((cep)->flags&TCP_CEP_FLG_VALID)!=0)
707#define DYNAMIC_TCP_CEP(cep) (((cep)->flags&TCP_CEP_FLG_DYNAMIC)!=0)
708
709#ifdef TCP_CFG_EXTENTIONS
710
711#define VALID_TCP_REP(rep) (((rep)->flags&TCP_REP_FLG_VALID)!=0)
712#define DYNAMIC_TCP_REP(rep) (((rep)->flags&TCP_REP_FLG_DYNAMIC)!=0)
713
714#else /* of #ifdef TCP_CFG_EXTENTIONS */
715
716#define VALID_TCP_REP(rep) (true)
717#define DYNAMIC_TCP_REP(rep) (false)
718
719#endif /* of #ifdef TCP_CFG_EXTENTIONS */
720
721/*
722 * å…
723¨åŸŸå¤‰æ•°
724 */
725
726extern T_TCP_REP tcp_rep[];
727extern T_TCP_CEP tcp_cep[];
728extern uint8_t tcp_initialized;
729extern const ID tmax_tcp_repid;
730extern const ID tmax_tcp_cepid;
731extern T_TCP_TWCEP tcp_twcep[];
732
733#ifdef SUPPORT_MIB
734
735extern T_TCP_STATS tcp_stats;
736
737#endif /* of #ifdef SUPPORT_MIB */
738
739/*
740 * Inline 関数
741 */
742
743#ifndef TCP_CFG_RWBUF_CSAVE
744
745/*
746 * TCP 通信端点の受信ウィンドバッファの省コピー機能が
747 * 無効の場合は何もしないためのダミーの関数
748 */
749
750/*
751 * tcp_free_rwbufq -- 受信ウィンドバッファキューを解放する。
752 */
753
754Inline void
755tcp_free_rwbufq_ncs (T_TCP_CEP *cep)
756{
757 }
758
759#endif /* of #ifndef TCP_CFG_RWBUF_CSAVE */
760
761#ifdef TCP_CFG_SWBUF_CSAVE_ONLY
762
763/*
764 * TCP 通信端点の送信ウィンドバッファの省コピー機能のみが
765 * 有効の場合は何もしないためのダミーの関数
766 */
767
768/*
769 * tcp_read_swbuf_cs -- 送信ウィンドバッファからデータを読み出す。
770 */
771
772Inline void
773tcp_read_swbuf_cs (T_TCP_CEP *cep, T_NET_BUF *output, uint_t len, uint_t doff)
774{
775 }
776
777#endif /* of #ifdef TCP_CFG_SWBUF_CSAVE_ONLY */
778
779#ifndef TCP_CFG_SWBUF_CSAVE
780
781/*
782 * TCP 通信端点の送信ウィンドバッファの省コピー機能が
783 * 無効の場合は何もしないためのダミーの関数
784 */
785
786/*
787 * tcp_free_swbufq -- 送信ウィンドバッファキューを解放する。
788 */
789
790Inline void
791tcp_free_swbufq_ncs (T_TCP_CEP *cep)
792{
793 }
794
795/*
796 * tcp_alloc_swbuf -- 送信ウィンドバッファ用のネットワークバッファの割り当てを指示する。
797 */
798
799Inline void
800tcp_alloc_swbuf_ncs (T_TCP_CEP *cep)
801{
802 }
803
804/*
805 * tcp_push_res_nbuf -- ネットワークバッファを予約する。
806 */
807
808Inline T_NET_BUF *
809tcp_push_res_nbuf_ncs (T_NET_BUF *nbuf)
810{
811 return nbuf;
812 }
813
814/*
815 * tcp_pull_res_nbuf -- 予約してあるネットワークバッファ返す。
816 */
817
818Inline T_NET_BUF *
819tcp_pull_res_nbuf_ncs (ATR nbatr)
820{
821 return NULL;
822 }
823
824#endif /* of #ifndef TCP_CFG_SWBUF_CSAVE */
825
826/*
827 * TCP 通信端点の受信ウィンドバッファの省コピー機能の切り替えマクロ
828 */
829
830#ifdef TCP_CFG_RWBUF_CSAVE
831
832#ifdef TCP_CFG_RWBUF_CSAVE_ONLY
833
834#define TCP_FREE_RWBUFQ(cep) tcp_free_rwbufq_cs(cep)
835#define TCP_DROP_RWBUF(cep,len) tcp_drop_rwbuf_cs(cep,len)
836#define TCP_READ_RWBUF(cep,data,len) tcp_read_rwbuf_cs(cep,data,len)
837#define TCP_GET_RWBUF_ADDR(cep,buf) tcp_get_rwbuf_addr_cs(cep,buf)
838#define TCP_WRITE_RWBUF(cep,input,thoff) tcp_write_rwbuf_cs(cep,input,thoff)
839
840#else /* of #ifdef TCP_CFG_RWBUF_CSAVE_ONLY */
841
842#define TCP_FREE_RWBUFQ(cep) tcp_free_rwbufq(cep)
843#define TCP_DROP_RWBUF(cep,len) tcp_drop_rwbuf(cep,len)
844#define TCP_READ_RWBUF(cep,data,len) tcp_read_rwbuf(cep,data,len)
845#define TCP_GET_RWBUF_ADDR(cep,buf) tcp_get_rwbuf_addr(cep,buf)
846#define TCP_WRITE_RWBUF(cep,input,thoff) tcp_write_rwbuf(cep,input,thoff)
847
848#endif /* of #ifdef TCP_CFG_RWBUF_CSAVE_ONLY */
849
850#else /* of #ifdef TCP_CFG_RWBUF_CSAVE */
851
852#define TCP_FREE_RWBUFQ(cep) tcp_free_rwbufq_ncs(cep)
853#define TCP_DROP_RWBUF(cep,len) tcp_drop_rwbuf_ncs(cep,len)
854#define TCP_READ_RWBUF(cep,data,len) tcp_read_rwbuf_ncs(cep,data,len)
855#define TCP_GET_RWBUF_ADDR(cep,buf) tcp_get_rwbuf_addr_ncs(cep,buf)
856#define TCP_WRITE_RWBUF(cep,input,thoff) tcp_write_rwbuf_ncs(cep,input,thoff)
857
858#endif /* of #ifdef TCP_CFG_RWBUF_CSAVE */
859
860/*
861 * TCP 通信端点の送信ウィンドバッファの省コピー機能の切り替えマクロ
862 */
863
864#ifdef TCP_CFG_SWBUF_CSAVE
865
866#define TCP_PUSH_RES_NBUF(nbuf) tcp_push_res_nbuf(nbuf)
867#define TCP_PULL_RES_NBUF(atr) tcp_pull_res_nbuf(atr)
868
869#ifdef TCP_CFG_SWBUF_CSAVE_ONLY
870
871#define TCP_FREE_SWBUFQ(cep) tcp_free_swbufq_cs(cep)
872#define TCP_ALLOC_SWBUF(cep) tcp_alloc_swbuf_cs(cep)
873#define TCP_DROP_SWBUF(cep,len) tcp_drop_swbuf_cs(cep,len)
874#define TCP_WRITE_SWBUF(cep,data,len) tcp_write_swbuf_cs(cep,data,len)
875#define TCP_READ_SWBUF(cep,output,len,doff) tcp_read_swbuf_cs(cep,output,len,doff)
876#define TCP_WAIT_SWBUF(cep,tmout) tcp_wait_swbuf_cs(cep,tmout)
877#define TCP_GET_SWBUF_ADDR(cep,buf) tcp_get_swbuf_addr_cs(cep,buf)
878#define TCP_SEND_SWBUF(cep,len) tcp_send_swbuf_cs(cep,len)
879#define TCP_IS_SWBUF_FULL(cep) tcp_is_swbuf_full_cs(cep)
880
881#else /* of #ifdef TCP_CFG_SWBUF_CSAVE_ONLY */
882
883#define TCP_FREE_SWBUFQ(cep) tcp_free_swbufq(cep)
884#define TCP_ALLOC_SWBUF(cep) tcp_alloc_swbuf(cep)
885#define TCP_DROP_SWBUF(cep,len) tcp_drop_swbuf(cep,len)
886#define TCP_WRITE_SWBUF(cep,data,len) tcp_write_swbuf(cep,data,len)
887#define TCP_READ_SWBUF(cep,output,len,doff) tcp_read_swbuf(cep,output,len,doff)
888#define TCP_WAIT_SWBUF(cep,tmout) tcp_wait_swbuf(cep,tmout)
889#define TCP_GET_SWBUF_ADDR(cep,buf) tcp_get_swbuf_addr(cep,buf)
890#define TCP_SEND_SWBUF(cep,len) tcp_send_swbuf(cep,len)
891#define TCP_IS_SWBUF_FULL(cep) tcp_is_swbuf_full(cep)
892
893#endif /* of #ifdef TCP_CFG_SWBUF_CSAVE_ONLY */
894
895#else /* of #ifdef TCP_CFG_SWBUF_CSAVE */
896
897#define TCP_READ_SWBUF(cep,output,len,doff) tcp_read_swbuf_ncs(cep,output,len,doff)
898#define TCP_FREE_SWBUFQ(cep) tcp_free_swbufq_ncs(cep)
899#define TCP_ALLOC_SWBUF(cep) tcp_alloc_swbuf_ncs(cep)
900#define TCP_PUSH_RES_NBUF(nbuf) tcp_push_res_nbuf_ncs(nbuf)
901#define TCP_PULL_RES_NBUF(atr) tcp_pull_res_nbuf_ncs(atr)
902#define TCP_DROP_SWBUF(cep,len) tcp_drop_swbuf_ncs(cep,len)
903#define TCP_WRITE_SWBUF(cep,data,len) tcp_write_swbuf_ncs(cep,data,len)
904#define TCP_WAIT_SWBUF(cep,tmout) tcp_wait_swbuf_ncs(cep,tmout)
905#define TCP_GET_SWBUF_ADDR(cep,buf) tcp_get_swbuf_addr_ncs(cep,buf)
906#define TCP_SEND_SWBUF(cep,len) tcp_send_swbuf_ncs(cep,len)
907#define TCP_IS_SWBUF_FULL(cep) tcp_is_swbuf_full_ncs(cep)
908
909#endif /* of #ifdef TCP_CFG_SWBUF_CSAVE */
910
911/*
912 * 関数
913 */
914
915extern uint_t tcp_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp);
916extern void tcp_init (void);
917extern void tcp_init_iss (void);
918extern T_TCP_CEP *tcp_close (T_TCP_CEP *cep);
919extern T_TCP_CEP *tcp_drop (T_TCP_CEP *cep, ER errno);
920extern void tcp_respond (T_NET_BUF *nbuf, T_TCP_CEP *cep,
921 T_TCP_SEQ ack, T_TCP_SEQ seq, uint_t rbfree, uint8_t flags);
922extern void tcp_set_header (T_NET_BUF *nbuf, T_TCP_CEP *cep, uint_t thoff, uint_t optlen);
923extern ER tcp_get_segment (T_NET_BUF **nbuf, T_TCP_CEP *cep,
924 uint_t optlen, uint_t len, uint_t maxlen, ATR nbatr, TMO tmout);
925extern void tcp_init_cep (T_TCP_CEP *cep);
926extern void tcp_notify (T_NET_BUF *input, int code);
927extern T_TCP_TIME tcp_rexmt_val (T_TCP_CEP *cep);
928extern void tcp_set_persist_timer (T_TCP_CEP *cep);
929extern void tcp_cancel_timers (T_TCP_CEP *cep);
930extern void tcp_alloc_auto_port (T_TCP_CEP *cep);
931extern ER tcp_alloc_port (T_TCP_CEP *cep, uint16_t portno);
932extern void tcp_move_twcep (T_TCP_CEP *cep);
933extern ER tcp_lock_cep (ID cepid, T_TCP_CEP **p_cep, FN tfn);
934extern void tcp_free_reassq (T_TCP_CEP *cep);
935extern ER tcp_can_send_more (T_TCP_CEP *cep, FN fncd, TMO tmout);
936extern ER tcp_can_recv_more (ER *error, T_TCP_CEP *cep, FN fncd, TMO tmout);
937extern uint8_t tcp_move_ra2rw (T_TCP_CEP *cep, uint8_t flags);
938extern uint8_t tcp_write_raque (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff, uint8_t flags);
939extern ER tcp_wait_rwbuf (T_TCP_CEP *cep, TMO tmout);
940extern T_TCP_CEP *tcp_user_closed (T_TCP_CEP *cep);
941
942/*
943 * TCP 通信端点の受信ウィンドバッファ用関数
944 */
945
946/*
947 * TCP 通信端点の受信ウィンドバッファの省コピー機能が有効の場合、
948 * 関数の選択に使用する。
949 */
950
951extern void tcp_free_rwbufq (T_TCP_CEP *cep);
952extern void tcp_drop_rwbuf (T_TCP_CEP *cep, uint_t len);
953extern void tcp_write_rwbuf (T_TCP_CEP *cep, T_NET_BUF *input, uint_t tcpoff);
954extern uint_t tcp_read_rwbuf (T_TCP_CEP *cep, void *data, uint_t len);
955extern uint_t tcp_get_rwbuf_addr (T_TCP_CEP *cep, void **p_buf);
956
957/*
958 * TCP 通信端点の受信ウィンドバッファの省コピー機能用関数
959 */
960
961extern void tcp_free_rwbufq_cs (T_TCP_CEP *cep);
962extern void tcp_drop_rwbuf_cs (T_TCP_CEP *cep, uint_t len);
963extern void tcp_write_rwbuf_cs (T_TCP_CEP *cep, T_NET_BUF *input, uint_t tcpoff);
964extern uint_t tcp_read_rwbuf_cs (T_TCP_CEP *cep, void *data, uint_t len);
965extern uint_t tcp_get_rwbuf_addr_cs (T_TCP_CEP *cep, void **p_buf);
966
967/*
968 * TCP 通信端点の受信ウィンドバッファの【非】省コピー機能用関数
969 */
970
971extern void tcp_free_rwbufq_ncs (T_TCP_CEP *cep);
972extern void tcp_drop_rwbuf_ncs (T_TCP_CEP *cep, uint_t len);
973extern void tcp_write_rwbuf_ncs (T_TCP_CEP *cep, T_NET_BUF *input, uint_t tcpoff);
974extern uint_t tcp_read_rwbuf_ncs (T_TCP_CEP *cep, void *data, uint_t len);
975extern uint_t tcp_get_rwbuf_addr_ncs (T_TCP_CEP *cep, void **p_buf);
976
977/*
978 * TCP 通信端点の送信ウィンドバッファ用関数
979 */
980
981/*
982 * TCP 通信端点の送信ウィンドバッファの省コピー機能が有効の場合、
983 * 関数の選択に使用する。
984 */
985
986extern void tcp_free_swbufq (T_TCP_CEP *cep);
987extern void tcp_drop_swbuf (T_TCP_CEP *cep, uint_t len);
988extern ER_UINT tcp_write_swbuf (T_TCP_CEP *cep, void *data, uint_t len);
989extern void tcp_read_swbuf (T_TCP_CEP *cep, T_NET_BUF *output, uint_t len, uint_t doff);
990extern void tcp_send_swbuf (T_TCP_CEP *cep, uint_t len);
991extern ER_UINT tcp_get_swbuf_addr (T_TCP_CEP *cep, void **p_buf);
992extern ER tcp_wait_swbuf (T_TCP_CEP *cep, TMO tmout);
993extern T_NET_BUF *tcp_push_res_nbuf (T_NET_BUF *buf);
994extern T_NET_BUF *tcp_pull_res_nbuf (ATR nbatr);
995extern void tcp_alloc_swbuf (T_TCP_CEP *cep);
996extern bool_t tcp_is_swbuf_full (T_TCP_CEP *cep);
997extern void tcp_init_swbuf (T_TCP_CEP *cep);
998
999/*
1000 * TCP 通信端点の送信ウィンドバッファの省コピー機能用関数
1001 */
1002
1003extern void tcp_free_swbufq_cs (T_TCP_CEP *cep);
1004extern void tcp_drop_swbuf_cs (T_TCP_CEP *cep, uint_t len);
1005extern ER_UINT tcp_write_swbuf_cs (T_TCP_CEP *cep, void *data, uint_t len);
1006extern void tcp_read_swbuf_cs (T_TCP_CEP *cep, T_NET_BUF *output, uint_t len, uint_t doff);
1007extern void tcp_send_swbuf_cs (T_TCP_CEP *cep, uint_t len);
1008extern ER_UINT tcp_get_swbuf_addr_cs (T_TCP_CEP *cep, void **p_buf);
1009extern ER tcp_wait_swbuf_cs (T_TCP_CEP *cep, TMO tmout);
1010extern void tcp_alloc_swbuf_cs (T_TCP_CEP *cep);
1011extern bool_t tcp_is_swbuf_full_cs (T_TCP_CEP *cep);
1012
1013/*
1014 * TCP 通信端点の送信ウィンドバッファの【非】省コピー機能用関数
1015 */
1016
1017extern void tcp_free_swbufq_ncs (T_TCP_CEP *cep);
1018extern void tcp_drop_swbuf_ncs (T_TCP_CEP *cep, uint_t len);
1019extern ER_UINT tcp_write_swbuf_ncs (T_TCP_CEP *cep, void *data, uint_t len);
1020extern void tcp_read_swbuf_ncs (T_TCP_CEP *cep, T_NET_BUF *output, uint_t len, uint_t doff);
1021extern void tcp_send_swbuf_ncs (T_TCP_CEP *cep, uint_t len);
1022extern ER_UINT tcp_get_swbuf_addr_ncs (T_TCP_CEP *cep, void **p_buf);
1023extern ER tcp_wait_swbuf_ncs (T_TCP_CEP *cep, TMO tmout);
1024extern T_NET_BUF *tcp_push_res_nbuf_ncs (T_NET_BUF *buf);
1025extern T_NET_BUF *tcp_pull_res_nbuf_ncs (ATR nbatr);
1026extern void tcp_alloc_swbuf_ncs (T_TCP_CEP *cep);
1027extern bool_t tcp_is_swbuf_full_ncs (T_TCP_CEP *cep);
1028
1029/*
1030 * tcp_find_cep -- ポート番号から TCP 通信端点を得る。
1031 *
1032 * 注意: myaddr は、
1033 * TINET-1.2 からネットワークバイトオーダ、
1034 * TINET-1.1 までは、ホストバイトオーダ
1035 */
1036extern T_TCP_CEP *tcp_find_cep (T_IN_ADDR *dstaddr, uint16_t dstport,
1037 T_IN_ADDR *peeraddr, uint16_t peerport);
1038
1039/*
1040 * TCP ヘッダのトレース出力機能用関数
1041 */
1042extern void tcp_output_trace (T_NET_BUF *output, T_TCP_CEP *cep);
1043extern void tcp_input_trace (T_NET_BUF *input, T_TCP_CEP *cep);
1044
1045/* TCP 出力タスク */
1046
1047extern void tcp_output_task(intptr_t exinf);
1048
1049#endif /* of #ifndef _TCP_VAR_H_ */
Note: See TracBrowser for help on using the repository browser.