PageRenderTime 59ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/agent/mibgroup/mibII/icmp.c

https://bitbucket.org/dnelson/net-snmp
C | 1667 lines | 1444 code | 150 blank | 73 comment | 89 complexity | 761f127dfee06dd26021ac59fc904bab MD5 | raw file
Possible License(s): BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. * ICMP MIB group implementation - icmp.c
  3. */
  4. #include <net-snmp/net-snmp-config.h>
  5. #include "mibII_common.h"
  6. #if HAVE_NETINET_IP_ICMP_H
  7. #include <netinet/ip_icmp.h>
  8. #endif
  9. #ifdef NETSNMP_ENABLE_IPV6
  10. #if HAVE_NETINET_ICMP6_H
  11. #include <netinet/icmp6.h>
  12. #endif
  13. #endif /* NETSNMP_ENABLE_IPV6 */
  14. #if HAVE_NETINET_ICMP_VAR_H
  15. #include <netinet/icmp_var.h>
  16. #endif
  17. #include <net-snmp/net-snmp-includes.h>
  18. #include <net-snmp/agent/net-snmp-agent-includes.h>
  19. #include <net-snmp/agent/auto_nlist.h>
  20. #include <net-snmp/agent/cache_handler.h>
  21. #include <net-snmp/agent/scalar_group.h>
  22. #include <net-snmp/agent/sysORTable.h>
  23. #include "util_funcs/MIB_STATS_CACHE_TIMEOUT.h"
  24. #include "icmp.h"
  25. #ifndef MIB_STATS_CACHE_TIMEOUT
  26. #define MIB_STATS_CACHE_TIMEOUT 5
  27. #endif
  28. #ifndef ICMP_STATS_CACHE_TIMEOUT
  29. #define ICMP_STATS_CACHE_TIMEOUT MIB_STATS_CACHE_TIMEOUT
  30. #endif
  31. /* redefine ICMP6 message types from glibc < 2.4 to newer names */
  32. #ifndef MLD_LISTENER_QUERY
  33. #define MLD_LISTENER_QUERY ICMP6_MEMBERSHIP_QUERY
  34. #define MLD_LISTENER_REPORT ICMP6_MEMBERSHIP_REPORT
  35. #define MLD_LISTENER_REDUCTION ICMP6_MEMBERSHIP_REDUCTION
  36. #endif /* ICMP6_MEMBERSHIP_QUERY */
  37. #if defined(HAVE_LIBPERFSTAT_H) && (defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)) && !defined(FIRST_PROTOCOL)
  38. #ifdef HAVE_SYS_PROTOSW_H
  39. #include <sys/protosw.h>
  40. #endif
  41. #include <libperfstat.h>
  42. #ifdef FIRST_PROTOCOL
  43. perfstat_protocol_t ps_proto;
  44. perfstat_id_t ps_name;
  45. #define _USE_PERFSTAT_PROTOCOL 1
  46. #endif
  47. #endif
  48. /*********************
  49. *
  50. * Kernel & interface information,
  51. * and internal forward declarations
  52. *
  53. *********************/
  54. /*********************
  55. *
  56. * Initialisation & common implementation functions
  57. *
  58. *********************/
  59. #ifdef hpux11
  60. #define ICMP_STAT_STRUCTURE int
  61. #endif
  62. #ifdef linux
  63. #define ICMP_STAT_STRUCTURE struct icmp_mib
  64. #define USES_SNMP_DESIGNED_ICMPSTAT
  65. #undef ICMPSTAT_SYMBOL
  66. #endif
  67. #ifdef solaris2
  68. #define USES_SNMP_DESIGNED_ICMPSTAT
  69. #define ICMP_STAT_STRUCTURE mib2_icmp_t
  70. #include "kernel_mib.h"
  71. static int
  72. solaris_read_icmp_stat(ICMP_STAT_STRUCTURE *);
  73. static int
  74. solaris_read_icmp_msg_stat(ICMP_STAT_STRUCTURE *, struct icmp4_msg_mib *, int *);
  75. #ifdef NETSNMP_ENABLE_IPV6
  76. static int
  77. solaris_read_icmp6_stat(struct icmp6_mib *);
  78. static int
  79. solaris_read_icmp6_msg_stat(struct icmp6_mib *, struct icmp6_msg_mib *, int *);
  80. #endif
  81. #endif
  82. #ifdef NETBSD_STATS_VIA_SYSCTL
  83. #define ICMP_STAT_STRUCTURE struct icmp_mib
  84. #define USES_SNMP_DESIGNED_ICMPSTAT
  85. #undef ICMP_NSTATS
  86. #endif
  87. #ifdef HAVE_IPHLPAPI_H
  88. #include <iphlpapi.h>
  89. #define ICMP_STAT_STRUCTURE MIB_ICMP
  90. #endif
  91. #if (defined(NETSNMP_CAN_USE_SYSCTL) && defined(ICMPCTL_STATS))
  92. #define ICMP_STAT_STRUCTURE struct icmp_mib
  93. #define USES_SNMP_DESIGNED_ICMPSTAT
  94. #undef ICMPSTAT_SYMBOL
  95. #endif
  96. #ifdef HAVE_SYS_ICMPIPSTATS_H
  97. /* or #ifdef HAVE_SYS_TCPIPSTATS_H ??? */
  98. #define ICMP_STAT_STRUCTURE struct kna
  99. #define USES_TRADITIONAL_ICMPSTAT
  100. #endif
  101. #if !defined(ICMP_STAT_STRUCTURE)
  102. #define ICMP_STAT_STRUCTURE struct icmpstat
  103. #define USES_TRADITIONAL_ICMPSTAT
  104. #endif
  105. ICMP_STAT_STRUCTURE icmpstat;
  106. #if defined(solaris2) && defined(NETSNMP_ENABLE_IPV6)
  107. static struct icmp6_mib icmp6stat;
  108. #endif
  109. /* If they just all agreed ... */
  110. #ifndef ICMP_DEST_UNREACH
  111. #define ICMP_DEST_UNREACH ICMP_UNREACH
  112. #endif
  113. #ifndef ICMP_SOURCE_QUENCH
  114. #define ICMP_SOURCE_QUENCH ICMP_SOURCEQUENCH
  115. #endif
  116. #ifndef ICMP_TIME_EXCEEDED
  117. #define ICMP_TIME_EXCEEDED ICMP_TIMXCEED
  118. #endif
  119. #ifndef ICMP_PARAMETERPROB
  120. #define ICMP_PARAMETERPROB ICMP_PARAMPROB
  121. #endif
  122. #ifndef ICMP_TIMESTAMP
  123. #define ICMP_TIMESTAMP ICMP_TSTAMP
  124. #endif
  125. #ifndef ICMP_TIMESTAMPREPLY
  126. #define ICMP_TIMESTAMPREPLY ICMP_TSTAMPREPLY
  127. #endif
  128. #ifndef ICMP_ADDRESS
  129. #define ICMP_ADDRESS ICMP_MASKREQ
  130. #endif
  131. #ifndef ICMP_ADDRESSREPLY
  132. #define ICMP_ADDRESSREPLY ICMP_MASKREPLY
  133. #endif
  134. #ifndef MLD_LISTENER_REDUCTION
  135. #define MLD_LISTENER_REDUCTION MLD_LISTENER_DONE
  136. #endif
  137. /*
  138. * Define the OID pointer to the top of the mib tree that we're
  139. * registering underneath
  140. */
  141. static const oid icmp_oid[] = { SNMP_OID_MIB2, 5 };
  142. static const oid icmp_stats_tbl_oid[] = { SNMP_OID_MIB2, 5, 29 };
  143. static const oid icmp_msg_stats_tbl_oid[] = { SNMP_OID_MIB2, 5, 30 };
  144. #ifdef USING_MIBII_IP_MODULE
  145. extern oid ip_module_oid[];
  146. extern int ip_module_oid_len;
  147. extern int ip_module_count;
  148. #endif
  149. #ifdef USES_SNMP_DESIGNED_ICMPSTAT
  150. struct icmp_stats_table_entry {
  151. uint32_t ipVer;
  152. uint32_t icmpStatsInMsgs;
  153. uint32_t icmpStatsInErrors;
  154. uint32_t icmpStatsOutMsgs;
  155. uint32_t icmpStatsOutErrors;
  156. };
  157. struct icmp_stats_table_entry icmp_stats_table[2];
  158. #define ICMP_MSG_STATS_HAS_IN 1
  159. #define ICMP_MSG_STATS_HAS_OUT 2
  160. struct icmp_msg_stats_table_entry {
  161. uint32_t ipVer;
  162. uint32_t icmpMsgStatsType;
  163. uint32_t icmpMsgStatsInPkts;
  164. uint32_t icmpMsgStatsOutPkts;
  165. int flags;
  166. };
  167. #ifdef linux
  168. /* Linux keeps track of all possible message types */
  169. #define ICMP_MSG_STATS_IPV4_COUNT 256
  170. #else
  171. #define ICMP_MSG_STATS_IPV4_COUNT 11
  172. #endif
  173. #ifdef NETSNMP_ENABLE_IPV6
  174. #ifdef linux
  175. /* Linux keeps track of all possible message types */
  176. #define ICMP_MSG_STATS_IPV6_COUNT 256
  177. #else
  178. #define ICMP_MSG_STATS_IPV6_COUNT 14
  179. #endif
  180. #else
  181. #define ICMP_MSG_STATS_IPV6_COUNT 0
  182. #endif /* NETSNMP_ENABLE_IPV6 */
  183. struct icmp_msg_stats_table_entry icmp_msg_stats_table[ICMP_MSG_STATS_IPV4_COUNT + ICMP_MSG_STATS_IPV6_COUNT];
  184. int
  185. icmp_stats_load(netsnmp_cache *cache, void *vmagic)
  186. {
  187. /*
  188. * note don't bother using the passed in cache
  189. * and vmagic pointers. They are useless as they
  190. * currently point to the icmp system stats cache
  191. * since I see little point in registering another
  192. * cache for this table. Its not really needed
  193. */
  194. int i;
  195. ICMP_STAT_STRUCTURE v4icmp;
  196. #ifdef NETSNMP_ENABLE_IPV6
  197. struct icmp6_mib v6icmp;
  198. #endif
  199. for(i = 0; i < 2; i++) {
  200. switch(i) {
  201. case 0:
  202. #ifdef linux
  203. linux_read_icmp_stat(&v4icmp);
  204. #elif defined(NETBSD_STATS_VIA_SYSCTL)
  205. netbsd_read_icmp_stat(&v4icmp);
  206. #elif (defined(NETSNMP_CAN_USE_SYSCTL) && defined(ICMPCTL_STATS))
  207. sysctl_read_icmp_stat(&v4icmp);
  208. #elif defined(solaris2)
  209. solaris_read_icmp_stat(&v4icmp);
  210. #else
  211. return -1;
  212. #endif
  213. icmp_stats_table[i].icmpStatsInMsgs = v4icmp.icmpInMsgs;
  214. icmp_stats_table[i].icmpStatsInErrors = v4icmp.icmpInErrors;
  215. icmp_stats_table[i].icmpStatsOutMsgs = v4icmp.icmpOutMsgs;
  216. icmp_stats_table[i].icmpStatsOutErrors = v4icmp.icmpOutErrors;
  217. break;
  218. case 1:
  219. #ifdef NETSNMP_ENABLE_IPV6
  220. memset(&icmp_stats_table[i],0,
  221. sizeof(struct icmp_stats_table_entry));
  222. #ifdef linux
  223. linux_read_icmp6_stat(&v6icmp);
  224. #elif defined(NETBSD_STATS_VIA_SYSCTL)
  225. netbsd_read_icmp6_stat(&v6icmp);
  226. #elif (defined(NETSNMP_CAN_USE_SYSCTL) && defined(ICMPCTL_STATS))
  227. sysctl_read_icmp6_stat(&v6icmp);
  228. #elif defined(solaris2)
  229. solaris_read_icmp6_stat(&v6icmp);
  230. #else
  231. return -1;
  232. #endif
  233. icmp_stats_table[i].icmpStatsInMsgs = v6icmp.icmp6InMsgs;
  234. icmp_stats_table[i].icmpStatsInErrors = v6icmp.icmp6InErrors;
  235. icmp_stats_table[i].icmpStatsOutMsgs = v6icmp.icmp6OutMsgs;
  236. icmp_stats_table[i].icmpStatsOutErrors =
  237. v6icmp.icmp6OutDestUnreachs +
  238. v6icmp.icmp6OutPktTooBigs + v6icmp.icmp6OutTimeExcds +
  239. v6icmp.icmp6OutParmProblems;
  240. #endif /* NETSNMP_ENABLE_IPV6 */
  241. break;
  242. }
  243. icmp_stats_table[i].ipVer = i + 1;
  244. }
  245. return 0;
  246. }
  247. int
  248. icmp_msg_stats_load(netsnmp_cache *cache, void *vmagic)
  249. {
  250. ICMP_STAT_STRUCTURE v4icmp;
  251. struct icmp4_msg_mib v4icmpmsg;
  252. #ifdef NETSNMP_ENABLE_IPV6
  253. struct icmp6_mib v6icmp;
  254. struct icmp6_msg_mib v6icmpmsg;
  255. #endif
  256. int i, k, flag, inc;
  257. memset(&icmp_msg_stats_table, 0, sizeof(icmp_msg_stats_table));
  258. i = 0;
  259. flag = 0;
  260. k = 0;
  261. inc = 0;
  262. #ifdef linux
  263. linux_read_icmp_msg_stat(&v4icmp, &v4icmpmsg, &flag);
  264. #elif defined(NETBSD_STATS_VIA_SYSCTL)
  265. netbsd_read_icmp_msg_stat(&v4icmp, &v4icmpmsg, &flag);
  266. #elif (defined(NETSNMP_CAN_USE_SYSCTL) && defined(ICMPCTL_STATS))
  267. sysctl_read_icmp_msg_stat(&v4icmp, &v4icmpmsg, &flag);
  268. #elif defined(solaris2)
  269. solaris_read_icmp_msg_stat(&v4icmp, &v4icmpmsg, &flag);
  270. #else
  271. return -1;
  272. #endif
  273. if (flag) {
  274. while (255 >= k) {
  275. if (v4icmpmsg.vals[k].InType) {
  276. icmp_msg_stats_table[i].ipVer = 1;
  277. icmp_msg_stats_table[i].icmpMsgStatsType = k;
  278. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmpmsg.vals[k].InType;
  279. icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_IN;
  280. inc = 1; /* Set this if we found a valid entry */
  281. }
  282. if (v4icmpmsg.vals[k].OutType) {
  283. icmp_msg_stats_table[i].ipVer = 1;
  284. icmp_msg_stats_table[i].icmpMsgStatsType = k;
  285. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmpmsg.vals[k].OutType;
  286. icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_OUT;
  287. inc = 1; /* Set this if we found a valid entry */
  288. }
  289. if (inc) {
  290. i++;
  291. inc = 0;
  292. }
  293. k++;
  294. }
  295. } else {
  296. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ECHOREPLY;
  297. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInEchoReps;
  298. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutEchoReps;
  299. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  300. icmp_msg_stats_table[i].ipVer = 1;
  301. i++;
  302. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_DEST_UNREACH;
  303. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInDestUnreachs;
  304. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutDestUnreachs;
  305. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  306. icmp_msg_stats_table[i].ipVer = 1;
  307. i++;
  308. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_SOURCE_QUENCH;
  309. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInSrcQuenchs;
  310. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutSrcQuenchs;
  311. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  312. icmp_msg_stats_table[i].ipVer = 1;
  313. i++;
  314. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_REDIRECT;
  315. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInRedirects;
  316. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutRedirects;
  317. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  318. icmp_msg_stats_table[i].ipVer = 1;
  319. i++;
  320. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ECHO;
  321. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInEchos;
  322. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutEchos;
  323. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  324. icmp_msg_stats_table[i].ipVer = 1;
  325. i++;
  326. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIME_EXCEEDED;
  327. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimeExcds;
  328. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimeExcds;
  329. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  330. icmp_msg_stats_table[i].ipVer = 1;
  331. i++;
  332. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_PARAMETERPROB;
  333. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInParmProbs;
  334. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutParmProbs;
  335. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  336. icmp_msg_stats_table[i].ipVer = 1;
  337. i++;
  338. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIMESTAMP;
  339. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimestamps;
  340. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimestamps;
  341. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  342. icmp_msg_stats_table[i].ipVer = 1;
  343. i++;
  344. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIMESTAMPREPLY;
  345. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimestampReps;
  346. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimestampReps;
  347. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  348. icmp_msg_stats_table[i].ipVer = 1;
  349. i++;
  350. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ADDRESS;
  351. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInAddrMasks;
  352. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutAddrMasks;
  353. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  354. icmp_msg_stats_table[i].ipVer = 1;
  355. i++;
  356. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ADDRESSREPLY;
  357. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInAddrMaskReps;
  358. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutAddrMaskReps;
  359. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  360. icmp_msg_stats_table[i].ipVer = 1;
  361. i++;
  362. }
  363. #ifdef NETSNMP_ENABLE_IPV6
  364. flag = 0;
  365. k = 0;
  366. inc = 0;
  367. #ifdef linux
  368. linux_read_icmp6_msg_stat(&v6icmp, &v6icmpmsg, &flag);
  369. #elif defined(NETBSD_STATS_VIA_SYSCTL)
  370. netbsd_read_icmp6_msg_stat(&v6icmp, &v6icmpmsg, &flag);
  371. #elif (defined(NETSNMP_CAN_USE_SYSCTL) && defined(ICMPCTL_STATS))
  372. sysctl_read_icmp6_msg_stat(&v6icmp, &v6icmpmsg, &flag);
  373. #elif defined(solaris2)
  374. solaris_read_icmp6_msg_stat(&v6icmp, &v6icmpmsg, &flag);
  375. #else
  376. return -1;
  377. #endif
  378. if (flag) {
  379. while (255 >= k) {
  380. if (v6icmpmsg.vals[k].InType) {
  381. icmp_msg_stats_table[i].ipVer = 2;
  382. icmp_msg_stats_table[i].icmpMsgStatsType = k;
  383. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmpmsg.vals[k].InType;
  384. icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_IN;
  385. inc = 1; /* Set this if we found a valid entry */
  386. }
  387. if (v6icmpmsg.vals[k].OutType) {
  388. icmp_msg_stats_table[i].ipVer = 2;
  389. icmp_msg_stats_table[i].icmpMsgStatsType = k;
  390. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmpmsg.vals[k].OutType;
  391. icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_OUT;
  392. inc = 1; /* Set this if we found a valid entry */
  393. }
  394. if (inc) {
  395. i++;
  396. inc = 0;
  397. }
  398. k++;
  399. }
  400. } else {
  401. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_DST_UNREACH;
  402. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InDestUnreachs;
  403. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutDestUnreachs;
  404. icmp_msg_stats_table[i].ipVer = 2;
  405. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  406. i++;
  407. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_PACKET_TOO_BIG;
  408. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InPktTooBigs;
  409. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutPktTooBigs;
  410. icmp_msg_stats_table[i].ipVer = 2;
  411. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  412. i++;
  413. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_TIME_EXCEEDED;
  414. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InTimeExcds;
  415. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutTimeExcds;
  416. icmp_msg_stats_table[i].ipVer = 2;
  417. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  418. i++;
  419. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_PARAM_PROB;
  420. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InParmProblems;
  421. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutParmProblems;
  422. icmp_msg_stats_table[i].ipVer = 2;
  423. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  424. i++;
  425. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_ECHO_REQUEST;
  426. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InEchos;
  427. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutEchos;
  428. icmp_msg_stats_table[i].ipVer = 2;
  429. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  430. i++;
  431. icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_ECHO_REPLY;
  432. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InEchoReplies;
  433. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutEchoReplies;
  434. icmp_msg_stats_table[i].ipVer = 2;
  435. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  436. i++;
  437. #ifdef MLD_LISTENER_QUERY
  438. icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_QUERY;
  439. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembQueries;
  440. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
  441. icmp_msg_stats_table[i].ipVer = 2;
  442. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
  443. i++;
  444. icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_REPORT;
  445. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembResponses;
  446. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutGroupMembResponses;
  447. icmp_msg_stats_table[i].ipVer = 2;
  448. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  449. i++;
  450. icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_REDUCTION;
  451. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembReductions;
  452. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutGroupMembReductions;
  453. icmp_msg_stats_table[i].ipVer = 2;
  454. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  455. i++;
  456. icmp_msg_stats_table[i].icmpMsgStatsType = ND_ROUTER_SOLICIT;
  457. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRouterSolicits;
  458. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutRouterSolicits;
  459. icmp_msg_stats_table[i].ipVer = 2;
  460. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  461. i++;
  462. icmp_msg_stats_table[i].icmpMsgStatsType = ND_ROUTER_ADVERT;
  463. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRouterAdvertisements;
  464. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
  465. icmp_msg_stats_table[i].ipVer = 2;
  466. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
  467. i++;
  468. icmp_msg_stats_table[i].icmpMsgStatsType = ND_NEIGHBOR_SOLICIT;
  469. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InNeighborSolicits;
  470. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutNeighborSolicits;
  471. icmp_msg_stats_table[i].ipVer = 2;
  472. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  473. i++;
  474. icmp_msg_stats_table[i].icmpMsgStatsType = ND_NEIGHBOR_ADVERT;
  475. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InNeighborAdvertisements;
  476. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutNeighborAdvertisements;
  477. icmp_msg_stats_table[i].ipVer = 2;
  478. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  479. i++;
  480. icmp_msg_stats_table[i].icmpMsgStatsType = ND_REDIRECT;
  481. icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRedirects;
  482. icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutRedirects;
  483. icmp_msg_stats_table[i].ipVer = 2;
  484. icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
  485. #endif
  486. }
  487. #endif /* NETSNMP_ENABLE_IPV6 */
  488. return 0;
  489. }
  490. netsnmp_variable_list *
  491. icmp_stats_next_entry( void **loop_context,
  492. void **data_context,
  493. netsnmp_variable_list *index,
  494. netsnmp_iterator_info *data)
  495. {
  496. int i = (int)(intptr_t)(*loop_context);
  497. netsnmp_variable_list *idx = index;
  498. if(i > 1)
  499. return NULL;
  500. /*
  501. *set IP version
  502. */
  503. snmp_set_var_typed_value(idx, ASN_INTEGER, (u_char *)&icmp_stats_table[i].ipVer,
  504. sizeof(uint32_t));
  505. idx = idx->next_variable;
  506. *data_context = &icmp_stats_table[i];
  507. *loop_context = (void *)(intptr_t)(++i);
  508. return index;
  509. }
  510. netsnmp_variable_list *
  511. icmp_stats_first_entry( void **loop_context,
  512. void **data_context,
  513. netsnmp_variable_list *index,
  514. netsnmp_iterator_info *data)
  515. {
  516. *loop_context = NULL;
  517. *data_context = NULL;
  518. return icmp_stats_next_entry(loop_context, data_context, index, data);
  519. }
  520. netsnmp_variable_list *
  521. icmp_msg_stats_next_entry(void **loop_context,
  522. void **data_context,
  523. netsnmp_variable_list *index,
  524. netsnmp_iterator_info *data)
  525. {
  526. int i = (int)(intptr_t)(*loop_context);
  527. netsnmp_variable_list *idx = index;
  528. if(i >= ICMP_MSG_STATS_IPV4_COUNT + ICMP_MSG_STATS_IPV6_COUNT)
  529. return NULL;
  530. /* set IP version */
  531. snmp_set_var_typed_value(idx, ASN_INTEGER,
  532. (u_char *)&icmp_msg_stats_table[i].ipVer,
  533. sizeof(uint32_t));
  534. /* set packet type */
  535. idx = idx->next_variable;
  536. snmp_set_var_typed_value(idx, ASN_INTEGER,
  537. (u_char *)&icmp_msg_stats_table[i].icmpMsgStatsType,
  538. sizeof(uint32_t));
  539. *data_context = &icmp_msg_stats_table[i];
  540. *loop_context = (void *)(intptr_t)(++i);
  541. return index;
  542. }
  543. netsnmp_variable_list *
  544. icmp_msg_stats_first_entry(void **loop_context,
  545. void **data_context,
  546. netsnmp_variable_list *index,
  547. netsnmp_iterator_info *data)
  548. {
  549. *loop_context = NULL;
  550. *data_context = NULL;
  551. return icmp_msg_stats_next_entry(loop_context, data_context, index, data);
  552. }
  553. #endif
  554. void
  555. init_icmp(void)
  556. {
  557. #ifdef USES_SNMP_DESIGNED_ICMPSTAT
  558. netsnmp_handler_registration *msg_stats_reginfo = NULL;
  559. netsnmp_handler_registration *table_reginfo = NULL;
  560. netsnmp_iterator_info *iinfo;
  561. netsnmp_iterator_info *msg_stats_iinfo;
  562. netsnmp_table_registration_info *table_info = NULL;
  563. netsnmp_table_registration_info *msg_stats_table_info;
  564. #endif
  565. netsnmp_handler_registration *scalar_reginfo = NULL;
  566. int rc;
  567. /*
  568. * register ourselves with the agent as a group of scalars...
  569. */
  570. DEBUGMSGTL(("mibII/icmp", "Initialising ICMP group\n"));
  571. scalar_reginfo = netsnmp_create_handler_registration("icmp", icmp_handler,
  572. icmp_oid, OID_LENGTH(icmp_oid), HANDLER_CAN_RONLY);
  573. rc = netsnmp_register_scalar_group(scalar_reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS);
  574. if (rc != SNMPERR_SUCCESS)
  575. return;
  576. /*
  577. * .... with a local cache
  578. * (except for HP-UX 11, which extracts objects individually)
  579. */
  580. #ifndef hpux11
  581. rc = netsnmp_inject_handler( scalar_reginfo,
  582. netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
  583. icmp_load, icmp_free,
  584. icmp_oid, OID_LENGTH(icmp_oid)));
  585. if (rc != SNMPERR_SUCCESS)
  586. goto bail;
  587. #endif
  588. #ifdef USES_SNMP_DESIGNED_ICMPSTAT
  589. /* register icmpStatsTable */
  590. table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
  591. if (!table_info)
  592. goto bail;
  593. netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, 0);
  594. table_info->min_column = ICMP_STAT_INMSG;
  595. table_info->max_column = ICMP_STAT_OUTERR;
  596. iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
  597. if (!iinfo)
  598. goto bail;
  599. iinfo->get_first_data_point = icmp_stats_first_entry;
  600. iinfo->get_next_data_point = icmp_stats_next_entry;
  601. iinfo->table_reginfo = table_info;
  602. table_reginfo = netsnmp_create_handler_registration("icmpStatsTable",
  603. icmp_stats_table_handler, icmp_stats_tbl_oid,
  604. OID_LENGTH(icmp_stats_tbl_oid), HANDLER_CAN_RONLY);
  605. rc = netsnmp_register_table_iterator2(table_reginfo, iinfo);
  606. if (rc != SNMPERR_SUCCESS) {
  607. table_reginfo = NULL;
  608. goto bail;
  609. }
  610. netsnmp_inject_handler( table_reginfo,
  611. netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
  612. icmp_load, icmp_free,
  613. icmp_stats_tbl_oid, OID_LENGTH(icmp_stats_tbl_oid)));
  614. /* register icmpMsgStatsTable */
  615. msg_stats_table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
  616. if (!msg_stats_table_info)
  617. goto bail;
  618. netsnmp_table_helper_add_indexes(msg_stats_table_info, ASN_INTEGER, ASN_INTEGER, 0);
  619. msg_stats_table_info->min_column = ICMP_MSG_STAT_IN_PKTS;
  620. msg_stats_table_info->max_column = ICMP_MSG_STAT_OUT_PKTS;
  621. msg_stats_iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
  622. if (!msg_stats_iinfo)
  623. goto bail;
  624. msg_stats_iinfo->get_first_data_point = icmp_msg_stats_first_entry;
  625. msg_stats_iinfo->get_next_data_point = icmp_msg_stats_next_entry;
  626. msg_stats_iinfo->table_reginfo = msg_stats_table_info;
  627. msg_stats_reginfo = netsnmp_create_handler_registration("icmpMsgStatsTable",
  628. icmp_msg_stats_table_handler, icmp_msg_stats_tbl_oid,
  629. OID_LENGTH(icmp_msg_stats_tbl_oid), HANDLER_CAN_RONLY);
  630. rc = netsnmp_register_table_iterator2(msg_stats_reginfo, msg_stats_iinfo);
  631. if (rc != SNMPERR_SUCCESS) {
  632. msg_stats_reginfo = NULL;
  633. goto bail;
  634. }
  635. netsnmp_inject_handler( msg_stats_reginfo,
  636. netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
  637. icmp_load, icmp_free,
  638. icmp_msg_stats_tbl_oid, OID_LENGTH(icmp_msg_stats_tbl_oid)));
  639. #endif /* USES_SNMP_DESIGNED_ICMPSTAT */
  640. #ifdef USING_MIBII_IP_MODULE
  641. if (++ip_module_count == 2)
  642. REGISTER_SYSOR_TABLE(ip_module_oid, ip_module_oid_len,
  643. "The MIB module for managing IP and ICMP implementations");
  644. #endif
  645. #if !defined(_USE_PERFSTAT_PROTOCOL)
  646. #ifdef ICMPSTAT_SYMBOL
  647. auto_nlist(ICMPSTAT_SYMBOL, 0, 0);
  648. #endif
  649. #ifdef solaris2
  650. init_kernel_sunos5();
  651. #endif
  652. #endif
  653. return;
  654. #ifndef hpux11
  655. bail:
  656. #endif
  657. #ifdef USES_SNMP_DESIGNED_ICMPSTAT
  658. if (msg_stats_reginfo)
  659. netsnmp_handler_registration_free(msg_stats_reginfo);
  660. if (table_reginfo)
  661. netsnmp_handler_registration_free(table_reginfo);
  662. #endif
  663. if (scalar_reginfo)
  664. netsnmp_handler_registration_free(scalar_reginfo);
  665. }
  666. /*********************
  667. *
  668. * System specific data formats
  669. *
  670. *********************/
  671. /*********************
  672. *
  673. * System independent handler
  674. * (mostly!)
  675. *
  676. *********************/
  677. int
  678. icmp_handler(netsnmp_mib_handler *handler,
  679. netsnmp_handler_registration *reginfo,
  680. netsnmp_agent_request_info *reqinfo,
  681. netsnmp_request_info *requests)
  682. {
  683. netsnmp_request_info *request;
  684. netsnmp_variable_list *requestvb;
  685. long ret_value;
  686. oid subid;
  687. /*
  688. * The cached data should already have been loaded by the
  689. * cache handler, higher up the handler chain.
  690. */
  691. #if defined(_USE_PERFSTAT_PROTOCOL)
  692. icmp_load(NULL, NULL);
  693. #endif
  694. /*
  695. *
  696. *
  697. */
  698. DEBUGMSGTL(("mibII/icmp", "Handler - mode %s\n",
  699. se_find_label_in_slist("agent_mode", reqinfo->mode)));
  700. switch (reqinfo->mode) {
  701. case MODE_GET:
  702. for (request=requests; request; request=request->next) {
  703. requestvb = request->requestvb;
  704. subid = requestvb->name[OID_LENGTH(icmp_oid)]; /* XXX */
  705. DEBUGMSGTL(( "mibII/icmp", "oid: "));
  706. DEBUGMSGOID(("mibII/icmp", requestvb->name,
  707. requestvb->name_length));
  708. DEBUGMSG(( "mibII/icmp", "\n"));
  709. switch (subid) {
  710. #ifdef USES_SNMP_DESIGNED_ICMPSTAT
  711. case ICMPINMSGS:
  712. ret_value = icmpstat.icmpInMsgs;
  713. break;
  714. case ICMPINERRORS:
  715. ret_value = icmpstat.icmpInErrors;
  716. break;
  717. case ICMPINDESTUNREACHS:
  718. ret_value = icmpstat.icmpInDestUnreachs;
  719. break;
  720. case ICMPINTIMEEXCDS:
  721. ret_value = icmpstat.icmpInTimeExcds;
  722. break;
  723. case ICMPINPARMPROBS:
  724. ret_value = icmpstat.icmpInParmProbs;
  725. break;
  726. case ICMPINSRCQUENCHS:
  727. ret_value = icmpstat.icmpInSrcQuenchs;
  728. break;
  729. case ICMPINREDIRECTS:
  730. ret_value = icmpstat.icmpInRedirects;
  731. break;
  732. case ICMPINECHOS:
  733. ret_value = icmpstat.icmpInEchos;
  734. break;
  735. case ICMPINECHOREPS:
  736. ret_value = icmpstat.icmpInEchoReps;
  737. break;
  738. case ICMPINTIMESTAMPS:
  739. ret_value = icmpstat.icmpInTimestamps;
  740. break;
  741. case ICMPINTIMESTAMPREPS:
  742. ret_value = icmpstat.icmpInTimestampReps;
  743. break;
  744. case ICMPINADDRMASKS:
  745. ret_value = icmpstat.icmpInAddrMasks;
  746. break;
  747. case ICMPINADDRMASKREPS:
  748. ret_value = icmpstat.icmpInAddrMaskReps;
  749. break;
  750. case ICMPOUTMSGS:
  751. ret_value = icmpstat.icmpOutMsgs;
  752. break;
  753. case ICMPOUTERRORS:
  754. ret_value = icmpstat.icmpOutErrors;
  755. break;
  756. case ICMPOUTDESTUNREACHS:
  757. ret_value = icmpstat.icmpOutDestUnreachs;
  758. break;
  759. case ICMPOUTTIMEEXCDS:
  760. ret_value = icmpstat.icmpOutTimeExcds;
  761. break;
  762. case ICMPOUTPARMPROBS:
  763. ret_value = icmpstat.icmpOutParmProbs;
  764. break;
  765. case ICMPOUTSRCQUENCHS:
  766. ret_value = icmpstat.icmpOutSrcQuenchs;
  767. break;
  768. case ICMPOUTREDIRECTS:
  769. ret_value = icmpstat.icmpOutRedirects;
  770. break;
  771. case ICMPOUTECHOS:
  772. ret_value = icmpstat.icmpOutEchos;
  773. break;
  774. case ICMPOUTECHOREPS:
  775. ret_value = icmpstat.icmpOutEchoReps;
  776. break;
  777. case ICMPOUTTIMESTAMPS:
  778. ret_value = icmpstat.icmpOutTimestamps;
  779. break;
  780. case ICMPOUTTIMESTAMPREPS:
  781. ret_value = icmpstat.icmpOutTimestampReps;
  782. break;
  783. case ICMPOUTADDRMASKS:
  784. ret_value = icmpstat.icmpOutAddrMasks;
  785. break;
  786. case ICMPOUTADDRMASKREPS:
  787. ret_value = icmpstat.icmpOutAddrMaskReps;
  788. break;
  789. #elif defined(USES_TRADITIONAL_ICMPSTAT) && !defined(_USE_PERFSTAT_PROTOCOL)
  790. case ICMPINMSGS: {
  791. int i;
  792. ret_value = icmpstat.icps_badcode +
  793. icmpstat.icps_tooshort +
  794. icmpstat.icps_checksum + icmpstat.icps_badlen;
  795. for (i = 0; i <= ICMP_MAXTYPE; i++)
  796. ret_value += icmpstat.icps_inhist[i];
  797. break;
  798. }
  799. case ICMPINERRORS:
  800. ret_value = icmpstat.icps_badcode +
  801. icmpstat.icps_tooshort +
  802. icmpstat.icps_checksum + icmpstat.icps_badlen;
  803. break;
  804. case ICMPINDESTUNREACHS:
  805. ret_value = icmpstat.icps_inhist[ICMP_UNREACH];
  806. break;
  807. case ICMPINTIMEEXCDS:
  808. ret_value = icmpstat.icps_inhist[ICMP_TIMXCEED];
  809. break;
  810. case ICMPINPARMPROBS:
  811. ret_value = icmpstat.icps_inhist[ICMP_PARAMPROB];
  812. break;
  813. case ICMPINSRCQUENCHS:
  814. ret_value = icmpstat.icps_inhist[ICMP_SOURCEQUENCH];
  815. break;
  816. case ICMPINREDIRECTS:
  817. ret_value = icmpstat.icps_inhist[ICMP_REDIRECT];
  818. break;
  819. case ICMPINECHOS:
  820. ret_value = icmpstat.icps_inhist[ICMP_ECHO];
  821. break;
  822. case ICMPINECHOREPS:
  823. ret_value = icmpstat.icps_inhist[ICMP_ECHOREPLY];
  824. break;
  825. case ICMPINTIMESTAMPS:
  826. ret_value = icmpstat.icps_inhist[ICMP_TSTAMP];
  827. break;
  828. case ICMPINTIMESTAMPREPS:
  829. ret_value = icmpstat.icps_inhist[ICMP_TSTAMPREPLY];
  830. break;
  831. case ICMPINADDRMASKS:
  832. ret_value = icmpstat.icps_inhist[ICMP_MASKREQ];
  833. break;
  834. case ICMPINADDRMASKREPS:
  835. ret_value = icmpstat.icps_inhist[ICMP_MASKREPLY];
  836. break;
  837. case ICMPOUTMSGS: {
  838. int i;
  839. ret_value = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
  840. for (i = 0; i <= ICMP_MAXTYPE; i++)
  841. ret_value += icmpstat.icps_outhist[i];
  842. break;
  843. }
  844. case ICMPOUTERRORS:
  845. ret_value = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
  846. break;
  847. case ICMPOUTDESTUNREACHS:
  848. ret_value = icmpstat.icps_outhist[ICMP_UNREACH];
  849. break;
  850. case ICMPOUTTIMEEXCDS:
  851. ret_value = icmpstat.icps_outhist[ICMP_TIMXCEED];
  852. break;
  853. case ICMPOUTPARMPROBS:
  854. ret_value = icmpstat.icps_outhist[ICMP_PARAMPROB];
  855. break;
  856. case ICMPOUTSRCQUENCHS:
  857. ret_value = icmpstat.icps_outhist[ICMP_SOURCEQUENCH];
  858. break;
  859. case ICMPOUTREDIRECTS:
  860. ret_value = icmpstat.icps_outhist[ICMP_REDIRECT];
  861. break;
  862. case ICMPOUTECHOS:
  863. ret_value = icmpstat.icps_outhist[ICMP_ECHO];
  864. break;
  865. case ICMPOUTECHOREPS:
  866. ret_value = icmpstat.icps_outhist[ICMP_ECHOREPLY];
  867. break;
  868. case ICMPOUTTIMESTAMPS:
  869. ret_value = icmpstat.icps_outhist[ICMP_TSTAMP];
  870. break;
  871. case ICMPOUTTIMESTAMPREPS:
  872. ret_value = icmpstat.icps_outhist[ICMP_TSTAMPREPLY];
  873. break;
  874. case ICMPOUTADDRMASKS:
  875. ret_value = icmpstat.icps_outhist[ICMP_MASKREQ];
  876. break;
  877. case ICMPOUTADDRMASKREPS:
  878. ret_value = icmpstat.icps_outhist[ICMP_MASKREPLY];
  879. break;
  880. #elif defined(hpux11)
  881. case ICMPINMSGS:
  882. case ICMPINERRORS:
  883. case ICMPINDESTUNREACHS:
  884. case ICMPINTIMEEXCDS:
  885. case ICMPINPARMPROBS:
  886. case ICMPINSRCQUENCHS:
  887. case ICMPINREDIRECTS:
  888. case ICMPINECHOS:
  889. case ICMPINECHOREPS:
  890. case ICMPINTIMESTAMPS:
  891. case ICMPINTIMESTAMPREPS:
  892. case ICMPINADDRMASKS:
  893. case ICMPINADDRMASKREPS:
  894. case ICMPOUTMSGS:
  895. case ICMPOUTERRORS:
  896. case ICMPOUTDESTUNREACHS:
  897. case ICMPOUTTIMEEXCDS:
  898. case ICMPOUTPARMPROBS:
  899. case ICMPOUTSRCQUENCHS:
  900. case ICMPOUTREDIRECTS:
  901. case ICMPOUTECHOS:
  902. case ICMPOUTECHOREPS:
  903. case ICMPOUTTIMESTAMPS:
  904. case ICMPOUTTIMESTAMPREPS:
  905. case ICMPOUTADDRMASKS:
  906. case ICMPOUTADDRMASKREPS:
  907. /*
  908. * This is a bit of a hack, to shoehorn the HP-UX 11
  909. * single-object retrieval approach into the caching
  910. * architecture.
  911. */
  912. if (icmp_load(NULL, (void*)subid) == -1 ) {
  913. netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
  914. continue;
  915. }
  916. ret_value = icmpstat;
  917. break;
  918. #elif defined (WIN32) || defined (cygwin)
  919. case ICMPINMSGS:
  920. ret_value = icmpstat.stats.icmpInStats.dwMsgs;
  921. break;
  922. case ICMPINERRORS:
  923. ret_value = icmpstat.stats.icmpInStats.dwErrors;
  924. break;
  925. case ICMPINDESTUNREACHS:
  926. ret_value = icmpstat.stats.icmpInStats.dwDestUnreachs;
  927. break;
  928. case ICMPINTIMEEXCDS:
  929. ret_value = icmpstat.stats.icmpInStats.dwTimeExcds;
  930. break;
  931. case ICMPINPARMPROBS:
  932. ret_value = icmpstat.stats.icmpInStats.dwParmProbs;
  933. break;
  934. case ICMPINSRCQUENCHS:
  935. ret_value = icmpstat.stats.icmpInStats.dwSrcQuenchs;
  936. break;
  937. case ICMPINREDIRECTS:
  938. ret_value = icmpstat.stats.icmpInStats.dwRedirects;
  939. break;
  940. case ICMPINECHOS:
  941. ret_value = icmpstat.stats.icmpInStats.dwEchos;
  942. break;
  943. case ICMPINECHOREPS:
  944. ret_value = icmpstat.stats.icmpInStats.dwEchoReps;
  945. break;
  946. case ICMPINTIMESTAMPS:
  947. ret_value = icmpstat.stats.icmpInStats.dwTimestamps;
  948. break;
  949. case ICMPINTIMESTAMPREPS:
  950. ret_value = icmpstat.stats.icmpInStats.dwTimestampReps;
  951. break;
  952. case ICMPINADDRMASKS:
  953. ret_value = icmpstat.stats.icmpInStats.dwAddrMasks;
  954. break;
  955. case ICMPINADDRMASKREPS:
  956. ret_value = icmpstat.stats.icmpInStats.dwAddrMaskReps;
  957. break;
  958. case ICMPOUTMSGS:
  959. ret_value = icmpstat.stats.icmpOutStats.dwMsgs;
  960. break;
  961. case ICMPOUTERRORS:
  962. ret_value = icmpstat.stats.icmpOutStats.dwErrors;
  963. break;
  964. case ICMPOUTDESTUNREACHS:
  965. ret_value = icmpstat.stats.icmpOutStats.dwDestUnreachs;
  966. break;
  967. case ICMPOUTTIMEEXCDS:
  968. ret_value = icmpstat.stats.icmpOutStats.dwTimeExcds;
  969. break;
  970. case ICMPOUTPARMPROBS:
  971. ret_value = icmpstat.stats.icmpOutStats.dwParmProbs;
  972. break;
  973. case ICMPOUTSRCQUENCHS:
  974. ret_value = icmpstat.stats.icmpOutStats.dwSrcQuenchs;
  975. break;
  976. case ICMPOUTREDIRECTS:
  977. ret_value = icmpstat.stats.icmpOutStats.dwRedirects;
  978. break;
  979. case ICMPOUTECHOS:
  980. ret_value = icmpstat.stats.icmpOutStats.dwEchos;
  981. break;
  982. case ICMPOUTECHOREPS:
  983. ret_value = icmpstat.stats.icmpOutStats.dwEchoReps;
  984. break;
  985. case ICMPOUTTIMESTAMPS:
  986. ret_value = icmpstat.stats.icmpOutStats.dwTimestamps;
  987. break;
  988. case ICMPOUTTIMESTAMPREPS:
  989. ret_value = icmpstat.stats.icmpOutStats.dwTimestampReps;
  990. break;
  991. case ICMPOUTADDRMASKS:
  992. ret_value = icmpstat.stats.icmpOutStats.dwAddrMasks;
  993. break;
  994. case ICMPOUTADDRMASKREPS:
  995. ret_value = icmpstat.stats.icmpOutStats.dwAddrMaskReps;
  996. break;
  997. #elif defined(_USE_PERFSTAT_PROTOCOL)
  998. case ICMPINMSGS:
  999. ret_value = ps_proto.u.icmp.received;
  1000. break;
  1001. case ICMPINERRORS:
  1002. ret_value = ps_proto.u.icmp.errors;
  1003. break;
  1004. case ICMPINDESTUNREACHS:
  1005. case ICMPINTIMEEXCDS:
  1006. case ICMPINPARMPROBS:
  1007. case ICMPINSRCQUENCHS:
  1008. case ICMPINREDIRECTS:
  1009. case ICMPINECHOS:
  1010. case ICMPINECHOREPS:
  1011. case ICMPINTIMESTAMPS:
  1012. case ICMPINTIMESTAMPREPS:
  1013. case ICMPINADDRMASKS:
  1014. case ICMPINADDRMASKREPS:
  1015. ret_value = 0;
  1016. break;
  1017. case ICMPOUTMSGS:
  1018. ret_value = ps_proto.u.icmp.sent;
  1019. break;
  1020. case ICMPOUTERRORS:
  1021. ret_value = ps_proto.u.icmp.errors;
  1022. break;
  1023. case ICMPOUTDESTUNREACHS:
  1024. case ICMPOUTTIMEEXCDS:
  1025. case ICMPOUTPARMPROBS:
  1026. case ICMPOUTSRCQUENCHS:
  1027. case ICMPOUTREDIRECTS:
  1028. case ICMPOUTECHOS:
  1029. case ICMPOUTECHOREPS:
  1030. case ICMPOUTTIMESTAMPS:
  1031. case ICMPOUTTIMESTAMPREPS:
  1032. case ICMPOUTADDRMASKS:
  1033. case ICMPOUTADDRMASKREPS:
  1034. ret_value = 0;
  1035. break;
  1036. #endif /* USES_SNMP_DESIGNED_ICMPSTAT */
  1037. }
  1038. snmp_set_var_typed_value(request->requestvb, ASN_COUNTER,
  1039. (u_char *)&ret_value, sizeof(ret_value));
  1040. }
  1041. break;
  1042. case MODE_GETNEXT:
  1043. case MODE_GETBULK:
  1044. #ifndef NETSNMP_NO_WRITE_SUPPORT
  1045. case MODE_SET_RESERVE1:
  1046. case MODE_SET_RESERVE2:
  1047. case MODE_SET_ACTION:
  1048. case MODE_SET_COMMIT:
  1049. case MODE_SET_FREE:
  1050. case MODE_SET_UNDO:
  1051. snmp_log(LOG_WARNING, "mibII/icmp: Unsupported mode (%d)\n",
  1052. reqinfo->mode);
  1053. break;
  1054. #endif /* !NETSNMP_NO_WRITE_SUPPORT */
  1055. default:
  1056. snmp_log(LOG_WARNING, "mibII/icmp: Unrecognised mode (%d)\n",
  1057. reqinfo->mode);
  1058. break;
  1059. }
  1060. return SNMP_ERR_NOERROR;
  1061. }
  1062. #ifdef USES_SNMP_DESIGNED_ICMPSTAT
  1063. int
  1064. icmp_stats_table_handler(netsnmp_mib_handler *handler,
  1065. netsnmp_handler_registration *reginfo,
  1066. netsnmp_agent_request_info *reqinfo,
  1067. netsnmp_request_info *requests)
  1068. {
  1069. netsnmp_request_info *request;
  1070. netsnmp_variable_list *requestvb;
  1071. netsnmp_table_request_info *table_info;
  1072. struct icmp_stats_table_entry *entry;
  1073. oid subid;
  1074. switch (reqinfo->mode) {
  1075. case MODE_GET:
  1076. for (request=requests; request; request=request->next) {
  1077. requestvb = request->requestvb;
  1078. entry = (struct icmp_stats_table_entry *)netsnmp_extract_iterator_context(request);
  1079. if (!entry)
  1080. continue;
  1081. table_info = netsnmp_extract_table_info(request);
  1082. subid = table_info->colnum;
  1083. DEBUGMSGTL(( "mibII/icmpStatsTable", "oid: " ));
  1084. DEBUGMSGOID(( "mibII/icmpStatsTable", request->requestvb->name,
  1085. request->requestvb->name_length ));
  1086. DEBUGMSG(( "mibII/icmpStatsTable", " In %d InErr %d Out %d OutErr %d\n",
  1087. entry->icmpStatsInMsgs, entry->icmpStatsInErrors,
  1088. entry->icmpStatsOutMsgs, entry->icmpStatsOutErrors ));
  1089. switch (subid) {
  1090. case ICMP_STAT_INMSG:
  1091. snmp_set_var_typed_value(requestvb, ASN_COUNTER,
  1092. (u_char *)&entry->icmpStatsInMsgs, sizeof(uint32_t));
  1093. break;
  1094. case ICMP_STAT_INERR:
  1095. snmp_set_var_typed_value(requestvb, ASN_COUNTER,
  1096. (u_char *)&entry->icmpStatsInErrors, sizeof(uint32_t));
  1097. break;
  1098. case ICMP_STAT_OUTMSG:
  1099. snmp_set_var_typed_value(requestvb, ASN_COUNTER,
  1100. (u_char *)&entry->icmpStatsOutMsgs, sizeof(uint32_t));
  1101. break;
  1102. case ICMP_STAT_OUTERR:
  1103. snmp_set_var_typed_value(requestvb, ASN_COUNTER,
  1104. (u_char *)&entry->icmpStatsOutErrors, sizeof(uint32_t));
  1105. break;
  1106. default:
  1107. snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unrecognised column (%d)\n",(int)subid);
  1108. }
  1109. }
  1110. break;
  1111. case MODE_GETNEXT:
  1112. case MODE_GETBULK:
  1113. #ifndef NETSNMP_NO_WRITE_SUPPORT
  1114. case MODE_SET_RESERVE1:
  1115. case MODE_SET_RESERVE2:
  1116. case MODE_SET_ACTION:
  1117. case MODE_SET_COMMIT:
  1118. case MODE_SET_FREE:
  1119. case MODE_SET_UNDO:
  1120. snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unsupported mode (%d)\n",
  1121. reqinfo->mode);
  1122. break;
  1123. #endif /* !NETSNMP_NO_WRITE_SUPPORT */
  1124. default:
  1125. snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unrecognised mode (%d)\n",
  1126. reqinfo->mode);
  1127. break;
  1128. }
  1129. return SNMP_ERR_NOERROR;
  1130. }
  1131. int
  1132. icmp_msg_stats_table_handler(netsnmp_mib_handler *handler,
  1133. netsnmp_handler_registration *reginfo,
  1134. netsnmp_agent_request_info *reqinfo,
  1135. netsnmp_request_info *requests)
  1136. {
  1137. netsnmp_request_info *request;
  1138. netsnmp_variable_list *requestvb;
  1139. netsnmp_table_request_info *table_info;
  1140. struct icmp_msg_stats_table_entry *entry;
  1141. oid subid;
  1142. switch (reqinfo->mode) {
  1143. case MODE_GET:
  1144. for (request = requests; request; request = request->next) {
  1145. requestvb = request->requestvb;
  1146. entry = (struct icmp_msg_stats_table_entry *)netsnmp_extract_iterator_context(request);
  1147. if (!entry)
  1148. continue;
  1149. table_info = netsnmp_extract_table_info(request);
  1150. subid = table_info->colnum;
  1151. DEBUGMSGTL(( "mibII/icmpMsgStatsTable", "oid: " ));
  1152. DEBUGMSGOID(( "mibII/icmpMsgStatsTable", request->requestvb->name,
  1153. request->requestvb->name_length ));
  1154. DEBUGMSG(( "mibII/icmpMsgStatsTable", " In %d Out %d Flags 0x%x\n",
  1155. entry->icmpMsgStatsInPkts, entry->icmpMsgStatsOutPkts, entry->flags ));
  1156. switch (subid) {
  1157. case ICMP_MSG_STAT_IN_PKTS:
  1158. if (entry->flags & ICMP_MSG_STATS_HAS_IN) {
  1159. snmp_set_var_typed_value(requestvb, ASN_COUNTER,
  1160. (u_char *)&entry->icmpMsgStatsInPkts, sizeof(uint32_t));
  1161. } else {
  1162. requestvb->type = SNMP_NOSUCHINSTANCE;
  1163. }
  1164. break;
  1165. case ICMP_MSG_STAT_OUT_PKTS:
  1166. if (entry->flags & ICMP_MSG_STATS_HAS_OUT) {
  1167. snmp_set_var_typed_value(requestvb, ASN_COUNTER,
  1168. (u_char *)&entry->icmpMsgStatsOutPkts, sizeof(uint32_t));
  1169. } else {
  1170. requestvb->type = SNMP_NOSUCHINSTANCE;
  1171. }
  1172. break;
  1173. default:
  1174. snmp_log(LOG_WARNING, "mibII/icmpMsgStatsTable: Unrecognised column (%d)\n",(int)subid);
  1175. }
  1176. }
  1177. break;
  1178. case MODE_GETNEXT:
  1179. case MODE_GETBULK:
  1180. #ifndef NETSNMP_NO_WRITE_SUPPORT
  1181. case MODE_SET_RESERVE1:
  1182. case MODE_SET_RESERVE2:
  1183. case MODE_SET_ACTION:
  1184. case MODE_SET_COMMIT:
  1185. case MODE_SET_FREE:
  1186. case MODE_SET_UNDO:
  1187. snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unsupported mode (%d)\n",
  1188. reqinfo->mode);
  1189. break;
  1190. #endif /* !NETSNMP_NO_WRITE_SUPPORT */
  1191. default:
  1192. snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unrecognised mode (%d)\n",
  1193. reqinfo->mode);
  1194. break;
  1195. }
  1196. return SNMP_ERR_NOERROR;
  1197. }
  1198. #endif /* USES_SNMP_DESIGNED_ICMPSTAT */
  1199. /*********************
  1200. *
  1201. * Internal implementation functions
  1202. *
  1203. *********************/
  1204. #ifdef hpux11
  1205. int
  1206. icmp_load(netsnmp_cache *cache, void *vmagic)
  1207. {
  1208. int fd;
  1209. struct nmparms p;
  1210. unsigned int ulen;
  1211. int ret;
  1212. int magic = (int) vmagic;
  1213. if ((fd = open_mib("/dev/ip", O_RDONLY, 0, NM_ASYNC_OFF)) < 0) {
  1214. DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP object %d (hpux11)\n", magic));
  1215. return (-1); /* error */
  1216. }
  1217. switch (magic) {
  1218. case ICMPINMSGS:
  1219. p.objid = ID_icmpInMsgs;
  1220. break;
  1221. case ICMPINERRORS:
  1222. p.objid = ID_icmpInErrors;
  1223. break;
  1224. case ICMPINDESTUNREACHS:
  1225. p.objid = ID_icmpInDestUnreachs;
  1226. break;
  1227. case ICMPINTIMEEXCDS:
  1228. p.objid = ID_icmpInTimeExcds;
  1229. break;
  1230. case ICMPINPARMPROBS:
  1231. p.objid = ID_icmpInParmProbs;
  1232. break;
  1233. case ICMPINSRCQUENCHS:
  1234. p.objid = ID_icmpInSrcQuenchs;
  1235. break;
  1236. case ICMPINREDIRECTS:
  1237. p.objid = ID_icmpInRedirects;
  1238. break;
  1239. case ICMPINECHOS:
  1240. p.objid = ID_icmpInEchos;
  1241. break;
  1242. case ICMPINECHOREPS:
  1243. p.objid = ID_icmpInEchoReps;
  1244. break;
  1245. case ICMPINTIMESTAMPS:
  1246. p.objid = ID_icmpInTimestamps;
  1247. break;
  1248. case ICMPINTIMESTAMPREPS:
  1249. p.objid = ID_icmpInTimestampReps;
  1250. break;
  1251. case ICMPINADDRMASKS:
  1252. p.objid = ID_icmpInAddrMasks;
  1253. break;
  1254. case ICMPINADDRMASKREPS:
  1255. p.objid = ID_icmpInAddrMaskReps;
  1256. break;
  1257. case ICMPOUTMSGS:
  1258. p.objid = ID_icmpOutMsgs;
  1259. break;
  1260. case ICMPOUTERRORS:
  1261. p.objid = ID_icmpOutErrors;
  1262. break;
  1263. case ICMPOUTDESTUNREACHS:
  1264. p.objid = ID_icmpOutDestUnreachs;
  1265. break;
  1266. case ICMPOUTTIMEEXCDS:
  1267. p.objid = ID_icmpOutTimeExcds;
  1268. break;
  1269. case ICMPOUTPARMPROBS:
  1270. p.objid = ID_icmpOutParmProbs;
  1271. break;
  1272. case ICMPOUTSRCQUENCHS:
  1273. p.objid = ID_icmpOutSrcQuenchs;
  1274. break;
  1275. case ICMPOUTREDIRECTS:
  1276. p.objid = ID_icmpOutRedirects;
  1277. break;
  1278. case ICMPOUTECHOS:
  1279. p.objid = ID_icmpOutEchos;
  1280. break;
  1281. case ICMPOUTECHOREPS:
  1282. p.objid = ID_icmpOutEchoReps;
  1283. break;
  1284. case ICMPOUTTIMESTAMPS:
  1285. p.objid = ID_icmpOutTimestamps;
  1286. break;
  1287. case ICMPOUTTIMESTAMPREPS:
  1288. p.objid = ID_icmpOutTimestampReps;
  1289. break;
  1290. case ICMPOUTADDRMASKS:
  1291. p.objid = ID_icmpOutAddrMasks;
  1292. break;
  1293. case ICMPOUTADDRMASKREPS:
  1294. p.objid = ID_icmpOutAddrMaskReps;
  1295. break;
  1296. default:
  1297. icmpstat = 0;
  1298. close_mib(fd);
  1299. return (0);
  1300. }
  1301. p.buffer = (void *)&icmpstat;
  1302. ulen = sizeof(ICMP_STAT_STRUCTURE);
  1303. p.len = &ulen;
  1304. ret = get_mib_info(fd, &p);
  1305. close_mib(fd);
  1306. DEBUGMSGTL(("mibII/icmp", "%s ICMP object %d (hpux11)\n",
  1307. (ret < 0 ? "Failed to load" : "Loaded"), magic));
  1308. return (ret); /* 0: ok, < 0: error */
  1309. }
  1310. #elif defined(linux)
  1311. int
  1312. icmp_load(netsnmp_cache *cache, void *vmagic)
  1313. {
  1314. long ret_value = -1;
  1315. ret_value = linux_read_icmp_stat(&icmpstat);
  1316. if ( ret_value < 0 ) {
  1317. DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (linux)\n"));
  1318. } else {
  1319. DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (linux)\n"));
  1320. }
  1321. icmp_stats_load(cache, vmagic);
  1322. icmp_msg_stats_load(cache, vmagic);
  1323. return ret_value;
  1324. }
  1325. #elif defined(solaris2)
  1326. int
  1327. icmp_load(netsnmp_cache *cache, void *vmagic)
  1328. {
  1329. int ret_value = -1;
  1330. #ifdef NETSNMP_ENABLE_IPV6
  1331. mib2_ipv6IfIcmpEntry_t ifstat;
  1332. int req = GET_FIRST;
  1333. #endif
  1334. ret_value =
  1335. getMibstat(MIB_ICMP, &icmpstat, sizeof(mib2_icmp_t), GET_FIRST,
  1336. &Get_everything, NULL);
  1337. if ( ret_value < 0 ) {
  1338. DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP Group (solaris)\n"));
  1339. } else {
  1340. DEBUGMSGTL(("mibII/icmp", "Loaded ICMP Group (solaris)\n"));
  1341. }
  1342. #ifdef NETSNMP_ENABLE_IPV6
  1343. memset(&icmp6stat, 0, sizeof(icmp6stat));
  1344. while ((ret_value = getMibstat(MIB_ICMP6, &ifstat, sizeof(ifstat), req,
  1345. &Get_everything, NULL)) == 0) {
  1346. if ( ret_value < 0 ) {
  1347. DEBUGMSGTL(("mibII/icmp", "Failed to load ICMP6 Group (solaris)\n"));
  1348. } else {
  1349. DEBUGMSGTL(("mibII/icmp", "Loaded ICMP6 Group (solaris)\n"));
  1350. }
  1351. icmp6stat.icmp6OutMsgs += ifstat.ipv6IfIcmpOutMsgs;
  1352. icmp6stat.icmp6InMsgs += ifstat.ipv6IfIcmpInMsgs;
  1353. icmp6stat.icmp6InErrors += ifstat.ipv6IfIcmpInErrors;
  1354. icmp6stat.icmp6OutDestUnreachs += ifstat.ipv6IfIcmpOutDestUnreachs;
  1355. icmp6stat.icmp6InDestUnreachs += ifstat.ipv6IfIcmpInDestUnreachs;
  1356. icmp6stat.icmp6OutPktTooBigs += ifstat.ipv6IfIcmpOutPktTooBigs;
  1357. icmp6stat.icmp6InPktTooBigs += ifstat.ipv6IfIcmpInPktTooBigs;
  1358. icmp6stat.icmp6OutTimeExcds += ifstat.ipv6IfIcmpOutTimeExcds;
  1359. icmp6stat.icmp6InTimeExcds += ifstat.ipv6IfIcmpInTimeExcds;
  1360. icmp6stat.icmp6OutParmProblems += ifstat.ipv6IfIcmpOutParmProblems;
  1361. icmp6stat.icmp6InParmProblems += ifstat.ipv6IfIcmpInParmProblems;
  1362. icm

Large files files are truncated, but you can click here to view the full file