void add_roam_cache(wl_bss_info_t *bi) { int i; uint8 channel; char chanbuf[CHANSPEC_STR_LEN]; #if defined(CUSTOMER_HW4) && defined(WES_SUPPORT) if (roamscan_mode == ROAMSCAN_MODE_WES) return; #endif if (n_roam_cache >= MAX_ROAM_CACHE) return; for (i = 0; i < n_roam_cache; i++) { if ((roam_cache[i].ssid_len == bi->SSID_len) && (roam_cache[i].chanspec == bi->chanspec) && (memcmp(roam_cache[i].ssid, bi->SSID, bi->SSID_len) == 0)) { /* identical one found, just return */ return; } } roam_cache[n_roam_cache].ssid_len = bi->SSID_len; channel = wf_chspec_ctlchan(bi->chanspec); WL_DBG(("CHSPEC = %s, CTL %d\n", wf_chspec_ntoa_ex(bi->chanspec, chanbuf), channel)); roam_cache[n_roam_cache].chanspec = (channel <= CH_MAX_2G_CHANNEL ? band2G : band5G) | band_bw | channel; memcpy(roam_cache[n_roam_cache].ssid, bi->SSID, bi->SSID_len); n_roam_cache++; }
/* given a chanspec and a string buffer, format the chanspec as a * string, and return the original pointer a. * Min buffer length must be CHANSPEC_STR_LEN. * On error return NULL */ char * wf_chspec_ntoa(chanspec_t chspec, char *buf) { const char *band; uint ctl_chan; if (wf_chspec_malformed(chspec)) return NULL; band = ""; /* check for non-default band spec */ if ((CHSPEC_IS2G(chspec) && CHSPEC_CHANNEL(chspec) > CH_MAX_2G_CHANNEL) || (CHSPEC_IS5G(chspec) && CHSPEC_CHANNEL(chspec) <= CH_MAX_2G_CHANNEL)) band = (CHSPEC_IS2G(chspec)) ? "2g" : "5g"; /* ctl channel */ ctl_chan = wf_chspec_ctlchan(chspec); /* bandwidth and ctl sideband */ if (CHSPEC_IS20(chspec)) { snprintf(buf, CHANSPEC_STR_LEN, "%s%d", band, ctl_chan); } else if (!CHSPEC_IS8080(chspec)) { const char *bw; const char *sb = ""; bw = wf_chspec_bw_str[(chspec & WL_CHANSPEC_BW_MASK) >> WL_CHANSPEC_BW_SHIFT]; #ifdef CHANSPEC_NEW_40MHZ_FORMAT /* ctl sideband string if needed for 2g 40MHz */ if (CHSPEC_IS40(chspec) && CHSPEC_IS2G(chspec)) { sb = CHSPEC_SB_UPPER(chspec) ? "u" : "l"; } snprintf(buf, CHANSPEC_STR_LEN, "%s%d/%s%s", band, ctl_chan, bw, sb); #else /* ctl sideband string instead of BW for 40MHz */ if (CHSPEC_IS40(chspec)) { sb = CHSPEC_SB_UPPER(chspec) ? "u" : "l"; snprintf(buf, CHANSPEC_STR_LEN, "%s%d%s", band, ctl_chan, sb); } else { snprintf(buf, CHANSPEC_STR_LEN, "%s%d/%s", band, ctl_chan, bw); } #endif /* CHANSPEC_NEW_40MHZ_FORMAT */ } else {
char * wf_chspec_ntoa(chanspec_t chspec, char *buf) { const char *band; uint ctl_chan; if (wf_chspec_malformed(chspec)) return NULL; band = ""; if ((CHSPEC_IS2G(chspec) && CHSPEC_CHANNEL(chspec) > CH_MAX_2G_CHANNEL) || (CHSPEC_IS5G(chspec) && CHSPEC_CHANNEL(chspec) <= CH_MAX_2G_CHANNEL)) band = (CHSPEC_IS2G(chspec)) ? "2g" : "5g"; ctl_chan = wf_chspec_ctlchan(chspec); if (CHSPEC_IS20(chspec)) { snprintf(buf, CHANSPEC_STR_LEN, "%s%d", band, ctl_chan); } else if (!CHSPEC_IS8080(chspec)) { const char *bw; const char *sb = ""; bw = wf_chspec_bw_str[(chspec & WL_CHANSPEC_BW_MASK) >> WL_CHANSPEC_BW_SHIFT]; #ifdef CHANSPEC_NEW_40MHZ_FORMAT if (CHSPEC_IS40(chspec) && CHSPEC_IS2G(chspec)) { sb = CHSPEC_SB_UPPER(chspec) ? "u" : "l"; } snprintf(buf, CHANSPEC_STR_LEN, "%s%d/%s%s", band, ctl_chan, bw, sb); #else if (CHSPEC_IS40(chspec)) { sb = CHSPEC_SB_UPPER(chspec) ? "u" : "l"; snprintf(buf, CHANSPEC_STR_LEN, "%s%d%s", band, ctl_chan, sb); } else { snprintf(buf, CHANSPEC_STR_LEN, "%s%d/%s", band, ctl_chan, bw); } #endif } else {
static int lua_get_ch(lua_State *L, void *wl, lua_cmd_t *cmd, char *argv) { int err; uint32 val = 0; chanspec_t chanspec = 0; if ((err = wlu_iovar_getint(wl, cmd->name, (int*)&val)) < 0) { return err; } chanspec = wl_chspec32_from_driver(val); val = wf_chspec_ctlchan(chanspec); lua_pushnumber(L, val); return 0; }
s32 wl_cfgnan_notify_nan_status(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev, const wl_event_msg_t *event, void *data) { s32 ret = BCME_OK; u16 data_len; u32 event_num; s32 event_type; nan_event_hdr_t nan_hdr; wl_nan_tlv_data_t tlv_data; u8 *buf = NULL; u32 buf_len; u8 *ptr; u16 kflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL; if (!event || !data) { WL_ERR((" event data is NULL \n")); return -EINVAL; } event_type = ntoh32(event->event_type); event_num = ntoh32(event->reason); data_len = ntoh32(event->datalen); memset(&nan_hdr, 0, sizeof(nan_event_hdr_t)); nan_hdr.event_subtype = event_num; WL_DBG((" nan event: type: %d num: %d len: %d \n", event_type, event_num, data_len)); if (INVALID_NAN_EVENT(event_num)) { WL_ERR((" unsupported event, num: %d \n", event_num)); return -EINVAL; } if (g_nan_debug) { WL_DBG((" event name: %s \n", nan_event_name[event_num])); WL_DBG((" event data: \n")); prhex(NULL, data, data_len); } /* unpack the tlvs */ memset(&tlv_data, 0, sizeof(wl_nan_tlv_data_t)); bcm_unpack_xtlv_buf(&tlv_data, data, data_len, wl_cfgnan_set_vars_cbfn); /* * send as preformatted hex string * * EVENT_NAN <event_type> <tlv_hex_string> */ buf_len = NAN_IOCTL_BUF_SIZE; buf = ptr = kzalloc(buf_len, kflags); if (!buf) { WL_ERR((" memory allocation failed \n")); ret = -ENOMEM; goto fail; } switch (event_num) { case WL_NAN_EVENT_START: case WL_NAN_EVENT_JOIN: case WL_NAN_EVENT_STOP: ptr += sprintf(buf, SUPP_EVENT_PREFIX"%s " CLUS_ID_PREFIX MACF, nan_event_str[event_num], ETHER_TO_MACF(tlv_data.nstatus.cid)); break; case WL_NAN_EVENT_ROLE: ptr += sprintf(buf, SUPP_EVENT_PREFIX"%s "ROLE_PREFIX "%d " CLUS_ID_PREFIX MACF, nan_event_str[event_num], tlv_data.nstatus.role, ETHER_TO_MACF(tlv_data.nstatus.cid)); break; case WL_NAN_EVENT_DISCOVERY_RESULT: ptr += sprintf(buf, SUPP_EVENT_PREFIX"%s " PUB_ID_PREFIX"%d " SUB_ID_PREFIX"%d " MAC_ADDR_PREFIX MACF, nan_event_str[event_num], tlv_data.pub_id, tlv_data.sub_id, ETHER_TO_MACF(tlv_data.mac_addr)); if (tlv_data.svc_info.data && tlv_data.svc_info.dlen) { WL_DBG((" service info present \n")); if ((strlen(ptr) + tlv_data.svc_info.dlen) >= buf_len) { WL_ERR((" service info length = %d\n", tlv_data.svc_info.dlen)); WL_ERR((" insufficent buffer to copy service info \n")); ret = -EOVERFLOW; goto fail; } ptr += sprintf(ptr, " %s", SVC_INFO_PREFIX); ptr += bcm_format_hex(ptr, tlv_data.svc_info.data, tlv_data.svc_info.dlen); } else { WL_DBG((" service info not present \n")); } if (tlv_data.vend_info.data && tlv_data.vend_info.dlen) { struct ether_addr *ea; u8 *data = tlv_data.vend_info.data; uint32 bitmap; u16 dlen = tlv_data.vend_info.dlen; chanspec_t chanspec; uint8 mapcontrol; uint8 proto; WL_DBG((" vendor info present \n")); if ((*data != NAN_ATTR_VENDOR_SPECIFIC) || (dlen < NAN_VENDOR_HDR_SIZE)) { WL_ERR((" error in vendor info attribute \n")); ret = -EINVAL; goto fail; } else { WL_DBG((" vendor info not present \n")); } if (*(data + 6) == NAN_VENDOR_TYPE_RTT) { data += NAN_VENDOR_HDR_SIZE; ea = (struct ether_addr *)data; data += ETHER_ADDR_LEN; mapcontrol = *data++; proto = *data++; bitmap = *(uint32 *)data; data += 4; chanspec = *(chanspec_t *)data; ptr += sprintf(ptr, " "BITMAP_PREFIX"0x%x "CHAN_PREFIX"%d/%s", bitmap, wf_chspec_ctlchan(chanspec), wf_chspec_to_bw_str(chanspec)); WL_DBG((" bitmap: 0x%x channel: %d bandwidth: %s \n", bitmap, wf_chspec_ctlchan(chanspec), wf_chspec_to_bw_str(chanspec))); } } break; case WL_NAN_EVENT_REPLIED: ptr += sprintf(buf, SUPP_EVENT_PREFIX"%s " PUB_ID_PREFIX"%d " MAC_ADDR_PREFIX MACF, nan_event_str[event_num], tlv_data.pub_id, ETHER_TO_MACF(tlv_data.mac_addr)); break; case WL_NAN_EVENT_TERMINATED: ptr += sprintf(buf, SUPP_EVENT_PREFIX"%s " PUB_ID_PREFIX"%d ", nan_event_str[event_num], tlv_data.pub_id); break; case WL_NAN_EVENT_RECEIVE: ptr += sprintf(buf, SUPP_EVENT_PREFIX"%s " PUB_ID_PREFIX"%d " MAC_ADDR_PREFIX MACF, nan_event_str[event_num], tlv_data.pub_id, ETHER_TO_MACF(tlv_data.mac_addr)); if (tlv_data.svc_info.data && tlv_data.svc_info.dlen) { WL_DBG((" service info present \n")); if ((strlen(ptr) + tlv_data.svc_info.dlen) >= buf_len) { WL_ERR((" service info length = %d\n", tlv_data.svc_info.dlen)); WL_ERR((" insufficent buffer to copy service info \n")); ret = -EOVERFLOW; goto fail; } ptr += sprintf(ptr, " %s", SVC_INFO_PREFIX); ptr += bcm_format_hex(ptr, tlv_data.svc_info.data, tlv_data.svc_info.dlen); } else { WL_DBG((" service info not present \n")); } break; case WL_NAN_EVENT_SCAN_COMPLETE: ptr += sprintf(buf, SUPP_EVENT_PREFIX"%s " CLUS_ID_PREFIX MACF, nan_event_str[event_num], ETHER_TO_MACF(tlv_data.nstatus.cid)); break; case WL_NAN_EVENT_STATUS_CHG: ptr += sprintf(buf, SUPP_EVENT_PREFIX"%s " CLUS_ID_PREFIX MACF, nan_event_str[event_num], ETHER_TO_MACF(tlv_data.nstatus.cid)); break; case WL_NAN_EVENT_MERGE: ptr += sprintf(buf, SUPP_EVENT_PREFIX"%s " CLUS_ID_PREFIX MACF, nan_event_str[event_num], ETHER_TO_MACF(tlv_data.nstatus.cid)); break; default: WL_ERR((" unknown event \n")); break; } #ifdef WL_GENL /* send the preformatted string to the upper layer as event */ WL_DBG((" formatted string for userspace: %s, len: %zu \n", buf, strlen(buf))); wl_genl_send_msg(bcmcfg_to_prmry_ndev(cfg), 0, buf, strlen(buf), 0, 0); #endif /* WL_GENL */ fail: if (buf) { kfree(buf); } if (tlv_data.svc_info.data) { kfree(tlv_data.svc_info.data); tlv_data.svc_info.data = NULL; tlv_data.svc_info.dlen = 0; } if (tlv_data.vend_info.data) { kfree(tlv_data.vend_info.data); tlv_data.vend_info.data = NULL; tlv_data.vend_info.dlen = 0; } return ret; }
int gen_stateless_conf(void) { int ret; FILE *fp; int l_len; // check security char auth[8]; char crypto[16]; char beacon[] = "WPAand11i"; char encryption[] = "TKIPandAESEncryption"; char key[65]; char ssid[65]; char region[5]; int channel = wf_chspec_ctlchan(wf_chspec_aton(nvram_safe_get("wl1_chanspec"))); int bw = atoi(nvram_safe_get("wl1_bw")); uint32_t index = 0; sprintf(ssid, "%s", nvram_safe_get("wl1_ssid")); sprintf(region, "%s", nvram_safe_get("1:ccode")); dbg("[stateless] channel:[%d]\n", channel); dbg("[stateless] bw:[%d]\n", bw); fp = fopen("/tmp/stateless_slave_config", "w"); if(nvram_get_int("sw_mode") == SW_MODE_AP && nvram_get_int("wlc_psta") == 1 && nvram_get_int("wlc_band") == 1){ /* media bridge mode */ fprintf(fp, "wifi0_mode=sta\n"); strncpy(auth, nvram_safe_get("wlc_auth_mode"), sizeof(auth)); strncpy(crypto, nvram_safe_get("wlc_crypto"), sizeof(crypto)); strncpy(key, nvram_safe_get("wlc_wpa_psk"), sizeof(key)); strncpy(ssid, nvram_safe_get("wlc_ssid"), sizeof(ssid)); fprintf(fp, "wifi0_SSID=\"%s\"\n", ssid); logmessage("start_psta", "ssid=%s, auth=%s, crypto=%s, encryption=%s, key=%s\n", ssid, auth, crypto, encryption, key); /* convert security from nvram to qtn */ if(!strcmp(auth, "psk2") && !strcmp(crypto, "aes")){ fprintf(fp, "wifi0_auth_mode=PSKAuthentication\n"); fprintf(fp, "wifi0_beacon=11i\n"); fprintf(fp, "wifi0_encryption=AESEncryption\n"); fprintf(fp, "wifi0_passphrase=%s\n", key); } else if(!strcmp(auth, "pskpsk2") && !strcmp(crypto, "aes") ){ fprintf(fp, "wifi0_auth_mode=PSKAuthentication\n"); fprintf(fp, "wifi0_beacon=WPAand11i\n"); fprintf(fp, "wifi0_encryption=AESEncryption\n"); fprintf(fp, "wifi0_passphrase=%s\n", key); } else if(!strcmp(auth, "pskpsk2") && !strcmp(crypto, "tkip+aes") ){ fprintf(fp, "wifi0_auth_mode=PSKAuthentication\n"); fprintf(fp, "wifi0_beacon=WPAand11i\n"); fprintf(fp, "wifi0_encryption=TKIPandAESEncryption\n"); fprintf(fp, "wifi0_passphrase=%s\n", key); } else{ logmessage("start_psta", "No security in use\n"); fprintf(fp, "wifi0_auth_mode=NONE\n"); fprintf(fp, "wifi0_beacon=Basic\n"); } /* auto channel for media bridge mode */ channel = 0; }else{ /* not media bridge mode */ fprintf(fp, "wifi0_mode=ap\n"); strncpy(auth, nvram_safe_get("wl1_auth_mode_x"), sizeof(auth)); strncpy(crypto, nvram_safe_get("wl1_crypto"), sizeof(crypto)); strncpy(key, nvram_safe_get("wl1_wpa_psk"), sizeof(key)); strncpy(ssid, nvram_safe_get("wl1_ssid"), sizeof(ssid)); fprintf(fp, "wifi0_SSID=\"%s\"\n", ssid); if(!strcmp(auth, "psk2") && !strcmp(crypto, "aes")){ fprintf(fp, "wifi0_auth_mode=PSKAuthentication\n"); fprintf(fp, "wifi0_beacon=11i\n"); fprintf(fp, "wifi0_encryption=AESEncryption\n"); fprintf(fp, "wifi0_passphrase=%s\n", key); } else if(!strcmp(auth, "pskpsk2") && !strcmp(crypto, "aes") ){ fprintf(fp, "wifi0_auth_mode=PSKAuthentication\n"); fprintf(fp, "wifi0_beacon=WPAand11i\n"); fprintf(fp, "wifi0_encryption=AESEncryption\n"); fprintf(fp, "wifi0_passphrase=%s\n", key); } else if(!strcmp(auth, "pskpsk2") && !strcmp(crypto, "tkip+aes") ){ fprintf(fp, "wifi0_auth_mode=PSKAuthentication\n"); fprintf(fp, "wifi0_beacon=WPAand11i\n"); fprintf(fp, "wifi0_encryption=TKIPandAESEncryption\n"); fprintf(fp, "wifi0_passphrase=%s\n", key); } else{ logmessage("start_ap", "No security in use\n"); fprintf(fp, "wifi0_beacon=Basic\n"); } } for( l_len = 0 ; l_len < strlen(region); l_len++){ region[l_len] = tolower(region[l_len]); } fprintf(fp, "wifi0_region=%s\n", region); nvram_set("wl1_country_code", nvram_safe_get("1:ccode")); fprintf(fp, "wifi0_vht=1\n"); if(bw==1) fprintf(fp, "wifi0_bw=20\n"); else if(bw==2) fprintf(fp, "wifi0_bw=40\n"); else if(bw==3) fprintf(fp, "wifi0_bw=80\n"); else fprintf(fp, "wifi0_bw=80\n"); /* if media bridge mode, always auto channel */ fprintf(fp, "wifi0_channel=%d\n", channel); fprintf(fp, "wifi0_pwr=%d\n", get_tx_power_qtn()); if(nvram_get_int("wl1_itxbf") == 1 || nvram_get_int("wl1_txbf") == 1){ fprintf(fp, "wifi0_bf=1\n"); }else{ fprintf(fp, "wifi0_bf=0\n"); } fprintf(fp, "wifi0_staticip=1\n"); fprintf(fp, "slave_ipaddr=\"192.168.1.111/16\"\n"); fprintf(fp, "server_ipaddr=\"%s\"\n", nvram_safe_get("QTN_RPC_SERVER")); fprintf(fp, "client_ipaddr=\"%s\"\n", nvram_safe_get("QTN_RPC_CLIENT")); fclose(fp); return 1; }