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