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_rcvaddr.c,v 1.7 2003/01/28 13:44:35 hbb Exp $ 34f06ca4afSHartmut Brandt * 35f06ca4afSHartmut Brandt * Interface receive address table. 36f06ca4afSHartmut Brandt */ 37f06ca4afSHartmut Brandt #include "mibII.h" 38f06ca4afSHartmut Brandt #include "mibII_oid.h" 39f06ca4afSHartmut Brandt 40f06ca4afSHartmut Brandt /* 41f06ca4afSHartmut Brandt * find receive address 42f06ca4afSHartmut Brandt */ 43f06ca4afSHartmut Brandt struct mibrcvaddr * 44f06ca4afSHartmut Brandt mib_find_rcvaddr(u_int ifindex, const u_char *addr, size_t addrlen) 45f06ca4afSHartmut Brandt { 46f06ca4afSHartmut Brandt struct mibrcvaddr *rcv; 47f06ca4afSHartmut Brandt 48f06ca4afSHartmut Brandt TAILQ_FOREACH(rcv, &mibrcvaddr_list, link) 49f06ca4afSHartmut Brandt if (rcv->ifindex == ifindex && 50f06ca4afSHartmut Brandt rcv->addrlen == addrlen && 51f06ca4afSHartmut Brandt memcmp(rcv->addr, addr, addrlen) == 0) 52f06ca4afSHartmut Brandt return (rcv); 53f06ca4afSHartmut Brandt return (NULL); 54f06ca4afSHartmut Brandt } 55f06ca4afSHartmut Brandt 56f06ca4afSHartmut Brandt /* 57f06ca4afSHartmut Brandt * Create receive address 58f06ca4afSHartmut Brandt */ 59f06ca4afSHartmut Brandt struct mibrcvaddr * 60f06ca4afSHartmut Brandt mib_rcvaddr_create(struct mibif *ifp, const u_char *addr, size_t addrlen) 61f06ca4afSHartmut Brandt { 62f06ca4afSHartmut Brandt struct mibrcvaddr *rcv; 63f06ca4afSHartmut Brandt u_int i; 64f06ca4afSHartmut Brandt 65f06ca4afSHartmut Brandt if (addrlen + OIDLEN_ifRcvAddressEntry + 1 > ASN_MAXOIDLEN) 66f06ca4afSHartmut Brandt return (NULL); 67f06ca4afSHartmut Brandt 68f06ca4afSHartmut Brandt if ((rcv = malloc(sizeof(*rcv))) == NULL) 69f06ca4afSHartmut Brandt return (NULL); 70f06ca4afSHartmut Brandt rcv->ifindex = ifp->index; 71f06ca4afSHartmut Brandt rcv->addrlen = addrlen; 72f06ca4afSHartmut Brandt memcpy(rcv->addr, addr, addrlen); 73f06ca4afSHartmut Brandt rcv->flags = 0; 74f06ca4afSHartmut Brandt 75f06ca4afSHartmut Brandt rcv->index.len = addrlen + 2; 76f06ca4afSHartmut Brandt rcv->index.subs[0] = ifp->index; 77f06ca4afSHartmut Brandt rcv->index.subs[1] = addrlen; 78f06ca4afSHartmut Brandt for (i = 0; i < addrlen; i++) 79f06ca4afSHartmut Brandt rcv->index.subs[i + 2] = addr[i]; 80f06ca4afSHartmut Brandt 81f06ca4afSHartmut Brandt INSERT_OBJECT_OID(rcv, &mibrcvaddr_list); 82f06ca4afSHartmut Brandt 83f06ca4afSHartmut Brandt return (rcv); 84f06ca4afSHartmut Brandt } 85f06ca4afSHartmut Brandt 86f06ca4afSHartmut Brandt /* 87f06ca4afSHartmut Brandt * Delete a receive address 88f06ca4afSHartmut Brandt */ 89f06ca4afSHartmut Brandt void 90f06ca4afSHartmut Brandt mib_rcvaddr_delete(struct mibrcvaddr *rcv) 91f06ca4afSHartmut Brandt { 92f06ca4afSHartmut Brandt TAILQ_REMOVE(&mibrcvaddr_list, rcv, link); 93f06ca4afSHartmut Brandt free(rcv); 94f06ca4afSHartmut Brandt } 95f06ca4afSHartmut Brandt 96f06ca4afSHartmut Brandt int 97f06ca4afSHartmut Brandt op_rcvaddr(struct snmp_context *ctx __unused, struct snmp_value *value, 98f06ca4afSHartmut Brandt u_int sub, u_int iidx __unused, enum snmp_op op) 99f06ca4afSHartmut Brandt { 100f06ca4afSHartmut Brandt struct mibrcvaddr *rcv; 101f06ca4afSHartmut Brandt 102f06ca4afSHartmut Brandt rcv = NULL; /* make compiler happy */ 103f06ca4afSHartmut Brandt 104f06ca4afSHartmut Brandt switch (op) { 105f06ca4afSHartmut Brandt 106f06ca4afSHartmut Brandt case SNMP_OP_GETNEXT: 107f06ca4afSHartmut Brandt if ((rcv = NEXT_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL) 108f06ca4afSHartmut Brandt return (SNMP_ERR_NOSUCHNAME); 109f06ca4afSHartmut Brandt index_append(&value->var, sub, &rcv->index); 110f06ca4afSHartmut Brandt break; 111f06ca4afSHartmut Brandt 112f06ca4afSHartmut Brandt case SNMP_OP_GET: 113f06ca4afSHartmut Brandt if ((rcv = FIND_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL) 114f06ca4afSHartmut Brandt return (SNMP_ERR_NOSUCHNAME); 115f06ca4afSHartmut Brandt break; 116f06ca4afSHartmut Brandt 117f06ca4afSHartmut Brandt case SNMP_OP_SET: 118f06ca4afSHartmut Brandt if ((rcv = FIND_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL) 119f06ca4afSHartmut Brandt return (SNMP_ERR_NO_CREATION); 120f06ca4afSHartmut Brandt return (SNMP_ERR_NOT_WRITEABLE); 121f06ca4afSHartmut Brandt 122f06ca4afSHartmut Brandt case SNMP_OP_ROLLBACK: 123f06ca4afSHartmut Brandt case SNMP_OP_COMMIT: 124f06ca4afSHartmut Brandt abort(); 125f06ca4afSHartmut Brandt } 126f06ca4afSHartmut Brandt 127f06ca4afSHartmut Brandt switch (value->var.subs[sub - 1]) { 128f06ca4afSHartmut Brandt 129f06ca4afSHartmut Brandt case LEAF_ifRcvAddressStatus: 130f06ca4afSHartmut Brandt value->v.integer = 1; 131f06ca4afSHartmut Brandt break; 132f06ca4afSHartmut Brandt 133f06ca4afSHartmut Brandt case LEAF_ifRcvAddressType: 134f06ca4afSHartmut Brandt value->v.integer = (rcv->flags & MIBRCVADDR_VOLATILE) ? 2 : 3; 135f06ca4afSHartmut Brandt break; 136f06ca4afSHartmut Brandt } 137f06ca4afSHartmut Brandt return (SNMP_ERR_NOERROR); 138f06ca4afSHartmut Brandt } 139