Преглед изворни кода

system api: Check if Base MAC is a unicast MAC before setting

Closes https://github.com/espressif/esp-idf/issues/4263
Closes IDFGH-2096
Angus Gratton пре 6 година
родитељ
комит
912bd03a5c

+ 5 - 1
components/esp32/system_api.c

@@ -51,7 +51,11 @@ esp_err_t esp_base_mac_addr_set(uint8_t *mac)
 {
     if (mac == NULL) {
         ESP_LOGE(TAG, "Base MAC address is NULL");
-        abort();
+        return ESP_ERR_INVALID_ARG;
+    }
+    if (mac[0] & 0x01) {
+        ESP_LOGE(TAG, "Base MAC must be a unicast MAC");
+        return ESP_ERR_INVALID_ARG;
     }
 
     memcpy(base_mac_addr, mac, 6);

+ 5 - 1
components/esp32s2beta/system_api.c

@@ -54,7 +54,11 @@ esp_err_t esp_base_mac_addr_set(uint8_t *mac)
 {
     if (mac == NULL) {
         ESP_LOGE(TAG, "Base MAC address is NULL");
-        abort();
+        return ESP_ERR_INVALID_ARG;
+    }
+    if (mac[0] & 0x01) {
+        ESP_LOGE(TAG, "Base MAC must be a unicast MAC");
+        return ESP_ERR_INVALID_ARG;
     }
 
     memcpy(base_mac_addr, mac, 6);

+ 6 - 0
components/esp_common/include/esp_system.h

@@ -161,9 +161,15 @@ void esp_fill_random(void *buf, size_t len);
   * address with the MAC address which is stored in BLK3 of EFUSE or external storage before initializing
   * WiFi/BT/Ethernet.
   *
+  * @note Base MAC must be a unicast MAC (least significant bit of first byte must be zero).
+  *
+  * @note If not using a valid OUI, set the "locally administered" bit
+  *       (bit value 0x02 in the first byte) to avoid collisions.
+  *
   * @param  mac  base MAC address, length: 6 bytes.
   *
   * @return ESP_OK on success
+  *         ESP_ERR_INVALID_ARG If mac is NULL or is not a unicast MAC
   */
 esp_err_t esp_base_mac_addr_set(uint8_t *mac);