mib2if.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /*
  2. * Copyright 2007 by egnite Software GmbH
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. * 3. Neither the name of the copyright holders nor the names of
  14. * contributors may be used to endorse or promote products derived
  15. * from this software without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  18. * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  19. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  20. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  21. * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  22. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  23. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  24. * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  25. * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  26. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
  27. * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  28. * SUCH DAMAGE.
  29. *
  30. * For additional information see http://www.ethernut.de/
  31. */
  32. #include <sys/confnet.h>
  33. #include <pro/snmp.h>
  34. #include <pro/snmp_api.h>
  35. #include <stdlib.h>
  36. #include <string.h>
  37. #include "mib2if.h"
  38. #define MIB_IF_ENTRIES 4
  39. #if defined(ETHERNUT1) || defined(XNUT_100) || defined(XNUT_105) || defined(CHARON2)
  40. #define PHY_NAME "RTL8019AS 10 Mbit Ethernet"
  41. #elif defined(ETHERNUT2) || defined(INTECH21)
  42. #define PHY_NAME "LAN91C111 100Mbit Ethernet"
  43. #elif defined(ETHERNUT3)
  44. #define PHY_NAME "DM9000E 100Mbit Ethernet"
  45. #elif defined(AT91SAM7X_EK) || defined(AT91SAM9260_EK)
  46. #define PHY_NAME "DM9161A 100Mbit Ethernet"
  47. #elif defined(ETHERNUT5)
  48. #define PHY_NAME "LAN8700I 100Mbit Ethernet"
  49. #else
  50. #define PHY_NAME "Ethernet"
  51. #endif
  52. static uint8_t *MibVarsIfGet(const SNMPVAR *, OID *, size_t *, int, size_t *, WMETHOD **);
  53. #define MAG_IF_NUMBER 0
  54. #define MAG_IF_INDEX 1
  55. #define MAG_IF_DESCR 2
  56. #define MAG_IF_TYPE 3
  57. #define MAG_IF_MTU 4
  58. #define MAG_IF_SPEED 5
  59. #define MAG_IF_PHYSADDRESS 6
  60. #define MAG_IF_ADMINSTATUS 7
  61. #define MAG_IF_OPERSTATUS 8
  62. #define MAG_IF_LASTCHANGE 9
  63. #define MAG_IF_INOCTETS 10
  64. #define MAG_IF_INUCASTPKTS 11
  65. #define MAG_IF_INNUCASTPKTS 12
  66. #define MAG_IF_INDISCARDS 13
  67. #define MAG_IF_INERRORS 14
  68. #define MAG_IF_INUNKNOWNPROTOS 15
  69. #define MAG_IF_OUTOCTETS 16
  70. #define MAG_IF_OUTUCASTPKTS 17
  71. #define MAG_IF_OUTNUCASTPKTS 18
  72. #define MAG_IF_OUTDISCARDS 19
  73. #define MAG_IF_OUTERRORS 20
  74. #define MAG_IF_OUTQLEN 21
  75. #define MAG_IF_SPECIFIC 22
  76. static OID base_oid[] = { SNMP_OID_MIB2, 2 };
  77. static size_t base_oidlen = sizeof(base_oid) / sizeof(OID);
  78. static SNMPVAR mib_variables[] = {
  79. {MAG_IF_NUMBER, ASN_INTEGER, ACL_RONLY, MibVarsIfGet, 1, {1}},
  80. {MAG_IF_INDEX, ASN_INTEGER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 1}},
  81. {MAG_IF_DESCR, ASN_OCTET_STR, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 2}},
  82. {MAG_IF_TYPE, ASN_INTEGER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 3}},
  83. {MAG_IF_MTU, ASN_INTEGER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 4}},
  84. {MAG_IF_SPEED, ASN_GAUGE, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 5}},
  85. {MAG_IF_PHYSADDRESS, ASN_OCTET_STR, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 6}},
  86. {MAG_IF_ADMINSTATUS, ASN_INTEGER, ACL_RWRITE, MibVarsIfGet, 3, {2, 1, 7}},
  87. {MAG_IF_OPERSTATUS, ASN_INTEGER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 8}},
  88. {MAG_IF_LASTCHANGE, ASN_TIMETICKS, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 9}},
  89. {MAG_IF_INOCTETS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 10}},
  90. {MAG_IF_INUCASTPKTS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 11}},
  91. {MAG_IF_INNUCASTPKTS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 12}},
  92. {MAG_IF_INDISCARDS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 13}},
  93. {MAG_IF_INERRORS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 14}},
  94. {MAG_IF_INUNKNOWNPROTOS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 15}},
  95. {MAG_IF_OUTOCTETS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 16}},
  96. {MAG_IF_OUTUCASTPKTS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 17}},
  97. {MAG_IF_OUTNUCASTPKTS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 18}},
  98. {MAG_IF_OUTDISCARDS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 19}},
  99. {MAG_IF_OUTERRORS, ASN_COUNTER, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 20}},
  100. {MAG_IF_OUTQLEN, ASN_GAUGE, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 21}},
  101. {MAG_IF_SPECIFIC, ASN_OBJECT_ID, ACL_RONLY, MibVarsIfGet, 3, {2, 1, 22}}
  102. };
  103. static long if_number;
  104. static long if_type;
  105. static long if_mtu;
  106. static uint32_t if_speed;
  107. static long if_index;
  108. static char *if_descr;
  109. static OID if_specific[] = { 0, 0 };
  110. static long if_admin_status[MIB_IF_ENTRIES];
  111. /*!
  112. * \brief Register MIB II variables of the interfaces.
  113. *
  114. * \note Preliminary code with hard coded values.
  115. */
  116. int MibRegisterIfVars(void)
  117. {
  118. int i;
  119. if_number = 1;
  120. for (i = 0; i < if_number; i++) {
  121. if_admin_status[i] = 1;
  122. }
  123. if_type = 6;
  124. if_mtu = 1500;
  125. if_speed = 100000000UL;
  126. if_index = 1;
  127. if ((if_descr = malloc(strlen(PHY_NAME) + 1)) != NULL) {
  128. strcpy(if_descr, PHY_NAME);
  129. }
  130. return SnmpMibRegister(base_oid, base_oidlen, mib_variables, sizeof(mib_variables) / sizeof(SNMPVAR));
  131. }
  132. static int MibVarsIfSet(int action, uint8_t * var_val, uint8_t var_val_type, size_t var_val_len, OID * name, size_t name_len)
  133. {
  134. size_t bigsize = 1000;
  135. uint32_t value = 0;
  136. if (action != SNMP_ACT_COMMIT) {
  137. return 0;
  138. }
  139. switch (name[9]) {
  140. case 7:
  141. if (var_val_type != ASN_INTEGER)
  142. return SNMP_ERR_WRONGTYPE;
  143. if (var_val_len > sizeof(uint32_t))
  144. return SNMP_ERR_WRONGLENGTH;
  145. AsnUnsignedParse(var_val, &bigsize, &var_val_type, &value);
  146. if (name[10] > 0 && name[10] < MIB_IF_ENTRIES) {
  147. if_admin_status[name[10] - 1] = value;
  148. }
  149. break;
  150. }
  151. return 0;
  152. }
  153. static uint8_t *MibVarsIfGet(const SNMPVAR * vp, OID * name, size_t * namelen, int exact, size_t * varlen, WMETHOD ** wmethod)
  154. {
  155. int rc;
  156. int ifc = 0;
  157. OID index = 0;
  158. static long zero = 0;
  159. OID *fullname;
  160. size_t fullnamelen = base_oidlen + vp->var_namelen + 1;
  161. fullname = malloc(fullnamelen * sizeof(OID));
  162. memcpy(fullname, base_oid, base_oidlen * sizeof(OID));
  163. memcpy(fullname + base_oidlen, vp->var_name, vp->var_namelen * sizeof(OID));
  164. if (vp->var_magic == MAG_IF_NUMBER) {
  165. /* Determine the number of interfaces. */
  166. *(fullname + fullnamelen - 1) = index;
  167. rc = SnmpOidCmp(name, *namelen, fullname, fullnamelen);
  168. if ((exact && rc) || (!exact && rc >= 0)) {
  169. free(fullname);
  170. return NULL;
  171. }
  172. } else {
  173. /* Determine the interface number. */
  174. for (; ifc < if_number; ifc++) {
  175. *(fullname + fullnamelen - 1) = ifc + 1;
  176. rc = SnmpOidCmp(name, *namelen, fullname, fullnamelen);
  177. if ((exact && rc == 0) || (!exact && rc < 0)) {
  178. index = ifc + 1;
  179. break;
  180. }
  181. }
  182. if (index == 0) {
  183. free(fullname);
  184. return NULL;
  185. }
  186. }
  187. memcpy(name, fullname, fullnamelen * sizeof(OID));
  188. free(fullname);
  189. *namelen = fullnamelen;
  190. *wmethod = NULL;
  191. *varlen = sizeof(long);
  192. switch (vp->var_magic) {
  193. case MAG_IF_NUMBER:
  194. return (uint8_t *) & if_number;
  195. case MAG_IF_INDEX:
  196. return (uint8_t *) & if_index;
  197. case MAG_IF_DESCR:
  198. *varlen = strlen(if_descr);
  199. return (uint8_t *) if_descr;
  200. case MAG_IF_TYPE:
  201. return (uint8_t *) & if_type;
  202. case MAG_IF_MTU:
  203. return (uint8_t *) & if_mtu;
  204. case MAG_IF_SPEED:
  205. return (uint8_t *) & if_speed;
  206. case MAG_IF_PHYSADDRESS:
  207. *varlen = 6;
  208. return confnet.cdn_mac;
  209. case MAG_IF_ADMINSTATUS:
  210. case MAG_IF_OPERSTATUS:
  211. *wmethod = MibVarsIfSet;
  212. return (uint8_t *) & if_admin_status[ifc];
  213. case MAG_IF_LASTCHANGE:
  214. case MAG_IF_INOCTETS:
  215. case MAG_IF_INUCASTPKTS:
  216. case MAG_IF_INNUCASTPKTS:
  217. case MAG_IF_INDISCARDS:
  218. case MAG_IF_INERRORS:
  219. case MAG_IF_INUNKNOWNPROTOS:
  220. case MAG_IF_OUTOCTETS:
  221. case MAG_IF_OUTUCASTPKTS:
  222. case MAG_IF_OUTNUCASTPKTS:
  223. case MAG_IF_OUTDISCARDS:
  224. case MAG_IF_OUTERRORS:
  225. case MAG_IF_OUTQLEN:
  226. return (uint8_t *) & zero;
  227. case MAG_IF_SPECIFIC:
  228. *varlen = sizeof(if_specific);
  229. return (uint8_t *) if_specific;
  230. }
  231. return NULL;
  232. }