|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*-
23: * Copyright (c) 1991, 1993
24: * The Regents of the University of California. All rights reserved.
25: *
26: * Redistribution and use in source and binary forms, with or without
27: * modification, are permitted provided that the following conditions
28: * are met:
29: * 1. Redistributions of source code must retain the above copyright
30: * notice, this list of conditions and the following disclaimer.
31: * 2. Redistributions in binary form must reproduce the above copyright
32: * notice, this list of conditions and the following disclaimer in the
33: * documentation and/or other materials provided with the distribution.
34: * 3. All advertising materials mentioning features or use of this software
35: * must display the following acknowledgement:
36: * This product includes software developed by the University of
37: * California, Berkeley and its contributors.
38: * 4. Neither the name of the University nor the names of its contributors
39: * may be used to endorse or promote products derived from this software
40: * without specific prior written permission.
41: *
42: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
43: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52: * SUCH DAMAGE.
53: *
54: * @(#)tp_pcb.h 8.1 (Berkeley) 6/10/93
55: */
56:
57: /***********************************************************
58: Copyright IBM Corporation 1987
59:
60: All Rights Reserved
61:
62: Permission to use, copy, modify, and distribute this software and its
63: documentation for any purpose and without fee is hereby granted,
64: provided that the above copyright notice appear in all copies and that
65: both that copyright notice and this permission notice appear in
66: supporting documentation, and that the name of IBM not be
67: used in advertising or publicity pertaining to distribution of the
68: software without specific, written prior permission.
69:
70: IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
71: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
72: IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
73: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
74: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
75: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
76: SOFTWARE.
77:
78: ******************************************************************/
79:
80: /*
81: * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
82: */
83: /*
84: * ARGO TP
85: *
86: *
87: * This file defines the transport protocol control block (tpcb).
88: * and a bunch of #define values that are used in the tpcb.
89: */
90:
91: #ifndef __TP_PCB__
92: #define __TP_PCB__
93:
94: #include <netiso/tp_param.h>
95: #include <netiso/tp_timer.h>
96: #include <netiso/tp_user.h>
97: #ifndef sblock
98: #include <sys/socketvar.h>
99: #endif /* sblock */
100:
101: /* NOTE: the code depends on REF_CLOSED > REF_OPEN > the rest, and
102: * on REF_FREE being zero
103: *
104: * Possible improvement:
105: * think about merging the tp_ref w/ the tpcb and doing a search
106: * through the tpcb list, from tpb. This would slow down lookup
107: * during data transfer
108: * It would be a little nicer also to have something based on the
109: * clock (like top n bits of the reference is part of the clock, to
110: * minimize the likelihood of reuse after a crash)
111: * also, need to keep the timer servicing part to a minimum (although
112: * the cost of this is probably independent of whether the timers are
113: * in the pcb or in an array..
114: * Last, would have to make the number of timers a function of the amount of
115: * mbufs available, plus some for the frozen references.
116: *
117: * Possible improvement:
118: * Might not need the ref_state stuff either...
119: * REF_FREE could correspond to tp_state == CLOSED or nonexistend tpcb,
120: * REF_OPEN to tp_state anywhere from AK_WAIT or CR_SENT to CLOSING
121: * REF_OPENING could correspond to LISTENING, because that's the
122: * way it's used, not because the correspondence is exact.
123: * REF_CLOSED could correspond to REFWAIT
124: */
125: #define REF_FROZEN 3 /* has ref timer only */
126: #define REF_OPEN 2 /* has timers, possibly active */
127: #define REF_OPENING 1 /* in use (has a pcb) but no timers */
128: #define REF_FREE 0 /* free to reallocate */
129:
130: #define TM_NTIMERS 6
131:
132: struct tp_ref {
133: struct tp_pcb *tpr_pcb; /* back ptr to PCB */
134: };
135:
136: /* PER system stuff (one static structure instead of a bunch of names) */
137: struct tp_refinfo {
138: struct tp_ref *tpr_base;
139: int tpr_size;
140: int tpr_maxopen;
141: int tpr_numopen;
142: };
143:
144: struct nl_protosw {
145: int nlp_afamily; /* address family */
146: int (*nlp_putnetaddr)(); /* puts addresses in nl pcb */
147: int (*nlp_getnetaddr)(); /* gets addresses from nl pcb */
148: int (*nlp_cmpnetaddr)(); /* compares address in pcb with sockaddr */
149: int (*nlp_putsufx)(); /* puts transport suffixes in nl pcb */
150: int (*nlp_getsufx)(); /* gets transport suffixes from nl pcb */
151: int (*nlp_recycle_suffix)();/* clears suffix from nl pcb */
152: int (*nlp_mtu)(); /* figures out mtu based on nl used */
153: int (*nlp_pcbbind)(); /* bind to pcb for net level */
154: int (*nlp_pcbconn)(); /* connect for net level */
155: int (*nlp_pcbdisc)(); /* disconnect net level */
156: int (*nlp_pcbdetach)(); /* detach net level pcb */
157: int (*nlp_pcballoc)(); /* allocate a net level pcb */
158: int (*nlp_output)(); /* prepare a packet to give to nl */
159: int (*nlp_dgoutput)(); /* prepare a packet to give to nl */
160: int (*nlp_ctloutput)(); /* hook for network set/get options */
161: caddr_t nlp_pcblist; /* list of xx_pcb's for connections */
162: };
163:
164:
165: struct tp_pcb {
166: struct tp_pcb *tp_next;
167: struct tp_pcb *tp_prev;
168: struct tp_pcb *tp_nextlisten; /* chain all listeners */
169: struct socket *tp_sock; /* back ptr */
170: u_short tp_state; /* state of fsm */
171: short tp_retrans; /* # times can still retrans */
172: caddr_t tp_npcb; /* to lower layer pcb */
173: struct nl_protosw *tp_nlproto; /* lower-layer dependent routines */
174: struct rtentry **tp_routep; /* obtain mtu; inside npcb */
175:
176:
177: RefNum tp_lref; /* local reference */
178: RefNum tp_fref; /* foreign reference */
179:
180: u_int tp_seqmask; /* mask for seq space */
181: u_int tp_seqbit; /* bit for seq number wraparound */
182: u_int tp_seqhalf; /* half the seq space */
183:
184: struct mbuf *tp_ucddata; /* user connect/disconnect data */
185:
186: /* credit & sequencing info for SENDING */
187: u_short tp_fcredit; /* current remote credit in # packets */
188: u_short tp_maxfcredit; /* max remote credit in # packets */
189: u_short tp_dupacks; /* intuit packet loss before rxt timo */
190: u_long tp_cong_win; /* congestion window in bytes.
191: * see profuse comments in TCP code
192: */
193: u_long tp_ssthresh; /* cong_win threshold for slow start
194: * exponential to linear switch
195: */
196: SeqNum tp_snduna; /* seq # of lowest unacked DT */
197: SeqNum tp_sndnew; /* seq # of lowest unsent DT */
198: SeqNum tp_sndnum; /* next seq # to be assigned */
199: SeqNum tp_sndnxt; /* what to do next; poss. rxt */
200: struct mbuf *tp_sndnxt_m; /* packet corres. to sndnxt*/
201: int tp_Nwindow; /* for perf. measurement */
202:
203: /* credit & sequencing info for RECEIVING */
204: SeqNum tp_rcvnxt; /* next DT seq # expect to recv */
205: SeqNum tp_sent_lcdt; /* cdt according to last ack sent */
206: SeqNum tp_sent_uwe; /* uwe according to last ack sent */
207: SeqNum tp_sent_rcvnxt; /* rcvnxt according to last ack sent
208: * needed for perf measurements only
209: */
210: u_short tp_lcredit; /* current local credit in # packets */
211: u_short tp_maxlcredit; /* needed for reassembly queue */
212: struct mbuf **tp_rsyq; /* unacked stuff recvd out of order */
213: int tp_rsycnt; /* number of packets "" "" "" "" */
214: u_long tp_rhiwat; /* remember original RCVBUF size */
215:
216: /* receiver congestion state stuff ... */
217: u_int tp_win_recv;
218:
219: /* receive window as a scaled int (8 bit fraction part) */
220:
221: struct cong_sample {
222: ushort cs_size; /* current window size */
223: ushort cs_received; /* PDUs received in this sample */
224: ushort cs_ce_set; /* PDUs received in this sample with CE bit set */
225: } tp_cong_sample;
226:
227:
228: /* parameters per-connection controllable by user */
229: struct tp_conn_param _tp_param;
230:
231: #define tp_Nretrans _tp_param.p_Nretrans
232: #define tp_dr_ticks _tp_param.p_dr_ticks
233: #define tp_cc_ticks _tp_param.p_cc_ticks
234: #define tp_dt_ticks _tp_param.p_dt_ticks
235: #define tp_xpd_ticks _tp_param.p_x_ticks
236: #define tp_cr_ticks _tp_param.p_cr_ticks
237: #define tp_keepalive_ticks _tp_param.p_keepalive_ticks
238: #define tp_sendack_ticks _tp_param.p_sendack_ticks
239: #define tp_refer_ticks _tp_param.p_ref_ticks
240: #define tp_inact_ticks _tp_param.p_inact_ticks
241: #define tp_xtd_format _tp_param.p_xtd_format
242: #define tp_xpd_service _tp_param.p_xpd_service
243: #define tp_ack_strat _tp_param.p_ack_strat
244: #define tp_rx_strat _tp_param.p_rx_strat
245: #define tp_use_checksum _tp_param.p_use_checksum
246: #define tp_use_efc _tp_param.p_use_efc
247: #define tp_use_nxpd _tp_param.p_use_nxpd
248: #define tp_use_rcc _tp_param.p_use_rcc
249: #define tp_tpdusize _tp_param.p_tpdusize
250: #define tp_class _tp_param.p_class
251: #define tp_winsize _tp_param.p_winsize
252: #define tp_no_disc_indications _tp_param.p_no_disc_indications
253: #define tp_dont_change_params _tp_param.p_dont_change_params
254: #define tp_netservice _tp_param.p_netservice
255: #define tp_version _tp_param.p_version
256: #define tp_ptpdusize _tp_param.p_ptpdusize
257:
258: int tp_l_tpdusize;
259: /* whereas tp_tpdusize is log2(the negotiated max size)
260: * l_tpdusize is the size we'll use when sending, in # chars
261: */
262:
263: int tp_rtv; /* max round-trip time variance */
264: int tp_rtt; /* smoothed round-trip time */
265: SeqNum tp_rttseq; /* packet being timed */
266: int tp_rttemit; /* when emitted, in ticks */
267: int tp_idle; /* last activity, in ticks */
268: short tp_rxtcur; /* current retransmit value */
269: short tp_rxtshift; /* log(2) of rexmt exp. backoff */
270: u_char tp_cebit_off; /* real DEC bit algorithms not in use */
271: u_char tp_oktonagle; /* Last unsent pckt may be append to */
272: u_char tp_flags; /* values: */
273: #define TPF_NLQOS_PDN TPFLAG_NLQOS_PDN
274: #define TPF_PEER_ON_SAMENET TPFLAG_PEER_ON_SAMENET
275: #define TPF_GENERAL_ADDR TPFLAG_GENERAL_ADDR
276: #define TPF_DELACK 0x8
277: #define TPF_ACKNOW 0x10
278:
279: #define PEER_IS_LOCAL(t) (((t)->tp_flags & TPF_PEER_ON_SAME_NET) != 0)
280: #define USES_PDN(t) (((t)->tp_flags & TPF_NLQOS_PDN) != 0)
281:
282:
283: unsigned
284: tp_sendfcc:1, /* shall next ack include FCC parameter? */
285: tp_trace:1, /* is this pcb being traced? (not used yet) */
286: tp_perf_on:1, /* 0/1 -> performance measuring on */
287: tp_reneged:1, /* have we reneged on cdt since last ack? */
288: tp_decbit:3, /* dec bit was set, we're in reneg mode */
289: tp_notdetached:1; /* Call tp_detach before freeing XXXXXXX */
290:
291: #ifdef TP_PERF_MEAS
292: /* performance stats - see tp_stat.h */
293: struct tp_pmeas *tp_p_meas;
294: struct mbuf *tp_p_mbuf;
295: #endif /* TP_PERF_MEAS */
296:
297: /* addressing */
298: u_short tp_domain; /* domain (INET, ISO) */
299: /* for compatibility with the *old* way and with INET, be sure that
300: * that lsuffix and fsuffix are aligned to a short addr.
301: * having them follow the u_short *suffixlen should suffice (choke)
302: */
303: u_short tp_fsuffixlen; /* foreign suffix */
304: char tp_fsuffix[MAX_TSAP_SEL_LEN];
305: u_short tp_lsuffixlen; /* local suffix */
306: char tp_lsuffix[MAX_TSAP_SEL_LEN];
307: #define SHORT_LSUFXP(tpcb) ((short *)((tpcb)->tp_lsuffix))
308: #define SHORT_FSUFXP(tpcb) ((short *)((tpcb)->tp_fsuffix))
309:
310: /* Timer stuff */
311: u_char tp_vers; /* protocol version */
312: u_char tp_peer_acktime; /* used for DT retrans time */
313: u_char tp_refstate; /* values REF_FROZEN, etc. above */
314: struct tp_pcb *tp_fasttimeo; /* limit pcbs to examine */
315: u_int tp_timer[TM_NTIMERS]; /* C timers */
316:
317: struct sockbuf tp_Xsnd; /* for expedited data */
318: /* struct sockbuf tp_Xrcv; /* for expedited data */
319: #define tp_Xrcv tp_sock->so_rcv
320: SeqNum tp_Xsndnxt; /* next XPD seq # to send */
321: SeqNum tp_Xuna; /* seq # of unacked XPD */
322: SeqNum tp_Xrcvnxt; /* next XPD seq # expect to recv */
323:
324: /* AK subsequencing */
325: u_short tp_s_subseq; /* next subseq to send */
326: u_short tp_r_subseq; /* highest recv subseq */
327:
328: };
329:
330: u_int tp_start_win;
331:
332: #define ROUND(scaled_int) (((scaled_int) >> 8) + (((scaled_int) & 0x80) ? 1:0))
333:
334: /* to round off a scaled int with an 8 bit fraction part */
335:
336: #define CONG_INIT_SAMPLE(pcb) \
337: pcb->tp_cong_sample.cs_received = \
338: pcb->tp_cong_sample.cs_ce_set = 0; \
339: pcb->tp_cong_sample.cs_size = max(pcb->tp_lcredit, 1) << 1;
340:
341: #define CONG_UPDATE_SAMPLE(pcb, ce_bit) \
342: pcb->tp_cong_sample.cs_received++; \
343: if (ce_bit) { \
344: pcb->tp_cong_sample.cs_ce_set++; \
345: } \
346: if (pcb->tp_cong_sample.cs_size <= pcb->tp_cong_sample.cs_received) { \
347: if ((pcb->tp_cong_sample.cs_ce_set << 1) >= \
348: pcb->tp_cong_sample.cs_size ) { \
349: pcb->tp_win_recv -= pcb->tp_win_recv >> 3; /* multiply by .875 */ \
350: pcb->tp_win_recv = max(1 << 8, pcb->tp_win_recv); \
351: } \
352: else { \
353: pcb->tp_win_recv += (1 << 8); /* add one to the scaled int */ \
354: } \
355: pcb->tp_lcredit = ROUND(pcb->tp_win_recv); \
356: CONG_INIT_SAMPLE(pcb); \
357: }
358:
359: #ifdef KERNEL
360: extern struct tp_refinfo tp_refinfo;
361: extern struct timeval time;
362: extern struct tp_ref *tp_ref;
363: extern struct tp_param tp_param;
364: extern struct nl_protosw nl_protosw[];
365: extern struct tp_pcb *tp_listeners;
366: extern struct tp_pcb *tp_ftimeolist;
367: #endif
368:
369: #define sototpcb(so) ((struct tp_pcb *)(so->so_pcb))
370: #define sototpref(so) ((sototpcb(so)->tp_ref))
371: #define tpcbtoso(tp) ((struct socket *)((tp)->tp_sock))
372: #define tpcbtoref(tp) ((struct tp_ref *)((tp)->tp_ref))
373:
374: #endif /* __TP_PCB__ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.