1*36412Ssklower /*********************************************************** 2*36412Ssklower Copyright IBM Corporation 1987 3*36412Ssklower 4*36412Ssklower All Rights Reserved 5*36412Ssklower 6*36412Ssklower Permission to use, copy, modify, and distribute this software and its 7*36412Ssklower documentation for any purpose and without fee is hereby granted, 8*36412Ssklower provided that the above copyright notice appear in all copies and that 9*36412Ssklower both that copyright notice and this permission notice appear in 10*36412Ssklower supporting documentation, and that the name of IBM not be 11*36412Ssklower used in advertising or publicity pertaining to distribution of the 12*36412Ssklower software without specific, written prior permission. 13*36412Ssklower 14*36412Ssklower IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 15*36412Ssklower ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 16*36412Ssklower IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 17*36412Ssklower ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 18*36412Ssklower WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 19*36412Ssklower ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 20*36412Ssklower SOFTWARE. 21*36412Ssklower 22*36412Ssklower ******************************************************************/ 23*36412Ssklower 24*36412Ssklower /* 25*36412Ssklower * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison 26*36412Ssklower */ 27*36412Ssklower /* 28*36412Ssklower * ARGO TP 29*36412Ssklower * 30*36412Ssklower * $Header: tp_stat.h,v 5.4 88/11/18 17:28:38 nhall Exp $ 31*36412Ssklower * $Source: /usr/argo/sys/netiso/RCS/tp_stat.h,v $ 32*36412Ssklower * 33*36412Ssklower * Here are the data structures in which the global 34*36412Ssklower * statistics(counters) are gathered. 35*36412Ssklower */ 36*36412Ssklower 37*36412Ssklower #ifndef __TP_STAT__ 38*36412Ssklower #define __TP_STAT__ 39*36412Ssklower 40*36412Ssklower struct tp_stat { 41*36412Ssklower u_long ts_param_ignored; 42*36412Ssklower u_long ts_unused3; 43*36412Ssklower u_long ts_bad_csum; 44*36412Ssklower 45*36412Ssklower u_long ts_inv_length; 46*36412Ssklower u_long ts_inv_pcode; 47*36412Ssklower u_long ts_inv_dutype; 48*36412Ssklower u_long ts_negotfailed; 49*36412Ssklower u_long ts_inv_dref; 50*36412Ssklower u_long ts_inv_pval; 51*36412Ssklower u_long ts_inv_sufx; 52*36412Ssklower 53*36412Ssklower u_long ts_xtd_fmt; 54*36412Ssklower u_long ts_use_txpd; 55*36412Ssklower u_long ts_csum_off; 56*36412Ssklower u_long ts_send_drop; 57*36412Ssklower u_long ts_recv_drop; 58*36412Ssklower 59*36412Ssklower u_long ts_xpd_intheway;/* xpd mark caused data flow to stop */ 60*36412Ssklower u_long ts_xpdmark_del; /* xpd markers thrown away */ 61*36412Ssklower u_long ts_dt_ooo; /* dt tpdus received out of order */ 62*36412Ssklower u_long ts_dt_niw; /* dt tpdus received & not in window */ 63*36412Ssklower u_long ts_xpd_niw; /* xpd tpdus received & not in window */ 64*36412Ssklower u_long ts_xpd_dup; 65*36412Ssklower u_long ts_dt_dup; /* dt tpdus received & are duplicates */ 66*36412Ssklower 67*36412Ssklower u_long ts_zfcdt; /* # times f credit went down to 0 */ 68*36412Ssklower u_long ts_lcdt_reduced; /* 69*36412Ssklower # times local cdt reduced on an acknowledgement. 70*36412Ssklower */ 71*36412Ssklower 72*36412Ssklower u_long ts_pkt_rcvd; /* from ip */ 73*36412Ssklower u_long ts_tpdu_rcvd; /* accepted as a TPDU in tp_input */ 74*36412Ssklower u_long ts_tpdu_sent; 75*36412Ssklower u_long ts_unused2; 76*36412Ssklower 77*36412Ssklower u_long ts_retrans_cr; 78*36412Ssklower u_long ts_retrans_cc; 79*36412Ssklower u_long ts_retrans_dr; 80*36412Ssklower u_long ts_retrans_dt; 81*36412Ssklower u_long ts_retrans_xpd; 82*36412Ssklower u_long ts_conn_gaveup; 83*36412Ssklower 84*36412Ssklower u_long ts_ER_sent; 85*36412Ssklower u_long ts_DT_sent; 86*36412Ssklower u_long ts_XPD_sent; 87*36412Ssklower u_long ts_AK_sent; 88*36412Ssklower u_long ts_XAK_sent; 89*36412Ssklower u_long ts_DR_sent; 90*36412Ssklower u_long ts_DC_sent; 91*36412Ssklower u_long ts_CR_sent; 92*36412Ssklower u_long ts_CC_sent; 93*36412Ssklower 94*36412Ssklower u_long ts_ER_rcvd; 95*36412Ssklower u_long ts_DT_rcvd; 96*36412Ssklower u_long ts_XPD_rcvd; 97*36412Ssklower u_long ts_AK_rcvd; 98*36412Ssklower u_long ts_XAK_rcvd; 99*36412Ssklower u_long ts_DR_rcvd; 100*36412Ssklower u_long ts_DC_rcvd; 101*36412Ssklower u_long ts_CR_rcvd; 102*36412Ssklower u_long ts_CC_rcvd; 103*36412Ssklower 104*36412Ssklower u_long ts_Eticks; 105*36412Ssklower u_long ts_Eexpired; 106*36412Ssklower u_long ts_Eset; 107*36412Ssklower u_long ts_Ecan_act; 108*36412Ssklower u_long ts_Cticks; 109*36412Ssklower u_long ts_Cexpired; 110*36412Ssklower u_long ts_Cset; 111*36412Ssklower u_long ts_Ccan_act; 112*36412Ssklower u_long ts_Ccan_inact; 113*36412Ssklower 114*36412Ssklower u_long ts_concat_rcvd; 115*36412Ssklower 116*36412Ssklower u_long ts_zdebug; /* zero dref to test timeout on conn estab tp_input.c */ 117*36412Ssklower u_long ts_ydebug; /* throw away pseudo-random pkts tp_input.c */ 118*36412Ssklower u_long ts_unused5; 119*36412Ssklower u_long ts_unused; /* kludged concat to test separation tp_emit.c */ 120*36412Ssklower u_long ts_vdebug; /* kludge to test input size checking tp_emit.c */ 121*36412Ssklower u_long ts_unused4; 122*36412Ssklower u_long ts_ldebug; /* faked a renegging of credit */ 123*36412Ssklower 124*36412Ssklower u_long ts_mb_small; 125*36412Ssklower u_long ts_mb_cluster; 126*36412Ssklower u_long ts_mb_len_distr[17]; 127*36412Ssklower 128*36412Ssklower u_long ts_eot_input; 129*36412Ssklower u_long ts_eot_user; 130*36412Ssklower u_long ts_EOT_sent; 131*36412Ssklower u_long ts_tp0_conn; 132*36412Ssklower u_long ts_tp4_conn; 133*36412Ssklower u_long ts_quench; 134*36412Ssklower u_long ts_rcvdecbit; 135*36412Ssklower 136*36412Ssklower #define NRTT_CATEGORIES 4 137*36412Ssklower /* The 4 categories are: 138*36412Ssklower * 0 --> tp_flags: ~TPF_PEER_ON_SAMENET | TPF_NL_PDN 139*36412Ssklower * 1 --> tp_flags: ~TPF_PEER_ON_SAMENET | ~TPF_NL_PDN 140*36412Ssklower * 2 --> tp_flags: TPF_PEER_ON_SAMENET | ~TPF_NL_PDN 141*36412Ssklower * 3 --> tp_flags: TPF_PEER_ON_SAMENET | TPF_NL_PDN 142*36412Ssklower */ 143*36412Ssklower struct timeval ts_rtt[NRTT_CATEGORIES]; 144*36412Ssklower struct timeval ts_rtv[NRTT_CATEGORIES]; 145*36412Ssklower 146*36412Ssklower u_long ts_ackreason[_ACK_NUM_REASONS_]; 147*36412Ssklower /* ACK_DONT 0 / ACK_STRAT_EACH 0x1 / ACK_STRAT_FULLWIN 0x4 148*36412Ssklower * ACK_DUP 0x8 / ACK_EOT 0x10 / ACK_REORDER 0x20 149*36412Ssklower * ACK_USRRCV ** 150*36412Ssklower * ACK_FCC ** 151*36412Ssklower */ 152*36412Ssklower } tp_stat ; 153*36412Ssklower 154*36412Ssklower #define IncStat(x) tp_stat./**/x/**/++ 155*36412Ssklower 156*36412Ssklower #ifdef TP_PERF_MEAS 157*36412Ssklower 158*36412Ssklower #define PStat(Tpcb, X) (Tpcb)->tp_p_meas->/**/X/**/ 159*36412Ssklower #define IncPStat(Tpcb, X) if((Tpcb)->tp_perf_on) (Tpcb)->tp_p_meas->/**/X/**/++ 160*36412Ssklower 161*36412Ssklower /* BEWARE OF MACROS like this ^^^ must be sure it's surrounded by {} if 162*36412Ssklower * it's used in an if-else statement. 163*36412Ssklower */ 164*36412Ssklower 165*36412Ssklower 166*36412Ssklower /* for perf measurement stuff: maximum window size it can handle */ 167*36412Ssklower #define TP_PM_MAX 0xa /* 10 decimal */ 168*36412Ssklower 169*36412Ssklower struct tp_pmeas { 170*36412Ssklower /* the first few are distributions as a fn of window size 171*36412Ssklower * only keep enough space for normal format plus 1 slot for 172*36412Ssklower * extended format, in case any windows larger than 15 are used 173*36412Ssklower */ 174*36412Ssklower 175*36412Ssklower /* 176*36412Ssklower * tps_npdusent: for each call to tp_sbsend, we inc the 177*36412Ssklower * element representing the number of pdus sent in this call 178*36412Ssklower */ 179*36412Ssklower int tps_win_lim_by_cdt[TP_PM_MAX+1]; 180*36412Ssklower int tps_win_lim_by_data[TP_PM_MAX+1]; 181*36412Ssklower /* 182*36412Ssklower * tps_sendtime: Each call to tp_sbsend() is timed. For 183*36412Ssklower * Each window size, we keep the running average of the time 184*36412Ssklower * taken by tp_sbsend() for each window size. 185*36412Ssklower */ 186*36412Ssklower struct timeval tps_sendtime[TP_PM_MAX+1]; 187*36412Ssklower /* 188*36412Ssklower * n_TMsendack: # times ack sent because timer went off 189*36412Ssklower * n_ack_cuz_eot: # times ack sent due to EOTSDU on incoming packet 190*36412Ssklower * n_ack_cuz_dup: # times ack sent for receiving a duplicate pkt. 191*36412Ssklower * n_ack_cuz_fullwin: # times ack sent for receiving the full window. 192*36412Ssklower * n_ack_cuz_doack: # times ack sent for having just reordered data. 193*36412Ssklower */ 194*36412Ssklower int tps_n_TMsendack; 195*36412Ssklower int tps_n_ack_cuz_eot; 196*36412Ssklower int tps_n_ack_cuz_fullwin; 197*36412Ssklower int tps_n_ack_cuz_reorder; 198*36412Ssklower int tps_n_ack_cuz_dup; 199*36412Ssklower int tps_n_ack_cuz_strat; 200*36412Ssklower /* 201*36412Ssklower * when we send an ack: how much less than the "expected" window 202*36412Ssklower * did we actually ack. For example: if we last sent a credit 203*36412Ssklower * of 10, and we're acking now for whatever reason, and have 204*36412Ssklower * only received 6 since our last credit advertisement, we'll 205*36412Ssklower * keep the difference, 4, in this variable. 206*36412Ssklower */ 207*36412Ssklower int tps_ack_early[TP_PM_MAX+1]; 208*36412Ssklower /* 209*36412Ssklower * when we ack, for the # pkts we actually acked w/ this ack, 210*36412Ssklower * how much cdt are we advertising? 211*36412Ssklower * [ size of window acknowledged ] [ cdt we're giving ] 212*36412Ssklower */ 213*36412Ssklower int tps_cdt_acked[TP_PM_MAX+1][TP_PM_MAX+1]; 214*36412Ssklower 215*36412Ssklower int tps_AK_sent; 216*36412Ssklower int tps_XAK_sent; 217*36412Ssklower int tps_DT_sent; 218*36412Ssklower int tps_XPD_sent; 219*36412Ssklower int tps_AK_rcvd; 220*36412Ssklower int tps_XAK_rcvd; 221*36412Ssklower int tps_DT_rcvd; 222*36412Ssklower int tps_XPD_rcvd; 223*36412Ssklower 224*36412Ssklower int Nb_from_sess; 225*36412Ssklower int Nb_to_sess; 226*36412Ssklower int Nb_to_ll; 227*36412Ssklower int Nb_from_ll; 228*36412Ssklower }; 229*36412Ssklower 230*36412Ssklower #define IFPERF(tpcb) if (tpcb->tp_perf_on &&\ 231*36412Ssklower (tpcb->tp_p_meas != (struct tp_pmeas *)0 )) { 232*36412Ssklower #define ENDPERF } 233*36412Ssklower 234*36412Ssklower #else 235*36412Ssklower 236*36412Ssklower #define PStat(tpcb, x) /* no-op */ 237*36412Ssklower #define IncPStat(tpcb, x) /* no-op */ 238*36412Ssklower 239*36412Ssklower #ifndef STAR 240*36412Ssklower #define STAR * 241*36412Ssklower #endif STAR 242*36412Ssklower #define IFPERF //*beginning of comment*/STAR 243*36412Ssklower #define ENDPERF STAR/*end of comment*// 244*36412Ssklower 245*36412Ssklower #endif TP_PERF_MEAS 246*36412Ssklower 247*36412Ssklower #endif __TP_STAT__ 248