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