respondd.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <respondd.h>
  2. #include <json-c/json.h>
  3. #include <libgluonutil.h>
  4. #include <net/ethernet.h>
  5. #include <stdio.h>
  6. #include "mac.h"
  7. static struct json_object * get_radv_filter() {
  8. FILE *f = popen("exec ebtables --concurrent -L RADV_FILTER", "r");
  9. char *line = NULL;
  10. size_t len = 0;
  11. struct ether_addr mac = {};
  12. struct ether_addr unspec = {};
  13. char macstr[F_MAC_LEN + 1] = "";
  14. if (!f)
  15. return NULL;
  16. while (getline(&line, &len, f) > 0) {
  17. if (sscanf(line, "-s " F_MAC " -j ACCEPT\n", F_MAC_VAR_REF(mac)) == ETH_ALEN)
  18. break;
  19. }
  20. free(line);
  21. pclose(f);
  22. memset(&unspec, 0, sizeof(unspec));
  23. if (ether_addr_equal(mac, unspec)) {
  24. return NULL;
  25. } else {
  26. snprintf(macstr, sizeof(macstr), F_MAC, F_MAC_VAR(mac));
  27. return gluonutil_wrap_string(macstr);
  28. }
  29. }
  30. static struct json_object * respondd_provider_statistics() {
  31. struct json_object *ret = json_object_new_object();
  32. json_object_object_add(ret, "gateway6", get_radv_filter());
  33. return ret;
  34. }
  35. const struct respondd_provider_info respondd_providers[] = {
  36. {"statistics", respondd_provider_statistics},
  37. {}
  38. };