/* * sysctl interface for icmp stats for others than NetBSD */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kernel_sysctl.h" #if defined(NETSNMP_CAN_USE_SYSCTL) int sysctl_read_icmp_stat(struct icmp_mib *mib) { struct icmpstat icmpstat; size_t size = sizeof(icmpstat); int i; static int sname[4] = { CTL_NET, PF_INET, IPPROTO_ICMP, ICMPCTL_STATS }; (void)memset(mib, 0, sizeof(*mib)); if (-1 == sysctl(sname, 4, &icmpstat, &size, NULL, 0)) { snmp_perror("sysctl_read_icmp_stat: net.inet.icmp.stats"); return -1; } mib->icmpInMsgs = icmpstat.icps_badcode + icmpstat.icps_tooshort + icmpstat.icps_checksum + icmpstat.icps_badlen; mib->icmpInErrors = mib->icmpInMsgs; for (i = 0; i <= ICMP_MAXTYPE; i++) mib->icmpInMsgs += icmpstat.icps_inhist[i]; mib->icmpInDestUnreachs = icmpstat.icps_inhist[ICMP_UNREACH]; mib->icmpInTimeExcds = icmpstat.icps_inhist[ICMP_TIMXCEED]; mib->icmpInParmProbs = icmpstat.icps_inhist[ICMP_PARAMPROB]; mib->icmpInSrcQuenchs = icmpstat.icps_inhist[ICMP_SOURCEQUENCH]; mib->icmpInRedirects = icmpstat.icps_inhist[ICMP_REDIRECT]; mib->icmpInEchos = icmpstat.icps_inhist[ICMP_ECHO]; mib->icmpInEchoReps = icmpstat.icps_inhist[ICMP_ECHOREPLY]; mib->icmpInTimestamps = icmpstat.icps_inhist[ICMP_TSTAMP]; mib->icmpInTimestampReps = icmpstat.icps_inhist[ICMP_TSTAMPREPLY]; mib->icmpInAddrMasks = icmpstat.icps_inhist[ICMP_MASKREQ]; mib->icmpInAddrMaskReps = icmpstat.icps_inhist[ICMP_MASKREPLY]; mib->icmpOutMsgs = icmpstat.icps_oldshort + icmpstat.icps_oldicmp; for (i = 0; i <= ICMP_MAXTYPE; i++) mib->icmpOutMsgs += icmpstat.icps_outhist[i]; mib->icmpOutErrors = icmpstat.icps_oldshort + icmpstat.icps_oldicmp; mib->icmpOutDestUnreachs = icmpstat.icps_outhist[ICMP_UNREACH]; mib->icmpOutTimeExcds = icmpstat.icps_outhist[ICMP_TIMXCEED]; mib->icmpOutParmProbs = icmpstat.icps_outhist[ICMP_PARAMPROB]; mib->icmpOutSrcQuenchs = icmpstat.icps_outhist[ICMP_SOURCEQUENCH]; mib->icmpOutRedirects = icmpstat.icps_outhist[ICMP_REDIRECT]; mib->icmpOutEchos = icmpstat.icps_outhist[ICMP_ECHO]; mib->icmpOutEchoReps = icmpstat.icps_outhist[ICMP_ECHOREPLY]; mib->icmpOutTimestamps = icmpstat.icps_outhist[ICMP_TSTAMP]; mib->icmpOutTimestampReps = icmpstat.icps_outhist[ICMP_TSTAMPREPLY]; mib->icmpOutAddrMasks = icmpstat.icps_outhist[ICMP_MASKREQ]; mib->icmpOutAddrMaskReps = icmpstat.icps_outhist[ICMP_MASKREPLY]; return 0; } int sysctl_read_icmp6_stat(struct icmp6_mib *mib) { struct icmp6stat icmpstat; size_t size = sizeof(icmpstat); int i; static int sname[4] = { CTL_NET, PF_INET6, IPPROTO_ICMPV6, ICMPV6CTL_STATS }; (void)memset(mib, 0, sizeof(*mib)); if (-1 == sysctl(sname, 4, &icmpstat, &size, NULL, 0)) { snmp_perror("sysctl_read_icmp6_stat: net.inet6.icmp6.stats"); return -1; } mib->icmp6InMsgs = icmpstat.icp6s_badcode + icmpstat.icp6s_tooshort + icmpstat.icp6s_checksum + icmpstat.icp6s_badlen; mib->icmp6InErrors = mib->icmp6InMsgs; for (i = 0; i <= ICMP6_MAXTYPE; i++) mib->icmp6InMsgs += icmpstat.icp6s_inhist[i]; mib->icmp6InDestUnreachs = icmpstat.icp6s_inhist[ICMP6_DST_UNREACH]; mib->icmp6InPktTooBigs = icmpstat.icp6s_inhist[ICMP6_PACKET_TOO_BIG]; mib->icmp6InTimeExcds = icmpstat.icp6s_inhist[ICMP6_TIME_EXCEEDED]; mib->icmp6InParmProblems = icmpstat.icp6s_inhist[ICMP6_PARAM_PROB]; mib->icmp6InEchos = icmpstat.icp6s_inhist[ICMP6_ECHO_REQUEST]; mib->icmp6InEchoReplies = icmpstat.icp6s_inhist[ICMP6_ECHO_REPLY]; mib->icmp6InGroupMembQueries = icmpstat.icp6s_inhist[MLD_LISTENER_QUERY]; mib->icmp6InGroupMembResponses = icmpstat.icp6s_inhist[MLD_LISTENER_REPORT]; mib->icmp6InRouterSolicits = icmpstat.icp6s_inhist[ND_ROUTER_SOLICIT]; mib->icmp6InRouterAdvertisements = icmpstat.icp6s_inhist[ND_ROUTER_ADVERT]; mib->icmp6InNeighborSolicits = icmpstat.icp6s_inhist[ND_NEIGHBOR_SOLICIT]; mib->icmp6InNeighborAdvertisements = icmpstat.icp6s_inhist[ND_NEIGHBOR_ADVERT]; mib->icmp6InRedirects = icmpstat.icp6s_inhist[ND_REDIRECT]; mib->icmp6OutMsgs = icmpstat.icp6s_canterror + icmpstat.icp6s_toofreq; for (i = 0; i <= ICMP6_MAXTYPE; i++) mib->icmp6OutMsgs += icmpstat.icp6s_outhist[i]; mib->icmp6OutDestUnreachs = icmpstat.icp6s_outhist[ICMP6_DST_UNREACH]; mib->icmp6OutPktTooBigs = icmpstat.icp6s_outhist[ICMP6_PACKET_TOO_BIG]; mib->icmp6OutTimeExcds = icmpstat.icp6s_outhist[ICMP6_TIME_EXCEEDED]; mib->icmp6OutParmProblems = icmpstat.icp6s_outhist[ICMP6_PARAM_PROB]; mib->icmp6OutEchos = icmpstat.icp6s_outhist[ICMP6_ECHO_REQUEST]; mib->icmp6OutEchoReplies = icmpstat.icp6s_outhist[ICMP6_ECHO_REPLY]; mib->icmp6OutRouterSolicits = icmpstat.icp6s_outhist[ND_ROUTER_SOLICIT]; mib->icmp6OutNeighborSolicits = icmpstat.icp6s_outhist[ND_NEIGHBOR_SOLICIT]; mib->icmp6OutNeighborAdvertisements = icmpstat.icp6s_outhist[ND_NEIGHBOR_ADVERT]; mib->icmp6OutRedirects = icmpstat.icp6s_outhist[ND_REDIRECT]; mib->icmp6OutGroupMembResponses = icmpstat.icp6s_outhist[MLD_LISTENER_REPORT]; mib->icmp6OutGroupMembReductions = icmpstat.icp6s_outhist[MLD_LISTENER_DONE]; return 0; } int sysctl_read_icmp_msg_stat(struct icmp_mib *mib, struct icmp4_msg_mib *msgmib, int *flag) { sysctl_read_icmp_stat(mib); *flag = 0; return 0; } int sysctl_read_icmp6_msg_stat(struct icmp6_mib *mib, struct icmp6_msg_mib *msgmib, int *support) { struct icmp6stat icmpstat; size_t size = sizeof(icmpstat); int i; static int sname[4] = { CTL_NET, PF_INET6, IPPROTO_ICMPV6, ICMPV6CTL_STATS }; sysctl_read_icmp6_stat(mib); if (-1 == sysctl(sname, 4, &icmpstat, &size, NULL, 0)) { snmp_perror("sysctl_read_icmp6_stat: net.inet6.icmp6.stats"); return -1; } for (i = 0; i < 256; i++) { msgmib->vals[i].InType = icmpstat.icp6s_inhist[i]; msgmib->vals[i].OutType = icmpstat.icp6s_outhist[i]; } *support = 1; return 0; } #endif