setter.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "setter.h"
  2. #include <linux/nl80211.h>
  3. #include <netlink/attr.h>
  4. #include <netlink/genl/genl.h>
  5. #include <netlink/msg.h>
  6. #include <netlink/netlink.h>
  7. #include <netlink/socket.h>
  8. #include "log.h"
  9. #include "monitor.h"
  10. static int oldpwr = 15;
  11. static int minpwr = 6;
  12. int maxpwr = 15;
  13. static int minstrength = 15;
  14. static int maxstrenght = 80;
  15. static int minchange = 40;
  16. static int maxchange = 55;
  17. int setter(int oldval, int newval, Wifi *w) {
  18. log_out_v("SETTER", "setter called %i -> %i\n", oldval, newval);
  19. Netlink nl;
  20. nl.id = initNl80211(&nl, w, NULL);
  21. if (nl.id < 0) {
  22. log_err("SETTER", "Error initializing netlink 802.11\n");
  23. exit(EXIT_FAILURE);
  24. }
  25. int txpwr = calculate_pwr(oldpwr, newval);
  26. oldpwr = txpwr;
  27. // xxx txpwr in dBm to kernel in mBm
  28. int result = setpwr(&nl, w, 100 * txpwr);
  29. nl_close(nl.socket);
  30. nl_socket_free(nl.socket);
  31. return result;
  32. }
  33. static int setpwr(Netlink *nl, Wifi *w, int txpwr) {
  34. nl->result = 1;
  35. struct nl_msg* msg = nlmsg_alloc();
  36. if (!msg) {
  37. log_err("SETPWR", "Failed to allocate netlink message.\n");
  38. return -1;
  39. }
  40. if (genlmsg_put(msg, NL_AUTO_PORT, NL_AUTO_SEQ, nl->id, 0, 0,
  41. NL80211_CMD_SET_WIPHY, 0) == NULL) {
  42. log_err("SETPWR", "Error creating message\n");
  43. return -1;
  44. }
  45. nla_put_u32(msg, NL80211_ATTR_IFINDEX, w->ifindex);
  46. nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_SETTING, NL80211_TX_POWER_FIXED);
  47. nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, txpwr);
  48. int result = nl_send_auto(nl->socket, msg);
  49. if (result < 0) {
  50. log_err("SETPWR", "Error sending request\n");
  51. return -1;
  52. }
  53. nlmsg_free(msg);
  54. return 1;
  55. }
  56. static int calculate_pwr(int oldpwr, int newval) {
  57. if (newval > maxchange || newval < minchange) {
  58. float current_state = (float)(newval - minstrength) / (maxstrenght - minstrength);
  59. float multplier = .5 / current_state;
  60. int newpwr = oldpwr * multplier;
  61. log_out("CALCULATE_PWR", "calculated newpwr as %i\n", newpwr);
  62. if (newpwr > maxpwr)
  63. return maxpwr;
  64. if (newpwr < minpwr)
  65. return minpwr;
  66. return newpwr;
  67. }
  68. log_out("CALCULATE_PWR", "not changing\n");
  69. return oldpwr;
  70. }