Path: blob/main/contrib/bsnmp/snmp_mibII/mibII_rcvaddr.c
39478 views
/*1* Copyright (c) 2001-20032* Fraunhofer Institute for Open Communication Systems (FhG Fokus).3* All rights reserved.4*5* Author: Harti Brandt <[email protected]>6*7* Redistribution and use in source and binary forms, with or without8* modification, are permitted provided that the following conditions9* are met:10* 1. Redistributions of source code must retain the above copyright11* notice, this list of conditions and the following disclaimer.12* 2. Redistributions in binary form must reproduce the above copyright13* notice, this list of conditions and the following disclaimer in the14* documentation and/or other materials provided with the distribution.15*16* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND17* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE18* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE19* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE20* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL21* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS22* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)23* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT24* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY25* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF26* SUCH DAMAGE.27*28* $Begemot: bsnmp/snmp_mibII/mibII_rcvaddr.c,v 1.9 2004/08/06 08:47:03 brandt Exp $29*30* Interface receive address table.31*/32#include "mibII.h"33#include "mibII_oid.h"3435/*36* find receive address37*/38struct mibrcvaddr *39mib_find_rcvaddr(u_int ifindex, const u_char *addr, size_t addrlen)40{41struct mibrcvaddr *rcv;4243TAILQ_FOREACH(rcv, &mibrcvaddr_list, link)44if (rcv->ifindex == ifindex &&45rcv->addrlen == addrlen &&46memcmp(rcv->addr, addr, addrlen) == 0)47return (rcv);48return (NULL);49}5051/*52* Create receive address53*/54struct mibrcvaddr *55mib_rcvaddr_create(struct mibif *ifp, const u_char *addr, size_t addrlen)56{57struct mibrcvaddr *rcv;58u_int i;5960if (addrlen + OIDLEN_ifRcvAddressEntry + 1 > ASN_MAXOIDLEN)61return (NULL);6263if ((rcv = malloc(sizeof(*rcv))) == NULL)64return (NULL);65rcv->ifindex = ifp->index;66rcv->addrlen = addrlen;67memcpy(rcv->addr, addr, addrlen);68rcv->flags = 0;6970rcv->index.len = addrlen + 2;71rcv->index.subs[0] = ifp->index;72rcv->index.subs[1] = addrlen;73for (i = 0; i < addrlen; i++)74rcv->index.subs[i + 2] = addr[i];7576INSERT_OBJECT_OID(rcv, &mibrcvaddr_list);7778return (rcv);79}8081/*82* Delete a receive address83*/84void85mib_rcvaddr_delete(struct mibrcvaddr *rcv)86{87TAILQ_REMOVE(&mibrcvaddr_list, rcv, link);88free(rcv);89}9091int92op_rcvaddr(struct snmp_context *ctx __unused, struct snmp_value *value,93u_int sub, u_int iidx __unused, enum snmp_op op)94{95struct mibrcvaddr *rcv;9697rcv = NULL; /* make compiler happy */9899switch (op) {100101case SNMP_OP_GETNEXT:102if ((rcv = NEXT_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL)103return (SNMP_ERR_NOSUCHNAME);104index_append(&value->var, sub, &rcv->index);105break;106107case SNMP_OP_GET:108if ((rcv = FIND_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL)109return (SNMP_ERR_NOSUCHNAME);110break;111112case SNMP_OP_SET:113if ((rcv = FIND_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL)114return (SNMP_ERR_NO_CREATION);115return (SNMP_ERR_NOT_WRITEABLE);116117case SNMP_OP_ROLLBACK:118case SNMP_OP_COMMIT:119abort();120}121122switch (value->var.subs[sub - 1]) {123124case LEAF_ifRcvAddressStatus:125value->v.integer = 1;126break;127128case LEAF_ifRcvAddressType:129value->v.integer = (rcv->flags & MIBRCVADDR_VOLATILE) ? 2 : 3;130break;131}132return (SNMP_ERR_NOERROR);133}134135136