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