📄 icmp.c
字号:
u_char *var_icmp(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ register int i; static struct icmpstat icmpstat; if (header_icmp(vp, name, length, exact, var_len, write_method) == MATCH_FAILED ) return NULL; /* * Get the ICMP statistics from the kernel... */#if !defined(CAN_USE_SYSCTL) || !defined(ICMPCTL_STATS) auto_nlist(ICMPSTAT_SYMBOL, (char *)&icmpstat, sizeof (icmpstat));#else { int sname[] = { CTL_NET, PF_INET, IPPROTO_ICMP, ICMPCTL_STATS }; size_t len; len = sizeof icmpstat; if (sysctl(sname, 4, &icmpstat, &len, 0, 0) < 0) return NULL; }#endif /* use sysctl */ switch (vp->magic) { case ICMPINMSGS: long_return = icmpstat.icps_badcode + icmpstat.icps_tooshort + icmpstat.icps_checksum + icmpstat.icps_badlen; for (i=0; i <= ICMP_MAXTYPE; i++) long_return += icmpstat.icps_inhist[i]; return (u_char *)&long_return; case ICMPINERRORS: long_return = icmpstat.icps_badcode + icmpstat.icps_tooshort + icmpstat.icps_checksum + icmpstat.icps_badlen; return (u_char *)&long_return; case ICMPINDESTUNREACHS: long_return = icmpstat.icps_inhist[ICMP_UNREACH]; return (u_char *) &long_return; case ICMPINTIMEEXCDS: long_return = icmpstat.icps_inhist[ICMP_TIMXCEED]; return (u_char *) &long_return; case ICMPINPARMPROBS: long_return = icmpstat.icps_inhist[ICMP_PARAMPROB]; return (u_char *) &long_return; case ICMPINSRCQUENCHS: long_return = icmpstat.icps_inhist[ICMP_SOURCEQUENCH]; return (u_char *) &long_return; case ICMPINREDIRECTS: long_return = icmpstat.icps_inhist[ICMP_REDIRECT]; return (u_char *) &long_return; case ICMPINECHOS: long_return = icmpstat.icps_inhist[ICMP_ECHO]; return (u_char *) &long_return; case ICMPINECHOREPS: long_return = icmpstat.icps_inhist[ICMP_ECHOREPLY]; return (u_char *) &long_return; case ICMPINTIMESTAMPS: long_return = icmpstat.icps_inhist[ICMP_TSTAMP]; return (u_char *) &long_return; case ICMPINTIMESTAMPREPS: long_return = icmpstat.icps_inhist[ICMP_TSTAMPREPLY]; return (u_char *) &long_return; case ICMPINADDRMASKS: long_return = icmpstat.icps_inhist[ICMP_MASKREQ]; return (u_char *) &long_return; case ICMPINADDRMASKREPS: long_return = icmpstat.icps_inhist[ICMP_MASKREPLY]; return (u_char *) &long_return; case ICMPOUTMSGS: long_return = icmpstat.icps_oldshort + icmpstat.icps_oldicmp; for (i=0; i <= ICMP_MAXTYPE; i++) long_return += icmpstat.icps_outhist[i]; return (u_char *)&long_return; case ICMPOUTERRORS: long_return = icmpstat.icps_oldshort + icmpstat.icps_oldicmp; return (u_char *)&long_return; case ICMPOUTDESTUNREACHS: long_return = icmpstat.icps_outhist[ICMP_UNREACH]; return (u_char *) &long_return; case ICMPOUTTIMEEXCDS: long_return = icmpstat.icps_outhist[ICMP_TIMXCEED]; return (u_char *) &long_return; case ICMPOUTPARMPROBS: long_return = icmpstat.icps_outhist[ICMP_PARAMPROB]; return (u_char *) &long_return; case ICMPOUTSRCQUENCHS: long_return = icmpstat.icps_outhist[ICMP_SOURCEQUENCH]; return (u_char *) &long_return; case ICMPOUTREDIRECTS: long_return = icmpstat.icps_outhist[ICMP_REDIRECT]; return (u_char *) &long_return; case ICMPOUTECHOS: long_return = icmpstat.icps_outhist[ICMP_ECHO]; return (u_char *) &long_return; case ICMPOUTECHOREPS: long_return = icmpstat.icps_outhist[ICMP_ECHOREPLY]; return (u_char *) &long_return; case ICMPOUTTIMESTAMPS: long_return = icmpstat.icps_outhist[ICMP_TSTAMP]; return (u_char *) &long_return; case ICMPOUTTIMESTAMPREPS: long_return = icmpstat.icps_outhist[ICMP_TSTAMPREPLY]; return (u_char *) &long_return; case ICMPOUTADDRMASKS: long_return = icmpstat.icps_outhist[ICMP_MASKREQ]; return (u_char *) &long_return; case ICMPOUTADDRMASKREPS: long_return = icmpstat.icps_outhist[ICMP_MASKREPLY]; return (u_char *) &long_return; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_icmp\n", vp->magic)); } return NULL;}#endif /* not HAVE_SYS_TCPIPSTATS_H */#else /* linux */u_char *var_icmp(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ static struct icmp_mib icmpstat; if (header_icmp(vp, name, length, exact, var_len, write_method) == MATCH_FAILED ) return(NULL); linux_read_icmp_stat (&icmpstat); switch (vp->magic){ case ICMPINMSGS: return (u_char *) &icmpstat.IcmpInMsgs; case ICMPINERRORS: return (u_char *) &icmpstat.IcmpInErrors; case ICMPINDESTUNREACHS: return (u_char *) &icmpstat.IcmpInDestUnreachs; case ICMPINTIMEEXCDS: return (u_char *) &icmpstat.IcmpInTimeExcds; case ICMPINPARMPROBS: return (u_char *) &icmpstat.IcmpInParmProbs; case ICMPINSRCQUENCHS: return (u_char *) &icmpstat.IcmpInSrcQuenchs; case ICMPINREDIRECTS: return (u_char *) &icmpstat.IcmpInRedirects; case ICMPINECHOS: return (u_char *) &icmpstat.IcmpInEchos; case ICMPINECHOREPS: return (u_char *) &icmpstat.IcmpInEchoReps; case ICMPINTIMESTAMPS: return (u_char *) &icmpstat.IcmpInTimestamps; case ICMPINTIMESTAMPREPS: return (u_char *) &icmpstat.IcmpInTimestampReps; case ICMPINADDRMASKS: return (u_char *) &icmpstat.IcmpInAddrMasks; case ICMPINADDRMASKREPS: return (u_char *) &icmpstat.IcmpInAddrMaskReps; case ICMPOUTMSGS: return (u_char *) &icmpstat.IcmpOutMsgs; case ICMPOUTERRORS: return (u_char *) &icmpstat.IcmpOutErrors; case ICMPOUTDESTUNREACHS: return (u_char *) &icmpstat.IcmpOutDestUnreachs; case ICMPOUTTIMEEXCDS: return (u_char *) &icmpstat.IcmpOutTimeExcds; case ICMPOUTPARMPROBS: return (u_char *) &icmpstat.IcmpOutParmProbs; case ICMPOUTSRCQUENCHS: return (u_char *) &icmpstat.IcmpOutSrcQuenchs; case ICMPOUTREDIRECTS: return (u_char *) &icmpstat.IcmpOutRedirects; case ICMPOUTECHOS: return (u_char *) &icmpstat.IcmpOutEchos; case ICMPOUTECHOREPS: return (u_char *) &icmpstat.IcmpOutEchoReps; case ICMPOUTTIMESTAMPS: return (u_char *) &icmpstat.IcmpOutTimestamps; case ICMPOUTTIMESTAMPREPS: return (u_char *)&icmpstat.IcmpOutTimestampReps; case ICMPOUTADDRMASKS: return (u_char *) &icmpstat.IcmpOutAddrMasks; case ICMPOUTADDRMASKREPS: return (u_char *) &icmpstat.IcmpOutAddrMaskReps; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_icmp\n", vp->magic)); } return NULL;}#endif /* linux */#else /* solaris2 */u_char *var_icmp(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ mib2_icmp_t icmpstat; if (header_icmp(vp, name, length, exact, var_len, write_method) == MATCH_FAILED ) return(NULL); /* * Get the ICMP statistics from the kernel... */ if (getMibstat(MIB_ICMP, &icmpstat, sizeof(mib2_icmp_t), GET_FIRST, &Get_everything, NULL) < 0) return (NULL); /* Things are ugly ... */ switch (vp->magic){ case ICMPINMSGS: long_return = icmpstat.icmpInMsgs; break; case ICMPINERRORS: long_return = icmpstat.icmpInErrors; break; case ICMPINDESTUNREACHS: long_return = icmpstat.icmpInDestUnreachs; break; case ICMPINTIMEEXCDS: long_return = icmpstat.icmpInTimeExcds; break; case ICMPINPARMPROBS: long_return = icmpstat.icmpInParmProbs; break; case ICMPINSRCQUENCHS: long_return = icmpstat.icmpInSrcQuenchs; break; case ICMPINREDIRECTS: long_return = icmpstat.icmpInRedirects; break; case ICMPINECHOS: long_return = icmpstat.icmpInEchos; break; case ICMPINECHOREPS: long_return = icmpstat.icmpInEchoReps; break; case ICMPINTIMESTAMPS: long_return = icmpstat.icmpInTimestamps; break; case ICMPINTIMESTAMPREPS: long_return = icmpstat.icmpInTimestampReps; break; case ICMPINADDRMASKS: long_return = icmpstat.icmpInAddrMasks; break; case ICMPINADDRMASKREPS: long_return = icmpstat.icmpInAddrMaskReps; break; case ICMPOUTMSGS: long_return = icmpstat.icmpOutMsgs; break; case ICMPOUTERRORS: long_return = icmpstat.icmpOutErrors; break; case ICMPOUTDESTUNREACHS: long_return = icmpstat.icmpOutDestUnreachs; break; case ICMPOUTTIMEEXCDS: long_return = icmpstat.icmpOutTimeExcds; break; case ICMPOUTPARMPROBS: long_return = icmpstat.icmpOutParmProbs; break; case ICMPOUTSRCQUENCHS: long_return = icmpstat.icmpOutSrcQuenchs; break; case ICMPOUTREDIRECTS: long_return = icmpstat.icmpOutRedirects; break; case ICMPOUTECHOS: long_return = icmpstat.icmpOutEchos; break; case ICMPOUTECHOREPS: long_return = icmpstat.icmpOutEchoReps; break; case ICMPOUTTIMESTAMPS: long_return = icmpstat.icmpOutTimestamps; break; case ICMPOUTTIMESTAMPREPS: long_return = icmpstat.icmpOutTimestampReps; break; case ICMPOUTADDRMASKS: long_return = icmpstat.icmpOutAddrMasks; break; case ICMPOUTADDRMASKREPS: long_return = icmpstat.icmpOutAddrMaskReps; break; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_icmp\n", vp->magic)); return(NULL); } return ((u_char *) &long_return);}#endif /* solaris2 */ /********************* * * Internal implementation functions * *********************/#ifdef linux/* * lucky days. since 1.1.16 the icmp statistics are avail by the proc * file-system. */static voidlinux_read_icmp_stat (struct icmp_mib *icmpstat){ FILE *in = fopen ("/proc/net/snmp", "r"); char line [1024]; memset ((char *) icmpstat,(0), sizeof (*icmpstat)); if (! in) return; while (line == fgets (line, sizeof(line), in)) { if (26 == sscanf (line,"Icmp: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", &icmpstat->IcmpInMsgs, &icmpstat->IcmpInErrors, &icmpstat->IcmpInDestUnreachs, &icmpstat->IcmpInTimeExcds, &icmpstat->IcmpInParmProbs, &icmpstat->IcmpInSrcQuenchs, &icmpstat->IcmpInRedirects, &icmpstat->IcmpInEchos, &icmpstat->IcmpInEchoReps, &icmpstat->IcmpInTimestamps, &icmpstat->IcmpInTimestampReps, &icmpstat->IcmpInAddrMasks, &icmpstat->IcmpInAddrMaskReps, &icmpstat->IcmpOutMsgs, &icmpstat->IcmpOutErrors, &icmpstat->IcmpOutDestUnreachs, &icmpstat->IcmpOutTimeExcds, &icmpstat->IcmpOutParmProbs, &icmpstat->IcmpOutSrcQuenchs, &icmpstat->IcmpOutRedirects, &icmpstat->IcmpOutEchos, &icmpstat->IcmpOutEchoReps, &icmpstat->IcmpOutTimestamps, &icmpstat->IcmpOutTimestampReps, &icmpstat->IcmpOutAddrMasks, &icmpstat->IcmpOutAddrMaskReps)) break; } fclose (in);}#endif /* linux */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -