diff options
| -rw-r--r-- | core/hdd/inc/wlan_hdd_main.h | 13 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 44 |
2 files changed, 44 insertions, 13 deletions
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index abb496e2c189..3a180b10a815 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -2402,6 +2402,19 @@ struct qdf_mac_addr * hdd_wlan_get_ibss_mac_addr_from_staid(hdd_adapter_t *pAdapter, uint8_t staIdx); void hdd_checkandupdate_phymode(hdd_context_t *pHddCtx); + +/** + * wlan_hdd_validate_mac_address() - Function to validate mac address + * @mac_addr: input mac address + * + * Return QDF_STATUS + */ +#define wlan_hdd_validate_mac_address(mac_addr) \ + __wlan_hdd_validate_mac_address(mac_addr, __func__) + +QDF_STATUS __wlan_hdd_validate_mac_address(struct qdf_mac_addr *mac_addr, + const char *func); + #ifdef MSM_PLATFORM /** * hdd_bus_bw_compute_timer_start() - start the bandwidth timer diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 63957aa89356..a335d363ab64 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -807,6 +807,32 @@ int hdd_validate_adapter(hdd_adapter_t *adapter) return 0; } +QDF_STATUS __wlan_hdd_validate_mac_address(struct qdf_mac_addr *mac_addr, + const char *func) +{ + if (!mac_addr) { + hdd_err("Received NULL mac address (via %s)", func); + return QDF_STATUS_E_INVAL; + } + + if (qdf_is_macaddr_zero(mac_addr)) { + hdd_err("MAC is all zero (via %s)", func); + return QDF_STATUS_E_INVAL; + } + + if (qdf_is_macaddr_broadcast(mac_addr)) { + hdd_err("MAC is Broadcast (via %s)", func); + return QDF_STATUS_E_INVAL; + } + + if (ETHER_IS_MULTICAST(mac_addr->bytes)) { + hdd_err("MAC is Multicast (via %s)", func); + return QDF_STATUS_E_INVAL; + } + + return QDF_STATUS_SUCCESS; +} + /** * wlan_hdd_modules_are_enabled() - Check modules status * @hdd_ctx: HDD context pointer @@ -2851,20 +2877,10 @@ static int __hdd_set_mac_address(struct net_device *dev, void *addr) return -EINVAL; } - if (qdf_is_macaddr_zero(&mac_addr)) { - hdd_err("MAC is all zero"); - return -EINVAL; - } - - if (qdf_is_macaddr_broadcast(&mac_addr)) { - hdd_err("MAC is Broadcast"); + qdf_ret_status = wlan_hdd_validate_mac_address(&mac_addr); + if (QDF_IS_STATUS_ERROR(qdf_ret_status)) return -EINVAL; - } - if (ETHER_IS_MULTICAST(psta_mac_addr->sa_data)) { - hdd_err("MAC is Multicast"); - return -EINVAL; - } hdd_info("Changing MAC to " MAC_ADDRESS_STR " of the interface %s ", MAC_ADDR_ARRAY(mac_addr.bytes), dev->name); @@ -4399,11 +4415,13 @@ hdd_adapter_t *hdd_open_adapter(hdd_context_t *hdd_ctx, uint8_t session_type, return NULL; } - if (macAddr == NULL) { + status = wlan_hdd_validate_mac_address((struct qdf_mac_addr *)macAddr); + if (QDF_IS_STATUS_ERROR(status)) { /* Not received valid macAddr */ hdd_err("Unable to add virtual intf: Not able to get valid mac address"); return NULL; } + status = hdd_check_for_existing_macaddr(hdd_ctx, macAddr); if (QDF_STATUS_E_FAILURE == status) { hdd_err("Duplicate MAC addr: " MAC_ADDRESS_STR |
