--- a/src/drivers/driver_nl80211_event.c +++ b/src/drivers/driver_nl80211_event.c @@ -1273,12 +1273,14 @@ static void nl80211_cqm_event(struct wpa [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, [NL80211_ATTR_CQM_BEACON_LOSS_EVENT] = { .type = NLA_FLAG }, + [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_U32 }, }; struct nlattr *cqm[NL80211_ATTR_CQM_MAX + 1]; enum nl80211_cqm_rssi_threshold_event event; union wpa_event_data ed; struct wpa_signal_info sig; - int res; + int res, rssi_level; + u8 *addr = NULL; if (tb[NL80211_ATTR_CQM] == NULL || nla_parse_nested(cqm, NL80211_ATTR_CQM_MAX, tb[NL80211_ATTR_CQM], @@ -1329,11 +1331,28 @@ static void nl80211_cqm_event(struct wpa } event = nla_get_u32(cqm[NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT]); + if (tb[NL80211_ATTR_MAC]) + addr = nla_data(tb[NL80211_ATTR_MAC]); + + rssi_level = (s32) nla_get_u32(cqm[NL80211_ATTR_CQM_RSSI_LEVEL]); + if (event == NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH) { + if (addr) { + wpa_msg(drv->ctx, MSG_INFO, "nl80211: CQM RSSI HIGH " + "event for "MACSTR " RSSI :%d", MAC2STR(addr), + rssi_level); + return; + } wpa_printf(MSG_DEBUG, "nl80211: Connection quality monitor " "event: RSSI high"); ed.signal_change.above_threshold = 1; } else if (event == NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW) { + if (addr) { + wpa_msg(drv->ctx, MSG_INFO, "nl80211: CQM RSSI LOW " + "event for "MACSTR " RSSI :%d", MAC2STR(addr), + rssi_level); + return; + } wpa_printf(MSG_DEBUG, "nl80211: Connection quality monitor " "event: RSSI low"); ed.signal_change.above_threshold = 0;