/** * @brief 802.11h uap start channel check * * @param pmadapter A pointer to mlan_adapter structure * @param pioctl_req A pointer to ioctl request buffer * * @return MLAN_STATUS_PENDING --success, otherwise fail * @sa wlan_uap_callback_11h_channel_check_req */ static mlan_status wlan_uap_11h_channel_check_req(IN pmlan_adapter pmadapter, IN pmlan_ioctl_req pioctl_req) { mlan_status ret = MLAN_STATUS_SUCCESS; mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; ENTER(); if (pioctl_req->buf_len < sizeof(mlan_ds_11h_cfg)) { PRINTM(MWARN, "MLAN 11h_cfg IOCTL length is too short.\n"); pioctl_req->data_read_written = 0; pioctl_req->buf_len_needed = sizeof(mlan_ds_11h_cfg); LEAVE(); return MLAN_STATUS_RESOURCE; } /* store params, issue command to get UAP channel, whose CMD_RESP will callback remainder of 11H channel check handling */ pmpriv->uap_state_chan_cb.pioctl_req_curr = pioctl_req; pmpriv->uap_state_chan_cb.get_chan_callback = wlan_uap_callback_11h_channel_check_req; ret = wlan_uap_get_channel(pmpriv); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; LEAVE(); return ret; }
/** * @brief Set SNMP MIB for 11H * * @param pmadapter A pointer to mlan_adapter structure * @param pioctl_req A pointer to ioctl request buffer * * @return MLAN_STATUS_PENDING --success, otherwise fail * @sa wlan_uap_callback_snmp_mib_11h */ static mlan_status wlan_uap_snmp_mib_11h(IN pmlan_adapter pmadapter, IN pmlan_ioctl_req pioctl_req) { mlan_status ret = MLAN_STATUS_SUCCESS; mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; mlan_ds_snmp_mib *snmp = MNULL; t_bool enable; ENTER(); if (pioctl_req->buf_len < sizeof(mlan_ds_snmp_mib)) { PRINTM(MWARN, "MLAN snmp_mib IOCTL length is too short.\n"); pioctl_req->data_read_written = 0; pioctl_req->buf_len_needed = sizeof(mlan_ds_snmp_mib); LEAVE(); return MLAN_STATUS_RESOURCE; } snmp = (mlan_ds_snmp_mib *) pioctl_req->pbuf; enable = (snmp->param.oid_value) ? MTRUE : MFALSE; if (enable) { /* first enable 11D if it is not enabled */ if (!wlan_11d_is_enabled(pmpriv)) { ret = wlan_11d_enable(pmpriv, MNULL, ENABLE_11D); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Failed to first enable 11D before enabling 11H.\n"); LEAVE(); return ret; } } } /* store params, issue command to get UAP channel, whose CMD_RESP will callback remainder of 11H handling (and radar detect if DFS chan) */ pmpriv->uap_state_chan_cb.pioctl_req_curr = pioctl_req; pmpriv->uap_state_chan_cb.get_chan_callback = wlan_uap_callback_snmp_mib_11h; ret = wlan_uap_get_channel(pmpriv); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; LEAVE(); return ret; }
/** * @sa wlan_uap_callback_bss_ioctl_start */ static mlan_status wlan_uap_bss_ioctl_start(IN pmlan_adapter pmadapter, IN pmlan_ioctl_req pioctl_req) { mlan_status ret = MLAN_STATUS_SUCCESS; pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; ENTER(); /* First check channel report, defer BSS_START CMD to callback. */ /* store params, issue command to get UAP channel, whose CMD_RESP will callback remainder of bss_start handling */ pmpriv->uap_state_chan_cb.pioctl_req_curr = pioctl_req; pmpriv->uap_state_chan_cb.get_chan_callback = wlan_uap_callback_bss_ioctl_start; ret = wlan_uap_get_channel(pmpriv); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; LEAVE(); return ret; }
/** * @brief Set Domain Info for 11D * * @param pmadapter A pointer to mlan_adapter structure * @param pioctl_req A pointer to ioctl request buffer * * @return MLAN_STATUS_PENDING --success, otherwise fail * @sa wlan_uap_callback_domain_info */ static mlan_status wlan_uap_domain_info(IN pmlan_adapter pmadapter, IN pmlan_ioctl_req pioctl_req) { mlan_status ret = MLAN_STATUS_SUCCESS; mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; ENTER(); if (pioctl_req->buf_len < sizeof(mlan_ds_11d_cfg)) { PRINTM(MWARN, "MLAN 11d_cfg IOCTL length is too short.\n"); pioctl_req->data_read_written = 0; pioctl_req->buf_len_needed = sizeof(mlan_ds_11d_cfg); LEAVE(); return MLAN_STATUS_RESOURCE; } if ((pioctl_req->action == MLAN_ACT_SET) && pmpriv->uap_bss_started) { PRINTM(MIOCTL, "Domain_info cannot be changed while UAP bss is started.\n"); pioctl_req->data_read_written = 0; LEAVE(); return MLAN_STATUS_FAILURE; } /* store params, issue command to get UAP channel, whose CMD_RESP will callback remainder of domain_info handling */ pmpriv->uap_state_chan_cb.pioctl_req_curr = pioctl_req; pmpriv->uap_state_chan_cb.get_chan_callback = wlan_uap_callback_domain_info; ret = wlan_uap_get_channel(pmpriv); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; LEAVE(); return ret; }