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