346-protmode_trig.patch 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. --- a/net80211/ieee80211.c
  2. +++ b/net80211/ieee80211.c
  3. @@ -333,7 +333,9 @@ ieee80211_ifattach(struct ieee80211com *
  4. IEEE80211_MS_TO_TU(IEEE80211_BMISSTHRESH_DEFAULT_MS),
  5. ic->ic_lintval), ic->ic_lintval);
  6. }
  7. -
  8. + ic->ic_protmode_timeout = IEEE80211_PROTMODE_TIMEOUT;
  9. + ic->ic_protmode_rssi = IEEE80211_PROTMODE_RSSITHR;
  10. +
  11. IEEE80211_LOCK_INIT(ic, "ieee80211com");
  12. IEEE80211_VAPS_LOCK_INIT(ic, "ieee80211com_vaps");
  13. TAILQ_INIT(&ic->ic_vaps);
  14. --- a/net80211/ieee80211_input.c
  15. +++ b/net80211/ieee80211_input.c
  16. @@ -3411,14 +3411,18 @@ ieee80211_recv_mgmt(struct ieee80211vap
  17. IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) {
  18. /* Assume no ERP IE == 11b AP */
  19. - if ((!has_erp || (has_erp && (scan.erp & IEEE80211_ERP_NON_ERP_PRESENT))) &&
  20. - !(ic->ic_flags & IEEE80211_F_USEPROT)) {
  21. + if ((!has_erp || (has_erp &&
  22. + (scan.erp & IEEE80211_ERP_NON_ERP_PRESENT))) &&
  23. + (rssi > ic->ic_protmode_rssi)) {
  24. struct ieee80211vap *tmpvap;
  25. - ic->ic_flags |= IEEE80211_F_USEPROT;
  26. - TAILQ_FOREACH(tmpvap, &ic->ic_vaps, iv_next) {
  27. - tmpvap->iv_flags_ext |= IEEE80211_FEXT_ERPUPDATE;
  28. + if (!(ic->ic_flags & IEEE80211_F_USEPROT)) {
  29. + ic->ic_flags |= IEEE80211_F_USEPROT;
  30. + TAILQ_FOREACH(tmpvap, &ic->ic_vaps, iv_next) {
  31. + tmpvap->iv_flags_ext |= IEEE80211_FEXT_ERPUPDATE;
  32. + }
  33. }
  34. + ic->ic_protmode_lasttrig = jiffies;
  35. }
  36. }
  37. --- a/net80211/ieee80211_ioctl.h
  38. +++ b/net80211/ieee80211_ioctl.h
  39. @@ -643,6 +643,8 @@ enum {
  40. IEEE80211_PARAM_BEACON_MISS_THRESH_MS = 74, /* Beacon miss threshold (in ms) */
  41. IEEE80211_PARAM_MAXRATE = 75, /* Maximum rate (by table index) */
  42. IEEE80211_PARAM_MINRATE = 76, /* Maximum rate (by table index) */
  43. + IEEE80211_PARAM_PROTMODE_RSSI = 77, /* RSSI Threshold for enabling protection mode */
  44. + IEEE80211_PARAM_PROTMODE_TIMEOUT = 78, /* Timeout for expiring protection mode */
  45. };
  46. #define SIOCG80211STATS (SIOCDEVPRIVATE+2)
  47. --- a/net80211/ieee80211_var.h
  48. +++ b/net80211/ieee80211_var.h
  49. @@ -128,6 +128,9 @@
  50. #define IEEE80211_APPIE_MAX 1024
  51. +#define IEEE80211_PROTMODE_RSSITHR 15 /* default rssi threshold for protection mode trigger */
  52. +#define IEEE80211_PROTMODE_TIMEOUT 30 /* timeout for keeping protection mode alive */
  53. +
  54. #define IEEE80211_PWRCONSTRAINT_VAL(ic) \
  55. (((ic)->ic_bsschan->ic_maxregpower > (ic)->ic_curchanmaxpwr) ? \
  56. (ic)->ic_bsschan->ic_maxregpower - (ic)->ic_curchanmaxpwr : 0)
  57. @@ -324,6 +327,9 @@ struct ieee80211com {
  58. u_int16_t ic_newtxpowlimit; /* tx power limit to change to (in 0.5 dBm) */
  59. u_int16_t ic_uapsdmaxtriggers; /* max triggers that could arrive */
  60. u_int8_t ic_coverageclass; /* coverage class */
  61. + u_int8_t ic_protmode_rssi; /* rssi threshold for protection mode */
  62. + u_int64_t ic_protmode_lasttrig; /* last trigger for protection mode */
  63. + u_int16_t ic_protmode_timeout; /* protection mode timeout */
  64. /* Channel state:
  65. *
  66. --- a/net80211/ieee80211_wireless.c
  67. +++ b/net80211/ieee80211_wireless.c
  68. @@ -2312,6 +2312,12 @@ ieee80211_ioctl_setparam(struct net_devi
  69. IEEE80211_IS_CHAN_ANYG(ic->ic_bsschan))
  70. retv = ENETRESET;
  71. break;
  72. + case IEEE80211_PARAM_PROTMODE_TIMEOUT:
  73. + ic->ic_protmode_timeout = value;
  74. + break;
  75. + case IEEE80211_PARAM_PROTMODE_RSSI:
  76. + ic->ic_protmode_rssi = value;
  77. + break;
  78. case IEEE80211_PARAM_MCASTCIPHER:
  79. if ((vap->iv_caps & cipher2cap(value)) == 0 &&
  80. !ieee80211_crypto_available(vap, value))
  81. @@ -2955,6 +2961,12 @@ ieee80211_ioctl_getparam(struct net_devi
  82. case IEEE80211_PARAM_PROTMODE:
  83. param[0] = ic->ic_protmode;
  84. break;
  85. + case IEEE80211_PARAM_PROTMODE_TIMEOUT:
  86. + param[0] = ic->ic_protmode_timeout;
  87. + break;
  88. + case IEEE80211_PARAM_PROTMODE_RSSI:
  89. + param[0] = ic->ic_protmode_rssi;
  90. + break;
  91. case IEEE80211_PARAM_MCASTCIPHER:
  92. param[0] = rsn->rsn_mcastcipher;
  93. break;
  94. @@ -5346,6 +5358,14 @@ static const struct iw_priv_args ieee802
  95. IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "protmode" },
  96. { IEEE80211_PARAM_PROTMODE,
  97. 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_protmode" },
  98. + { IEEE80211_PARAM_PROTMODE_RSSI,
  99. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "protrssi" },
  100. + { IEEE80211_PARAM_PROTMODE_RSSI,
  101. + 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_protrssi" },
  102. + { IEEE80211_PARAM_PROTMODE_TIMEOUT,
  103. + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "prottime" },
  104. + { IEEE80211_PARAM_PROTMODE_TIMEOUT,
  105. + 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_prottime" },
  106. { IEEE80211_PARAM_MCASTCIPHER,
  107. IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "mcastcipher" },
  108. { IEEE80211_PARAM_MCASTCIPHER,
  109. --- a/net80211/ieee80211_node.c
  110. +++ b/net80211/ieee80211_node.c
  111. @@ -1877,6 +1877,17 @@ ieee80211_node_timeout(unsigned long arg
  112. ieee80211_scan_timeout(ic);
  113. ieee80211_timeout_stations(&ic->ic_sta);
  114. + if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
  115. + (ic->ic_protmode_lasttrig + ic->ic_protmode_timeout * HZ <
  116. + jiffies)) {
  117. + struct ieee80211vap *tmpvap;
  118. +
  119. + /* expire protection mode */
  120. + ic->ic_flags &= ~IEEE80211_F_USEPROT;
  121. + TAILQ_FOREACH(tmpvap, &ic->ic_vaps, iv_next) {
  122. + tmpvap->iv_flags_ext |= IEEE80211_FEXT_ERPUPDATE;
  123. + }
  124. + }
  125. ic->ic_inact.expires = jiffies + IEEE80211_INACT_WAIT * HZ;
  126. add_timer(&ic->ic_inact);