freebsd_getifaddrs.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "plugin_freebsd.h"
  3. #include <ifaddrs.h>
  4. struct cgroup_network_interface {
  5. char *name;
  6. uint32_t hash;
  7. size_t len;
  8. // flags
  9. int configured;
  10. int enabled;
  11. int updated;
  12. int do_bandwidth;
  13. int do_packets;
  14. int do_errors;
  15. int do_drops;
  16. int do_events;
  17. // charts and dimensions
  18. RRDSET *st_bandwidth;
  19. RRDDIM *rd_bandwidth_in;
  20. RRDDIM *rd_bandwidth_out;
  21. RRDSET *st_packets;
  22. RRDDIM *rd_packets_in;
  23. RRDDIM *rd_packets_out;
  24. RRDDIM *rd_packets_m_in;
  25. RRDDIM *rd_packets_m_out;
  26. RRDSET *st_errors;
  27. RRDDIM *rd_errors_in;
  28. RRDDIM *rd_errors_out;
  29. RRDSET *st_drops;
  30. RRDDIM *rd_drops_in;
  31. RRDDIM *rd_drops_out;
  32. RRDSET *st_events;
  33. RRDDIM *rd_events_coll;
  34. struct cgroup_network_interface *next;
  35. };
  36. static struct cgroup_network_interface *network_interfaces_root = NULL, *network_interfaces_last_used = NULL;
  37. static size_t network_interfaces_added = 0, network_interfaces_found = 0;
  38. static void network_interface_free(struct cgroup_network_interface *ifm) {
  39. if (likely(ifm->st_bandwidth))
  40. rrdset_is_obsolete(ifm->st_bandwidth);
  41. if (likely(ifm->st_packets))
  42. rrdset_is_obsolete(ifm->st_packets);
  43. if (likely(ifm->st_errors))
  44. rrdset_is_obsolete(ifm->st_errors);
  45. if (likely(ifm->st_drops))
  46. rrdset_is_obsolete(ifm->st_drops);
  47. if (likely(ifm->st_events))
  48. rrdset_is_obsolete(ifm->st_events);
  49. network_interfaces_added--;
  50. freez(ifm->name);
  51. freez(ifm);
  52. }
  53. static void network_interfaces_cleanup() {
  54. if (likely(network_interfaces_found == network_interfaces_added)) return;
  55. struct cgroup_network_interface *ifm = network_interfaces_root, *last = NULL;
  56. while(ifm) {
  57. if (unlikely(!ifm->updated)) {
  58. // info("Removing network interface '%s', linked after '%s'", ifm->name, last?last->name:"ROOT");
  59. if (network_interfaces_last_used == ifm)
  60. network_interfaces_last_used = last;
  61. struct cgroup_network_interface *t = ifm;
  62. if (ifm == network_interfaces_root || !last)
  63. network_interfaces_root = ifm = ifm->next;
  64. else
  65. last->next = ifm = ifm->next;
  66. t->next = NULL;
  67. network_interface_free(t);
  68. }
  69. else {
  70. last = ifm;
  71. ifm->updated = 0;
  72. ifm = ifm->next;
  73. }
  74. }
  75. }
  76. static struct cgroup_network_interface *get_network_interface(const char *name) {
  77. struct cgroup_network_interface *ifm;
  78. uint32_t hash = simple_hash(name);
  79. // search it, from the last position to the end
  80. for(ifm = network_interfaces_last_used ; ifm ; ifm = ifm->next) {
  81. if (unlikely(hash == ifm->hash && !strcmp(name, ifm->name))) {
  82. network_interfaces_last_used = ifm->next;
  83. return ifm;
  84. }
  85. }
  86. // search it from the beginning to the last position we used
  87. for(ifm = network_interfaces_root ; ifm != network_interfaces_last_used ; ifm = ifm->next) {
  88. if (unlikely(hash == ifm->hash && !strcmp(name, ifm->name))) {
  89. network_interfaces_last_used = ifm->next;
  90. return ifm;
  91. }
  92. }
  93. // create a new one
  94. ifm = callocz(1, sizeof(struct cgroup_network_interface));
  95. ifm->name = strdupz(name);
  96. ifm->hash = simple_hash(ifm->name);
  97. ifm->len = strlen(ifm->name);
  98. network_interfaces_added++;
  99. // link it to the end
  100. if (network_interfaces_root) {
  101. struct cgroup_network_interface *e;
  102. for(e = network_interfaces_root; e->next ; e = e->next) ;
  103. e->next = ifm;
  104. }
  105. else
  106. network_interfaces_root = ifm;
  107. return ifm;
  108. }
  109. // --------------------------------------------------------------------------------------------------------------------
  110. // getifaddrs
  111. int do_getifaddrs(int update_every, usec_t dt) {
  112. (void)dt;
  113. #define DEFAULT_EXCLUDED_INTERFACES "lo*"
  114. #define DEFAULT_PHYSICAL_INTERFACES "igb* ix* cxl* em* ixl* ixlv* bge* ixgbe* vtnet* vmx* re* igc* dwc*"
  115. #define CONFIG_SECTION_GETIFADDRS "plugin:freebsd:getifaddrs"
  116. static int enable_new_interfaces = -1;
  117. static int do_bandwidth_ipv4 = -1, do_bandwidth_ipv6 = -1, do_bandwidth = -1, do_packets = -1, do_bandwidth_net = -1, do_packets_net = -1,
  118. do_errors = -1, do_drops = -1, do_events = -1;
  119. static SIMPLE_PATTERN *excluded_interfaces = NULL, *physical_interfaces = NULL;
  120. if (unlikely(enable_new_interfaces == -1)) {
  121. enable_new_interfaces = config_get_boolean_ondemand(CONFIG_SECTION_GETIFADDRS,
  122. "enable new interfaces detected at runtime",
  123. CONFIG_BOOLEAN_AUTO);
  124. do_bandwidth_net = config_get_boolean_ondemand(CONFIG_SECTION_GETIFADDRS, "total bandwidth for physical interfaces",
  125. CONFIG_BOOLEAN_AUTO);
  126. do_packets_net = config_get_boolean_ondemand(CONFIG_SECTION_GETIFADDRS, "total packets for physical interfaces",
  127. CONFIG_BOOLEAN_AUTO);
  128. do_bandwidth_ipv4 = config_get_boolean_ondemand(CONFIG_SECTION_GETIFADDRS, "total bandwidth for ipv4 interfaces",
  129. CONFIG_BOOLEAN_AUTO);
  130. do_bandwidth_ipv6 = config_get_boolean_ondemand(CONFIG_SECTION_GETIFADDRS, "total bandwidth for ipv6 interfaces",
  131. CONFIG_BOOLEAN_AUTO);
  132. do_bandwidth = config_get_boolean_ondemand(CONFIG_SECTION_GETIFADDRS, "bandwidth for all interfaces",
  133. CONFIG_BOOLEAN_AUTO);
  134. do_packets = config_get_boolean_ondemand(CONFIG_SECTION_GETIFADDRS, "packets for all interfaces",
  135. CONFIG_BOOLEAN_AUTO);
  136. do_errors = config_get_boolean_ondemand(CONFIG_SECTION_GETIFADDRS, "errors for all interfaces",
  137. CONFIG_BOOLEAN_AUTO);
  138. do_drops = config_get_boolean_ondemand(CONFIG_SECTION_GETIFADDRS, "drops for all interfaces",
  139. CONFIG_BOOLEAN_AUTO);
  140. do_events = config_get_boolean_ondemand(CONFIG_SECTION_GETIFADDRS, "collisions for all interfaces",
  141. CONFIG_BOOLEAN_AUTO);
  142. excluded_interfaces = simple_pattern_create(
  143. config_get(CONFIG_SECTION_GETIFADDRS, "disable by default interfaces matching", DEFAULT_EXCLUDED_INTERFACES)
  144. , NULL
  145. , SIMPLE_PATTERN_EXACT
  146. );
  147. physical_interfaces = simple_pattern_create(
  148. config_get(CONFIG_SECTION_GETIFADDRS, "set physical interfaces for system.net", DEFAULT_PHYSICAL_INTERFACES)
  149. , NULL
  150. , SIMPLE_PATTERN_EXACT
  151. );
  152. }
  153. if (likely(do_bandwidth_ipv4 || do_bandwidth_ipv6 || do_bandwidth || do_packets || do_errors || do_bandwidth_net || do_packets_net ||
  154. do_drops || do_events)) {
  155. struct ifaddrs *ifap;
  156. if (unlikely(getifaddrs(&ifap))) {
  157. error("FREEBSD: getifaddrs() failed");
  158. do_bandwidth_net = 0;
  159. error("DISABLED: system.net chart");
  160. do_packets_net = 0;
  161. error("DISABLED: system.packets chart");
  162. do_bandwidth_ipv4 = 0;
  163. error("DISABLED: system.ipv4 chart");
  164. do_bandwidth_ipv6 = 0;
  165. error("DISABLED: system.ipv6 chart");
  166. do_bandwidth = 0;
  167. error("DISABLED: net.* charts");
  168. do_packets = 0;
  169. error("DISABLED: net_packets.* charts");
  170. do_errors = 0;
  171. error("DISABLED: net_errors.* charts");
  172. do_drops = 0;
  173. error("DISABLED: net_drops.* charts");
  174. do_events = 0;
  175. error("DISABLED: net_events.* charts");
  176. error("DISABLED: getifaddrs module");
  177. return 1;
  178. } else {
  179. #define IFA_DATA(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s)
  180. struct ifaddrs *ifa;
  181. struct iftot {
  182. u_long ift_ibytes;
  183. u_long ift_obytes;
  184. u_long ift_ipackets;
  185. u_long ift_opackets;
  186. u_long ift_imcasts;
  187. u_long ift_omcasts;
  188. } iftot = {0, 0, 0, 0, 0, 0};
  189. // --------------------------------------------------------------------
  190. if (likely(do_bandwidth_net)) {
  191. iftot.ift_ibytes = iftot.ift_obytes = 0;
  192. for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
  193. if (ifa->ifa_addr->sa_family != AF_LINK)
  194. continue;
  195. if (!simple_pattern_matches(physical_interfaces, ifa->ifa_name))
  196. continue;
  197. iftot.ift_ibytes += IFA_DATA(ibytes);
  198. iftot.ift_obytes += IFA_DATA(obytes);
  199. }
  200. static RRDSET *st = NULL;
  201. static RRDDIM *rd_in = NULL, *rd_out = NULL;
  202. if (unlikely(!st)) {
  203. st = rrdset_create_localhost("system",
  204. "net",
  205. NULL,
  206. "network",
  207. NULL,
  208. "Network Traffic",
  209. "kilobits/s",
  210. "freebsd.plugin",
  211. "getifaddrs",
  212. NETDATA_CHART_PRIO_SYSTEM_NET,
  213. update_every,
  214. RRDSET_TYPE_AREA
  215. );
  216. rd_in = rrddim_add(st, "InOctets", "received", 8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
  217. rd_out = rrddim_add(st, "OutOctets", "sent", -8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
  218. } else
  219. rrdset_next(st);
  220. rrddim_set_by_pointer(st, rd_in, iftot.ift_ibytes);
  221. rrddim_set_by_pointer(st, rd_out, iftot.ift_obytes);
  222. rrdset_done(st);
  223. }
  224. // --------------------------------------------------------------------
  225. if (likely(do_packets_net)) {
  226. iftot.ift_ipackets = iftot.ift_opackets = iftot.ift_imcasts = iftot.ift_omcasts = 0;
  227. for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
  228. if (ifa->ifa_addr->sa_family != AF_LINK)
  229. continue;
  230. if (!simple_pattern_matches(physical_interfaces, ifa->ifa_name))
  231. continue;
  232. iftot.ift_ipackets += IFA_DATA(ipackets);
  233. iftot.ift_opackets += IFA_DATA(opackets);
  234. iftot.ift_imcasts += IFA_DATA(imcasts);
  235. iftot.ift_omcasts += IFA_DATA(omcasts);
  236. }
  237. static RRDSET *st = NULL;
  238. static RRDDIM *rd_packets_in = NULL, *rd_packets_out = NULL, *rd_packets_m_in = NULL, *rd_packets_m_out = NULL;
  239. if (unlikely(!st)) {
  240. st = rrdset_create_localhost("system",
  241. "packets",
  242. NULL,
  243. "network",
  244. NULL,
  245. "Network Packets",
  246. "packets/s",
  247. "freebsd.plugin",
  248. "getifaddrs",
  249. NETDATA_CHART_PRIO_SYSTEM_PACKETS,
  250. update_every,
  251. RRDSET_TYPE_LINE
  252. );
  253. rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
  254. rd_packets_in = rrddim_add(st, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  255. rd_packets_out = rrddim_add(st, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
  256. rd_packets_m_in = rrddim_add(st, "multicast_received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  257. rd_packets_m_out = rrddim_add(st, "multicast_sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
  258. } else
  259. rrdset_next(st);
  260. rrddim_set_by_pointer(st, rd_packets_in, iftot.ift_ipackets);
  261. rrddim_set_by_pointer(st, rd_packets_out, iftot.ift_opackets);
  262. rrddim_set_by_pointer(st, rd_packets_m_in, iftot.ift_imcasts);
  263. rrddim_set_by_pointer(st, rd_packets_m_out, iftot.ift_omcasts);
  264. rrdset_done(st);
  265. }
  266. // --------------------------------------------------------------------
  267. if (likely(do_bandwidth_ipv4)) {
  268. iftot.ift_ibytes = iftot.ift_obytes = 0;
  269. for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
  270. if (ifa->ifa_addr->sa_family != AF_INET)
  271. continue;
  272. iftot.ift_ibytes += IFA_DATA(ibytes);
  273. iftot.ift_obytes += IFA_DATA(obytes);
  274. }
  275. static RRDSET *st = NULL;
  276. static RRDDIM *rd_in = NULL, *rd_out = NULL;
  277. if (unlikely(!st)) {
  278. st = rrdset_create_localhost("system",
  279. "ipv4",
  280. NULL,
  281. "network",
  282. NULL,
  283. "IPv4 Bandwidth",
  284. "kilobits/s",
  285. "freebsd.plugin",
  286. "getifaddrs",
  287. NETDATA_CHART_PRIO_SYSTEM_IPV4,
  288. update_every,
  289. RRDSET_TYPE_AREA
  290. );
  291. rd_in = rrddim_add(st, "InOctets", "received", 8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
  292. rd_out = rrddim_add(st, "OutOctets", "sent", -8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
  293. } else
  294. rrdset_next(st);
  295. rrddim_set_by_pointer(st, rd_in, iftot.ift_ibytes);
  296. rrddim_set_by_pointer(st, rd_out, iftot.ift_obytes);
  297. rrdset_done(st);
  298. }
  299. // --------------------------------------------------------------------
  300. if (likely(do_bandwidth_ipv6)) {
  301. iftot.ift_ibytes = iftot.ift_obytes = 0;
  302. for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
  303. if (ifa->ifa_addr->sa_family != AF_INET6)
  304. continue;
  305. iftot.ift_ibytes += IFA_DATA(ibytes);
  306. iftot.ift_obytes += IFA_DATA(obytes);
  307. }
  308. static RRDSET *st = NULL;
  309. static RRDDIM *rd_in = NULL, *rd_out = NULL;
  310. if (unlikely(!st)) {
  311. st = rrdset_create_localhost("system",
  312. "ipv6",
  313. NULL,
  314. "network",
  315. NULL,
  316. "IPv6 Bandwidth",
  317. "kilobits/s",
  318. "freebsd.plugin",
  319. "getifaddrs",
  320. NETDATA_CHART_PRIO_SYSTEM_IPV6,
  321. update_every,
  322. RRDSET_TYPE_AREA
  323. );
  324. rd_in = rrddim_add(st, "received", NULL, 8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
  325. rd_out = rrddim_add(st, "sent", NULL, -8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
  326. } else
  327. rrdset_next(st);
  328. rrddim_set_by_pointer(st, rd_in, iftot.ift_ibytes);
  329. rrddim_set_by_pointer(st, rd_out, iftot.ift_obytes);
  330. rrdset_done(st);
  331. }
  332. // --------------------------------------------------------------------
  333. network_interfaces_found = 0;
  334. for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
  335. if (ifa->ifa_addr->sa_family != AF_LINK)
  336. continue;
  337. struct cgroup_network_interface *ifm = get_network_interface(ifa->ifa_name);
  338. ifm->updated = 1;
  339. network_interfaces_found++;
  340. if (unlikely(!ifm->configured)) {
  341. char var_name[4096 + 1];
  342. // this is the first time we see this network interface
  343. // remember we configured it
  344. ifm->configured = 1;
  345. ifm->enabled = enable_new_interfaces;
  346. if (likely(ifm->enabled))
  347. ifm->enabled = !simple_pattern_matches(excluded_interfaces, ifa->ifa_name);
  348. snprintfz(var_name, 4096, "%s:%s", CONFIG_SECTION_GETIFADDRS, ifa->ifa_name);
  349. ifm->enabled = config_get_boolean_ondemand(var_name, "enabled", ifm->enabled);
  350. if (unlikely(ifm->enabled == CONFIG_BOOLEAN_NO))
  351. continue;
  352. ifm->do_bandwidth = config_get_boolean_ondemand(var_name, "bandwidth", do_bandwidth);
  353. ifm->do_packets = config_get_boolean_ondemand(var_name, "packets", do_packets);
  354. ifm->do_errors = config_get_boolean_ondemand(var_name, "errors", do_errors);
  355. ifm->do_drops = config_get_boolean_ondemand(var_name, "drops", do_drops);
  356. ifm->do_events = config_get_boolean_ondemand(var_name, "events", do_events);
  357. }
  358. if (unlikely(!ifm->enabled))
  359. continue;
  360. // --------------------------------------------------------------------
  361. if (ifm->do_bandwidth == CONFIG_BOOLEAN_YES || (ifm->do_bandwidth == CONFIG_BOOLEAN_AUTO &&
  362. (IFA_DATA(ibytes) ||
  363. IFA_DATA(obytes) ||
  364. netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
  365. if (unlikely(!ifm->st_bandwidth)) {
  366. ifm->st_bandwidth = rrdset_create_localhost("net",
  367. ifa->ifa_name,
  368. NULL,
  369. ifa->ifa_name,
  370. "net.net",
  371. "Bandwidth",
  372. "kilobits/s",
  373. "freebsd.plugin",
  374. "getifaddrs",
  375. NETDATA_CHART_PRIO_FIRST_NET_IFACE,
  376. update_every,
  377. RRDSET_TYPE_AREA
  378. );
  379. ifm->rd_bandwidth_in = rrddim_add(ifm->st_bandwidth, "received", NULL, 8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
  380. ifm->rd_bandwidth_out = rrddim_add(ifm->st_bandwidth, "sent", NULL, -8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
  381. } else
  382. rrdset_next(ifm->st_bandwidth);
  383. rrddim_set_by_pointer(ifm->st_bandwidth, ifm->rd_bandwidth_in, IFA_DATA(ibytes));
  384. rrddim_set_by_pointer(ifm->st_bandwidth, ifm->rd_bandwidth_out, IFA_DATA(obytes));
  385. rrdset_done(ifm->st_bandwidth);
  386. }
  387. // --------------------------------------------------------------------
  388. if (ifm->do_packets == CONFIG_BOOLEAN_YES || (ifm->do_packets == CONFIG_BOOLEAN_AUTO &&
  389. (IFA_DATA(ipackets) ||
  390. IFA_DATA(opackets) ||
  391. IFA_DATA(imcasts) ||
  392. IFA_DATA(omcasts) ||
  393. netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
  394. if (unlikely(!ifm->st_packets)) {
  395. ifm->st_packets = rrdset_create_localhost("net_packets",
  396. ifa->ifa_name,
  397. NULL,
  398. ifa->ifa_name,
  399. "net.packets",
  400. "Packets",
  401. "packets/s",
  402. "freebsd.plugin",
  403. "getifaddrs",
  404. NETDATA_CHART_PRIO_FIRST_NET_PACKETS,
  405. update_every,
  406. RRDSET_TYPE_LINE
  407. );
  408. rrdset_flag_set(ifm->st_packets, RRDSET_FLAG_DETAIL);
  409. ifm->rd_packets_in = rrddim_add(ifm->st_packets, "received", NULL, 1, 1,
  410. RRD_ALGORITHM_INCREMENTAL);
  411. ifm->rd_packets_out = rrddim_add(ifm->st_packets, "sent", NULL, -1, 1,
  412. RRD_ALGORITHM_INCREMENTAL);
  413. ifm->rd_packets_m_in = rrddim_add(ifm->st_packets, "multicast_received", NULL, 1, 1,
  414. RRD_ALGORITHM_INCREMENTAL);
  415. ifm->rd_packets_m_out = rrddim_add(ifm->st_packets, "multicast_sent", NULL, -1, 1,
  416. RRD_ALGORITHM_INCREMENTAL);
  417. } else
  418. rrdset_next(ifm->st_packets);
  419. rrddim_set_by_pointer(ifm->st_packets, ifm->rd_packets_in, IFA_DATA(ipackets));
  420. rrddim_set_by_pointer(ifm->st_packets, ifm->rd_packets_out, IFA_DATA(opackets));
  421. rrddim_set_by_pointer(ifm->st_packets, ifm->rd_packets_m_in, IFA_DATA(imcasts));
  422. rrddim_set_by_pointer(ifm->st_packets, ifm->rd_packets_m_out, IFA_DATA(omcasts));
  423. rrdset_done(ifm->st_packets);
  424. }
  425. // --------------------------------------------------------------------
  426. if (ifm->do_errors == CONFIG_BOOLEAN_YES || (ifm->do_errors == CONFIG_BOOLEAN_AUTO &&
  427. (IFA_DATA(ierrors) ||
  428. IFA_DATA(oerrors) ||
  429. netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
  430. if (unlikely(!ifm->st_errors)) {
  431. ifm->st_errors = rrdset_create_localhost("net_errors",
  432. ifa->ifa_name,
  433. NULL,
  434. ifa->ifa_name,
  435. "net.errors",
  436. "Interface Errors",
  437. "errors/s",
  438. "freebsd.plugin",
  439. "getifaddrs",
  440. NETDATA_CHART_PRIO_FIRST_NET_ERRORS,
  441. update_every,
  442. RRDSET_TYPE_LINE
  443. );
  444. rrdset_flag_set(ifm->st_errors, RRDSET_FLAG_DETAIL);
  445. ifm->rd_errors_in = rrddim_add(ifm->st_errors, "inbound", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  446. ifm->rd_errors_out = rrddim_add(ifm->st_errors, "outbound", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
  447. } else
  448. rrdset_next(ifm->st_errors);
  449. rrddim_set_by_pointer(ifm->st_errors, ifm->rd_errors_in, IFA_DATA(ierrors));
  450. rrddim_set_by_pointer(ifm->st_errors, ifm->rd_errors_out, IFA_DATA(oerrors));
  451. rrdset_done(ifm->st_errors);
  452. }
  453. // --------------------------------------------------------------------
  454. if (ifm->do_drops == CONFIG_BOOLEAN_YES || (ifm->do_drops == CONFIG_BOOLEAN_AUTO &&
  455. (IFA_DATA(iqdrops) ||
  456. #if __FreeBSD__ >= 11
  457. IFA_DATA(oqdrops) ||
  458. #endif
  459. netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
  460. if (unlikely(!ifm->st_drops)) {
  461. ifm->st_drops = rrdset_create_localhost("net_drops",
  462. ifa->ifa_name,
  463. NULL,
  464. ifa->ifa_name,
  465. "net.drops",
  466. "Interface Drops",
  467. "drops/s",
  468. "freebsd.plugin",
  469. "getifaddrs",
  470. NETDATA_CHART_PRIO_FIRST_NET_DROPS,
  471. update_every,
  472. RRDSET_TYPE_LINE
  473. );
  474. rrdset_flag_set(ifm->st_drops, RRDSET_FLAG_DETAIL);
  475. ifm->rd_drops_in = rrddim_add(ifm->st_drops, "inbound", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  476. #if __FreeBSD__ >= 11
  477. ifm->rd_drops_out = rrddim_add(ifm->st_drops, "outbound", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
  478. #endif
  479. } else
  480. rrdset_next(ifm->st_drops);
  481. rrddim_set_by_pointer(ifm->st_drops, ifm->rd_drops_in, IFA_DATA(iqdrops));
  482. #if __FreeBSD__ >= 11
  483. rrddim_set_by_pointer(ifm->st_drops, ifm->rd_drops_out, IFA_DATA(oqdrops));
  484. #endif
  485. rrdset_done(ifm->st_drops);
  486. }
  487. // --------------------------------------------------------------------
  488. if (ifm->do_events == CONFIG_BOOLEAN_YES || (ifm->do_events == CONFIG_BOOLEAN_AUTO &&
  489. (IFA_DATA(collisions) ||
  490. netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))) {
  491. if (unlikely(!ifm->st_events)) {
  492. ifm->st_events = rrdset_create_localhost("net_events",
  493. ifa->ifa_name,
  494. NULL,
  495. ifa->ifa_name,
  496. "net.events",
  497. "Network Interface Events",
  498. "events/s",
  499. "freebsd.plugin",
  500. "getifaddrs",
  501. NETDATA_CHART_PRIO_FIRST_NET_EVENTS,
  502. update_every,
  503. RRDSET_TYPE_LINE
  504. );
  505. rrdset_flag_set(ifm->st_events, RRDSET_FLAG_DETAIL);
  506. ifm->rd_events_coll = rrddim_add(ifm->st_events, "collisions", NULL, -1, 1,
  507. RRD_ALGORITHM_INCREMENTAL);
  508. } else
  509. rrdset_next(ifm->st_events);
  510. rrddim_set_by_pointer(ifm->st_events, ifm->rd_events_coll, IFA_DATA(collisions));
  511. rrdset_done(ifm->st_events);
  512. }
  513. }
  514. freeifaddrs(ifap);
  515. }
  516. } else {
  517. error("DISABLED: getifaddrs module");
  518. return 1;
  519. }
  520. network_interfaces_cleanup();
  521. return 0;
  522. }