xref: /csrg-svn/sys/netiso/tp_stat.h (revision 36412)
1*36412Ssklower /***********************************************************
2*36412Ssklower 		Copyright IBM Corporation 1987
3*36412Ssklower 
4*36412Ssklower                       All Rights Reserved
5*36412Ssklower 
6*36412Ssklower Permission to use, copy, modify, and distribute this software and its
7*36412Ssklower documentation for any purpose and without fee is hereby granted,
8*36412Ssklower provided that the above copyright notice appear in all copies and that
9*36412Ssklower both that copyright notice and this permission notice appear in
10*36412Ssklower supporting documentation, and that the name of IBM not be
11*36412Ssklower used in advertising or publicity pertaining to distribution of the
12*36412Ssklower software without specific, written prior permission.
13*36412Ssklower 
14*36412Ssklower IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15*36412Ssklower ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
16*36412Ssklower IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
17*36412Ssklower ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18*36412Ssklower WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
19*36412Ssklower ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20*36412Ssklower SOFTWARE.
21*36412Ssklower 
22*36412Ssklower ******************************************************************/
23*36412Ssklower 
24*36412Ssklower /*
25*36412Ssklower  * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
26*36412Ssklower  */
27*36412Ssklower /*
28*36412Ssklower  * ARGO TP
29*36412Ssklower  *
30*36412Ssklower  * $Header: tp_stat.h,v 5.4 88/11/18 17:28:38 nhall Exp $
31*36412Ssklower  * $Source: /usr/argo/sys/netiso/RCS/tp_stat.h,v $
32*36412Ssklower  *
33*36412Ssklower  * Here are the data structures in which the global
34*36412Ssklower  * statistics(counters) are gathered.
35*36412Ssklower  */
36*36412Ssklower 
37*36412Ssklower #ifndef __TP_STAT__
38*36412Ssklower #define __TP_STAT__
39*36412Ssklower 
40*36412Ssklower struct tp_stat {
41*36412Ssklower 	u_long ts_param_ignored;
42*36412Ssklower 	u_long ts_unused3;
43*36412Ssklower 	u_long ts_bad_csum;
44*36412Ssklower 
45*36412Ssklower 	u_long ts_inv_length;
46*36412Ssklower 	u_long ts_inv_pcode;
47*36412Ssklower 	u_long ts_inv_dutype;
48*36412Ssklower 	u_long ts_negotfailed;
49*36412Ssklower 	u_long ts_inv_dref;
50*36412Ssklower 	u_long ts_inv_pval;
51*36412Ssklower 	u_long ts_inv_sufx;
52*36412Ssklower 
53*36412Ssklower 	u_long ts_xtd_fmt;
54*36412Ssklower 	u_long ts_use_txpd;
55*36412Ssklower 	u_long ts_csum_off;
56*36412Ssklower 	u_long	ts_send_drop;
57*36412Ssklower 	u_long	ts_recv_drop;
58*36412Ssklower 
59*36412Ssklower 	u_long ts_xpd_intheway;/* xpd mark caused data flow to stop */
60*36412Ssklower 	u_long ts_xpdmark_del;	/* xpd markers thrown away */
61*36412Ssklower 	u_long ts_dt_ooo;		/* dt tpdus received out of order */
62*36412Ssklower 	u_long ts_dt_niw;		/* dt tpdus received & not in window */
63*36412Ssklower 	u_long ts_xpd_niw;		/* xpd tpdus received & not in window */
64*36412Ssklower 	u_long ts_xpd_dup;
65*36412Ssklower 	u_long ts_dt_dup;		/* dt tpdus received & are duplicates */
66*36412Ssklower 
67*36412Ssklower 	u_long ts_zfcdt;		/* # times f credit went down to 0 */
68*36412Ssklower 	u_long ts_lcdt_reduced; /*
69*36412Ssklower 		# times local cdt reduced on an acknowledgement.
70*36412Ssklower 		*/
71*36412Ssklower 
72*36412Ssklower 	u_long	ts_pkt_rcvd; /* from ip */
73*36412Ssklower 	u_long	ts_tpdu_rcvd; /* accepted as a TPDU in tp_input */
74*36412Ssklower 	u_long	ts_tpdu_sent;
75*36412Ssklower 	u_long	ts_unused2;
76*36412Ssklower 
77*36412Ssklower 	u_long	ts_retrans_cr;
78*36412Ssklower 	u_long	ts_retrans_cc;
79*36412Ssklower 	u_long	ts_retrans_dr;
80*36412Ssklower 	u_long	ts_retrans_dt;
81*36412Ssklower 	u_long	ts_retrans_xpd;
82*36412Ssklower 	u_long	ts_conn_gaveup;
83*36412Ssklower 
84*36412Ssklower 	u_long ts_ER_sent;
85*36412Ssklower 	u_long	ts_DT_sent;
86*36412Ssklower 	u_long	ts_XPD_sent;
87*36412Ssklower 	u_long	ts_AK_sent;
88*36412Ssklower 	u_long	ts_XAK_sent;
89*36412Ssklower 	u_long	ts_DR_sent;
90*36412Ssklower 	u_long	ts_DC_sent;
91*36412Ssklower 	u_long	ts_CR_sent;
92*36412Ssklower 	u_long	ts_CC_sent;
93*36412Ssklower 
94*36412Ssklower 	u_long ts_ER_rcvd;
95*36412Ssklower 	u_long	ts_DT_rcvd;
96*36412Ssklower 	u_long	ts_XPD_rcvd;
97*36412Ssklower 	u_long	ts_AK_rcvd;
98*36412Ssklower 	u_long	ts_XAK_rcvd;
99*36412Ssklower 	u_long	ts_DR_rcvd;
100*36412Ssklower 	u_long	ts_DC_rcvd;
101*36412Ssklower 	u_long	ts_CR_rcvd;
102*36412Ssklower 	u_long	ts_CC_rcvd;
103*36412Ssklower 
104*36412Ssklower 	u_long	ts_Eticks;
105*36412Ssklower 	u_long	ts_Eexpired;
106*36412Ssklower 	u_long	ts_Eset;
107*36412Ssklower 	u_long	ts_Ecan_act;
108*36412Ssklower 	u_long	ts_Cticks;
109*36412Ssklower 	u_long	ts_Cexpired;
110*36412Ssklower 	u_long	ts_Cset;
111*36412Ssklower 	u_long	ts_Ccan_act;
112*36412Ssklower 	u_long	ts_Ccan_inact;
113*36412Ssklower 
114*36412Ssklower 	u_long	ts_concat_rcvd;
115*36412Ssklower 
116*36412Ssklower 	u_long	ts_zdebug; /* zero dref to test timeout on conn estab tp_input.c */
117*36412Ssklower 	u_long ts_ydebug; /* throw away pseudo-random pkts tp_input.c */
118*36412Ssklower 	u_long ts_unused5;
119*36412Ssklower 	u_long ts_unused; /* kludged concat to test separation tp_emit.c */
120*36412Ssklower 	u_long ts_vdebug; /* kludge to test input size checking tp_emit.c */
121*36412Ssklower 	u_long ts_unused4;
122*36412Ssklower 	u_long ts_ldebug; /* faked a renegging of credit */
123*36412Ssklower 
124*36412Ssklower 	u_long ts_mb_small;
125*36412Ssklower 	u_long ts_mb_cluster;
126*36412Ssklower 	u_long ts_mb_len_distr[17];
127*36412Ssklower 
128*36412Ssklower 	u_long ts_eot_input;
129*36412Ssklower 	u_long ts_eot_user;
130*36412Ssklower 	u_long	ts_EOT_sent;
131*36412Ssklower 	u_long ts_tp0_conn;
132*36412Ssklower 	u_long ts_tp4_conn;
133*36412Ssklower 	u_long ts_quench;
134*36412Ssklower 	u_long ts_rcvdecbit;
135*36412Ssklower 
136*36412Ssklower #define NRTT_CATEGORIES 4
137*36412Ssklower 	/*  The 4 categories are:
138*36412Ssklower 	 * 0 --> tp_flags: ~TPF_PEER_ON_SAMENET |  TPF_NL_PDN
139*36412Ssklower 	 * 1 --> tp_flags: ~TPF_PEER_ON_SAMENET | ~TPF_NL_PDN
140*36412Ssklower 	 * 2 --> tp_flags:  TPF_PEER_ON_SAMENET | ~TPF_NL_PDN
141*36412Ssklower 	 * 3 --> tp_flags:  TPF_PEER_ON_SAMENET |  TPF_NL_PDN
142*36412Ssklower 	 */
143*36412Ssklower 	struct timeval ts_rtt[NRTT_CATEGORIES];
144*36412Ssklower 	struct timeval ts_rtv[NRTT_CATEGORIES];
145*36412Ssklower 
146*36412Ssklower 	u_long ts_ackreason[_ACK_NUM_REASONS_];
147*36412Ssklower 		/*  ACK_DONT 0 / ACK_STRAT_EACH 0x1 / ACK_STRAT_FULLWIN 0x4
148*36412Ssklower 	  	 *	ACK_DUP 0x8 / ACK_EOT 0x10  / ACK_REORDER 0x20
149*36412Ssklower 	  	 *	ACK_USRRCV **
150*36412Ssklower 	  	 *	ACK_FCC **
151*36412Ssklower 		 */
152*36412Ssklower } tp_stat ;
153*36412Ssklower 
154*36412Ssklower #define IncStat(x) tp_stat./**/x/**/++
155*36412Ssklower 
156*36412Ssklower #ifdef TP_PERF_MEAS
157*36412Ssklower 
158*36412Ssklower #define PStat(Tpcb, X) (Tpcb)->tp_p_meas->/**/X/**/
159*36412Ssklower #define IncPStat(Tpcb, X) if((Tpcb)->tp_perf_on) (Tpcb)->tp_p_meas->/**/X/**/++
160*36412Ssklower 
161*36412Ssklower /* BEWARE OF MACROS like this ^^^ must be sure it's surrounded by {} if
162*36412Ssklower  * it's used in an if-else statement.
163*36412Ssklower  */
164*36412Ssklower 
165*36412Ssklower 
166*36412Ssklower /* for perf measurement stuff: maximum window size it can handle */
167*36412Ssklower #define 	TP_PM_MAX			0xa /* 10 decimal */
168*36412Ssklower 
169*36412Ssklower struct tp_pmeas {
170*36412Ssklower 		/* the first few are distributions as a fn of window size
171*36412Ssklower 		 * only keep enough space for normal format plus 1 slot for
172*36412Ssklower 		 * extended format, in case any windows larger than 15 are used
173*36412Ssklower 		 */
174*36412Ssklower 
175*36412Ssklower 		/*
176*36412Ssklower 		 * tps_npdusent: for each call to tp_sbsend, we inc the
177*36412Ssklower 		 * element representing the number of pdus sent in this call
178*36412Ssklower 		 */
179*36412Ssklower 		int		tps_win_lim_by_cdt[TP_PM_MAX+1];
180*36412Ssklower 		int		tps_win_lim_by_data[TP_PM_MAX+1];
181*36412Ssklower 		/*
182*36412Ssklower 		 * tps_sendtime: Each call to tp_sbsend() is timed.  For
183*36412Ssklower 		 * Each window size, we keep the running average of the time
184*36412Ssklower 		 * taken by tp_sbsend() for each window size.
185*36412Ssklower 		 */
186*36412Ssklower 		struct timeval	tps_sendtime[TP_PM_MAX+1];
187*36412Ssklower 		/*
188*36412Ssklower 		 * n_TMsendack: # times ack sent because timer went off
189*36412Ssklower 		 * n_ack_cuz_eot: # times ack sent due to EOTSDU on incoming packet
190*36412Ssklower 		 * n_ack_cuz_dup: # times ack sent for receiving a duplicate pkt.
191*36412Ssklower 		 * n_ack_cuz_fullwin: # times ack sent for receiving the full window.
192*36412Ssklower 		 * n_ack_cuz_doack: # times ack sent for having just reordered data.
193*36412Ssklower 		 */
194*36412Ssklower 		int		tps_n_TMsendack;
195*36412Ssklower 		int		tps_n_ack_cuz_eot;
196*36412Ssklower 		int		tps_n_ack_cuz_fullwin;
197*36412Ssklower 		int		tps_n_ack_cuz_reorder;
198*36412Ssklower 		int		tps_n_ack_cuz_dup;
199*36412Ssklower 		int		tps_n_ack_cuz_strat;
200*36412Ssklower 		/*
201*36412Ssklower 		 * when we send an ack: how much less than the "expected" window
202*36412Ssklower 		 * did we actually ack.  For example: if we last sent a credit
203*36412Ssklower 		 * of 10, and we're acking now for whatever reason, and have
204*36412Ssklower 		 * only received 6 since our last credit advertisement, we'll
205*36412Ssklower 		 * keep the difference, 4, in this variable.
206*36412Ssklower 		 */
207*36412Ssklower 		int		tps_ack_early[TP_PM_MAX+1];
208*36412Ssklower 		/*
209*36412Ssklower 		 * when we ack, for the # pkts we actually acked w/ this ack,
210*36412Ssklower 		 * how much cdt are we advertising?
211*36412Ssklower 		 * [ size of window acknowledged ] [ cdt we're giving ]
212*36412Ssklower 		 */
213*36412Ssklower 		int		tps_cdt_acked[TP_PM_MAX+1][TP_PM_MAX+1];
214*36412Ssklower 
215*36412Ssklower 		int 	tps_AK_sent;
216*36412Ssklower 		int 	tps_XAK_sent;
217*36412Ssklower 		int 	tps_DT_sent;
218*36412Ssklower 		int 	tps_XPD_sent;
219*36412Ssklower 		int 	tps_AK_rcvd;
220*36412Ssklower 		int 	tps_XAK_rcvd;
221*36412Ssklower 		int 	tps_DT_rcvd;
222*36412Ssklower 		int 	tps_XPD_rcvd;
223*36412Ssklower 
224*36412Ssklower 		int		Nb_from_sess;
225*36412Ssklower 		int		Nb_to_sess;
226*36412Ssklower 		int		Nb_to_ll;
227*36412Ssklower 		int		Nb_from_ll;
228*36412Ssklower };
229*36412Ssklower 
230*36412Ssklower #define  IFPERF(tpcb)  if (tpcb->tp_perf_on &&\
231*36412Ssklower 					(tpcb->tp_p_meas != (struct tp_pmeas *)0 )) {
232*36412Ssklower #define  ENDPERF }
233*36412Ssklower 
234*36412Ssklower #else
235*36412Ssklower 
236*36412Ssklower #define PStat(tpcb, x)  /* no-op */
237*36412Ssklower #define IncPStat(tpcb, x)  /* no-op */
238*36412Ssklower 
239*36412Ssklower #ifndef STAR
240*36412Ssklower #define STAR *
241*36412Ssklower #endif	STAR
242*36412Ssklower #define IFPERF	//*beginning of comment*/STAR
243*36412Ssklower #define ENDPERF		 STAR/*end of comment*//
244*36412Ssklower 
245*36412Ssklower #endif TP_PERF_MEAS
246*36412Ssklower 
247*36412Ssklower #endif __TP_STAT__
248