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