|
|
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.