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