136412Ssklower /*********************************************************** 236412Ssklower Copyright IBM Corporation 1987 336412Ssklower 436412Ssklower All Rights Reserved 536412Ssklower 636412Ssklower Permission to use, copy, modify, and distribute this software and its 736412Ssklower documentation for any purpose and without fee is hereby granted, 836412Ssklower provided that the above copyright notice appear in all copies and that 936412Ssklower both that copyright notice and this permission notice appear in 1036412Ssklower supporting documentation, and that the name of IBM not be 1136412Ssklower used in advertising or publicity pertaining to distribution of the 1236412Ssklower software without specific, written prior permission. 1336412Ssklower 1436412Ssklower IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 1536412Ssklower ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 1636412Ssklower IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 1736412Ssklower ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 1836412Ssklower WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 1936412Ssklower ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 2036412Ssklower SOFTWARE. 2136412Ssklower 2236412Ssklower ******************************************************************/ 2336412Ssklower 2436412Ssklower /* 2536412Ssklower * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison 2636412Ssklower */ 2736412Ssklower /* 2836412Ssklower * ARGO TP 2936412Ssklower * 3036412Ssklower * $Header: tp_stat.h,v 5.4 88/11/18 17:28:38 nhall Exp $ 3136412Ssklower * $Source: /usr/argo/sys/netiso/RCS/tp_stat.h,v $ 3236412Ssklower * 3336412Ssklower * Here are the data structures in which the global 3436412Ssklower * statistics(counters) are gathered. 3536412Ssklower */ 3636412Ssklower 3736412Ssklower #ifndef __TP_STAT__ 3836412Ssklower #define __TP_STAT__ 3936412Ssklower 4036412Ssklower struct tp_stat { 4136412Ssklower u_long ts_param_ignored; 4236412Ssklower u_long ts_unused3; 4336412Ssklower u_long ts_bad_csum; 4436412Ssklower 4536412Ssklower u_long ts_inv_length; 4636412Ssklower u_long ts_inv_pcode; 4736412Ssklower u_long ts_inv_dutype; 4836412Ssklower u_long ts_negotfailed; 4936412Ssklower u_long ts_inv_dref; 5036412Ssklower u_long ts_inv_pval; 5136412Ssklower u_long ts_inv_sufx; 5236412Ssklower 5336412Ssklower u_long ts_xtd_fmt; 5436412Ssklower u_long ts_use_txpd; 5536412Ssklower u_long ts_csum_off; 5636412Ssklower u_long ts_send_drop; 5736412Ssklower u_long ts_recv_drop; 5836412Ssklower 5936412Ssklower u_long ts_xpd_intheway;/* xpd mark caused data flow to stop */ 6036412Ssklower u_long ts_xpdmark_del; /* xpd markers thrown away */ 6136412Ssklower u_long ts_dt_ooo; /* dt tpdus received out of order */ 6236412Ssklower u_long ts_dt_niw; /* dt tpdus received & not in window */ 6336412Ssklower u_long ts_xpd_niw; /* xpd tpdus received & not in window */ 6436412Ssklower u_long ts_xpd_dup; 6536412Ssklower u_long ts_dt_dup; /* dt tpdus received & are duplicates */ 6636412Ssklower 6736412Ssklower u_long ts_zfcdt; /* # times f credit went down to 0 */ 6836412Ssklower u_long ts_lcdt_reduced; /* 6936412Ssklower # times local cdt reduced on an acknowledgement. 7036412Ssklower */ 7136412Ssklower 7236412Ssklower u_long ts_pkt_rcvd; /* from ip */ 7336412Ssklower u_long ts_tpdu_rcvd; /* accepted as a TPDU in tp_input */ 7436412Ssklower u_long ts_tpdu_sent; 7536412Ssklower u_long ts_unused2; 7636412Ssklower 7736412Ssklower u_long ts_retrans_cr; 7836412Ssklower u_long ts_retrans_cc; 7936412Ssklower u_long ts_retrans_dr; 8036412Ssklower u_long ts_retrans_dt; 8136412Ssklower u_long ts_retrans_xpd; 8236412Ssklower u_long ts_conn_gaveup; 8336412Ssklower 8436412Ssklower u_long ts_ER_sent; 8536412Ssklower u_long ts_DT_sent; 8636412Ssklower u_long ts_XPD_sent; 8736412Ssklower u_long ts_AK_sent; 8836412Ssklower u_long ts_XAK_sent; 8936412Ssklower u_long ts_DR_sent; 9036412Ssklower u_long ts_DC_sent; 9136412Ssklower u_long ts_CR_sent; 9236412Ssklower u_long ts_CC_sent; 9336412Ssklower 9436412Ssklower u_long ts_ER_rcvd; 9536412Ssklower u_long ts_DT_rcvd; 9636412Ssklower u_long ts_XPD_rcvd; 9736412Ssklower u_long ts_AK_rcvd; 9836412Ssklower u_long ts_XAK_rcvd; 9936412Ssklower u_long ts_DR_rcvd; 10036412Ssklower u_long ts_DC_rcvd; 10136412Ssklower u_long ts_CR_rcvd; 10236412Ssklower u_long ts_CC_rcvd; 10336412Ssklower 10436412Ssklower u_long ts_Eticks; 10536412Ssklower u_long ts_Eexpired; 10636412Ssklower u_long ts_Eset; 10736412Ssklower u_long ts_Ecan_act; 10836412Ssklower u_long ts_Cticks; 10936412Ssklower u_long ts_Cexpired; 11036412Ssklower u_long ts_Cset; 11136412Ssklower u_long ts_Ccan_act; 11236412Ssklower u_long ts_Ccan_inact; 11336412Ssklower 11436412Ssklower u_long ts_concat_rcvd; 11536412Ssklower 11636412Ssklower u_long ts_zdebug; /* zero dref to test timeout on conn estab tp_input.c */ 11736412Ssklower u_long ts_ydebug; /* throw away pseudo-random pkts tp_input.c */ 11836412Ssklower u_long ts_unused5; 11936412Ssklower u_long ts_unused; /* kludged concat to test separation tp_emit.c */ 12036412Ssklower u_long ts_vdebug; /* kludge to test input size checking tp_emit.c */ 12136412Ssklower u_long ts_unused4; 12236412Ssklower u_long ts_ldebug; /* faked a renegging of credit */ 12336412Ssklower 12436412Ssklower u_long ts_mb_small; 12536412Ssklower u_long ts_mb_cluster; 12636412Ssklower u_long ts_mb_len_distr[17]; 12736412Ssklower 12836412Ssklower u_long ts_eot_input; 12936412Ssklower u_long ts_eot_user; 13036412Ssklower u_long ts_EOT_sent; 13136412Ssklower u_long ts_tp0_conn; 13236412Ssklower u_long ts_tp4_conn; 13336412Ssklower u_long ts_quench; 13436412Ssklower u_long ts_rcvdecbit; 13536412Ssklower 13636412Ssklower #define NRTT_CATEGORIES 4 13736412Ssklower /* The 4 categories are: 13836412Ssklower * 0 --> tp_flags: ~TPF_PEER_ON_SAMENET | TPF_NL_PDN 13936412Ssklower * 1 --> tp_flags: ~TPF_PEER_ON_SAMENET | ~TPF_NL_PDN 14036412Ssklower * 2 --> tp_flags: TPF_PEER_ON_SAMENET | ~TPF_NL_PDN 14136412Ssklower * 3 --> tp_flags: TPF_PEER_ON_SAMENET | TPF_NL_PDN 14236412Ssklower */ 14336412Ssklower struct timeval ts_rtt[NRTT_CATEGORIES]; 14436412Ssklower struct timeval ts_rtv[NRTT_CATEGORIES]; 14536412Ssklower 14636412Ssklower u_long ts_ackreason[_ACK_NUM_REASONS_]; 14736412Ssklower /* ACK_DONT 0 / ACK_STRAT_EACH 0x1 / ACK_STRAT_FULLWIN 0x4 14836412Ssklower * ACK_DUP 0x8 / ACK_EOT 0x10 / ACK_REORDER 0x20 14936412Ssklower * ACK_USRRCV ** 15036412Ssklower * ACK_FCC ** 15136412Ssklower */ 15236412Ssklower } tp_stat ; 15336412Ssklower 15436412Ssklower #define IncStat(x) tp_stat./**/x/**/++ 15536412Ssklower 15636412Ssklower #ifdef TP_PERF_MEAS 15736412Ssklower 15836412Ssklower #define PStat(Tpcb, X) (Tpcb)->tp_p_meas->/**/X/**/ 15936412Ssklower #define IncPStat(Tpcb, X) if((Tpcb)->tp_perf_on) (Tpcb)->tp_p_meas->/**/X/**/++ 16036412Ssklower 16136412Ssklower /* BEWARE OF MACROS like this ^^^ must be sure it's surrounded by {} if 16236412Ssklower * it's used in an if-else statement. 16336412Ssklower */ 16436412Ssklower 16536412Ssklower 16636412Ssklower /* for perf measurement stuff: maximum window size it can handle */ 16736412Ssklower #define TP_PM_MAX 0xa /* 10 decimal */ 16836412Ssklower 16936412Ssklower struct tp_pmeas { 17036412Ssklower /* the first few are distributions as a fn of window size 17136412Ssklower * only keep enough space for normal format plus 1 slot for 17236412Ssklower * extended format, in case any windows larger than 15 are used 17336412Ssklower */ 17436412Ssklower 17536412Ssklower /* 17636412Ssklower * tps_npdusent: for each call to tp_sbsend, we inc the 17736412Ssklower * element representing the number of pdus sent in this call 17836412Ssklower */ 17936412Ssklower int tps_win_lim_by_cdt[TP_PM_MAX+1]; 18036412Ssklower int tps_win_lim_by_data[TP_PM_MAX+1]; 18136412Ssklower /* 18236412Ssklower * tps_sendtime: Each call to tp_sbsend() is timed. For 18336412Ssklower * Each window size, we keep the running average of the time 18436412Ssklower * taken by tp_sbsend() for each window size. 18536412Ssklower */ 18636412Ssklower struct timeval tps_sendtime[TP_PM_MAX+1]; 18736412Ssklower /* 18836412Ssklower * n_TMsendack: # times ack sent because timer went off 18936412Ssklower * n_ack_cuz_eot: # times ack sent due to EOTSDU on incoming packet 19036412Ssklower * n_ack_cuz_dup: # times ack sent for receiving a duplicate pkt. 19136412Ssklower * n_ack_cuz_fullwin: # times ack sent for receiving the full window. 19236412Ssklower * n_ack_cuz_doack: # times ack sent for having just reordered data. 19336412Ssklower */ 19436412Ssklower int tps_n_TMsendack; 19536412Ssklower int tps_n_ack_cuz_eot; 19636412Ssklower int tps_n_ack_cuz_fullwin; 19736412Ssklower int tps_n_ack_cuz_reorder; 19836412Ssklower int tps_n_ack_cuz_dup; 19936412Ssklower int tps_n_ack_cuz_strat; 20036412Ssklower /* 20136412Ssklower * when we send an ack: how much less than the "expected" window 20236412Ssklower * did we actually ack. For example: if we last sent a credit 20336412Ssklower * of 10, and we're acking now for whatever reason, and have 20436412Ssklower * only received 6 since our last credit advertisement, we'll 20536412Ssklower * keep the difference, 4, in this variable. 20636412Ssklower */ 20736412Ssklower int tps_ack_early[TP_PM_MAX+1]; 20836412Ssklower /* 20936412Ssklower * when we ack, for the # pkts we actually acked w/ this ack, 21036412Ssklower * how much cdt are we advertising? 21136412Ssklower * [ size of window acknowledged ] [ cdt we're giving ] 21236412Ssklower */ 21336412Ssklower int tps_cdt_acked[TP_PM_MAX+1][TP_PM_MAX+1]; 21436412Ssklower 21536412Ssklower int tps_AK_sent; 21636412Ssklower int tps_XAK_sent; 21736412Ssklower int tps_DT_sent; 21836412Ssklower int tps_XPD_sent; 21936412Ssklower int tps_AK_rcvd; 22036412Ssklower int tps_XAK_rcvd; 22136412Ssklower int tps_DT_rcvd; 22236412Ssklower int tps_XPD_rcvd; 22336412Ssklower 22436412Ssklower int Nb_from_sess; 22536412Ssklower int Nb_to_sess; 22636412Ssklower int Nb_to_ll; 22736412Ssklower int Nb_from_ll; 22836412Ssklower }; 22936412Ssklower 230*37469Ssklower #define IFPERF(tpcb) if (tpcb->tp_perf_on && tpcb->tp_p_meas) { 23136412Ssklower #define ENDPERF } 23236412Ssklower 23336412Ssklower #else 23436412Ssklower 23536412Ssklower #define PStat(tpcb, x) /* no-op */ 23636412Ssklower #define IncPStat(tpcb, x) /* no-op */ 23736412Ssklower 23836412Ssklower #ifndef STAR 23936412Ssklower #define STAR * 24036412Ssklower #endif STAR 24136412Ssklower #define IFPERF //*beginning of comment*/STAR 24236412Ssklower #define ENDPERF STAR/*end of comment*// 24336412Ssklower 24436412Ssklower #endif TP_PERF_MEAS 24536412Ssklower 24636412Ssklower #endif __TP_STAT__ 247