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