diff options
| author | Yuanyuan Liu <yuanliu@qca.qualcomm.com> | 2014-01-28 13:55:55 -0800 |
|---|---|---|
| committer | Akash Patel <c_akashp@qca.qualcomm.com> | 2014-02-07 17:38:23 -0800 |
| commit | eeefa49ffef6ce19df389631a753469e09b514c5 (patch) | |
| tree | 953f2e89d043f7fdf6c4adece18d04acf40802c3 | |
| parent | ded58968277eea8bcdcf2eafb11198c6b7deb538 (diff) | |
qcacld: Add function of updating macaddress from wlan_mac.bin
In FTM mode, user defined macaddresses might be provided. The
new macaddress will be written into /persist/wlan_mac.bin.
Add function of updating macaddress from wlan_mac.bin. Overwrite
default ini macaddress if wlan_mac.bin exist.
Change-Id: I78ab0104fc5cae456c8fd8dc3df2029cdecf7214
CRs-Fixed: 605901
| -rw-r--r-- | Android.mk | 1 | ||||
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_cfg.h | 1 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg.c | 110 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 11 | ||||
| -rw-r--r-- | CORE/VOSS/inc/wlan_hdd_misc.h | 3 |
5 files changed, 123 insertions, 3 deletions
diff --git a/Android.mk b/Android.mk index d3dfafce1fe0..f86c223bcb1e 100644 --- a/Android.mk +++ b/Android.mk @@ -72,6 +72,7 @@ include $(DLKM_DIR)/AndroidKernelModule.mk $(shell mkdir -p $(TARGET_OUT)/lib/modules; \ ln -sf /system/lib/modules/$(WLAN_CHIPSET)/$(WLAN_CHIPSET)_wlan.ko \ $(TARGET_OUT)/lib/modules/wlan.ko) +$(shell ln -sf /persist/wlan_mac.bin $(TARGET_OUT_ETC)/firmware/wlan/qca_cld/wlan_mac.bin) endif # DLKM check diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index a3ffb79c0d78..b030c4bc3eb8 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -2675,6 +2675,7 @@ typedef struct Function declarations and documenation -------------------------------------------------------------------------*/ VOS_STATUS hdd_parse_config_ini(hdd_context_t *pHddCtx); +VOS_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx); VOS_STATUS hdd_set_sme_config( hdd_context_t *pHddCtx ); VOS_STATUS hdd_set_sme_chan_list(hdd_context_t *hdd_ctx); v_BOOL_t hdd_update_config_dat ( hdd_context_t *pHddCtx ); diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 229efded8ef8..4d71b707cb41 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -3633,6 +3633,116 @@ static int parseHexDigit(char c) return 0; } +/* convert string to 6 bytes mac address + * 00AA00BB00CC -> 0x00 0xAA 0x00 0xBB 0x00 0xCC + */ +static void update_mac_from_string(hdd_context_t *pHddCtx, tCfgIniEntry *macTable, int num) +{ + int i = 0, j = 0, res = 0; + char *candidate = NULL; + v_MACADDR_t macaddr[VOS_MAX_CONCURRENCY_PERSONA]; + + memset(macaddr, 0, sizeof(macaddr)); + + for (i = 0; i < num; i++) + { + candidate = macTable[i].value; + for (j = 0; j < VOS_MAC_ADDR_SIZE; j++) { + res = hex2bin(&macaddr[i].bytes[j], &candidate[(j<<1)], 1); + if (res < 0) + break; + } + if (res == 0 && !vos_is_macaddr_zero(&macaddr[i])) { + vos_mem_copy((v_U8_t *)&pHddCtx->cfg_ini->intfMacAddr[i].bytes[0], + (v_U8_t *)&macaddr[i].bytes[0], VOS_MAC_ADDR_SIZE); + } + } +} + +/* + * This function tries to update macaddress from cfg file. + * It overwrites the MAC address if config file exist. + */ +VOS_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx) +{ + int status, i = 0; + const struct firmware *fw = NULL; + char *line, *buffer = NULL; + char *name, *value; + tCfgIniEntry macTable[VOS_MAX_CONCURRENCY_PERSONA]; + + VOS_STATUS vos_status = VOS_STATUS_SUCCESS; + + memset(macTable, 0, sizeof(macTable)); + status = request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev); + + if (status) + { + hddLog(VOS_TRACE_LEVEL_FATAL, "%s: request_firmware failed %d\n", + __func__, status); + vos_status = VOS_STATUS_E_FAILURE; + goto config_exit; + } + if (!fw || !fw->data || !fw->size) + { + hddLog(VOS_TRACE_LEVEL_FATAL, "%s: invalid firmware\n", __func__); + vos_status = VOS_STATUS_E_INVAL; + goto config_exit; + } + + buffer = (char *)fw->data; + + /* data format: + * Intf0MacAddress=00AA00BB00CC + * Intf1MacAddress=00AA00BB00CD + * END + */ + while (buffer != NULL) + { + line = get_next_line(buffer); + buffer = i_trim(buffer); + + if (strlen((char *)buffer) == 0 || *buffer == '#') { + buffer = line; + continue; + } + if (strncmp(buffer, "END", 3) == 0) + break; + + name = buffer; + buffer = strchr(buffer, '='); + if (buffer) { + *buffer++ = '\0'; + i_trim(name); + if (strlen(name) != 0) { + buffer = i_trim(buffer); + if (strlen(buffer) == 12) { + value = buffer; + macTable[i].name = name; + macTable[i++].value = value; + if (i >= VOS_MAX_CONCURRENCY_PERSONA) + break; + } + } + } + buffer = line; + } + if (i <= VOS_MAX_CONCURRENCY_PERSONA) { + hddLog(VOS_TRACE_LEVEL_INFO, "%s: %d Mac addresses provided\n", __func__, i); + } + else { + hddLog(VOS_TRACE_LEVEL_ERROR, "%s: invalid number of Mac address provided, nMac = %d\n", + __func__, i); + vos_status = VOS_STATUS_E_INVAL; + goto config_exit; + } + + update_mac_from_string(pHddCtx, &macTable[0], i); + +config_exit: + release_firmware(fw); + return vos_status; +} static VOS_STATUS hdd_apply_cfg_ini( hdd_context_t *pHddCtx, tCfgIniEntry* iniTable, unsigned long entries) { diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index b050ec8bc3b2..7beee7f9d478 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -9108,8 +9108,15 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) goto err_config; } - pHddCtx->current_intf_count=0; - pHddCtx->max_intf_count = WLAN_MAX_INTERFACES; + if ( VOS_STATUS_SUCCESS != hdd_update_mac_config( pHddCtx ) ) + { + hddLog(VOS_TRACE_LEVEL_WARN, + "%s: can't update mac config, using MAC from ini file", + __func__); + } + + pHddCtx->current_intf_count=0; + pHddCtx->max_intf_count = WLAN_MAX_INTERFACES; #ifndef QCA_WIFI_2_0 pHddCtx->cfg_ini->maxWoWFilters = WOWL_MAX_PTRNS_ALLOWED; diff --git a/CORE/VOSS/inc/wlan_hdd_misc.h b/CORE/VOSS/inc/wlan_hdd_misc.h index ec623a153be9..232161f64c5b 100644 --- a/CORE/VOSS/inc/wlan_hdd_misc.h +++ b/CORE/VOSS/inc/wlan_hdd_misc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -38,6 +38,7 @@ #define WLAN_DICT_FILE "wlan/qca_cld/WCNSS_qcom_wlan_dictionary.dat" #define WLAN_COUNTRY_INFO_FILE "wlan/qca_cld/WCNSS_wlan_country_info.dat" #define WLAN_HO_CFG_FILE "wlan/qca_cld/WCNSS_wlan_ho_config" +#define WLAN_MAC_FILE "wlan/qca_cld/wlan_mac.bin" #else #define WLAN_INI_FILE "wlan/prima/WCNSS_qcom_cfg.ini" #define WLAN_CFG_FILE "wlan/prima/WCNSS_cfg.dat" |
