xref: /csrg-svn/sys/netiso/tp_stat.h (revision 42944)
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;
52*42944Ssklower 	u_long ts_inv_aclass;
5336412Ssklower 
5436412Ssklower 	u_long ts_xtd_fmt;
5536412Ssklower 	u_long ts_use_txpd;
5636412Ssklower 	u_long ts_csum_off;
5736412Ssklower 	u_long	ts_send_drop;
5836412Ssklower 	u_long	ts_recv_drop;
5936412Ssklower 
6036412Ssklower 	u_long ts_xpd_intheway;/* xpd mark caused data flow to stop */
6136412Ssklower 	u_long ts_xpdmark_del;	/* xpd markers thrown away */
6236412Ssklower 	u_long ts_dt_ooo;		/* dt tpdus received out of order */
6336412Ssklower 	u_long ts_dt_niw;		/* dt tpdus received & not in window */
6436412Ssklower 	u_long ts_xpd_niw;		/* xpd tpdus received & not in window */
6536412Ssklower 	u_long ts_xpd_dup;
6636412Ssklower 	u_long ts_dt_dup;		/* dt tpdus received & are duplicates */
6736412Ssklower 
6836412Ssklower 	u_long ts_zfcdt;		/* # times f credit went down to 0 */
6936412Ssklower 	u_long ts_lcdt_reduced; /*
7036412Ssklower 		# times local cdt reduced on an acknowledgement.
7136412Ssklower 		*/
7236412Ssklower 
7336412Ssklower 	u_long	ts_pkt_rcvd; /* from ip */
7436412Ssklower 	u_long	ts_tpdu_rcvd; /* accepted as a TPDU in tp_input */
7536412Ssklower 	u_long	ts_tpdu_sent;
7636412Ssklower 	u_long	ts_unused2;
7736412Ssklower 
7836412Ssklower 	u_long	ts_retrans_cr;
7936412Ssklower 	u_long	ts_retrans_cc;
8036412Ssklower 	u_long	ts_retrans_dr;
8136412Ssklower 	u_long	ts_retrans_dt;
8236412Ssklower 	u_long	ts_retrans_xpd;
8336412Ssklower 	u_long	ts_conn_gaveup;
8436412Ssklower 
8536412Ssklower 	u_long ts_ER_sent;
8636412Ssklower 	u_long	ts_DT_sent;
8736412Ssklower 	u_long	ts_XPD_sent;
8836412Ssklower 	u_long	ts_AK_sent;
8936412Ssklower 	u_long	ts_XAK_sent;
9036412Ssklower 	u_long	ts_DR_sent;
9136412Ssklower 	u_long	ts_DC_sent;
9236412Ssklower 	u_long	ts_CR_sent;
9336412Ssklower 	u_long	ts_CC_sent;
9436412Ssklower 
9536412Ssklower 	u_long ts_ER_rcvd;
9636412Ssklower 	u_long	ts_DT_rcvd;
9736412Ssklower 	u_long	ts_XPD_rcvd;
9836412Ssklower 	u_long	ts_AK_rcvd;
9936412Ssklower 	u_long	ts_XAK_rcvd;
10036412Ssklower 	u_long	ts_DR_rcvd;
10136412Ssklower 	u_long	ts_DC_rcvd;
10236412Ssklower 	u_long	ts_CR_rcvd;
10336412Ssklower 	u_long	ts_CC_rcvd;
10436412Ssklower 
10536412Ssklower 	u_long	ts_Eticks;
10636412Ssklower 	u_long	ts_Eexpired;
10736412Ssklower 	u_long	ts_Eset;
10836412Ssklower 	u_long	ts_Ecan_act;
10936412Ssklower 	u_long	ts_Cticks;
11036412Ssklower 	u_long	ts_Cexpired;
11136412Ssklower 	u_long	ts_Cset;
11236412Ssklower 	u_long	ts_Ccan_act;
11336412Ssklower 	u_long	ts_Ccan_inact;
11436412Ssklower 
11536412Ssklower 	u_long	ts_concat_rcvd;
11636412Ssklower 
11736412Ssklower 	u_long	ts_zdebug; /* zero dref to test timeout on conn estab tp_input.c */
11836412Ssklower 	u_long ts_ydebug; /* throw away pseudo-random pkts tp_input.c */
11936412Ssklower 	u_long ts_unused5;
12036412Ssklower 	u_long ts_unused; /* kludged concat to test separation tp_emit.c */
12136412Ssklower 	u_long ts_vdebug; /* kludge to test input size checking tp_emit.c */
12236412Ssklower 	u_long ts_unused4;
12336412Ssklower 	u_long ts_ldebug; /* faked a renegging of credit */
12436412Ssklower 
12536412Ssklower 	u_long ts_mb_small;
12636412Ssklower 	u_long ts_mb_cluster;
12736412Ssklower 	u_long ts_mb_len_distr[17];
12836412Ssklower 
12936412Ssklower 	u_long ts_eot_input;
13036412Ssklower 	u_long ts_eot_user;
13136412Ssklower 	u_long	ts_EOT_sent;
13236412Ssklower 	u_long ts_tp0_conn;
13336412Ssklower 	u_long ts_tp4_conn;
13436412Ssklower 	u_long ts_quench;
13536412Ssklower 	u_long ts_rcvdecbit;
13636412Ssklower 
13736412Ssklower #define NRTT_CATEGORIES 4
13836412Ssklower 	/*  The 4 categories are:
13936412Ssklower 	 * 0 --> tp_flags: ~TPF_PEER_ON_SAMENET |  TPF_NL_PDN
14036412Ssklower 	 * 1 --> tp_flags: ~TPF_PEER_ON_SAMENET | ~TPF_NL_PDN
14136412Ssklower 	 * 2 --> tp_flags:  TPF_PEER_ON_SAMENET | ~TPF_NL_PDN
14236412Ssklower 	 * 3 --> tp_flags:  TPF_PEER_ON_SAMENET |  TPF_NL_PDN
14336412Ssklower 	 */
14436412Ssklower 	struct timeval ts_rtt[NRTT_CATEGORIES];
14536412Ssklower 	struct timeval ts_rtv[NRTT_CATEGORIES];
14636412Ssklower 
14736412Ssklower 	u_long ts_ackreason[_ACK_NUM_REASONS_];
14836412Ssklower 		/*  ACK_DONT 0 / ACK_STRAT_EACH 0x1 / ACK_STRAT_FULLWIN 0x4
14936412Ssklower 	  	 *	ACK_DUP 0x8 / ACK_EOT 0x10  / ACK_REORDER 0x20
15036412Ssklower 	  	 *	ACK_USRRCV **
15136412Ssklower 	  	 *	ACK_FCC **
15236412Ssklower 		 */
15336412Ssklower } tp_stat ;
15436412Ssklower 
15536412Ssklower #define IncStat(x) tp_stat./**/x/**/++
15636412Ssklower 
15736412Ssklower #ifdef TP_PERF_MEAS
15836412Ssklower 
15936412Ssklower #define PStat(Tpcb, X) (Tpcb)->tp_p_meas->/**/X/**/
16036412Ssklower #define IncPStat(Tpcb, X) if((Tpcb)->tp_perf_on) (Tpcb)->tp_p_meas->/**/X/**/++
16136412Ssklower 
16236412Ssklower /* BEWARE OF MACROS like this ^^^ must be sure it's surrounded by {} if
16336412Ssklower  * it's used in an if-else statement.
16436412Ssklower  */
16536412Ssklower 
16636412Ssklower 
16736412Ssklower /* for perf measurement stuff: maximum window size it can handle */
16836412Ssklower #define 	TP_PM_MAX			0xa /* 10 decimal */
16936412Ssklower 
17036412Ssklower struct tp_pmeas {
17136412Ssklower 		/* the first few are distributions as a fn of window size
17236412Ssklower 		 * only keep enough space for normal format plus 1 slot for
17336412Ssklower 		 * extended format, in case any windows larger than 15 are used
17436412Ssklower 		 */
17536412Ssklower 
17636412Ssklower 		/*
17736412Ssklower 		 * tps_npdusent: for each call to tp_sbsend, we inc the
17836412Ssklower 		 * element representing the number of pdus sent in this call
17936412Ssklower 		 */
18036412Ssklower 		int		tps_win_lim_by_cdt[TP_PM_MAX+1];
18136412Ssklower 		int		tps_win_lim_by_data[TP_PM_MAX+1];
18236412Ssklower 		/*
18336412Ssklower 		 * tps_sendtime: Each call to tp_sbsend() is timed.  For
18436412Ssklower 		 * Each window size, we keep the running average of the time
18536412Ssklower 		 * taken by tp_sbsend() for each window size.
18636412Ssklower 		 */
18736412Ssklower 		struct timeval	tps_sendtime[TP_PM_MAX+1];
18836412Ssklower 		/*
18936412Ssklower 		 * n_TMsendack: # times ack sent because timer went off
19036412Ssklower 		 * n_ack_cuz_eot: # times ack sent due to EOTSDU on incoming packet
19136412Ssklower 		 * n_ack_cuz_dup: # times ack sent for receiving a duplicate pkt.
19236412Ssklower 		 * n_ack_cuz_fullwin: # times ack sent for receiving the full window.
19336412Ssklower 		 * n_ack_cuz_doack: # times ack sent for having just reordered data.
19436412Ssklower 		 */
19536412Ssklower 		int		tps_n_TMsendack;
19636412Ssklower 		int		tps_n_ack_cuz_eot;
19736412Ssklower 		int		tps_n_ack_cuz_fullwin;
19836412Ssklower 		int		tps_n_ack_cuz_reorder;
19936412Ssklower 		int		tps_n_ack_cuz_dup;
20036412Ssklower 		int		tps_n_ack_cuz_strat;
20136412Ssklower 		/*
20236412Ssklower 		 * when we send an ack: how much less than the "expected" window
20336412Ssklower 		 * did we actually ack.  For example: if we last sent a credit
20436412Ssklower 		 * of 10, and we're acking now for whatever reason, and have
20536412Ssklower 		 * only received 6 since our last credit advertisement, we'll
20636412Ssklower 		 * keep the difference, 4, in this variable.
20736412Ssklower 		 */
20836412Ssklower 		int		tps_ack_early[TP_PM_MAX+1];
20936412Ssklower 		/*
21036412Ssklower 		 * when we ack, for the # pkts we actually acked w/ this ack,
21136412Ssklower 		 * how much cdt are we advertising?
21236412Ssklower 		 * [ size of window acknowledged ] [ cdt we're giving ]
21336412Ssklower 		 */
21436412Ssklower 		int		tps_cdt_acked[TP_PM_MAX+1][TP_PM_MAX+1];
21536412Ssklower 
21636412Ssklower 		int 	tps_AK_sent;
21736412Ssklower 		int 	tps_XAK_sent;
21836412Ssklower 		int 	tps_DT_sent;
21936412Ssklower 		int 	tps_XPD_sent;
22036412Ssklower 		int 	tps_AK_rcvd;
22136412Ssklower 		int 	tps_XAK_rcvd;
22236412Ssklower 		int 	tps_DT_rcvd;
22336412Ssklower 		int 	tps_XPD_rcvd;
22436412Ssklower 
22536412Ssklower 		int		Nb_from_sess;
22636412Ssklower 		int		Nb_to_sess;
22736412Ssklower 		int		Nb_to_ll;
22836412Ssklower 		int		Nb_from_ll;
22936412Ssklower };
23036412Ssklower 
23137469Ssklower #define  IFPERF(tpcb)  if (tpcb->tp_perf_on && tpcb->tp_p_meas) {
23236412Ssklower #define  ENDPERF }
23336412Ssklower 
23436412Ssklower #else
23536412Ssklower 
23636412Ssklower #define PStat(tpcb, x)  /* no-op */
23736412Ssklower #define IncPStat(tpcb, x)  /* no-op */
23836412Ssklower 
23936412Ssklower #ifndef STAR
24036412Ssklower #define STAR *
24136412Ssklower #endif	STAR
24236412Ssklower #define IFPERF	//*beginning of comment*/STAR
24336412Ssklower #define ENDPERF		 STAR/*end of comment*//
24436412Ssklower 
24536412Ssklower #endif TP_PERF_MEAS
24636412Ssklower 
24736412Ssklower #endif __TP_STAT__
248