static int ifmib_scan_interfaces(struct ifstat_driver *driver, struct ifstat_list *ifs) { int count, i; struct ifmibdata ifmd; if ((count = get_ifcount()) <= 0) return 0; for (i = 1; i <= count; i++) { if (!get_ifdata(i, &ifmd)) continue; examine_interface(ifs, ifmd.ifmd_name, ifmd.ifmd_flags, ifmd.ifmd_data.ifi_type); } return 1; }
int get_net_data(const char * _dev, struct net_data * _data) { int i; int name[6]; size_t len; struct ifmibdata ifmd; int ifcount = get_ifcount(); int found_device = 0; len = sizeof(ifmd); name[0] = CTL_NET; name[1] = PF_LINK; name[2] = NETLINK_GENERIC; name[3] = IFMIB_IFDATA; name[5] = IFDATA_GENERAL; for (i = 1; i <= ifcount; i++) { name[4] = i; sysctl(name, 6, &ifmd, &len, (void *) 0, 0); if (!strcmp(ifmd.ifmd_name, _dev)) { _data->s = ifmd.ifmd_data.ifi_obytes; _data->r = ifmd.ifmd_data.ifi_ibytes; found_device = 1; break; } } if (!found_device || ifcount == 0) return -1; return 0; }
static int ifmib_get_stats(struct ifstat_driver *driver, struct ifstat_list *ifs) { int count, i; struct ifmibdata ifmd; struct ifstat_data *cur; if (ifs->flags & IFSTAT_HASINDEX) { /* poll by index */ for (cur = ifs->first; cur != NULL; cur = cur->next) { i = ifstat_get_interface_index(cur); if (i < 0 || !get_ifdata(i, &ifmd)) continue; if (strcmp(ifstat_get_interface_name(cur), ifmd.ifmd_name)) continue; ifstat_set_interface_stats(cur, ifmd.ifmd_data.ifi_ibytes, ifmd.ifmd_data.ifi_obytes); ifstat_set_interface_index(cur, i); } return 1; } if ((count = get_ifcount()) <= 0) return 0; for (i = 1; i <= count; i++) { if (!get_ifdata(i, &ifmd)) continue; if ((cur = ifstat_get_interface(ifs, ifmd.ifmd_name)) == NULL) continue; ifstat_set_interface_stats(cur, ifmd.ifmd_data.ifi_ibytes, ifmd.ifmd_data.ifi_obytes); ifstat_set_interface_index(cur, i); } return 1; }