static int ath6kl_change_station(struct wiphy *wiphy, struct net_device *dev, u8 *mac, struct station_parameters *params) { struct ath6kl *ar = ath6kl_priv(dev); if (ar->nw_type != AP_NETWORK) return -EOPNOTSUPP; /* Use this only for authorizing/unauthorizing a station */ if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) return -EOPNOTSUPP; if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED)) return ath6kl_wmi_ap_set_mlme(ar->wmi, WMI_AP_MLME_AUTHORIZE, mac, 0); return ath6kl_wmi_ap_set_mlme(ar->wmi, WMI_AP_MLME_UNAUTHORIZE, mac, 0); }
static int ap_keepalive_update_check_txrx_time(struct ath6kl_vif *vif) { struct ath6kl *ar = vif->ar; struct wmi_ap_mode_stat *ap_stats = &vif->ap_stats; struct wmi_per_sta_stat *per_sta_stat; struct ath6kl_sta *conn; int i, action; if (test_bit(STATS_UPDATE_PEND, &vif->flags)) { ath6kl_info("somebody still query now and ignore it this time.\n"); return -EBUSY; } /* Now, tranfer to host time and update to vif->sta_list[]. */ for (i = 0; i < AP_MAX_NUM_STA; i++) { per_sta_stat = &ap_stats->sta[i]; if (per_sta_stat->aid) { conn = ath6kl_find_sta_by_aid(vif, per_sta_stat->aid); if (conn) { action = _ap_keepalive_update_check_txrx_time(vif, conn, per_sta_stat->last_txrx_time); if (action == AP_KA_ACTION_POLL) { ath6kl_wmi_ap_poll_sta(ar->wmi, vif->fw_vif_idx, conn->aid); } else if (action == AP_KA_ACTION_REMOVE) { ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx, WMI_AP_DEAUTH, conn->mac, WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY); } } else { ath6kl_err("can't find this AID %d in STA list\n", per_sta_stat->aid); } } } return 0; }