xref: /freebsd/contrib/bsnmp/snmp_mibII/mibII_tcp.c (revision f06ca4af1879f1cb903660d2a12ba7edcf152938)
1f06ca4afSHartmut Brandt /*
2f06ca4afSHartmut Brandt  * Copyright (c) 2001-2003
3f06ca4afSHartmut Brandt  *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4f06ca4afSHartmut Brandt  *	All rights reserved.
5f06ca4afSHartmut Brandt  *
6f06ca4afSHartmut Brandt  * Author: Harti Brandt <harti@freebsd.org>
7f06ca4afSHartmut Brandt  *
8f06ca4afSHartmut Brandt  * Redistribution of this software and documentation and use in source and
9f06ca4afSHartmut Brandt  * binary forms, with or without modification, are permitted provided that
10f06ca4afSHartmut Brandt  * the following conditions are met:
11f06ca4afSHartmut Brandt  *
12f06ca4afSHartmut Brandt  * 1. Redistributions of source code or documentation must retain the above
13f06ca4afSHartmut Brandt  *    copyright notice, this list of conditions and the following disclaimer.
14f06ca4afSHartmut Brandt  * 2. Redistributions in binary form must reproduce the above copyright
15f06ca4afSHartmut Brandt  *    notice, this list of conditions and the following disclaimer in the
16f06ca4afSHartmut Brandt  *    documentation and/or other materials provided with the distribution.
17f06ca4afSHartmut Brandt  * 3. Neither the name of the Institute nor the names of its contributors
18f06ca4afSHartmut Brandt  *    may be used to endorse or promote products derived from this software
19f06ca4afSHartmut Brandt  *    without specific prior written permission.
20f06ca4afSHartmut Brandt  *
21f06ca4afSHartmut Brandt  * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY FRAUNHOFER FOKUS
22f06ca4afSHartmut Brandt  * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
23f06ca4afSHartmut Brandt  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
24f06ca4afSHartmut Brandt  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
25f06ca4afSHartmut Brandt  * FRAUNHOFER FOKUS OR ITS CONTRIBUTORS  BE LIABLE FOR ANY DIRECT, INDIRECT,
26f06ca4afSHartmut Brandt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27f06ca4afSHartmut Brandt  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
28f06ca4afSHartmut Brandt  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29f06ca4afSHartmut Brandt  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30f06ca4afSHartmut Brandt  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
31f06ca4afSHartmut Brandt  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32f06ca4afSHartmut Brandt  *
33f06ca4afSHartmut Brandt  * $Begemot: bsnmp/snmp_mibII/mibII_tcp.c,v 1.4 2003/01/28 13:44:35 hbb Exp $
34f06ca4afSHartmut Brandt  *
35f06ca4afSHartmut Brandt  * tcp
36f06ca4afSHartmut Brandt  */
37f06ca4afSHartmut Brandt #include "mibII.h"
38f06ca4afSHartmut Brandt #include "mibII_oid.h"
39f06ca4afSHartmut Brandt #include <sys/socketvar.h>
40f06ca4afSHartmut Brandt #include <netinet/in_pcb.h>
41f06ca4afSHartmut Brandt #include <netinet/tcp.h>
42f06ca4afSHartmut Brandt #include <netinet/tcp_var.h>
43f06ca4afSHartmut Brandt #include <netinet/tcp_timer.h>
44f06ca4afSHartmut Brandt #include <netinet/tcp_fsm.h>
45f06ca4afSHartmut Brandt 
46f06ca4afSHartmut Brandt struct tcp_index {
47f06ca4afSHartmut Brandt 	struct asn_oid	index;
48f06ca4afSHartmut Brandt 	struct xtcpcb	*tp;
49f06ca4afSHartmut Brandt };
50f06ca4afSHartmut Brandt 
51f06ca4afSHartmut Brandt static u_int32_t tcp_tick;
52f06ca4afSHartmut Brandt static struct tcpstat tcpstat;
53f06ca4afSHartmut Brandt static struct xinpgen *xinpgen;
54f06ca4afSHartmut Brandt static size_t xinpgen_len;
55f06ca4afSHartmut Brandt static u_int tcp_count;
56f06ca4afSHartmut Brandt static u_int tcp_total;
57f06ca4afSHartmut Brandt 
58f06ca4afSHartmut Brandt static u_int oidnum;
59f06ca4afSHartmut Brandt static struct tcp_index *tcpoids;
60f06ca4afSHartmut Brandt 
61f06ca4afSHartmut Brandt static int
62f06ca4afSHartmut Brandt tcp_compare(const void *p1, const void *p2)
63f06ca4afSHartmut Brandt {
64f06ca4afSHartmut Brandt 	const struct tcp_index *t1 = p1;
65f06ca4afSHartmut Brandt 	const struct tcp_index *t2 = p2;
66f06ca4afSHartmut Brandt 
67f06ca4afSHartmut Brandt 	return (asn_compare_oid(&t1->index, &t2->index));
68f06ca4afSHartmut Brandt }
69f06ca4afSHartmut Brandt 
70f06ca4afSHartmut Brandt static int
71f06ca4afSHartmut Brandt fetch_tcp(void)
72f06ca4afSHartmut Brandt {
73f06ca4afSHartmut Brandt 	size_t len;
74f06ca4afSHartmut Brandt 	struct xinpgen *ptr;
75f06ca4afSHartmut Brandt 	struct xtcpcb *tp;
76f06ca4afSHartmut Brandt 	struct tcp_index *oid;
77f06ca4afSHartmut Brandt 	in_addr_t inaddr;
78f06ca4afSHartmut Brandt 
79f06ca4afSHartmut Brandt 	len = sizeof(tcpstat);
80f06ca4afSHartmut Brandt 	if (sysctlbyname("net.inet.tcp.stats", &tcpstat, &len, NULL, 0) == -1) {
81f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.tcp.stats: %m");
82f06ca4afSHartmut Brandt 		return (-1);
83f06ca4afSHartmut Brandt 	}
84f06ca4afSHartmut Brandt 	if (len != sizeof(tcpstat)) {
85f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.tcp.stats: wrong size");
86f06ca4afSHartmut Brandt 		return (-1);
87f06ca4afSHartmut Brandt 	}
88f06ca4afSHartmut Brandt 
89f06ca4afSHartmut Brandt 	len = 0;
90f06ca4afSHartmut Brandt 	if (sysctlbyname("net.inet.tcp.pcblist", NULL, &len, NULL, 0) == -1) {
91f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.tcp.pcblist: %m");
92f06ca4afSHartmut Brandt 		return (-1);
93f06ca4afSHartmut Brandt 	}
94f06ca4afSHartmut Brandt 	if (len > xinpgen_len) {
95f06ca4afSHartmut Brandt 		if ((ptr = realloc(xinpgen, len)) == NULL) {
96f06ca4afSHartmut Brandt 			syslog(LOG_ERR, "%zu: %m", len);
97f06ca4afSHartmut Brandt 			return (-1);
98f06ca4afSHartmut Brandt 		}
99f06ca4afSHartmut Brandt 		xinpgen = ptr;
100f06ca4afSHartmut Brandt 		xinpgen_len = len;
101f06ca4afSHartmut Brandt 	}
102f06ca4afSHartmut Brandt 	if (sysctlbyname("net.inet.tcp.pcblist", xinpgen, &len, NULL, 0) == -1) {
103f06ca4afSHartmut Brandt 		syslog(LOG_ERR, "net.inet.tcp.pcblist: %m");
104f06ca4afSHartmut Brandt 		return (-1);
105f06ca4afSHartmut Brandt 	}
106f06ca4afSHartmut Brandt 
107f06ca4afSHartmut Brandt 	tcp_tick = get_ticks();
108f06ca4afSHartmut Brandt 
109f06ca4afSHartmut Brandt 	tcp_count = 0;
110f06ca4afSHartmut Brandt 	tcp_total = 0;
111f06ca4afSHartmut Brandt 	for (ptr = (struct xinpgen *)(void *)((char *)xinpgen + xinpgen->xig_len);
112f06ca4afSHartmut Brandt 	     ptr->xig_len > sizeof(struct xinpgen);
113f06ca4afSHartmut Brandt              ptr = (struct xinpgen *)(void *)((char *)ptr + ptr->xig_len)) {
114f06ca4afSHartmut Brandt 		tp = (struct xtcpcb *)ptr;
115f06ca4afSHartmut Brandt 		if (tp->xt_inp.inp_gencnt > xinpgen->xig_gen ||
116f06ca4afSHartmut Brandt 		    (tp->xt_inp.inp_vflag & INP_IPV4) == 0)
117f06ca4afSHartmut Brandt 			continue;
118f06ca4afSHartmut Brandt 
119f06ca4afSHartmut Brandt 		tcp_total++;
120f06ca4afSHartmut Brandt 		if (tp->xt_tp.t_state == TCPS_ESTABLISHED ||
121f06ca4afSHartmut Brandt 		    tp->xt_tp.t_state == TCPS_CLOSE_WAIT)
122f06ca4afSHartmut Brandt 			tcp_count++;
123f06ca4afSHartmut Brandt 	}
124f06ca4afSHartmut Brandt 
125f06ca4afSHartmut Brandt 	if (oidnum < tcp_total) {
126f06ca4afSHartmut Brandt 		oid = realloc(tcpoids, tcp_total * sizeof(tcpoids[0]));
127f06ca4afSHartmut Brandt 		if (oid == NULL) {
128f06ca4afSHartmut Brandt 			free(tcpoids);
129f06ca4afSHartmut Brandt 			oidnum = 0;
130f06ca4afSHartmut Brandt 			return (0);
131f06ca4afSHartmut Brandt 		}
132f06ca4afSHartmut Brandt 		tcpoids = oid;
133f06ca4afSHartmut Brandt 		oidnum = tcp_total;
134f06ca4afSHartmut Brandt 	}
135f06ca4afSHartmut Brandt 
136f06ca4afSHartmut Brandt 	oid = tcpoids;
137f06ca4afSHartmut Brandt 	for (ptr = (struct xinpgen *)(void *)((char *)xinpgen + xinpgen->xig_len);
138f06ca4afSHartmut Brandt 	     ptr->xig_len > sizeof(struct xinpgen);
139f06ca4afSHartmut Brandt              ptr = (struct xinpgen *)(void *)((char *)ptr + ptr->xig_len)) {
140f06ca4afSHartmut Brandt 		tp = (struct xtcpcb *)ptr;
141f06ca4afSHartmut Brandt 		if (tp->xt_inp.inp_gencnt > xinpgen->xig_gen ||
142f06ca4afSHartmut Brandt 		    (tp->xt_inp.inp_vflag & INP_IPV4) == 0)
143f06ca4afSHartmut Brandt 			continue;
144f06ca4afSHartmut Brandt 		oid->tp = tp;
145f06ca4afSHartmut Brandt 		oid->index.len = 10;
146f06ca4afSHartmut Brandt 		inaddr = ntohl(tp->xt_inp.inp_laddr.s_addr);
147f06ca4afSHartmut Brandt 		oid->index.subs[0] = (inaddr >> 24) & 0xff;
148f06ca4afSHartmut Brandt 		oid->index.subs[1] = (inaddr >> 16) & 0xff;
149f06ca4afSHartmut Brandt 		oid->index.subs[2] = (inaddr >>  8) & 0xff;
150f06ca4afSHartmut Brandt 		oid->index.subs[3] = (inaddr >>  0) & 0xff;
151f06ca4afSHartmut Brandt 		oid->index.subs[4] = ntohs(tp->xt_inp.inp_lport);
152f06ca4afSHartmut Brandt 		inaddr = ntohl(tp->xt_inp.inp_faddr.s_addr);
153f06ca4afSHartmut Brandt 		oid->index.subs[5] = (inaddr >> 24) & 0xff;
154f06ca4afSHartmut Brandt 		oid->index.subs[6] = (inaddr >> 16) & 0xff;
155f06ca4afSHartmut Brandt 		oid->index.subs[7] = (inaddr >>  8) & 0xff;
156f06ca4afSHartmut Brandt 		oid->index.subs[8] = (inaddr >>  0) & 0xff;
157f06ca4afSHartmut Brandt 		oid->index.subs[9] = ntohs(tp->xt_inp.inp_fport);
158f06ca4afSHartmut Brandt 		oid++;
159f06ca4afSHartmut Brandt 	}
160f06ca4afSHartmut Brandt 
161f06ca4afSHartmut Brandt 	qsort(tcpoids, tcp_total, sizeof(tcpoids[0]), tcp_compare);
162f06ca4afSHartmut Brandt 
163f06ca4afSHartmut Brandt 	return (0);
164f06ca4afSHartmut Brandt }
165f06ca4afSHartmut Brandt 
166f06ca4afSHartmut Brandt /*
167f06ca4afSHartmut Brandt  * Scalars
168f06ca4afSHartmut Brandt  */
169f06ca4afSHartmut Brandt int
170f06ca4afSHartmut Brandt op_tcp(struct snmp_context *ctx __unused, struct snmp_value *value,
171f06ca4afSHartmut Brandt     u_int sub, u_int iidx __unused, enum snmp_op op)
172f06ca4afSHartmut Brandt {
173f06ca4afSHartmut Brandt 	switch (op) {
174f06ca4afSHartmut Brandt 
175f06ca4afSHartmut Brandt 	  case SNMP_OP_GETNEXT:
176f06ca4afSHartmut Brandt 		abort();
177f06ca4afSHartmut Brandt 
178f06ca4afSHartmut Brandt 	  case SNMP_OP_GET:
179f06ca4afSHartmut Brandt 		break;
180f06ca4afSHartmut Brandt 
181f06ca4afSHartmut Brandt 	  case SNMP_OP_SET:
182f06ca4afSHartmut Brandt 		return (SNMP_ERR_NOT_WRITEABLE);
183f06ca4afSHartmut Brandt 
184f06ca4afSHartmut Brandt 	  case SNMP_OP_ROLLBACK:
185f06ca4afSHartmut Brandt 	  case SNMP_OP_COMMIT:
186f06ca4afSHartmut Brandt 		abort();
187f06ca4afSHartmut Brandt 	}
188f06ca4afSHartmut Brandt 
189f06ca4afSHartmut Brandt 	if (tcp_tick < this_tick)
190f06ca4afSHartmut Brandt 		if (fetch_tcp() == -1)
191f06ca4afSHartmut Brandt 			return (SNMP_ERR_GENERR);
192f06ca4afSHartmut Brandt 
193f06ca4afSHartmut Brandt 	switch (value->var.subs[sub - 1]) {
194f06ca4afSHartmut Brandt 
195f06ca4afSHartmut Brandt 	  case LEAF_tcpRtoAlgorithm:
196f06ca4afSHartmut Brandt 		value->v.integer = 4;	/* Van Jacobson */
197f06ca4afSHartmut Brandt 		break;
198f06ca4afSHartmut Brandt 
199f06ca4afSHartmut Brandt #define hz clockinfo.hz
200f06ca4afSHartmut Brandt 
201f06ca4afSHartmut Brandt 	  case LEAF_tcpRtoMin:
202f06ca4afSHartmut Brandt 		value->v.integer = 1000 * TCPTV_MIN / hz;
203f06ca4afSHartmut Brandt 		break;
204f06ca4afSHartmut Brandt 
205f06ca4afSHartmut Brandt 	  case LEAF_tcpRtoMax:
206f06ca4afSHartmut Brandt 		value->v.integer = 1000 * TCPTV_REXMTMAX / hz;
207f06ca4afSHartmut Brandt 		break;
208f06ca4afSHartmut Brandt #undef hz
209f06ca4afSHartmut Brandt 
210f06ca4afSHartmut Brandt 	  case LEAF_tcpMaxConn:
211f06ca4afSHartmut Brandt 		value->v.integer = -1;
212f06ca4afSHartmut Brandt 		break;
213f06ca4afSHartmut Brandt 
214f06ca4afSHartmut Brandt 	  case LEAF_tcpActiveOpens:
215f06ca4afSHartmut Brandt 		value->v.uint32 = tcpstat.tcps_connattempt;
216f06ca4afSHartmut Brandt 		break;
217f06ca4afSHartmut Brandt 
218f06ca4afSHartmut Brandt 	  case LEAF_tcpPassiveOpens:
219f06ca4afSHartmut Brandt 		value->v.uint32 = tcpstat.tcps_accepts;
220f06ca4afSHartmut Brandt 		break;
221f06ca4afSHartmut Brandt 
222f06ca4afSHartmut Brandt 	  case LEAF_tcpAttemptFails:
223f06ca4afSHartmut Brandt 		value->v.uint32 = tcpstat.tcps_conndrops;
224f06ca4afSHartmut Brandt 		break;
225f06ca4afSHartmut Brandt 
226f06ca4afSHartmut Brandt 	  case LEAF_tcpEstabResets:
227f06ca4afSHartmut Brandt 		value->v.uint32 = tcpstat.tcps_drops;
228f06ca4afSHartmut Brandt 		break;
229f06ca4afSHartmut Brandt 
230f06ca4afSHartmut Brandt 	  case LEAF_tcpCurrEstab:
231f06ca4afSHartmut Brandt 		value->v.uint32 = tcp_count;
232f06ca4afSHartmut Brandt 		break;
233f06ca4afSHartmut Brandt 
234f06ca4afSHartmut Brandt 	  case LEAF_tcpInSegs:
235f06ca4afSHartmut Brandt 		value->v.uint32 = tcpstat.tcps_rcvtotal;
236f06ca4afSHartmut Brandt 		break;
237f06ca4afSHartmut Brandt 
238f06ca4afSHartmut Brandt 	  case LEAF_tcpOutSegs:
239f06ca4afSHartmut Brandt 		value->v.uint32 = tcpstat.tcps_sndtotal -
240f06ca4afSHartmut Brandt 		    tcpstat.tcps_sndrexmitpack;
241f06ca4afSHartmut Brandt 		break;
242f06ca4afSHartmut Brandt 
243f06ca4afSHartmut Brandt 	  case LEAF_tcpRetransSegs:
244f06ca4afSHartmut Brandt 		value->v.uint32 = tcpstat.tcps_sndrexmitpack;
245f06ca4afSHartmut Brandt 		break;
246f06ca4afSHartmut Brandt 
247f06ca4afSHartmut Brandt 	  case LEAF_tcpInErrs:
248f06ca4afSHartmut Brandt 		value->v.uint32 = tcpstat.tcps_rcvbadsum +
249f06ca4afSHartmut Brandt 		    tcpstat.tcps_rcvbadoff +
250f06ca4afSHartmut Brandt 		    tcpstat.tcps_rcvshort;
251f06ca4afSHartmut Brandt 		break;
252f06ca4afSHartmut Brandt 	}
253f06ca4afSHartmut Brandt 	return (SNMP_ERR_NOERROR);
254f06ca4afSHartmut Brandt }
255f06ca4afSHartmut Brandt 
256f06ca4afSHartmut Brandt int
257f06ca4afSHartmut Brandt op_tcpconn(struct snmp_context *ctx __unused, struct snmp_value *value,
258f06ca4afSHartmut Brandt     u_int sub, u_int iidx __unused, enum snmp_op op)
259f06ca4afSHartmut Brandt {
260f06ca4afSHartmut Brandt 	u_int i;
261f06ca4afSHartmut Brandt 
262f06ca4afSHartmut Brandt 	if (tcp_tick < this_tick)
263f06ca4afSHartmut Brandt 		if (fetch_tcp() == -1)
264f06ca4afSHartmut Brandt 			return (SNMP_ERR_GENERR);
265f06ca4afSHartmut Brandt 
266f06ca4afSHartmut Brandt 	switch (op) {
267f06ca4afSHartmut Brandt 
268f06ca4afSHartmut Brandt 	  case SNMP_OP_GETNEXT:
269f06ca4afSHartmut Brandt 		for (i = 0; i < tcp_total; i++)
270f06ca4afSHartmut Brandt 			if (index_compare(&value->var, sub, &tcpoids[i].index) < 0)
271f06ca4afSHartmut Brandt 				break;
272f06ca4afSHartmut Brandt 		if (i == tcp_total)
273f06ca4afSHartmut Brandt 			return (SNMP_ERR_NOSUCHNAME);
274f06ca4afSHartmut Brandt 		index_append(&value->var, sub, &tcpoids[i].index);
275f06ca4afSHartmut Brandt 		break;
276f06ca4afSHartmut Brandt 
277f06ca4afSHartmut Brandt 	  case SNMP_OP_GET:
278f06ca4afSHartmut Brandt 		for (i = 0; i < tcp_total; i++)
279f06ca4afSHartmut Brandt 			if (index_compare(&value->var, sub, &tcpoids[i].index) == 0)
280f06ca4afSHartmut Brandt 				break;
281f06ca4afSHartmut Brandt 		if (i == tcp_total)
282f06ca4afSHartmut Brandt 			return (SNMP_ERR_NOSUCHNAME);
283f06ca4afSHartmut Brandt 		break;
284f06ca4afSHartmut Brandt 
285f06ca4afSHartmut Brandt 	  case SNMP_OP_SET:
286f06ca4afSHartmut Brandt 		return (SNMP_ERR_NOT_WRITEABLE);
287f06ca4afSHartmut Brandt 
288f06ca4afSHartmut Brandt 	  case SNMP_OP_ROLLBACK:
289f06ca4afSHartmut Brandt 	  case SNMP_OP_COMMIT:
290f06ca4afSHartmut Brandt 	  default:
291f06ca4afSHartmut Brandt 		abort();
292f06ca4afSHartmut Brandt 	}
293f06ca4afSHartmut Brandt 
294f06ca4afSHartmut Brandt 	switch (value->var.subs[sub - 1]) {
295f06ca4afSHartmut Brandt 
296f06ca4afSHartmut Brandt 	  case LEAF_tcpConnState:
297f06ca4afSHartmut Brandt 		switch (tcpoids[i].tp->xt_tp.t_state) {
298f06ca4afSHartmut Brandt 
299f06ca4afSHartmut Brandt 		  case TCPS_CLOSED:
300f06ca4afSHartmut Brandt 			value->v.integer = 1;
301f06ca4afSHartmut Brandt 			break;
302f06ca4afSHartmut Brandt 		  case TCPS_LISTEN:
303f06ca4afSHartmut Brandt 			value->v.integer = 2;
304f06ca4afSHartmut Brandt 			break;
305f06ca4afSHartmut Brandt 		  case TCPS_SYN_SENT:
306f06ca4afSHartmut Brandt 			value->v.integer = 3;
307f06ca4afSHartmut Brandt 			break;
308f06ca4afSHartmut Brandt 		  case TCPS_SYN_RECEIVED:
309f06ca4afSHartmut Brandt 			value->v.integer = 4;
310f06ca4afSHartmut Brandt 			break;
311f06ca4afSHartmut Brandt 		  case TCPS_ESTABLISHED:
312f06ca4afSHartmut Brandt 			value->v.integer = 5;
313f06ca4afSHartmut Brandt 			break;
314f06ca4afSHartmut Brandt 		  case TCPS_CLOSE_WAIT:
315f06ca4afSHartmut Brandt 			value->v.integer = 8;
316f06ca4afSHartmut Brandt 			break;
317f06ca4afSHartmut Brandt 		  case TCPS_FIN_WAIT_1:
318f06ca4afSHartmut Brandt 			value->v.integer = 6;
319f06ca4afSHartmut Brandt 			break;
320f06ca4afSHartmut Brandt 		  case TCPS_CLOSING:
321f06ca4afSHartmut Brandt 			value->v.integer = 10;
322f06ca4afSHartmut Brandt 			break;
323f06ca4afSHartmut Brandt 		  case TCPS_LAST_ACK:
324f06ca4afSHartmut Brandt 			value->v.integer = 9;
325f06ca4afSHartmut Brandt 			break;
326f06ca4afSHartmut Brandt 		  case TCPS_FIN_WAIT_2:
327f06ca4afSHartmut Brandt 			value->v.integer = 7;
328f06ca4afSHartmut Brandt 			break;
329f06ca4afSHartmut Brandt 		  case TCPS_TIME_WAIT:
330f06ca4afSHartmut Brandt 			value->v.integer = 11;
331f06ca4afSHartmut Brandt 			break;
332f06ca4afSHartmut Brandt 		  default:
333f06ca4afSHartmut Brandt 			value->v.integer = 0;
334f06ca4afSHartmut Brandt 			break;
335f06ca4afSHartmut Brandt 		}
336f06ca4afSHartmut Brandt 		break;
337f06ca4afSHartmut Brandt 
338f06ca4afSHartmut Brandt 	  case LEAF_tcpConnLocalAddress:
339f06ca4afSHartmut Brandt 		value->v.ipaddress[0] = tcpoids[i].index.subs[0];
340f06ca4afSHartmut Brandt 		value->v.ipaddress[1] = tcpoids[i].index.subs[1];
341f06ca4afSHartmut Brandt 		value->v.ipaddress[2] = tcpoids[i].index.subs[2];
342f06ca4afSHartmut Brandt 		value->v.ipaddress[3] = tcpoids[i].index.subs[3];
343f06ca4afSHartmut Brandt 		break;
344f06ca4afSHartmut Brandt 
345f06ca4afSHartmut Brandt 	  case LEAF_tcpConnLocalPort:
346f06ca4afSHartmut Brandt 		value->v.integer = tcpoids[i].index.subs[4];
347f06ca4afSHartmut Brandt 		break;
348f06ca4afSHartmut Brandt 
349f06ca4afSHartmut Brandt 	  case LEAF_tcpConnRemAddress:
350f06ca4afSHartmut Brandt 		value->v.ipaddress[0] = tcpoids[i].index.subs[5];
351f06ca4afSHartmut Brandt 		value->v.ipaddress[1] = tcpoids[i].index.subs[6];
352f06ca4afSHartmut Brandt 		value->v.ipaddress[2] = tcpoids[i].index.subs[7];
353f06ca4afSHartmut Brandt 		value->v.ipaddress[3] = tcpoids[i].index.subs[8];
354f06ca4afSHartmut Brandt 		break;
355f06ca4afSHartmut Brandt 
356f06ca4afSHartmut Brandt 	  case LEAF_tcpConnRemPort:
357f06ca4afSHartmut Brandt 		value->v.integer = tcpoids[i].index.subs[9];
358f06ca4afSHartmut Brandt 		break;
359f06ca4afSHartmut Brandt 	}
360f06ca4afSHartmut Brandt 	return (SNMP_ERR_NOERROR);
361f06ca4afSHartmut Brandt }
362