source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/tinet/netinet/tcp_var.h@ 366

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

バッファ構造体への変更が、すべての定義に適用されていないを修正

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 34.1 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 * 上記著作権者は,以下の (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 GET_TCP_HDR(nbuf,thoff) ((T_TCP_HDR*)((uint8_t*)((nbuf)->buf) + thoff))
78#define GET_TCP_OPT(nbuf,thoff) ((uint8_t*)((nbuf)->buf) + thoff + TCP_HDR_SIZE)
79#define GET_TCP_SDU(nbuf,thoff) ((uint8_t*)((nbuf)->buf) + thoff + GET_TCP_HDR_SIZE(nbuf,thoff))
80
81#define GET_TCP_HDR_OFFSET(nbuf) (GET_IF_IP_HDR_SIZE(nbuf))
82
83#define GET_TCP_HDR_SIZE(nbuf,thoff) (TCP_HDR_LEN(GET_TCP_HDR(nbuf,thoff)->doff))
84
85#define GET_IP_TCP_HDR_SIZE(nbuf,thoff) (GET_IP_HDR_SIZE(nbuf) + GET_TCP_HDR_SIZE(nbuf,thoff))
86#define GET_IF_IP_TCP_HDR_SIZE(nbuf,thoff) \
87 (IF_HDR_SIZE + GET_IP_TCP_HDR_SIZE(nbuf,thoff))
88#define IF_IP_TCP_HDR_SIZE(nbuf) (IF_IP_HDR_SIZE(nbuf) + TCP_HDR_SIZE)
89#define IF_IP_TCP_HDR_OFFSET(nbuf) (IF_IP_HDR_SIZE(nbuf))
90#define IF_IP_TCP_NET_HDR_SIZE(addr) (IF_IP_NET_HDR_SIZE(addr) + TCP_HDR_SIZE)
91#define IF_IP_TCP_NET_HDR_OFFSET(addr) (IF_IP_NET_HDR_SIZE(addr))
92
93/*
94 * TINET 1.1 との互換性のための定義
95 */
96
97#if !defined(_IP6_CFG) && defined(_IP4_CFG)
98
99#define IP4_TCP_HDR_SIZE IP_TCP_HDR_SIZE
100#define IF_IP4_TCP_HDR_SIZE IF_IP_TCP_HDR_SIZE
101#define GET_IP4_TCP_HDR_SIZE(nbuf) GET_IP_TCP_HDR_SIZE1(nbuf)
102#define GET_IF_IP4_TCP_HDR_SIZE(nbuf) GET_IF_IP_TCP_HDR_SIZE1(nbuf)
103
104#endif /* of #if !defined(_IP6_CFG) && defined(_IP4_CFG) */
105
106/*
107 * TINET 1.3 との互換性のための定義
108 */
109
110#define TMIN_TCP_CREPID TMIN_TCP_REPID
111#define TNUM_TCP_CREPID TNUM_TCP_REPID
112
113#define TMIN_TCP_CCEPID TMIN_TCP_CEPID
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
126typedef uint32_t T_TCP_SEQ;
127typedef uint16_t T_TCP_SEG;
128typedef uint16_t T_TCP_WND;
129typedef int16_t T_TCP_TIME;
130
131/*
132 * TCP タイマ変数
133 */
134
135#define NUM_TCP_TIMERS 4 /* TCP のタイマ数 */
136
137/*
138 * TCP 受付口
139 */
140
141/* IPv6 用 TCP 受付口 */
142
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/* IPv4 用 TCP 受付口 */
159
160typedef struct t_tcp4_rep {
161
162 /*
163 * ITRON TCP/IP API、TCP 受付口と同じメンバ
164 */
165 ATR repatr; /* 受付口属性 */
166 T_IPV4EP myaddr; /* 自分のアドレス */
167
168#ifdef TCP_CFG_EXTENTIONS
169 uint16_t flags; /* 受付口フラグ */
170 ID semid_lock; /* 受付口ロック */
171#endif /* of #ifdef TCP_CFG_EXTENTIONS */
172
173 } T_TCP4_REP;
174
175#if defined(_IP6_CFG)
176
177#define T_TCP_REP T_TCP6_REP
178
179#else /* of #if defined(_IP6_CFG) */
180
181#if defined(_IP4_CFG)
182
183#define T_TCP_REP T_TCP4_REP
184
185#endif /* of #if defined(_IP4_CFG) */
186
187#endif /* of #if defined(_IP6_CFG) */
188
189#define T_TCP_REP_DEFINED
190
191/*
192 * 受付口フラグ
193 */
194
195#define TCP_REP_FLG_DYNAMIC UINT_C(0x0400) /* 動的生成・削除可能受付口。 */
196#define TCP_REP_FLG_VALID UINT_C(0x0800) /* 生成済みで有効な受付口。 */
197
198/*
199 * TCP 通信端点
200 */
201
202#ifndef T_NET_BUF_DEFINED
203
204typedef struct t_net_buf T_NET_BUF;
205
206#define T_NET_BUF_DEFINED
207
208#endif /* of #ifndef T_NET_BUF_DEFINED */
209
210typedef struct t_tcp_cep {
211
212 /*
213 * ITRON TCP/IP API、TCP 通信端点と同じメンバ
214 */
215 ATR cepatr; /* 通信端点属性 */
216 void *sbuf; /* 送信用ウィンドバッファ */
217 int_t sbufsz; /* 送信用ウィンドバッファサイズ */
218 void *rbuf; /* 受信用ウィンドバッファ */
219 int_t rbufsz; /* 受信用ウィンドバッファサイズ */
220 t_tcp_callback callback; /* コールバック関数 */
221
222 /*
223 * TINET 独自のメンバ
224 */
225 uint32_t flags; /* 通信端点フラグ */
226 ID semid_lock; /* 通信端点ロック */
227 ID est_flgid; /* コネクション状態イベントフラグ */
228 ID snd_flgid; /* 送信イベントフラグ */
229 ID rcv_flgid; /* 受信イベントフラグ */
230 ID snd_tskid; /* 送信タスク識別子 */
231 ID rcv_tskid; /* 受信タスク識別子 */
232 uint8_t *sbuf_rptr; /* 送信用読み出しポインタ */
233 uint8_t *sbuf_wptr; /* 送信用書き込みポインタ */
234 uint8_t *rbuf_rptr; /* 受信用読み出しポインタ */
235 uint8_t *rbuf_wptr; /* 受信用書き込みポインタ */
236 T_TCP_SEQ snd_ssthresh; /* 輻輳ウィンドサイズ(snd_cwnd) */
237 /* のしきい値 */
238 T_TCP_TIME rxtcur; /* 現在の再送タイムアウト */
239 T_TCP_TIME srtt; /* 平滑化された RTT */
240 T_TCP_TIME rttvar; /* 平滑化された分散 */
241 T_TCP_WND snd_cwnd; /* 輻輳ウィンドサイズ */
242
243 /*
244 * 相手の最大受信セグメントサイズ
245 *
246 * オリジナルでは、一般のセグメントの最大サイズ (t_maxseg) と、
247 * オプション付きのセグメントの最大サイズ (t_maxopd) が別に
248 * なっている。これは、現在のインターネットでは、オプション付きの
249 * セグメントのほうが多いからと説明されているためである。
250 * 本実装では、最大セグメントサイズオプション以外のオプションは
251 * 実装しないので、t_maxseg の使用する。
252 */
253 T_TCP_SEG maxseg;
254
255 int16_t snd_tfn; /* 送信動作中の API 機能コード */
256 int16_t rcv_tfn; /* 受信動作中の API 機能コード */
257
258#ifdef TCP_CFG_NON_BLOCKING
259
260 T_IPEP *p_dstaddr; /* 相手のアドレスへのポインタ */
261 T_IPEP *p_myaddr; /* 自分のアドレスへのポインタ */
262
263#if defined(_IP6_CFG) && defined(_IP4_CFG)
264 T_IPV4EP *p_dstaddr4; /* 相手のアドレスへのポインタ */
265 T_IPV4EP *p_myaddr4; /* 自分のアドレスへのポインタ */
266#endif
267
268 int16_t snd_nblk_tfn; /* 送信動作中の API 機能コード */
269 int16_t rcv_nblk_tfn; /* 受信動作中の API 機能コード */
270 void *snd_data; /* 送信データ領域の先頭アドレス */
271 int_t snd_len; /* 送信データ領域の長さ */
272 void *rcv_data; /* 受信データ領域の先頭アドレス */
273 int_t rcv_len; /* 受信データ領域の長さ */
274 void **snd_p_buf; /* 送信バッファへのポインタ */
275 void **rcv_p_buf; /* 受信バッファへのポインタ */
276
277#endif /* of #ifdef TCP_CFG_NON_BLOCKING */
278
279#ifdef TCP_CFG_SWBUF_CSAVE
280 T_NET_BUF *swbufq; /* 送信ウィンドバッファキュー */
281#endif
282
283 /*
284 * これ以降のメンバーは tcp_init_cep() 関数でゼロクリアーされる。
285 */
286
287 T_TCP_TIME timer[NUM_TCP_TIMERS]; /* TCP のタイマ */
288 T_IPEP dstaddr; /* 相手のアドレス */
289 T_IPEP myaddr; /* 自分のアドレス */
290 T_NET_BUF *reassq; /* 受信再構成キュー */
291
292#if defined(_IP6_CFG)
293
294#if defined(_IP4_CFG)
295
296 T_TCP4_REP *rep4; /* IPv4 用受付口 */
297
298#endif /* of #if defined(_IP4_CFG) */
299
300 T_TCP6_REP *rep; /* IPv6 用受付口 */
301
302#else /* of #if defined(_IP6_CFG) */
303
304#if defined(_IP4_CFG)
305
306 T_TCP4_REP *rep; /* IPv4 用受付口 */
307
308#endif /* of #if defined(_IP4_CFG) */
309
310#endif /* of #if defined(_IP6_CFG) */
311
312
313#ifdef TCP_CFG_RWBUF_CSAVE
314 T_NET_BUF *rwbufq; /* 受信ウィンドバッファキュー */
315#endif
316
317#ifdef TCP_CFG_EXTENTIONS
318 T_TCP_HDR *urg_tcph; /* 緊急データ入りのセグメントの TCP ヘッダ */
319 T_TCP_SEQ snd_up; /* 送信した緊急ポインタ */
320 T_TCP_SEQ rcv_up; /* 受信した緊急ポインタ */
321#endif /* of #ifdef TCP_CFG_EXTENTIONS */
322
323 T_TCP_SEQ snd_una; /* 未確認の最小送信 SEQ つまり */
324 /* 確認された最大送信 SEQ */
325 T_TCP_SEQ snd_max; /* 送信した最大 SEQ */
326 T_TCP_SEQ snd_nxt; /* 次に送信する SEQ */
327 T_TCP_SEQ snd_old_nxt; /* 元の snd_nxt */
328 T_TCP_SEQ snd_wl1; /* 前回ウィンドを更新した SEQ */
329 T_TCP_SEQ snd_wl2; /* 前回ウィンドを更新した ACK */
330 T_TCP_SEQ iss; /* 自分の SEQ の初期値 */
331 T_TCP_SEQ irs; /* 相手の SEQ の初期値 */
332 T_TCP_SEQ rcv_nxt; /* 受信を期待している最小の SEQ */
333 T_TCP_SEQ rcv_adv; /* 受信を期待している最大の SEQ */
334 T_TCP_SEQ rcv_wnd; /* 受信可能なウィンドサイズ */
335 T_TCP_SEQ rtseq; /* 時間計測を始めた SEQ */
336 T_TCP_SEQ last_ack_sent; /* 最後に送信した ACK */
337 T_TCP_TIME idle; /* アイドル時間 */
338 ER error; /* 非同期に発生したエラー */
339 ER net_error; /* ネットワークのエラー状態 */
340 T_TCP_WND snd_wnd; /* 相手の受信可能ウィンドサイズ */
341 T_TCP_WND max_sndwnd; /* 今までの最大送信ウィンドサイズ */
342 T_TCP_TIME rtt; /* 往復時間 */
343 uint16_t swbuf_count; /* 送信ウィンドバッファの使用中サイズ */
344 uint16_t rwbuf_count; /* 受信ウィンドバッファの使用中サイズ */
345 uint16_t rcv_buf_len; /* tcp_rcv_buf の割当て長 */
346 uint16_t get_buf_len; /* tcp_rcv_buf の割当て長 */
347 uint8_t rxtshift; /* 再送信回数の log(2) */
348 uint8_t fsm_state; /* FSM 状態 */
349 uint8_t dupacks; /* 再送 ACK 数 */
350
351#if defined(TCP_CFG_RWBUF_CSAVE) && defined(TCP_CFG_RWBUF_CSAVE_MAX_QUEUES)
352 uint16_t rwbufq_entries; /* 受信ウィンドバッファキューのエントリ数 */
353#endif
354
355 } T_TCP_CEP;
356
357#define T_TCP6_CEP T_TCP_CEP
358#define T_TCP4_CEP T_TCP_CEP
359
360/*
361 * Time Wait 用 TCP 通信端点
362 */
363
364typedef struct t_tcp_twcep {
365 int_t rbufsz; /* 受信用ウィンドバッファサイズ */
366 T_TCP_TIME timer_2msl; /* 2MSL タイマ */
367 T_IPEP dstaddr; /* 相手のアドレス */
368 T_IPEP myaddr; /* 自分のアドレス */
369 T_TCP_SEQ snd_una; /* 未確認の最小送信 SEQ つまり */
370 /* 確認された最大送信 SEQ */
371 T_TCP_SEQ rcv_nxt; /* 受信を期待している最小の SEQ */
372 uint16_t rwbuf_count; /* 受信ウィンドバッファの使用中サイズ */
373 uint8_t fsm_state; /* FSM 状態 */
374 uint8_t flags; /* 通信端点フラグ */
375
376 } T_TCP_TWCEP;
377
378#define T_TCP_CEP_DEFINED
379
380/*
381 * TCP 通信端点の状態フラグ
382 */
383
384#define TCP_CEP_FLG_IPV4 ULONG_C(0x00000001) /* IPv4 用。 */
385#define TCP_CEP_FLG_ACK_NOW ULONG_C(0x00000100) /* 直ちに相手に ACK を送る。 */
386#define TCP_CEP_FLG_DEL_ACK ULONG_C(0x00000200) /* ACK を遅延する。 */
387#define TCP_CEP_FLG_SENT_FIN ULONG_C(0x00000400) /* FIN を送ってある。 */
388#define TCP_CEP_FLG_NEED_SYN ULONG_C(0x00000800) /* SYN を送信する。 */
389#define TCP_CEP_FLG_NEED_FIN ULONG_C(0x00001000) /* FIN を送信する。 */
390#define TCP_CEP_FLG_FORCE ULONG_C(0x00002000) /* 強制送信。 */
391#define TCP_CEP_FLG_NO_PUSH ULONG_C(0x00004000) /* push しない。 */
392#define TCP_CEP_FLG_NO_DELAY ULONG_C(0x00008000) /* 遅延しない。 */
393#define TCP_CEP_FLG_FORCE_CLEAR ULONG_C(0x00010000) /* 強制送信した後フラグをクリアーする。*/
394#define TCP_CEP_FLG_POST_OUTPUT ULONG_C(0x00020000) /* 送信を開始する。 */
395#define TCP_CEP_FLG_RESERVE_OUTPUT ULONG_C(0x00040000) /* 送信を予約する。 */
396#define TCP_CEP_FLG_DYNAMIC ULONG_C(0x00100000) /* 動的生成・削除可能通信端点。 */
397#define TCP_CEP_FLG_VALID ULONG_C(0x00200000) /* 生成済みで有効な通信端点。 */
398#define TCP_CEP_FLG_CLOSE_AFTER_OUTPUT ULONG_C(0x00400000) /* 送信した後コネクションを閉じる。*/
399#define TCP_CEP_FLG_RESTORE_NEXT_OUTPUT ULONG_C(0x00800000) /* 送信した後、snd_nxt を元に戻す。*/
400
401/* 送受信ウィンドバッファの省コピー機能 */
402#define TCP_CEP_FLG_WBCS_NBUF_REQ ULONG_C(0x80000000) /* ネットワークバッファ割当て要求*/
403#define TCP_CEP_FLG_WBCS_MASK ULONG_C(0x70000000) /* マスク */
404#define TCP_CEP_FLG_WBCS_FREE ULONG_C(0x00000000) /* 送信ウィンドバッファ未使用 */
405#define TCP_CEP_FLG_WBCS_WOPEN_PEND ULONG_C(0x10000000) /* 相手の受信ウィンドの開き待ち */
406#define TCP_CEP_FLG_WBCS_NBUF_PEND ULONG_C(0x20000000) /* ネットワークバッファ予約待ち */
407#define TCP_CEP_FLG_WBCS_NBUF_RSVD ULONG_C(0x30000000) /* ネットワークバッファ予約済み */
408#define TCP_CEP_FLG_WBCS_NBUF_READY ULONG_C(0x40000000) /* ネットワークバッファ割当て済み*/
409#define TCP_CEP_FLG_WBCS_SEND_READY ULONG_C(0x50000000) /* 送信可能 */
410#define TCP_CEP_FLG_WBCS_SENT ULONG_C(0x60000000) /* 送信済みで、ACK待ち */
411#define TCP_CEP_FLG_WBCS_ACKED ULONG_C(0x70000000) /* 送信済みで、ACK完了 */
412
413/* 初期化から除外するフラグの定義 */
414#define TCP_CEP_FLG_NOT_CLEAR (TCP_CEP_FLG_WBCS_NBUF_REQ|TCP_CEP_FLG_WBCS_MASK|\
415 TCP_CEP_FLG_DYNAMIC|TCP_CEP_FLG_VALID|TCP_CEP_FLG_IPV4)
416
417/*
418 * 通信端点イベントフラグ
419 */
420
421#define TCP_CEP_EVT_ESTABLISHED ULONG_C(0x00000001) /* コネクション確立 */
422#define TCP_CEP_EVT_CLOSED ULONG_C(0x00000002) /* 未使用状態 */
423#define TCP_CEP_EVT_SWBUF_READY ULONG_C(0x00000004) /* 送信ウィンドバッファ空き */
424#define TCP_CEP_EVT_RWBUF_READY ULONG_C(0x00000008) /* 送信ウィンドバッファデータあり*/
425#define TCP_CEP_EVT_ALL ULONG_C(0xffffffff) /* 全イベント */
426
427/*
428 * 追加 API 機能・事象コード
429 */
430
431/* TCP 関係 */
432
433#define TFN_TCP_UNDEF (0)
434
435/*
436 * srtt: 平滑化された RTT
437 * rttvar: 平滑化された分散
438 * rtt: 測定された往復時間
439 *
440 * 平滑化された RTT (srtt) と平滑化された分散 (rttvar) を
441 * 整数型で計算するために、左シフトしてスケールする。
442 * srtt は 2 進小数点以下 3 ビット、
443 * rttvar は 2 進小数点以下 2 ビットを保持する。
444 */
445
446#define TCP_DELTA_SHIFT 2
447 /* 差分 = rtt/8 + srtt*7/8 の計算のためのシフト値 */
448#define TCP_SRTT_SHIFT (TCP_DELTA_SHIFT + 3)
449 /* srtt のシフト値、3(+2)ビット */
450#define TCP_RTTVAR_SHIFT (TCP_DELTA_SHIFT + 2)
451 /* rttvar のシフト値、2(+2)ビット */
452#define TCP_SRTT_SCALE (1<<TCP_SRTT_SHIFT)
453#define TCP_RTTVAR_SCALE (1<<TCP_RTTVAR_SHIFT)
454
455/*
456 * 高速再転送を開始する再送 ACK 数のしきい値
457 */
458
459#define MAX_TCP_REXMT_THRESH 3
460
461/*
462 * 受信再構成キューでの TCP ヘッダ
463 */
464
465typedef struct t_tcp_q_hdr {
466 uint16_t sport; /* 送信元ポート番号 */
467 uint16_t dport; /* 宛先ポート番号 */
468
469 uint32_t seq; /* SEQ 番号 */
470
471 T_NET_BUF *next; /* 次のセグメント、元は ACK 番号(ack) */
472
473 uint8_t doff; /* データオフセット(上位4ビット) */
474 uint8_t flags; /* フラグ(下位6ビット) */
475 uint16_t soff; /* SDU オフセット、元はウィンドサイズ(win) */
476
477 uint16_t slen; /* SDU 長、元はチェックサム(sum) */
478 uint16_t urp; /* 緊急ポインタ(SDU 長補正) */
479 } __attribute__((packed, aligned(2)))T_TCP_Q_HDR;
480
481#define GET_TCP_Q_HDR(nbuf,thoff) ((T_TCP_Q_HDR*)((uint8_t*)((nbuf)->buf) + thoff))
482
483/*
484 * オブジェクト ID の最小値の定義
485 */
486
487#define TMIN_TCP_REPID 1 /* TCP 受付口 ID の最小値 */
488#define TMIN_TCP6_REPID 1 /* TCP/IPv6 受付口 ID の最小値 */
489#define TMIN_TCP4_REPID (TNUM_TCP6_REPID+1) /* TCP/IPv4 受付口 ID の最小値 */
490
491#define TMIN_TCP_CEPID 1 /* TCP 通信端点 ID の最小値 */
492#define TMIN_TCP6_CEPID 1 /* TCP/IPv6 通信端点 ID の最小値 */
493#define TMIN_TCP4_CEPID (TNUM_TCP6_CEPID+1) /* TCP/IPv4 通信端点 ID の最小値 */
494
495#define TMIN_TCP_TWCEPID 1 /* Time Wait 用 TCP 通信端点 ID の最小値 */
496
497/*
498 * 制御セグメント(データなし)サイズのネットワークバッファ
499 */
500
501#if defined(IF_HDR_SIZE) && defined(IP_HDR_SIZE)
502
503typedef struct t_net_buf_cseg {
504 uint16_t len; /* データの長さ */
505 uint8_t idix; /* mpfid のインデックス */
506 uint8_t flags; /* フラグ */
507#ifdef IF_ETHER_MULTI_NIC
508 uint8_t conn_pos;
509#endif
510#ifdef IF_ETHER_NIC_NET_BUF_ALIGN
511 uint8_t nalign[IF_ETHER_NIC_NET_BUF_ALIGN];
512#endif
513#if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
514 uint8_t halign[4 - IF_HDR_ALIGN];
515#endif
516 uint8_t buf[IF_HDR_SIZE + IP_HDR_SIZE + TCP_HDR_SIZE];
517 /* バッファ本体 */
518 } T_NET_BUF_CSEG;
519
520#endif /* of #if defined(IF_HDR_SIZE) && defined(IP_HDR_SIZE) */
521
522/*
523 * SNMP の 管理情報ベース (MIB)
524 */
525
526typedef struct t_tcp_stats {
527 uint32_t tcpActiveOpens;
528 uint32_t tcpPassiveOpens;
529 uint32_t tcpAttemptFails;
530 uint32_t tcpEstabResets;
531/* uint32_t tcpCurrEstab;*/
532 uint32_t tcpInSegs;
533 uint32_t tcpOutSegs;
534 uint32_t tcpRetransSegs;
535 uint32_t tcpInErrs;
536 uint32_t tcpOutRsts;
537} T_TCP_STATS;
538
539/*
540 * 関数シミュレーションマクロ
541 */
542
543/* TCP 受付口 */
544
545#define VALID_TCP6_REPID(id) (TMIN_TCP6_REPID<=(id)&&(id)<=tmax_tcp6_repid)
546#define VALID_TCP4_REPID(id) (TMIN_TCP4_REPID<=(id)&&(id)<=tmax_tcp4_repid)
547
548#define INDEX_TCP6_REP(id) ((id)-TMIN_TCP6_REPID)
549#define INDEX_TCP4_REP(id) ((id)-TMIN_TCP4_REPID)
550
551#define GET_TCP6_REP(id) (&(tcp6_rep[INDEX_TCP6_REP(id)]))
552#define GET_TCP4_REP(id) (&(tcp4_rep[INDEX_TCP4_REP(id)]))
553
554#define GET_TCP6_REPID(rep) ((ID)(((rep)-tcp6_rep)+TMIN_TCP6_REPID))
555#define GET_TCP4_REPID(rep) ((ID)(((rep)-tcp4_rep)+TMIN_TCP4_REPID))
556
557#ifdef TCP_CFG_EXTENTIONS
558
559#define VALID_TCP_REP(rep) (((rep)->flags&TCP_REP_FLG_VALID)!=0)
560#define DYNAMIC_TCP_REP(rep) (((rep)->flags&TCP_REP_FLG_DYNAMIC)!=0)
561
562#else /* of #ifdef TCP_CFG_EXTENTIONS */
563
564#define VALID_TCP_REP(rep) (true)
565#define DYNAMIC_TCP_REP(rep) (false)
566
567#endif /* of #ifdef TCP_CFG_EXTENTIONS */
568
569/* TCP 通信端点 */
570
571#define VALID_TCP_CEPID(id) (TMIN_TCP_CEPID<=(id)&&(id)<=tmax_tcp_cepid)
572#define INDEX_TCP_CEP(id) ((id)-TMIN_TCP_CEPID)
573
574#define GET_TCP_CEP(id) (&(tcp_cep[INDEX_TCP_CEP(id)]))
575
576#define GET_TCP_CEPID(cep) ((ID)(((cep)-tcp_cep)+TMIN_TCP_CEPID))
577#define GET_TCP_TWCEPID(cep) ((ID)(((cep)-tcp_twcep)+TMIN_TCP_TWCEPID))
578
579#define VALID_TCP_CEP(cep) (((cep)->flags&TCP_CEP_FLG_VALID)!=0)
580#define DYNAMIC_TCP_CEP(cep) (((cep)->flags&TCP_CEP_FLG_DYNAMIC)!=0)
581#define TCP_IS_CEP_IPV6(cep) (((cep)->flags&TCP_CEP_FLG_IPV4)==0)
582#define TCP_IS_CEP_IPV4(cep) (((cep)->flags&TCP_CEP_FLG_IPV4)!=0)
583
584#define IS_TFN_TCP_RCV(t) ((t)==TFN_TCP_ACP_CEP||(t)==TFN_TCP_RCV_DAT||\
585 (t)==TFN_TCP_CLS_CEP||\
586 (t)==TFN_TCP_RCV_BUF||(t)==TFN_TCP_REL_BUF||\
587 (t)==TFN_TCP_RCV_OOB)
588
589#define VALID_TFN_TCP_CAN(t) ((t)==TFN_TCP_ACP_CEP||(t)==TFN_TCP_CON_CEP||\
590 (t)==TFN_TCP_CLS_CEP||\
591 (t)==TFN_TCP_SND_DAT||(t)==TFN_TCP_RCV_DAT||\
592 (t)==TFN_TCP_GET_BUF||(t)==TFN_TCP_RCV_BUF||\
593 (t)==TFN_TCP_SND_OOB||\
594 (t)==TFN_TCP_ALL)
595
596#define VALID_URG_POINTER(urg) (TCP_CFG_URG_OFFSET==0||urg!=0)
597
598/*
599 * 全域変数
600 */
601
602extern uint8_t tcp_initialized;
603
604extern T_TCP_STATS tcp_stats;
605
606/* TCP 受付口 */
607
608extern T_TCP6_REP tcp6_rep[];
609extern T_TCP4_REP tcp4_rep[];
610
611#if defined(SUPPORT_INET6)
612#define tcp_rep tcp6_rep
613#elif defined(SUPPORT_INET4)
614#define tcp_rep tcp4_rep
615#endif
616
617extern const ID tmax_tcp_repid;
618
619#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4)
620extern const ID tmax_tcp6_repid;
621extern const ID tmax_tcp4_repid;
622#else
623#define tmax_tcp6_repid tmax_tcp_repid
624#define tmax_tcp4_repid tmax_tcp_repid
625#endif
626
627/* TCP 通信端点 */
628
629extern T_TCP_CEP tcp_cep[];
630extern T_TCP_TWCEP tcp_twcep[];
631
632extern const ID tmax_tcp_cepid;
633
634#if defined(SUPPORT_INET6) && defined(SUPPORT_INET4)
635extern const ID tmax_tcp6_cepid;
636extern const ID tmax_tcp4_cepid;
637#else
638#define tmax_tcp6_cepid tmax_tcp_cepid
639#define tmax_tcp4_cepid tmax_tcp_cepid
640#endif
641
642/*
643 * Inline 関数
644 */
645
646#ifndef TCP_CFG_RWBUF_CSAVE
647
648/*
649 * TCP 通信端点の受信ウィンドバッファの省コピー機能が
650 * 無効の場合は何もしないためのダミーの関数
651 */
652
653/*
654 * tcp_free_rwbufq -- 受信ウィンドバッファキューを解放する。
655 */
656
657Inline void
658tcp_free_rwbufq_ncs (T_TCP_CEP *cep)
659{
660 }
661
662#endif /* of #ifndef TCP_CFG_RWBUF_CSAVE */
663
664#ifdef TCP_CFG_SWBUF_CSAVE_ONLY
665
666/*
667 * TCP 通信端点の送信ウィンドバッファの省コピー機能のみが
668 * 有効の場合は何もしないためのダミーの関数
669 */
670
671/*
672 * tcp_read_swbuf_cs -- 送信ウィンドバッファからデータを読み出す。
673 */
674
675Inline void
676tcp_read_swbuf_cs (T_TCP_CEP *cep, T_NET_BUF *output, uint_t len, uint_t doff)
677{
678 }
679
680#endif /* of #ifdef TCP_CFG_SWBUF_CSAVE_ONLY */
681
682#ifndef TCP_CFG_SWBUF_CSAVE
683
684/*
685 * TCP 通信端点の送信ウィンドバッファの省コピー機能が
686 * 無効の場合は何もしないためのダミーの関数
687 */
688
689/*
690 * tcp_free_swbufq -- 送信ウィンドバッファキューを解放する。
691 */
692
693Inline void
694tcp_free_swbufq_ncs (T_TCP_CEP *cep)
695{
696 }
697
698/*
699 * tcp_alloc_swbuf -- 送信ウィンドバッファ用のネットワークバッファの割り当てを指示する。
700 */
701
702Inline void
703tcp_alloc_swbuf_ncs (T_TCP_CEP *cep)
704{
705 }
706
707/*
708 * tcp_push_res_nbuf -- ネットワークバッファを予約する。
709 */
710
711Inline T_NET_BUF *
712tcp_push_res_nbuf_ncs (T_NET_BUF *nbuf)
713{
714 return nbuf;
715 }
716
717/*
718 * tcp_pull_res_nbuf -- 予約してあるネットワークバッファ返す。
719 */
720
721Inline T_NET_BUF *
722tcp_pull_res_nbuf_ncs (ATR nbatr)
723{
724 return NULL;
725 }
726
727#endif /* of #ifndef TCP_CFG_SWBUF_CSAVE */
728
729/*
730 * TCP 通信端点の受信ウィンドバッファの省コピー機能の切り替えマクロ
731 */
732
733#ifdef TCP_CFG_RWBUF_CSAVE
734
735#ifdef TCP_CFG_RWBUF_CSAVE_ONLY
736
737#define TCP_FREE_RWBUFQ(cep) tcp_free_rwbufq_cs(cep)
738#define TCP_DROP_RWBUF(cep,len) tcp_drop_rwbuf_cs(cep,len)
739#define TCP_READ_RWBUF(cep,data,len) tcp_read_rwbuf_cs(cep,data,len)
740#define TCP_GET_RWBUF_ADDR(cep,buf) tcp_get_rwbuf_addr_cs(cep,buf)
741#define TCP_WRITE_RWBUF(cep,input,thoff) tcp_write_rwbuf_cs(cep,input,thoff)
742
743#else /* of #ifdef TCP_CFG_RWBUF_CSAVE_ONLY */
744
745#define TCP_FREE_RWBUFQ(cep) tcp_free_rwbufq(cep)
746#define TCP_DROP_RWBUF(cep,len) tcp_drop_rwbuf(cep,len)
747#define TCP_READ_RWBUF(cep,data,len) tcp_read_rwbuf(cep,data,len)
748#define TCP_GET_RWBUF_ADDR(cep,buf) tcp_get_rwbuf_addr(cep,buf)
749#define TCP_WRITE_RWBUF(cep,input,thoff) tcp_write_rwbuf(cep,input,thoff)
750
751#endif /* of #ifdef TCP_CFG_RWBUF_CSAVE_ONLY */
752
753#else /* of #ifdef TCP_CFG_RWBUF_CSAVE */
754
755#define TCP_FREE_RWBUFQ(cep) tcp_free_rwbufq_ncs(cep)
756#define TCP_DROP_RWBUF(cep,len) tcp_drop_rwbuf_ncs(cep,len)
757#define TCP_READ_RWBUF(cep,data,len) tcp_read_rwbuf_ncs(cep,data,len)
758#define TCP_GET_RWBUF_ADDR(cep,buf) tcp_get_rwbuf_addr_ncs(cep,buf)
759#define TCP_WRITE_RWBUF(cep,input,thoff) tcp_write_rwbuf_ncs(cep,input,thoff)
760
761#endif /* of #ifdef TCP_CFG_RWBUF_CSAVE */
762
763/*
764 * TCP 通信端点の送信ウィンドバッファの省コピー機能の切り替えマクロ
765 */
766
767#ifdef TCP_CFG_SWBUF_CSAVE
768
769#define TCP_PUSH_RES_NBUF(nbuf) tcp_push_res_nbuf(nbuf)
770#define TCP_PULL_RES_NBUF(atr) tcp_pull_res_nbuf(atr)
771
772#ifdef TCP_CFG_SWBUF_CSAVE_ONLY
773
774#define TCP_FREE_SWBUFQ(cep) tcp_free_swbufq_cs(cep)
775#define TCP_ALLOC_SWBUF(cep) tcp_alloc_swbuf_cs(cep)
776#define TCP_DROP_SWBUF(cep,len) tcp_drop_swbuf_cs(cep,len)
777#define TCP_WRITE_SWBUF(cep,data,len) tcp_write_swbuf_cs(cep,data,len)
778#define TCP_READ_SWBUF(cep,output,len,doff) tcp_read_swbuf_cs(cep,output,len,doff)
779#define TCP_WAIT_SWBUF(cep,tmout) tcp_wait_swbuf_cs(cep,tmout)
780#define TCP_GET_SWBUF_ADDR(cep,buf) tcp_get_swbuf_addr_cs(cep,buf)
781#define TCP_SEND_SWBUF(cep,len) tcp_send_swbuf_cs(cep,len)
782#define TCP_IS_SWBUF_FULL(cep) tcp_is_swbuf_full_cs(cep)
783
784#else /* of #ifdef TCP_CFG_SWBUF_CSAVE_ONLY */
785
786#define TCP_FREE_SWBUFQ(cep) tcp_free_swbufq(cep)
787#define TCP_ALLOC_SWBUF(cep) tcp_alloc_swbuf(cep)
788#define TCP_DROP_SWBUF(cep,len) tcp_drop_swbuf(cep,len)
789#define TCP_WRITE_SWBUF(cep,data,len) tcp_write_swbuf(cep,data,len)
790#define TCP_READ_SWBUF(cep,output,len,doff) tcp_read_swbuf(cep,output,len,doff)
791#define TCP_WAIT_SWBUF(cep,tmout) tcp_wait_swbuf(cep,tmout)
792#define TCP_GET_SWBUF_ADDR(cep,buf) tcp_get_swbuf_addr(cep,buf)
793#define TCP_SEND_SWBUF(cep,len) tcp_send_swbuf(cep,len)
794#define TCP_IS_SWBUF_FULL(cep) tcp_is_swbuf_full(cep)
795
796#endif /* of #ifdef TCP_CFG_SWBUF_CSAVE_ONLY */
797
798#else /* of #ifdef TCP_CFG_SWBUF_CSAVE */
799
800#define TCP_READ_SWBUF(cep,output,len,doff) tcp_read_swbuf_ncs(cep,output,len,doff)
801#define TCP_FREE_SWBUFQ(cep) tcp_free_swbufq_ncs(cep)
802#define TCP_ALLOC_SWBUF(cep) tcp_alloc_swbuf_ncs(cep)
803#define TCP_PUSH_RES_NBUF(nbuf) tcp_push_res_nbuf_ncs(nbuf)
804#define TCP_PULL_RES_NBUF(atr) tcp_pull_res_nbuf_ncs(atr)
805#define TCP_DROP_SWBUF(cep,len) tcp_drop_swbuf_ncs(cep,len)
806#define TCP_WRITE_SWBUF(cep,data,len) tcp_write_swbuf_ncs(cep,data,len)
807#define TCP_WAIT_SWBUF(cep,tmout) tcp_wait_swbuf_ncs(cep,tmout)
808#define TCP_GET_SWBUF_ADDR(cep,buf) tcp_get_swbuf_addr_ncs(cep,buf)
809#define TCP_SEND_SWBUF(cep,len) tcp_send_swbuf_ncs(cep,len)
810#define TCP_IS_SWBUF_FULL(cep) tcp_is_swbuf_full_ncs(cep)
811
812#endif /* of #ifdef TCP_CFG_SWBUF_CSAVE */
813
814/*
815 * 関数
816 */
817
818extern uint_t tcp_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp);
819extern void tcp_init (void);
820extern void tcp_init_iss (void);
821extern T_TCP_CEP *tcp_close (T_TCP_CEP *cep);
822extern T_TCP_CEP *tcp_drop (T_TCP_CEP *cep, ER err);
823extern void tcp_respond (T_NET_BUF *nbuf, T_TCP_CEP *cep,
824 T_TCP_SEQ ack, T_TCP_SEQ seq, uint_t rbfree, uint8_t flags);
825extern ER tcp_get_segment (T_NET_BUF **nbuf, T_TCP_CEP *cep,
826 uint_t optlen, uint_t len, uint_t maxlen, ATR nbatr, TMO tmout);
827extern ER tcpn_get_segment (T_NET_BUF **nbuf, T_TCP_CEP *cep,
828 uint_t optlen, uint_t len, uint_t maxlen, ATR nbatr, TMO tmout);
829extern void tcp_init_cep (T_TCP_CEP *cep);
830extern void tcp_notify (T_NET_BUF *input, int code);
831extern T_TCP_TIME tcp_rexmt_val (T_TCP_CEP *cep);
832extern void tcp_set_persist_timer (T_TCP_CEP *cep);
833extern void tcp_cancel_timers (T_TCP_CEP *cep);
834extern void tcp_alloc_auto_port (T_TCP_CEP *cep);
835extern ER tcp_alloc_port (T_TCP_CEP *cep, uint16_t portno);
836extern ER tcp_lock_cep (ID cepid, T_TCP_CEP **p_cep, FN tfn);
837extern void tcp_free_reassq (T_TCP_CEP *cep);
838extern ER tcp_can_send_more (T_TCP_CEP *cep, FN fncd, TMO tmout);
839extern ER tcp_can_recv_more (ER *error, T_TCP_CEP *cep, FN fncd, TMO tmout);
840extern uint8_t tcp_move_ra2rw (T_TCP_CEP *cep, uint8_t flags);
841extern uint8_t tcp_write_raque (T_NET_BUF *input, T_TCP_CEP *cep, uint_t thoff, uint8_t flags);
842extern ER tcp_wait_rwbuf (T_TCP_CEP *cep, TMO tmout);
843extern T_TCP_CEP *tcp_user_closed (T_TCP_CEP *cep);
844extern T_TCP_CEP *tcp_find_cep (T_NET_BUF *input, uint_t off);
845extern T_TCP_TWCEP*tcp_find_twcep (T_NET_BUF *input, uint_t off);
846extern bool_t tcp_is_addr_accept (T_NET_BUF *input, uint_t off);
847extern void tcp_move_twcep (T_TCP_CEP *cep);
848
849/*
850 * TCP 通信端点の受信ウィンドバッファ用関数
851 */
852
853/*
854 * TCP 通信端点の受信ウィンドバッファの省コピー機能が有効の場合、
855 * 関数の選択に使用する。
856 */
857
858extern void tcp_free_rwbufq (T_TCP_CEP *cep);
859extern void tcp_drop_rwbuf (T_TCP_CEP *cep, uint_t len);
860extern void tcp_write_rwbuf (T_TCP_CEP *cep, T_NET_BUF *input, uint_t tcpoff);
861extern uint_t tcp_read_rwbuf (T_TCP_CEP *cep, void *data, uint_t len);
862extern uint_t tcp_get_rwbuf_addr (T_TCP_CEP *cep, void **p_buf);
863
864/*
865 * TCP 通信端点の受信ウィンドバッファの省コピー機能用関数
866 */
867
868extern void tcp_free_rwbufq_cs (T_TCP_CEP *cep);
869extern void tcp_drop_rwbuf_cs (T_TCP_CEP *cep, uint_t len);
870extern void tcp_write_rwbuf_cs (T_TCP_CEP *cep, T_NET_BUF *input, uint_t tcpoff);
871extern uint_t tcp_read_rwbuf_cs (T_TCP_CEP *cep, void *data, uint_t len);
872extern uint_t tcp_get_rwbuf_addr_cs (T_TCP_CEP *cep, void **p_buf);
873
874/*
875 * TCP 通信端点の受信ウィンドバッファの【非】省コピー機能用関数
876 */
877
878extern void tcp_free_rwbufq_ncs (T_TCP_CEP *cep);
879extern void tcp_drop_rwbuf_ncs (T_TCP_CEP *cep, uint_t len);
880extern void tcp_write_rwbuf_ncs (T_TCP_CEP *cep, T_NET_BUF *input, uint_t tcpoff);
881extern uint_t tcp_read_rwbuf_ncs (T_TCP_CEP *cep, void *data, uint_t len);
882extern uint_t tcp_get_rwbuf_addr_ncs (T_TCP_CEP *cep, void **p_buf);
883
884/*
885 * TCP 通信端点の送信ウィンドバッファ用関数
886 */
887
888/*
889 * TCP 通信端点の送信ウィンドバッファの省コピー機能が有効の場合、
890 * 関数の選択に使用する。
891 */
892
893extern void tcp_free_swbufq (T_TCP_CEP *cep);
894extern void tcp_drop_swbuf (T_TCP_CEP *cep, uint_t len);
895extern ER_UINT tcp_write_swbuf (T_TCP_CEP *cep, void *data, uint_t len);
896extern void tcp_read_swbuf (T_TCP_CEP *cep, T_NET_BUF *output, uint_t len, uint_t doff);
897extern void tcp_send_swbuf (T_TCP_CEP *cep, uint_t len);
898extern ER_UINT tcp_get_swbuf_addr (T_TCP_CEP *cep, void **p_buf);
899extern ER tcp_wait_swbuf (T_TCP_CEP *cep, TMO tmout);
900extern T_NET_BUF *tcp_push_res_nbuf (T_NET_BUF *buf);
901extern T_NET_BUF *tcp_pull_res_nbuf (ATR nbatr);
902extern void tcp_alloc_swbuf (T_TCP_CEP *cep);
903extern bool_t tcp_is_swbuf_full (T_TCP_CEP *cep);
904extern void tcp_init_swbuf (T_TCP_CEP *cep);
905
906/*
907 * TCP 通信端点の送信ウィンドバッファの省コピー機能用関数
908 */
909
910extern void tcp_free_swbufq_cs (T_TCP_CEP *cep);
911extern void tcp_drop_swbuf_cs (T_TCP_CEP *cep, uint_t len);
912extern ER_UINT tcp_write_swbuf_cs (T_TCP_CEP *cep, void *data, uint_t len);
913extern void tcp_read_swbuf_cs (T_TCP_CEP *cep, T_NET_BUF *output, uint_t len, uint_t doff);
914extern void tcp_send_swbuf_cs (T_TCP_CEP *cep, uint_t len);
915extern ER_UINT tcp_get_swbuf_addr_cs (T_TCP_CEP *cep, void **p_buf);
916extern ER tcp_wait_swbuf_cs (T_TCP_CEP *cep, TMO tmout);
917extern void tcp_alloc_swbuf_cs (T_TCP_CEP *cep);
918extern bool_t tcp_is_swbuf_full_cs (T_TCP_CEP *cep);
919
920/*
921 * TCP 通信端点の送信ウィンドバッファの【非】省コピー機能用関数
922 */
923
924extern void tcp_free_swbufq_ncs (T_TCP_CEP *cep);
925extern void tcp_drop_swbuf_ncs (T_TCP_CEP *cep, uint_t len);
926extern ER_UINT tcp_write_swbuf_ncs (T_TCP_CEP *cep, void *data, uint_t len);
927extern void tcp_read_swbuf_ncs (T_TCP_CEP *cep, T_NET_BUF *output, uint_t len, uint_t doff);
928extern void tcp_send_swbuf_ncs (T_TCP_CEP *cep, uint_t len);
929extern ER_UINT tcp_get_swbuf_addr_ncs (T_TCP_CEP *cep, void **p_buf);
930extern ER tcp_wait_swbuf_ncs (T_TCP_CEP *cep, TMO tmout);
931extern T_NET_BUF *tcp_push_res_nbuf_ncs (T_NET_BUF *buf);
932extern T_NET_BUF *tcp_pull_res_nbuf_ncs (ATR nbatr);
933extern void tcp_alloc_swbuf_ncs (T_TCP_CEP *cep);
934extern bool_t tcp_is_swbuf_full_ncs (T_TCP_CEP *cep);
935
936/*
937 * TCP ヘッダのトレース出力機能用関数
938 */
939extern void tcp_output_trace (T_NET_BUF *output, T_TCP_CEP *cep);
940extern void tcp_input_trace (T_NET_BUF *input, T_TCP_CEP *cep);
941
942/* TCP 出力タスク */
943
944extern void tcp_output_task(intptr_t exinf);
945
946#endif /* of #ifndef _TCP_VAR_H_ */
Note: See TracBrowser for help on using the repository browser.