int dhd_iscan_request(void * dhdp, uint16 action) { int rc; wl_iscan_params_t params; dhd_pub_t *dhd = dhd_bus_pub(dhdp); char buf[WLC_IOCTL_SMLEN]; DHD_TRACE(("%s: Entered\n", __FUNCTION__)); memset(¶ms, 0, sizeof(wl_iscan_params_t)); memcpy(¶ms.params.bssid, ðer_bcast, ETHER_ADDR_LEN); params.params.bss_type = DOT11_BSSTYPE_ANY; params.params.scan_type = DOT11_SCANTYPE_ACTIVE; params.params.nprobes = htod32(-1); params.params.active_time = htod32(-1); params.params.passive_time = htod32(-1); params.params.home_time = htod32(-1); params.params.channel_num = htod32(0); params.version = htod32(ISCAN_REQ_VERSION); params.action = htod16(action); params.scan_duration = htod16(0); bcm_mkiovar("iscan", (char *)¶ms, sizeof(wl_iscan_params_t), buf, WLC_IOCTL_SMLEN); rc = dhd_wl_ioctl_cmd(dhd, WLC_SET_VAR, buf, WLC_IOCTL_SMLEN, TRUE, 0); return rc; }
int dhd_iscan_request(void *dhdp, u16 action) { int rc; wl_iscan_params_t params; dhd_pub_t *dhd = dhd_bus_pub(dhdp); char buf[WLC_IOCTL_SMLEN]; memset(¶ms, 0, sizeof(wl_iscan_params_t)); memcpy(¶ms.params.bssid, ðer_bcast, ETH_ALEN); params.params.bss_type = DOT11_BSSTYPE_ANY; params.params.scan_type = DOT11_SCANTYPE_ACTIVE; params.params.nprobes = -1; params.params.active_time = -1; params.params.passive_time = -1; params.params.home_time = -1; params.params.channel_num = 0; params.version = ISCAN_REQ_VERSION; params.action = action; params.scan_duration = 0; bcm_mkiovar("iscan", (char *)¶ms, sizeof(wl_iscan_params_t), buf, WLC_IOCTL_SMLEN); rc = dhd_wl_ioctl(dhdp, WLC_SET_VAR, buf, WLC_IOCTL_SMLEN); return rc; }
static int dhd_iscan_get_partial_result(void *dhdp, uint *scan_count) { wl_iscan_results_t *list_buf; wl_iscan_results_t list; wl_scan_results_t *results; iscan_buf_t *iscan_cur; int status = -1; dhd_pub_t *dhd = dhd_bus_pub(dhdp); int rc; DHD_TRACE(("%s: Enter\n", __FUNCTION__)); iscan_cur = dhd_iscan_allocate_buf(dhd, &iscan_chain); if (!iscan_cur) { DHD_ERROR(("%s: Failed to allocate node\n", __FUNCTION__)); dhd_iscan_free_buf(dhdp, 0); dhd_iscan_request(dhdp, WL_SCAN_ACTION_ABORT); dhd_ind_scan_confirm(dhdp, FALSE); goto fail; } dhd_iscan_lock(); memset(iscan_cur->iscan_buf, 0, WLC_IW_ISCAN_MAXLEN); list_buf = (wl_iscan_results_t*)iscan_cur->iscan_buf; results = &list_buf->results; results->buflen = WL_ISCAN_RESULTS_FIXED_SIZE; results->version = 0; results->count = 0; memset(&list, 0, sizeof(list)); list.results.buflen = htod32(WLC_IW_ISCAN_MAXLEN); bcm_mkiovar("iscanresults", (char *)&list, WL_ISCAN_RESULTS_FIXED_SIZE, iscan_cur->iscan_buf, WLC_IW_ISCAN_MAXLEN); rc = dhd_wl_ioctl_cmd(dhd, WLC_GET_VAR, iscan_cur->iscan_buf, WLC_IW_ISCAN_MAXLEN, FALSE, 0); results->buflen = dtoh32(results->buflen); results->version = dtoh32(results->version); *scan_count = results->count = dtoh32(results->count); status = dtoh32(list_buf->status); DHD_TRACE(("%s: Got %d resuls\n", __FUNCTION__, results->count)); dhd_iscan_unlock(); if (!(*scan_count)) { dhd_iscan_free_buf(dhdp, iscan_cur); } fail: return status; }
static int dhd_iscan_get_partial_result(void *dhdp, uint *scan_count) { wl_iscan_results_t *list_buf; wl_iscan_results_t list; wl_scan_results_t *results; iscan_buf_t *iscan_cur; int status = -1; dhd_pub_t *dhd = dhd_bus_pub(dhdp); int rc; iscan_cur = dhd_iscan_allocate_buf(dhd, &iscan_chain); if (!iscan_cur) { DHD_ERROR(("%s: Failed to allocate node\n", __func__)); dhd_iscan_free_buf(dhdp, 0); dhd_iscan_request(dhdp, WL_SCAN_ACTION_ABORT); goto fail; } dhd_iscan_lock(); memset(iscan_cur->iscan_buf, 0, WLC_IW_ISCAN_MAXLEN); list_buf = (wl_iscan_results_t *) iscan_cur->iscan_buf; results = &list_buf->results; results->buflen = WL_ISCAN_RESULTS_FIXED_SIZE; results->version = 0; results->count = 0; memset(&list, 0, sizeof(list)); list.results.buflen = WLC_IW_ISCAN_MAXLEN; bcm_mkiovar("iscanresults", (char *)&list, WL_ISCAN_RESULTS_FIXED_SIZE, iscan_cur->iscan_buf, WLC_IW_ISCAN_MAXLEN); rc = dhd_wl_ioctl(dhdp, WLC_GET_VAR, iscan_cur->iscan_buf, WLC_IW_ISCAN_MAXLEN); results->buflen = results->buflen; results->version = results->version; *scan_count = results->count = results->count; status = list_buf->status; dhd_iscan_unlock(); if (!(*scan_count)) dhd_iscan_free_buf(dhdp, iscan_cur); else dhd_iscan_remove_duplicates(dhdp, iscan_cur); fail: return status; }
void dhd_iscan_free_buf(void *dhdp, iscan_buf_t *iscan_delete) { iscan_buf_t *iscanbuf_free = 0; iscan_buf_t *iscanbuf_prv = 0; iscan_buf_t *iscanbuf_cur; dhd_pub_t *dhd = dhd_bus_pub(dhdp); DHD_TRACE(("%s: Entered\n", __FUNCTION__)); dhd_iscan_lock(); iscanbuf_cur = iscan_chain; /* If iscan_delete is null then delete the entire * chain or else delete specific one provided */ if (!iscan_delete) { while (iscanbuf_cur) { iscanbuf_free = iscanbuf_cur; iscanbuf_cur = iscanbuf_cur->next; iscanbuf_free->next = 0; MFREE(dhd->osh, iscanbuf_free, sizeof(iscan_buf_t)); } iscan_chain = 0; } else { while (iscanbuf_cur) { if (iscanbuf_cur == iscan_delete) break; iscanbuf_prv = iscanbuf_cur; iscanbuf_cur = iscanbuf_cur->next; } if (iscanbuf_prv) iscanbuf_prv->next = iscan_delete->next; iscan_delete->next = 0; MFREE(dhd->osh, iscan_delete, sizeof(iscan_buf_t)); if (!iscanbuf_prv) iscan_chain = 0; } dhd_iscan_unlock(); }
void dhd_iscan_free_buf(void *dhdp, iscan_buf_t *iscan_delete) { iscan_buf_t *iscanbuf_free = 0; iscan_buf_t *iscanbuf_prv = 0; iscan_buf_t *iscanbuf_cur = iscan_chain; dhd_pub_t *dhd = dhd_bus_pub(dhdp); dhd_iscan_lock(); /* If iscan_delete is null then delete the entire * chain or else delete specific one provided */ if (!iscan_delete) { while (iscanbuf_cur) { iscanbuf_free = iscanbuf_cur; iscanbuf_cur = iscanbuf_cur->next; iscanbuf_free->next = 0; kfree(iscanbuf_free); } iscan_chain = 0; } else { while (iscanbuf_cur) { if (iscanbuf_cur == iscan_delete) break; iscanbuf_prv = iscanbuf_cur; iscanbuf_cur = iscanbuf_cur->next; } if (iscanbuf_prv) iscanbuf_prv->next = iscan_delete->next; iscan_delete->next = 0; kfree(iscan_delete); if (!iscanbuf_prv) iscan_chain = 0; } dhd_iscan_unlock(); }