1 /* 2 * Copyright (c) 2001-2003 3 * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4 * All rights reserved. 5 * 6 * Author: Harti Brandt <harti@freebsd.org> 7 * 8 * Redistribution of this software and documentation and use in source and 9 * binary forms, with or without modification, are permitted provided that 10 * the following conditions are met: 11 * 12 * 1. Redistributions of source code or documentation must retain the above 13 * copyright notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of the Institute nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY FRAUNHOFER FOKUS 22 * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 23 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 24 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 25 * FRAUNHOFER FOKUS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 28 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 31 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 * 33 * $Begemot: bsnmp/snmp_mibII/mibII_rcvaddr.c,v 1.8 2003/12/03 10:01:19 hbb Exp $ 34 * 35 * Interface receive address table. 36 */ 37 #include "mibII.h" 38 #include "mibII_oid.h" 39 40 /* 41 * find receive address 42 */ 43 struct mibrcvaddr * 44 mib_find_rcvaddr(u_int ifindex, const u_char *addr, size_t addrlen) 45 { 46 struct mibrcvaddr *rcv; 47 48 TAILQ_FOREACH(rcv, &mibrcvaddr_list, link) 49 if (rcv->ifindex == ifindex && 50 rcv->addrlen == addrlen && 51 memcmp(rcv->addr, addr, addrlen) == 0) 52 return (rcv); 53 return (NULL); 54 } 55 56 /* 57 * Create receive address 58 */ 59 struct mibrcvaddr * 60 mib_rcvaddr_create(struct mibif *ifp, const u_char *addr, size_t addrlen) 61 { 62 struct mibrcvaddr *rcv; 63 u_int i; 64 65 if (addrlen + OIDLEN_ifRcvAddressEntry + 1 > ASN_MAXOIDLEN) 66 return (NULL); 67 68 if ((rcv = malloc(sizeof(*rcv))) == NULL) 69 return (NULL); 70 rcv->ifindex = ifp->index; 71 rcv->addrlen = addrlen; 72 memcpy(rcv->addr, addr, addrlen); 73 rcv->flags = 0; 74 75 rcv->index.len = addrlen + 2; 76 rcv->index.subs[0] = ifp->index; 77 rcv->index.subs[1] = addrlen; 78 for (i = 0; i < addrlen; i++) 79 rcv->index.subs[i + 2] = addr[i]; 80 81 INSERT_OBJECT_OID(rcv, &mibrcvaddr_list); 82 83 return (rcv); 84 } 85 86 /* 87 * Delete a receive address 88 */ 89 void 90 mib_rcvaddr_delete(struct mibrcvaddr *rcv) 91 { 92 TAILQ_REMOVE(&mibrcvaddr_list, rcv, link); 93 free(rcv); 94 } 95 96 int 97 op_rcvaddr(struct snmp_context *ctx __unused, struct snmp_value *value, 98 u_int sub, u_int iidx __unused, enum snmp_op op) 99 { 100 struct mibrcvaddr *rcv; 101 102 rcv = NULL; /* make compiler happy */ 103 104 switch (op) { 105 106 case SNMP_OP_GETNEXT: 107 if ((rcv = NEXT_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL) 108 return (SNMP_ERR_NOSUCHNAME); 109 index_append(&value->var, sub, &rcv->index); 110 break; 111 112 case SNMP_OP_GET: 113 if ((rcv = FIND_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL) 114 return (SNMP_ERR_NOSUCHNAME); 115 break; 116 117 case SNMP_OP_SET: 118 if ((rcv = FIND_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL) 119 return (SNMP_ERR_NO_CREATION); 120 return (SNMP_ERR_NOT_WRITEABLE); 121 122 case SNMP_OP_ROLLBACK: 123 case SNMP_OP_COMMIT: 124 abort(); 125 } 126 127 switch (value->var.subs[sub - 1]) { 128 129 case LEAF_ifRcvAddressStatus: 130 value->v.integer = 1; 131 break; 132 133 case LEAF_ifRcvAddressType: 134 value->v.integer = (rcv->flags & MIBRCVADDR_VOLATILE) ? 2 : 3; 135 break; 136 } 137 return (SNMP_ERR_NOERROR); 138 } 139