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