/* * set named iovar given the parameter buffer * iovar name is converted to lower case */ int wlu_iovar_set(void *wl, const char *iovar, void *param, int paramlen) { char smbuf[WLC_IOCTL_SMLEN*2]; memset(smbuf, 0, sizeof(smbuf)); return wlu_iovar_setbuf(wl, iovar, param, paramlen, smbuf, sizeof(smbuf)); }
int wl_p2p_scan(void *wl, uint16 sync_id, int isActive, int numProbes, int activeDwellTime, int passiveDwellTime, int num_channels, uint16 *channels) { wl_p2p_scan_t *params = NULL; int params_size = 0; int malloc_size = 0; int nssid = 0; int err = 0; wl_escan_params_t *eparams; malloc_size = sizeof(wl_p2p_scan_t); malloc_size += OFFSETOF(wl_escan_params_t, params) + WL_SCAN_PARAMS_FIXED_SIZE + WL_NUMCHANNELS * sizeof(uint16); malloc_size += WL_SCAN_PARAMS_SSID_MAX * sizeof(wlc_ssid_t); params = (wl_p2p_scan_t *)malloc(malloc_size); if (params == NULL) { fprintf(stderr, "Error allocating %d bytes for scan params\n", malloc_size); return -1; } memset(params, 0, malloc_size); eparams = (wl_escan_params_t *)(params+1); params->type = 'E'; eparams->version = htod32(ESCAN_REQ_VERSION); eparams->action = htod16(WL_SCAN_ACTION_START); eparams->sync_id = sync_id; memcpy(&eparams->params.bssid, ðer_bcast, ETHER_ADDR_LEN); eparams->params.bss_type = DOT11_BSSTYPE_ANY; eparams->params.scan_type = isActive ? 0 : WL_SCANFLAGS_PASSIVE; eparams->params.nprobes = htod32(numProbes); eparams->params.active_time = htod32(activeDwellTime); eparams->params.passive_time = htod32(passiveDwellTime); eparams->params.home_time = htod32(-1); eparams->params.channel_num = 0; memcpy(eparams->params.channel_list, channels, num_channels * sizeof(uint16)); eparams->params.channel_num = htod32((nssid << WL_SCAN_PARAMS_NSSID_SHIFT) | (num_channels & WL_SCAN_PARAMS_COUNT_MASK)); params_size = sizeof(wl_p2p_scan_t) + sizeof(wl_escan_params_t) + WL_SCAN_PARAMS_FIXED_SIZE+ (num_channels * sizeof(uint16)) + (nssid * sizeof(wlc_ssid_t)); err = wlu_iovar_setbuf(wl, "p2p_scan", params, params_size, buf, WLC_IOCTL_MAXLEN); free(params); return err; }
static int escan(void *wl, uint16 action, uint16 sync_id, int isActive, int numProbes, int activeDwellTime, int passiveDwellTime, int num_channels, uint16 *channels) { int params_size = (WL_SCAN_PARAMS_FIXED_SIZE + OFFSETOF(wl_escan_params_t, params)) + (WL_NUMCHANNELS * sizeof(uint16)); wl_escan_params_t *params; int nssid = 0; int err; params_size += WL_SCAN_PARAMS_SSID_MAX * sizeof(wlc_ssid_t); params = (wl_escan_params_t*)malloc(params_size); if (params == NULL) { return -1; } memset(params, 0, params_size); memcpy(¶ms->params.bssid, ðer_bcast, ETHER_ADDR_LEN); params->params.bss_type = DOT11_BSSTYPE_ANY; params->params.scan_type = isActive ? 0 : WL_SCANFLAGS_PASSIVE; params->params.nprobes = htod32(numProbes); params->params.active_time = htod32(activeDwellTime); params->params.passive_time = htod32(passiveDwellTime); params->params.home_time = htod32(-1); params->params.channel_num = 0; params_size = sizeof(*params); params->version = htod32(ESCAN_REQ_VERSION); params->action = htod16(action); params->sync_id = htod16(sync_id); memcpy(params->params.channel_list, channels, num_channels * sizeof(uint16)); params->params.channel_num = htod32((nssid << WL_SCAN_PARAMS_NSSID_SHIFT) | (num_channels & WL_SCAN_PARAMS_COUNT_MASK)); params_size = (WL_SCAN_PARAMS_FIXED_SIZE + OFFSETOF(wl_escan_params_t, params)) + (num_channels * sizeof(uint16)) + (nssid * sizeof(wlc_ssid_t)); err = wlu_iovar_setbuf(wl, "escan", params, params_size, buf, WLC_IOCTL_MAXLEN); free(params); return err; }