/** * update entry stats (checking for counter wrap) * * @retval 0 : success * @retval <0 : error */ int netsnmp_access_systemstats_entry_update_stats(netsnmp_systemstats_entry * prev_vals, netsnmp_systemstats_entry * new_vals) { DEBUGMSGTL(("access:systemstats", "check_wrap\n")); /* * sanity checks */ if ((NULL == prev_vals) || (NULL == new_vals) || (prev_vals->index[0] != new_vals->index[0]) || (prev_vals->index[1] != new_vals->index[1])) return -1; /* * if we've determined that we have 64 bit counters, just copy them. */ if (0 == need_wrap_check) { memcpy(&prev_vals->stats, &new_vals->stats, sizeof(new_vals->stats)); _calculate_entries(prev_vals); return 0; } if (NULL == prev_vals->old_stats) { /* * if we don't have old stats, they can't have wrapped, so just copy */ prev_vals->old_stats = SNMP_MALLOC_TYPEDEF(netsnmp_ipstats); if (NULL == prev_vals->old_stats) { return -2; } } else { /* * update straight 32 bit counters */ memcpy(&prev_vals->stats.columnAvail[0], &new_vals->stats.columnAvail[0], sizeof(new_vals->stats.columnAvail)); prev_vals->stats.InHdrErrors = new_vals->stats.InHdrErrors; prev_vals->stats.InAddrErrors = new_vals->stats.InAddrErrors; prev_vals->stats.InUnknownProtos = new_vals->stats.InUnknownProtos; prev_vals->stats.InTruncatedPkts = new_vals->stats.InTruncatedPkts; prev_vals->stats.ReasmReqds = new_vals->stats.ReasmReqds; prev_vals->stats.ReasmOKs = new_vals->stats.ReasmOKs; prev_vals->stats.ReasmFails = new_vals->stats.ReasmFails; prev_vals->stats.InDiscards = new_vals->stats.InDiscards; /* * update 64bit counters */ if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCInNoRoutes, &new_vals->stats.HCInNoRoutes, &prev_vals->old_stats->HCInNoRoutes, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCInNoRoutes to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutNoRoutes, &new_vals->stats.HCOutNoRoutes, &prev_vals->old_stats->HCOutNoRoutes, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutNoRoutes to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutDiscards, &new_vals->stats.HCOutDiscards, &prev_vals->old_stats->HCOutDiscards, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutDiscards to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutFragReqds, &new_vals->stats.HCOutFragReqds, &prev_vals->old_stats->HCOutFragReqds, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutFragReqds to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutFragOKs, &new_vals->stats.HCOutFragOKs, &prev_vals->old_stats->HCOutFragOKs, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutFragOKs to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutFragFails, &new_vals->stats.HCOutFragFails, &prev_vals->old_stats->HCOutFragFails, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutFragFails to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutFragCreates, &new_vals->stats.HCOutFragCreates, &prev_vals->old_stats->HCOutFragCreates, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutFragCreates to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCInReceives, &new_vals->stats.HCInReceives, &prev_vals->old_stats->HCInReceives, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCInReceives to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCInOctets, &new_vals->stats.HCInOctets, &prev_vals->old_stats->HCInOctets, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCInOctets to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCInForwDatagrams, &new_vals->stats.HCInForwDatagrams, &prev_vals->old_stats->HCInForwDatagrams, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCInForwDatagrams to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCInDelivers, &new_vals->stats.HCInDelivers, &prev_vals->old_stats->HCInDelivers, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCInDelivers to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutRequests, &new_vals->stats.HCOutRequests, &prev_vals->old_stats->HCOutRequests, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutRequests to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutForwDatagrams, &new_vals->stats.HCOutForwDatagrams, &prev_vals->old_stats->HCOutForwDatagrams, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutForwDatagrams to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutTransmits, &new_vals->stats.HCOutTransmits, &prev_vals->old_stats->HCOutTransmits, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutTransmits to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutOctets, &new_vals->stats.HCOutOctets, &prev_vals->old_stats->HCOutOctets, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutOctets to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCInMcastPkts, &new_vals->stats.HCInMcastPkts, &prev_vals->old_stats->HCInMcastPkts, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCInMcastPkts to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCInMcastOctets, &new_vals->stats.HCInMcastOctets, &prev_vals->old_stats->HCInMcastOctets, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCInMcastOctets to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutMcastPkts, &new_vals->stats.HCOutMcastPkts, &prev_vals->old_stats->HCOutMcastPkts, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutMcastPkts to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutMcastOctets, &new_vals->stats.HCOutMcastOctets, &prev_vals->old_stats->HCOutMcastOctets, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutMcastOctets to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCInBcastPkts, &new_vals->stats.HCInBcastPkts, &prev_vals->old_stats->HCInBcastPkts, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCInBcastPkts to 64bits in %s\n", prev_vals->tableName)); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.HCOutBcastPkts, &new_vals->stats.HCOutBcastPkts, &prev_vals->old_stats->HCOutBcastPkts, &need_wrap_check)) NETSNMP_LOGONCE((LOG_ERR, "Error expanding HCOutBcastPkts to 64bits in %s\n", prev_vals->tableName)); } /* * if we've decided we no longer need to check wraps, free old stats */ if (0 == need_wrap_check) { SNMP_FREE(prev_vals->old_stats); } else { /* * update old stats from new stats. * careful - old_stats is a pointer to stats... */ memcpy(prev_vals->old_stats, &new_vals->stats, sizeof(new_vals->stats)); } _calculate_entries(prev_vals); return 0; }
/** * update stats * * @retval 0 : success * @retval -1 : error */ int netsnmp_access_interface_entry_update_stats(netsnmp_interface_entry * prev_vals, netsnmp_interface_entry * new_vals) { DEBUGMSGTL(("access:interface", "check_wrap\n")); /* * sanity checks */ if ((NULL == prev_vals) || (NULL == new_vals) || (NULL == prev_vals->name) || (NULL == new_vals->name) || (0 != strncmp(prev_vals->name, new_vals->name, strlen(prev_vals->name)))) return -1; /* * if we've determined that we have 64 bit counters, just copy them. */ if (0 == need_wrap_check) { memcpy(&prev_vals->stats, &new_vals->stats, sizeof(new_vals->stats)); return 0; } if (NULL == prev_vals->old_stats) { /* * if we don't have old stats, copy previous stats */ prev_vals->old_stats = SNMP_MALLOC_TYPEDEF(netsnmp_interface_stats); if (NULL == prev_vals->old_stats) { return -2; } memcpy(prev_vals->old_stats, &prev_vals->stats, sizeof(prev_vals->stats)); } if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.ibytes, &new_vals->stats.ibytes, &prev_vals->old_stats->ibytes, &need_wrap_check)) DEBUGMSGTL(("access:interface", "Error expanding ifHCInOctets to 64bits\n")); if (new_vals->ns_flags & NETSNMP_INTERFACE_FLAGS_CALCULATE_UCAST) { if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.iall, &new_vals->stats.iall, &prev_vals->old_stats->iall, &need_wrap_check)) DEBUGMSGTL(("access:interface", "Error expanding packet count to 64bits\n")); } else { if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.iucast, &new_vals->stats.iucast, &prev_vals->old_stats->iucast, &need_wrap_check)) DEBUGMSGTL(("access:interface", "Error expanding ifHCInUcastPkts to 64bits\n")); } if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.iucast, &new_vals->stats.iucast, &prev_vals->old_stats->iucast, &need_wrap_check)) DEBUGMSGTL(("access:interface", "Error expanding ifHCInUcastPkts to 64bits\n")); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.imcast, &new_vals->stats.imcast, &prev_vals->old_stats->imcast, &need_wrap_check)) DEBUGMSGTL(("access:interface", "Error expanding ifHCInMulticastPkts to 64bits\n")); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.ibcast, &new_vals->stats.ibcast, &prev_vals->old_stats->ibcast, &need_wrap_check)) DEBUGMSGTL(("access:interface", "Error expanding ifHCInBroadcastPkts to 64bits\n")); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.obytes, &new_vals->stats.obytes, &prev_vals->old_stats->obytes, &need_wrap_check)) DEBUGMSGTL(("access:interface", "Error expanding ifHCOutOctets to 64bits\n")); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.oucast, &new_vals->stats.oucast, &prev_vals->old_stats->oucast, &need_wrap_check)) DEBUGMSGTL(("access:interface", "Error expanding ifHCOutUcastPkts to 64bits\n")); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.omcast, &new_vals->stats.omcast, &prev_vals->old_stats->omcast, &need_wrap_check)) DEBUGMSGTL(("access:interface", "Error expanding ifHCOutMulticastPkts to 64bits\n")); if (0 != netsnmp_c64_check32_and_update(&prev_vals->stats.obcast, &new_vals->stats.obcast, &prev_vals->old_stats->obcast, &need_wrap_check)) DEBUGMSGTL(("access:interface", "Error expanding ifHCOutBroadcastPkts to 64bits\n")); /* * Copy 32 bit counters */ prev_vals->stats.ierrors = new_vals->stats.ierrors; prev_vals->stats.idiscards = new_vals->stats.idiscards; prev_vals->stats.iunknown_protos = new_vals->stats.iunknown_protos; prev_vals->stats.inucast = new_vals->stats.inucast; prev_vals->stats.oerrors = new_vals->stats.oerrors; prev_vals->stats.odiscards = new_vals->stats.odiscards; prev_vals->stats.oqlen = new_vals->stats.oqlen; prev_vals->stats.collisions = new_vals->stats.collisions; prev_vals->stats.onucast = new_vals->stats.onucast; /* * if we've decided we no longer need to check wraps, free old stats */ if (0 == need_wrap_check) { SNMP_FREE(prev_vals->old_stats); } else { /* * update old stats from new stats. * careful - old_stats is a pointer to stats... */ memcpy(prev_vals->old_stats, &new_vals->stats, sizeof(new_vals->stats)); } return 0; }