/contrib/bsnmp/snmp_mibII/mibII_rcvaddr.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 134 lines · 74 code · 19 blank · 41 comment · 16 complexity · dcfd88c9275637878f1ea54f09e4a6ce MD5 · raw file

  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 and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions
  10. * are met:
  11. * 1. Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. * 2. Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in the
  15. * documentation and/or other materials provided with the distribution.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  18. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20. * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
  21. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  23. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  24. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27. * SUCH DAMAGE.
  28. *
  29. * $Begemot: bsnmp/snmp_mibII/mibII_rcvaddr.c,v 1.9 2004/08/06 08:47:03 brandt Exp $
  30. *
  31. * Interface receive address table.
  32. */
  33. #include "mibII.h"
  34. #include "mibII_oid.h"
  35. /*
  36. * find receive address
  37. */
  38. struct mibrcvaddr *
  39. mib_find_rcvaddr(u_int ifindex, const u_char *addr, size_t addrlen)
  40. {
  41. struct mibrcvaddr *rcv;
  42. TAILQ_FOREACH(rcv, &mibrcvaddr_list, link)
  43. if (rcv->ifindex == ifindex &&
  44. rcv->addrlen == addrlen &&
  45. memcmp(rcv->addr, addr, addrlen) == 0)
  46. return (rcv);
  47. return (NULL);
  48. }
  49. /*
  50. * Create receive address
  51. */
  52. struct mibrcvaddr *
  53. mib_rcvaddr_create(struct mibif *ifp, const u_char *addr, size_t addrlen)
  54. {
  55. struct mibrcvaddr *rcv;
  56. u_int i;
  57. if (addrlen + OIDLEN_ifRcvAddressEntry + 1 > ASN_MAXOIDLEN)
  58. return (NULL);
  59. if ((rcv = malloc(sizeof(*rcv))) == NULL)
  60. return (NULL);
  61. rcv->ifindex = ifp->index;
  62. rcv->addrlen = addrlen;
  63. memcpy(rcv->addr, addr, addrlen);
  64. rcv->flags = 0;
  65. rcv->index.len = addrlen + 2;
  66. rcv->index.subs[0] = ifp->index;
  67. rcv->index.subs[1] = addrlen;
  68. for (i = 0; i < addrlen; i++)
  69. rcv->index.subs[i + 2] = addr[i];
  70. INSERT_OBJECT_OID(rcv, &mibrcvaddr_list);
  71. return (rcv);
  72. }
  73. /*
  74. * Delete a receive address
  75. */
  76. void
  77. mib_rcvaddr_delete(struct mibrcvaddr *rcv)
  78. {
  79. TAILQ_REMOVE(&mibrcvaddr_list, rcv, link);
  80. free(rcv);
  81. }
  82. int
  83. op_rcvaddr(struct snmp_context *ctx __unused, struct snmp_value *value,
  84. u_int sub, u_int iidx __unused, enum snmp_op op)
  85. {
  86. struct mibrcvaddr *rcv;
  87. rcv = NULL; /* make compiler happy */
  88. switch (op) {
  89. case SNMP_OP_GETNEXT:
  90. if ((rcv = NEXT_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL)
  91. return (SNMP_ERR_NOSUCHNAME);
  92. index_append(&value->var, sub, &rcv->index);
  93. break;
  94. case SNMP_OP_GET:
  95. if ((rcv = FIND_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL)
  96. return (SNMP_ERR_NOSUCHNAME);
  97. break;
  98. case SNMP_OP_SET:
  99. if ((rcv = FIND_OBJECT_OID(&mibrcvaddr_list, &value->var, sub)) == NULL)
  100. return (SNMP_ERR_NO_CREATION);
  101. return (SNMP_ERR_NOT_WRITEABLE);
  102. case SNMP_OP_ROLLBACK:
  103. case SNMP_OP_COMMIT:
  104. abort();
  105. }
  106. switch (value->var.subs[sub - 1]) {
  107. case LEAF_ifRcvAddressStatus:
  108. value->v.integer = 1;
  109. break;
  110. case LEAF_ifRcvAddressType:
  111. value->v.integer = (rcv->flags & MIBRCVADDR_VOLATILE) ? 2 : 3;
  112. break;
  113. }
  114. return (SNMP_ERR_NOERROR);
  115. }