static int qtnf_dump_station(struct wiphy *wiphy, struct net_device *dev, int idx, u8 *mac, struct station_info *sinfo) { struct qtnf_vif *vif = qtnf_netdev_get_priv(dev); const struct qtnf_sta_node *sta_node; int ret; sta_node = qtnf_sta_list_lookup_index(&vif->sta_list, idx); if (unlikely(!sta_node)) return -ENOENT; ether_addr_copy(mac, sta_node->mac_addr); ret = qtnf_cmd_get_sta_info(vif, sta_node->mac_addr, sinfo); if (unlikely(ret == -ENOENT)) { qtnf_sta_list_del(&vif->sta_list, mac); cfg80211_del_sta(vif->netdev, mac, GFP_KERNEL); sinfo->filled = 0; } return ret; }
static int qtnf_event_handle_sta_deauth(struct qtnf_wmac *mac, struct qtnf_vif *vif, const struct qlink_event_sta_deauth *sta_deauth, u16 len) { const u8 *sta_addr; u16 reason; if (unlikely(len < sizeof(*sta_deauth))) { pr_err("VIF%u.%u: payload is too short (%u < %zu)\n", mac->macid, vif->vifid, len, sizeof(struct qlink_event_sta_deauth)); return -EINVAL; } if (vif->wdev.iftype != NL80211_IFTYPE_AP) { pr_err("VIF%u.%u: STA_DEAUTH event when not in AP mode\n", mac->macid, vif->vifid); return -EPROTO; } sta_addr = sta_deauth->sta_addr; reason = le16_to_cpu(sta_deauth->reason); pr_debug("VIF%u.%u: MAC:%pM reason:%x\n", mac->macid, vif->vifid, sta_addr, reason); if (qtnf_sta_list_del(vif, sta_addr)) cfg80211_del_sta(vif->netdev, sta_deauth->sta_addr, GFP_KERNEL); return 0; }