xref: /csrg-svn/sys/netiso/tp_stat.h (revision 37469)
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