diff --git a/components/esp_wifi/include/esp_wifi_types_generic.h b/components/esp_wifi/include/esp_wifi_types_generic.h index a0039b06983..8c6743984e4 100644 --- a/components/esp_wifi/include/esp_wifi_types_generic.h +++ b/components/esp_wifi/include/esp_wifi_types_generic.h @@ -1488,7 +1488,6 @@ typedef struct { bool dcm; /**< Using dcm rate to send frame */ } wifi_tx_rate_config_t; -#define WIFI_MAX_SUPPORT_COUNTRY_NUM 176 /**< max number of supported countries */ #ifdef CONFIG_SOC_WIFI_SUPPORT_5G #define WIFI_MAX_REGULATORY_RULE_NUM 7 /**< max number of regulatory rules */ #else diff --git a/components/esp_wifi/regulatory/README.md b/components/esp_wifi/regulatory/README.md index ebb2f6ac2f4..e078582a79b 100644 --- a/components/esp_wifi/regulatory/README.md +++ b/components/esp_wifi/regulatory/README.md @@ -5,8 +5,6 @@ `esp_wifi_regulatory.c` is generated from `esp_wifi_regulatory.txt` by using the `reg2fw.py` script. -The num of all suppported countries in `esp_wifi_regulatory.txt` is `WIFI_MAX_SUPPORT_COUNTRY_NUM` that is defined in `esp_wifi_types_generic.h` - - Generate `esp_wifi_regulatory.c` - `cd ~/esp-idf/components/esp_wifi/regulatory` - `python reg2fw.py` \ No newline at end of file diff --git a/components/esp_wifi/regulatory/esp_wifi_regulatory.c b/components/esp_wifi/regulatory/esp_wifi_regulatory.c index cbcbde1b501..d6028adb14f 100644 --- a/components/esp_wifi/regulatory/esp_wifi_regulatory.c +++ b/components/esp_wifi/regulatory/esp_wifi_regulatory.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -25,7 +25,6 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_NCC, ESP_WIFI_REGULATORY_TYPE_FCC, ESP_WIFI_REGULATORY_TYPE_AF, - ESP_WIFI_REGULATORY_TYPE_AI, ESP_WIFI_REGULATORY_TYPE_AM, ESP_WIFI_REGULATORY_TYPE_AS, ESP_WIFI_REGULATORY_TYPE_AZ, @@ -35,6 +34,7 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_BN, ESP_WIFI_REGULATORY_TYPE_BO, ESP_WIFI_REGULATORY_TYPE_BS, + ESP_WIFI_REGULATORY_TYPE_BW, ESP_WIFI_REGULATORY_TYPE_BZ, ESP_WIFI_REGULATORY_TYPE_CF, ESP_WIFI_REGULATORY_TYPE_CR, @@ -43,13 +43,13 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_DZ, ESP_WIFI_REGULATORY_TYPE_EC, ESP_WIFI_REGULATORY_TYPE_EG, + ESP_WIFI_REGULATORY_TYPE_FO, ESP_WIFI_REGULATORY_TYPE_GB, ESP_WIFI_REGULATORY_TYPE_GD, ESP_WIFI_REGULATORY_TYPE_GT, ESP_WIFI_REGULATORY_TYPE_GU, ESP_WIFI_REGULATORY_TYPE_HR, ESP_WIFI_REGULATORY_TYPE_ID, - ESP_WIFI_REGULATORY_TYPE_IL, ESP_WIFI_REGULATORY_TYPE_IR, ESP_WIFI_REGULATORY_TYPE_JO, ESP_WIFI_REGULATORY_TYPE_KE, @@ -73,11 +73,10 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_RU, ESP_WIFI_REGULATORY_TYPE_SG, ESP_WIFI_REGULATORY_TYPE_SV, + ESP_WIFI_REGULATORY_TYPE_SX, ESP_WIFI_REGULATORY_TYPE_SY, - ESP_WIFI_REGULATORY_TYPE_TC, ESP_WIFI_REGULATORY_TYPE_TG, ESP_WIFI_REGULATORY_TYPE_TR, - ESP_WIFI_REGULATORY_TYPE_TZ, ESP_WIFI_REGULATORY_TYPE_UA, ESP_WIFI_REGULATORY_TYPE_VE, ESP_WIFI_REGULATORY_TYPE_VN, @@ -87,13 +86,17 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_MAX, } esp_wifi_regulatory_type_t; -const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { +/* + * regdomain_table: ISO alpha-2 country codes and their regulatory profile indices. + * Last row is a sentinel (not a real country code). + */ +const wifi_regdomain_t regdomain_table[] = { {"01", ESP_WIFI_REGULATORY_TYPE_DEFAULT}, {"EU", ESP_WIFI_REGULATORY_TYPE_CE}, {"AD", ESP_WIFI_REGULATORY_TYPE_CE}, {"AE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"AF", ESP_WIFI_REGULATORY_TYPE_AF}, - {"AI", ESP_WIFI_REGULATORY_TYPE_AI}, + {"AI", ESP_WIFI_REGULATORY_TYPE_AF}, {"AL", ESP_WIFI_REGULATORY_TYPE_CE}, {"AM", ESP_WIFI_REGULATORY_TYPE_AM}, {"AN", ESP_WIFI_REGULATORY_TYPE_AF}, @@ -117,6 +120,7 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"BR", ESP_WIFI_REGULATORY_TYPE_ANATEL}, {"BS", ESP_WIFI_REGULATORY_TYPE_BS}, {"BT", ESP_WIFI_REGULATORY_TYPE_AF}, + {"BW", ESP_WIFI_REGULATORY_TYPE_BW}, {"BY", ESP_WIFI_REGULATORY_TYPE_AF}, {"BZ", ESP_WIFI_REGULATORY_TYPE_BZ}, {"CA", ESP_WIFI_REGULATORY_TYPE_ISED}, @@ -143,14 +147,16 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"ET", ESP_WIFI_REGULATORY_TYPE_AF}, {"FI", ESP_WIFI_REGULATORY_TYPE_CE}, {"FM", ESP_WIFI_REGULATORY_TYPE_AS}, + {"FO", ESP_WIFI_REGULATORY_TYPE_FO}, {"FR", ESP_WIFI_REGULATORY_TYPE_CE}, {"GB", ESP_WIFI_REGULATORY_TYPE_GB}, {"GD", ESP_WIFI_REGULATORY_TYPE_GD}, {"GE", ESP_WIFI_REGULATORY_TYPE_AZ}, - {"GF", ESP_WIFI_REGULATORY_TYPE_AI}, + {"GF", ESP_WIFI_REGULATORY_TYPE_AF}, {"GH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, - {"GL", ESP_WIFI_REGULATORY_TYPE_AI}, - {"GP", ESP_WIFI_REGULATORY_TYPE_AI}, + {"GI", ESP_WIFI_REGULATORY_TYPE_FO}, + {"GL", ESP_WIFI_REGULATORY_TYPE_AF}, + {"GP", ESP_WIFI_REGULATORY_TYPE_AF}, {"GR", ESP_WIFI_REGULATORY_TYPE_CE}, {"GT", ESP_WIFI_REGULATORY_TYPE_GT}, {"GU", ESP_WIFI_REGULATORY_TYPE_GU}, @@ -162,7 +168,8 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"HU", ESP_WIFI_REGULATORY_TYPE_CE}, {"ID", ESP_WIFI_REGULATORY_TYPE_ID}, {"IE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"IL", ESP_WIFI_REGULATORY_TYPE_IL}, + {"IL", ESP_WIFI_REGULATORY_TYPE_CE}, + {"IM", ESP_WIFI_REGULATORY_TYPE_FO}, {"IN", ESP_WIFI_REGULATORY_TYPE_WPC}, {"IR", ESP_WIFI_REGULATORY_TYPE_IR}, {"IS", ESP_WIFI_REGULATORY_TYPE_CE}, @@ -190,13 +197,13 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"MC", ESP_WIFI_REGULATORY_TYPE_CE}, {"MD", ESP_WIFI_REGULATORY_TYPE_CE}, {"ME", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MF", ESP_WIFI_REGULATORY_TYPE_AI}, + {"MF", ESP_WIFI_REGULATORY_TYPE_AF}, {"MH", ESP_WIFI_REGULATORY_TYPE_AS}, {"MK", ESP_WIFI_REGULATORY_TYPE_CE}, {"MN", ESP_WIFI_REGULATORY_TYPE_BS}, {"MO", ESP_WIFI_REGULATORY_TYPE_MO}, {"MP", ESP_WIFI_REGULATORY_TYPE_AS}, - {"MQ", ESP_WIFI_REGULATORY_TYPE_AI}, + {"MQ", ESP_WIFI_REGULATORY_TYPE_AF}, {"MR", ESP_WIFI_REGULATORY_TYPE_AF}, {"MT", ESP_WIFI_REGULATORY_TYPE_CE}, {"MU", ESP_WIFI_REGULATORY_TYPE_BS}, @@ -214,18 +221,18 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"OM", ESP_WIFI_REGULATORY_TYPE_OM}, {"PA", ESP_WIFI_REGULATORY_TYPE_PA}, {"PE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, - {"PF", ESP_WIFI_REGULATORY_TYPE_AI}, + {"PF", ESP_WIFI_REGULATORY_TYPE_AF}, {"PG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"PH", ESP_WIFI_REGULATORY_TYPE_PH}, {"PK", ESP_WIFI_REGULATORY_TYPE_PK}, {"PL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PM", ESP_WIFI_REGULATORY_TYPE_AI}, + {"PM", ESP_WIFI_REGULATORY_TYPE_AF}, {"PR", ESP_WIFI_REGULATORY_TYPE_GD}, {"PT", ESP_WIFI_REGULATORY_TYPE_CE}, {"PW", ESP_WIFI_REGULATORY_TYPE_AS}, {"PY", ESP_WIFI_REGULATORY_TYPE_BS}, {"QA", ESP_WIFI_REGULATORY_TYPE_QA}, - {"RE", ESP_WIFI_REGULATORY_TYPE_AI}, + {"RE", ESP_WIFI_REGULATORY_TYPE_AF}, {"RO", ESP_WIFI_REGULATORY_TYPE_CE}, {"RS", ESP_WIFI_REGULATORY_TYPE_RS}, {"RU", ESP_WIFI_REGULATORY_TYPE_RU}, @@ -235,11 +242,13 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"SG", ESP_WIFI_REGULATORY_TYPE_SG}, {"SI", ESP_WIFI_REGULATORY_TYPE_CE}, {"SK", ESP_WIFI_REGULATORY_TYPE_CE}, + {"SM", ESP_WIFI_REGULATORY_TYPE_FO}, {"SN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"SR", ESP_WIFI_REGULATORY_TYPE_AF}, {"SV", ESP_WIFI_REGULATORY_TYPE_SV}, + {"SX", ESP_WIFI_REGULATORY_TYPE_SX}, {"SY", ESP_WIFI_REGULATORY_TYPE_SY}, - {"TC", ESP_WIFI_REGULATORY_TYPE_TC}, + {"TC", ESP_WIFI_REGULATORY_TYPE_BS}, {"TD", ESP_WIFI_REGULATORY_TYPE_AF}, {"TG", ESP_WIFI_REGULATORY_TYPE_TG}, {"TH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, @@ -247,23 +256,25 @@ const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { {"TR", ESP_WIFI_REGULATORY_TYPE_TR}, {"TT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"TW", ESP_WIFI_REGULATORY_TYPE_NCC}, - {"TZ", ESP_WIFI_REGULATORY_TYPE_TZ}, + {"TZ", ESP_WIFI_REGULATORY_TYPE_BW}, {"UA", ESP_WIFI_REGULATORY_TYPE_UA}, {"UG", ESP_WIFI_REGULATORY_TYPE_BS}, {"US", ESP_WIFI_REGULATORY_TYPE_FCC}, {"UY", ESP_WIFI_REGULATORY_TYPE_BB}, {"UZ", ESP_WIFI_REGULATORY_TYPE_MA}, + {"VA", ESP_WIFI_REGULATORY_TYPE_FO}, {"VC", ESP_WIFI_REGULATORY_TYPE_AF}, {"VE", ESP_WIFI_REGULATORY_TYPE_VE}, {"VI", ESP_WIFI_REGULATORY_TYPE_AS}, {"VN", ESP_WIFI_REGULATORY_TYPE_VN}, {"VU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, - {"WF", ESP_WIFI_REGULATORY_TYPE_AI}, + {"WF", ESP_WIFI_REGULATORY_TYPE_AF}, {"WS", ESP_WIFI_REGULATORY_TYPE_WS}, {"YE", ESP_WIFI_REGULATORY_TYPE_YE}, - {"YT", ESP_WIFI_REGULATORY_TYPE_AI}, + {"YT", ESP_WIFI_REGULATORY_TYPE_AF}, {"ZA", ESP_WIFI_REGULATORY_TYPE_ZA}, {"ZW", ESP_WIFI_REGULATORY_TYPE_AF}, + {"##", ESP_WIFI_REGULATORY_TYPE_MAX}, /* Sentinel: end of table; not a real country code — do not use as wifi_country_t.cc. */ }; const wifi_regulatory_t regulatory_data[] = { @@ -315,12 +326,12 @@ const wifi_regulatory_t regulatory_data[] = { { 6, /* Number of rules */ { - { 1, 11, 2, 30, 0, 0 }, /* chan:1~11, max_bw:40M, max_power:30(dBm), dfs:0, reserved.*/ + { 1, 13, 2, 36, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 24, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - { 100, 116, 3, 24, 1, 0 }, /* chan:100~116, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - { 132, 144, 3, 24, 1, 0 }, /* chan:132~144, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 26, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:26(dBm), dfs:1, reserved.*/ + { 100, 144, 4, 26, 1, 0 }, /* chan:100~144, max_bw:160M, max_power:26(dBm), dfs:1, reserved.*/ + { 149, 165, 3, 36, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:36(dBm), dfs:0, reserved.*/ + { 173, 177, 2, 27, 0, 0 }, /* chan:173~177, max_bw:40M, max_power:27(dBm), dfs:0, reserved.*/ } }, /* ESP_WIFI_REGULATORY_TYPE_SRRC */ @@ -419,7 +430,7 @@ const wifi_regulatory_t regulatory_data[] = { { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ { 52, 64, 3, 24, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ { 100, 144, 4, 24, 1, 0 }, /* chan:100~144, max_bw:160M, max_power:24(dBm), dfs:1, reserved.*/ - { 149, 169, 3, 27, 0, 0 }, /* chan:149~169, max_bw:80M, max_power:27(dBm), dfs:0, reserved.*/ + { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ { 173, 177, 2, 27, 0, 0 }, /* chan:173~177, max_bw:40M, max_power:27(dBm), dfs:0, reserved.*/ } }, @@ -433,16 +444,6 @@ const wifi_regulatory_t regulatory_data[] = { { 100, 140, 4, 27, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:27(dBm), dfs:1, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_AI */ - { - 4, /* Number of rules */ - { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ - { 36, 48, 3, 20, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:20(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ - { 100, 140, 4, 27, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:27(dBm), dfs:1, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_AM */ { 3, /* Number of rules */ @@ -530,6 +531,17 @@ const wifi_regulatory_t regulatory_data[] = { { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ } }, + /* ESP_WIFI_REGULATORY_TYPE_BW */ + { + 5, /* Number of rules */ + { + { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ + { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ + { 100, 140, 4, 23, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:23(dBm), dfs:1, reserved.*/ + { 149, 165, 3, 24, 1, 0 }, /* chan:149~165, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ + } + }, /* ESP_WIFI_REGULATORY_TYPE_BZ */ { 2, /* Number of rules */ @@ -551,13 +563,14 @@ const wifi_regulatory_t regulatory_data[] = { }, /* ESP_WIFI_REGULATORY_TYPE_CR */ { - 5, /* Number of rules */ + 6, /* Number of rules */ { { 1, 13, 2, 36, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ - { 36, 48, 1, 30, 0, 0 }, /* chan:36~48, max_bw:20M, max_power:30(dBm), dfs:0, reserved.*/ - { 52, 64, 1, 30, 1, 0 }, /* chan:52~64, max_bw:20M, max_power:30(dBm), dfs:1, reserved.*/ - { 100, 144, 1, 30, 1, 0 }, /* chan:100~144, max_bw:20M, max_power:30(dBm), dfs:1, reserved.*/ - { 149, 165, 1, 36, 0, 0 }, /* chan:149~165, max_bw:20M, max_power:36(dBm), dfs:0, reserved.*/ + { 36, 48, 3, 30, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 30, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:30(dBm), dfs:1, reserved.*/ + { 100, 144, 4, 30, 1, 0 }, /* chan:100~144, max_bw:160M, max_power:30(dBm), dfs:1, reserved.*/ + { 149, 165, 3, 36, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:36(dBm), dfs:0, reserved.*/ + { 173, 177, 2, 36, 0, 0 }, /* chan:173~177, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ } }, /* ESP_WIFI_REGULATORY_TYPE_CU */ @@ -610,6 +623,16 @@ const wifi_regulatory_t regulatory_data[] = { { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ } }, + /* ESP_WIFI_REGULATORY_TYPE_FO */ + { + 4, /* Number of rules */ + { + { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ + { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ + { 100, 140, 4, 26, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:26(dBm), dfs:1, reserved.*/ + } + }, /* ESP_WIFI_REGULATORY_TYPE_GB */ { 5, /* Number of rules */ @@ -673,17 +696,6 @@ const wifi_regulatory_t regulatory_data[] = { { 149, 161, 3, 23, 0, 0 }, /* chan:149~161, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_IL */ - { - 5, /* Number of rules */ - { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ - { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ - { 100, 140, 4, 26, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:26(dBm), dfs:1, reserved.*/ - { 149, 173, 3, 13, 0, 0 }, /* chan:149~173, max_bw:80M, max_power:13(dBm), dfs:0, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_IR */ { 4, /* Number of rules */ @@ -815,11 +827,11 @@ const wifi_regulatory_t regulatory_data[] = { { 5, /* Number of rules */ { - { 1, 13, 2, 26, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:26(dBm), dfs:0, reserved.*/ + { 1, 14, 2, 26, 0, 0 }, /* chan:1~14, max_bw:40M, max_power:26(dBm), dfs:0, reserved.*/ { 36, 48, 3, 30, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 30, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:30(dBm), dfs:1, reserved.*/ - { 100, 128, 4, 30, 1, 0 }, /* chan:100~128, max_bw:160M, max_power:30(dBm), dfs:1, reserved.*/ - { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 23, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:23(dBm), dfs:1, reserved.*/ + { 100, 128, 4, 23, 1, 0 }, /* chan:100~128, max_bw:160M, max_power:23(dBm), dfs:1, reserved.*/ + { 149, 173, 3, 30, 0, 0 }, /* chan:149~173, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ } }, /* ESP_WIFI_REGULATORY_TYPE_NA */ @@ -903,7 +915,7 @@ const wifi_regulatory_t regulatory_data[] = { { { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ { 36, 64, 4, 20, 0, 0 }, /* chan:36~64, max_bw:160M, max_power:20(dBm), dfs:0, reserved.*/ - { 132, 165, 4, 20, 0, 0 }, /* chan:132~165, max_bw:160M, max_power:20(dBm), dfs:0, reserved.*/ + { 132, 165, 4, 23, 0, 0 }, /* chan:132~165, max_bw:160M, max_power:23(dBm), dfs:0, reserved.*/ } }, /* ESP_WIFI_REGULATORY_TYPE_SG */ @@ -927,6 +939,17 @@ const wifi_regulatory_t regulatory_data[] = { { 149, 165, 1, 30, 0, 0 }, /* chan:149~165, max_bw:20M, max_power:30(dBm), dfs:0, reserved.*/ } }, + /* ESP_WIFI_REGULATORY_TYPE_SX */ + { + 5, /* Number of rules */ + { + { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ + { 36, 48, 3, 16, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:16(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 21, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:21(dBm), dfs:1, reserved.*/ + { 100, 140, 4, 23, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:23(dBm), dfs:1, reserved.*/ + { 149, 173, 3, 24, 1, 0 }, /* chan:149~173, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ + } + }, /* ESP_WIFI_REGULATORY_TYPE_SY */ { 6, /* Number of rules */ @@ -939,17 +962,6 @@ const wifi_regulatory_t regulatory_data[] = { { 173, 173, 1, 23, 0, 0 }, /* chan:173~173, max_bw:20M, max_power:23(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_TC */ - { - 5, /* Number of rules */ - { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ - { 36, 48, 3, 24, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:24(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 24, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - { 100, 144, 4, 24, 1, 0 }, /* chan:100~144, max_bw:160M, max_power:24(dBm), dfs:1, reserved.*/ - { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_TG */ { 3, /* Number of rules */ @@ -969,17 +981,6 @@ const wifi_regulatory_t regulatory_data[] = { { 100, 140, 4, 27, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:27(dBm), dfs:1, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_TZ */ - { - 5, /* Number of rules */ - { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ - { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ - { 100, 140, 4, 23, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:23(dBm), dfs:1, reserved.*/ - { 149, 165, 3, 24, 1, 0 }, /* chan:149~165, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_UA */ { 5, /* Number of rules */ @@ -1005,10 +1006,10 @@ const wifi_regulatory_t regulatory_data[] = { { 5, /* Number of rules */ { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ - { 36, 48, 3, 17, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:17(dBm), dfs:0, reserved.*/ - { 52, 64, 3, 24, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ - { 100, 144, 3, 24, 1, 0 }, /* chan:100~144, max_bw:80M, max_power:24(dBm), dfs:1, reserved.*/ + { 1, 13, 2, 23, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:23(dBm), dfs:0, reserved.*/ + { 36, 48, 3, 23, 0, 0 }, /* chan:36~48, max_bw:80M, max_power:23(dBm), dfs:0, reserved.*/ + { 52, 64, 3, 20, 1, 0 }, /* chan:52~64, max_bw:80M, max_power:20(dBm), dfs:1, reserved.*/ + { 100, 140, 4, 26, 1, 0 }, /* chan:100~140, max_bw:160M, max_power:26(dBm), dfs:1, reserved.*/ { 149, 165, 3, 30, 0, 0 }, /* chan:149~165, max_bw:80M, max_power:30(dBm), dfs:0, reserved.*/ } }, @@ -1056,194 +1057,204 @@ typedef enum { ESP_WIFI_REGULATORY_TYPE_RCM, ESP_WIFI_REGULATORY_TYPE_NCC, ESP_WIFI_REGULATORY_TYPE_FCC, - ESP_WIFI_REGULATORY_TYPE_CU, ESP_WIFI_REGULATORY_TYPE_GT, - ESP_WIFI_REGULATORY_TYPE_ID, ESP_WIFI_REGULATORY_TYPE_KE, ESP_WIFI_REGULATORY_TYPE_KP, - ESP_WIFI_REGULATORY_TYPE_OM, + ESP_WIFI_REGULATORY_TYPE_MY, ESP_WIFI_REGULATORY_TYPE_PK, ESP_WIFI_REGULATORY_TYPE_TG, ESP_WIFI_REGULATORY_TYPE_MAX, } esp_wifi_regulatory_type_t; -const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = { +/* + * regdomain_table: ISO alpha-2 country codes and their regulatory profile indices. + * Last row is a sentinel (not a real country code). + */ +const wifi_regdomain_t regdomain_table[] = { {"01", ESP_WIFI_REGULATORY_TYPE_DEFAULT}, - {"EU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AD", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AI", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AM", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AS", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"AT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AU", ESP_WIFI_REGULATORY_TYPE_ACMA}, - {"AW", ESP_WIFI_REGULATORY_TYPE_CE}, - {"AZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BA", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BB", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BD", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BG", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BH", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BM", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"BN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BO", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BR", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"BS", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BY", ESP_WIFI_REGULATORY_TYPE_CE}, - {"BZ", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"CA", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"CF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CH", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CI", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CO", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CR", ESP_WIFI_REGULATORY_TYPE_OFCA}, - {"CU", ESP_WIFI_REGULATORY_TYPE_CU}, - {"CX", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CY", ESP_WIFI_REGULATORY_TYPE_CE}, - {"CZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"DE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"DK", ESP_WIFI_REGULATORY_TYPE_CE}, - {"DM", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"DO", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"DZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"EC", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"EE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"EG", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ES", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ET", ESP_WIFI_REGULATORY_TYPE_CE}, - {"FI", ESP_WIFI_REGULATORY_TYPE_CE}, - {"FM", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"FR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GB", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GD", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"GE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GH", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GP", ESP_WIFI_REGULATORY_TYPE_CE}, - {"GR", ESP_WIFI_REGULATORY_TYPE_CE}, + {"EU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AD", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AS", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"AT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AU", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"AW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"AZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BB", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BD", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BM", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"BN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BR", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"BS", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BY", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"BZ", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"CA", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"CF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CR", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"CU", ESP_WIFI_REGULATORY_TYPE_KCC}, + {"CX", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CY", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"CZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"DE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"DK", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"DM", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"DO", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"DZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"EC", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"EE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"EG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ES", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ET", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"FI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"FM", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"FO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"FR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GB", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GD", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"GE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GP", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"GR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"GT", ESP_WIFI_REGULATORY_TYPE_GT}, - {"GU", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"GY", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"HK", ESP_WIFI_REGULATORY_TYPE_OFCA}, - {"HN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"HR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"HT", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"HU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ID", ESP_WIFI_REGULATORY_TYPE_ID}, - {"IE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"IL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"IN", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"IR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"IS", ESP_WIFI_REGULATORY_TYPE_CE}, - {"IT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"JM", ESP_WIFI_REGULATORY_TYPE_CE}, - {"JO", ESP_WIFI_REGULATORY_TYPE_CE}, + {"GU", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"GY", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"HK", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"HN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"HR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"HT", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"HU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ID", ESP_WIFI_REGULATORY_TYPE_GT}, + {"IE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"IL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"IM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"IN", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"IR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"IS", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"IT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"JM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"JO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"JP", ESP_WIFI_REGULATORY_TYPE_MIC}, {"KE", ESP_WIFI_REGULATORY_TYPE_KE}, - {"KH", ESP_WIFI_REGULATORY_TYPE_CE}, - {"KN", ESP_WIFI_REGULATORY_TYPE_CE}, + {"KH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"KN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"KP", ESP_WIFI_REGULATORY_TYPE_KP}, {"KR", ESP_WIFI_REGULATORY_TYPE_KCC}, - {"KW", ESP_WIFI_REGULATORY_TYPE_CE}, - {"KY", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"KZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LB", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LC", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LI", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LK", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LS", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"LV", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MA", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MC", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MD", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ME", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MH", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"MK", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MO", ESP_WIFI_REGULATORY_TYPE_CU}, - {"MP", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"MQ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MV", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MW", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MX", ESP_WIFI_REGULATORY_TYPE_CE}, - {"MY", ESP_WIFI_REGULATORY_TYPE_GT}, - {"NA", ESP_WIFI_REGULATORY_TYPE_CE}, - {"NG", ESP_WIFI_REGULATORY_TYPE_CE}, - {"NI", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"NL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"NO", ESP_WIFI_REGULATORY_TYPE_CE}, - {"NP", ESP_WIFI_REGULATORY_TYPE_CE}, - {"NZ", ESP_WIFI_REGULATORY_TYPE_OFCA}, - {"OM", ESP_WIFI_REGULATORY_TYPE_OM}, - {"PA", ESP_WIFI_REGULATORY_TYPE_OFCA}, - {"PE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PG", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PH", ESP_WIFI_REGULATORY_TYPE_CE}, + {"KW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"KY", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"KZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LB", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LC", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LK", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LS", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"LV", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MC", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MD", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ME", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MH", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"MK", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MO", ESP_WIFI_REGULATORY_TYPE_KCC}, + {"MP", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"MQ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MV", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MX", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"MY", ESP_WIFI_REGULATORY_TYPE_MY}, + {"NA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"NG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"NI", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"NL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"NO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"NP", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"NZ", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"OM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PA", ESP_WIFI_REGULATORY_TYPE_RCM}, + {"PE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"PK", ESP_WIFI_REGULATORY_TYPE_PK}, - {"PL", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PM", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PR", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"PT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"PW", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"PY", ESP_WIFI_REGULATORY_TYPE_CE}, - {"QA", ESP_WIFI_REGULATORY_TYPE_OM}, - {"RE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"RO", ESP_WIFI_REGULATORY_TYPE_CE}, - {"RS", ESP_WIFI_REGULATORY_TYPE_CE}, - {"RU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"RW", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SA", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SG", ESP_WIFI_REGULATORY_TYPE_CU}, - {"SI", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SK", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SV", ESP_WIFI_REGULATORY_TYPE_CE}, - {"SY", ESP_WIFI_REGULATORY_TYPE_OM}, - {"TC", ESP_WIFI_REGULATORY_TYPE_CE}, - {"TD", ESP_WIFI_REGULATORY_TYPE_CE}, + {"PL", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PR", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"PT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"PW", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"PY", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"QA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"RE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"RO", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"RS", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"RU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"RW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SG", ESP_WIFI_REGULATORY_TYPE_KCC}, + {"SI", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SK", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SM", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SV", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SX", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"SY", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TC", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TD", ESP_WIFI_REGULATORY_TYPE_IFETEL}, {"TG", ESP_WIFI_REGULATORY_TYPE_TG}, - {"TH", ESP_WIFI_REGULATORY_TYPE_CE}, - {"TN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"TR", ESP_WIFI_REGULATORY_TYPE_CE}, - {"TT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"TW", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"TZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"UA", ESP_WIFI_REGULATORY_TYPE_OM}, - {"UG", ESP_WIFI_REGULATORY_TYPE_CE}, - {"US", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"UY", ESP_WIFI_REGULATORY_TYPE_CE}, - {"UZ", ESP_WIFI_REGULATORY_TYPE_CE}, - {"VC", ESP_WIFI_REGULATORY_TYPE_CE}, - {"VE", ESP_WIFI_REGULATORY_TYPE_ANATEL}, - {"VI", ESP_WIFI_REGULATORY_TYPE_ISED}, - {"VN", ESP_WIFI_REGULATORY_TYPE_CE}, - {"VU", ESP_WIFI_REGULATORY_TYPE_CE}, - {"WF", ESP_WIFI_REGULATORY_TYPE_CE}, - {"WS", ESP_WIFI_REGULATORY_TYPE_CE}, - {"YE", ESP_WIFI_REGULATORY_TYPE_CE}, - {"YT", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ZA", ESP_WIFI_REGULATORY_TYPE_CE}, - {"ZW", ESP_WIFI_REGULATORY_TYPE_CE}, + {"TH", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TN", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TR", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"TW", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"TZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"UA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"UG", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"US", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"UY", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"UZ", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"VA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"VC", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"VE", ESP_WIFI_REGULATORY_TYPE_NCC}, + {"VI", ESP_WIFI_REGULATORY_TYPE_FCC}, + {"VN", ESP_WIFI_REGULATORY_TYPE_KCC}, + {"VU", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"WF", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"WS", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"YE", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"YT", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ZA", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"ZW", ESP_WIFI_REGULATORY_TYPE_IFETEL}, + {"##", ESP_WIFI_REGULATORY_TYPE_MAX}, /* Sentinel: end of table; not a real country code — do not use as wifi_country_t.cc. */ }; const wifi_regulatory_t regulatory_data[] = { @@ -1279,10 +1290,10 @@ const wifi_regulatory_t regulatory_data[] = { { 1, /* Number of rules */ { - { 1, 11, 2, 30, 0, 0 }, /* chan:1~11, max_bw:40M, max_power:30(dBm), dfs:0, reserved.*/ + { 1, 13, 2, 36, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_CE */ + /* ESP_WIFI_REGULATORY_TYPE_SRRC */ { 1, /* Number of rules */ { @@ -1296,7 +1307,7 @@ const wifi_regulatory_t regulatory_data[] = { { 1, 13, 2, 36, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_ANATEL */ + /* ESP_WIFI_REGULATORY_TYPE_WPC */ { 1, /* Number of rules */ { @@ -1318,41 +1329,34 @@ const wifi_regulatory_t regulatory_data[] = { { 1, 13, 2, 23, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:23(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_CE */ + /* ESP_WIFI_REGULATORY_TYPE_IFETEL */ { 1, /* Number of rules */ { { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_OFCA */ + /* ESP_WIFI_REGULATORY_TYPE_RCM */ { 1, /* Number of rules */ { { 1, 13, 2, 36, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:36(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_ANATEL */ + /* ESP_WIFI_REGULATORY_TYPE_NCC */ { 1, /* Number of rules */ { { 1, 13, 2, 30, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:30(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_ISED */ + /* ESP_WIFI_REGULATORY_TYPE_FCC */ { 1, /* Number of rules */ { { 1, 11, 2, 30, 0, 0 }, /* chan:1~11, max_bw:40M, max_power:30(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_CU */ - { - 1, /* Number of rules */ - { - { 1, 13, 2, 23, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:23(dBm), dfs:0, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_GT */ { 1, /* Number of rules */ @@ -1360,13 +1364,6 @@ const wifi_regulatory_t regulatory_data[] = { { 1, 13, 2, 26, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:26(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_ID */ - { - 1, /* Number of rules */ - { - { 1, 13, 2, 26, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:26(dBm), dfs:0, reserved.*/ - } - }, /* ESP_WIFI_REGULATORY_TYPE_KE */ { 1, /* Number of rules */ @@ -1381,11 +1378,11 @@ const wifi_regulatory_t regulatory_data[] = { { 1, 13, 1, 20, 0, 0 }, /* chan:1~13, max_bw:20M, max_power:20(dBm), dfs:0, reserved.*/ } }, - /* ESP_WIFI_REGULATORY_TYPE_OM */ + /* ESP_WIFI_REGULATORY_TYPE_MY */ { 1, /* Number of rules */ { - { 1, 13, 2, 20, 0, 0 }, /* chan:1~13, max_bw:40M, max_power:20(dBm), dfs:0, reserved.*/ + { 1, 14, 2, 26, 0, 0 }, /* chan:1~14, max_bw:40M, max_power:26(dBm), dfs:0, reserved.*/ } }, /* ESP_WIFI_REGULATORY_TYPE_PK */ diff --git a/components/esp_wifi/regulatory/esp_wifi_regulatory.txt b/components/esp_wifi/regulatory/esp_wifi_regulatory.txt index ade4bbeaac5..1dd38607ec6 100644 --- a/components/esp_wifi/regulatory/esp_wifi_regulatory.txt +++ b/components/esp_wifi/regulatory/esp_wifi_regulatory.txt @@ -2,7 +2,7 @@ # SPDX-FileCopyrightText: 2008 Johannes Berg # SPDX-FileCopyrightText: 2008 Michael Green # -# SPDX-FileContributor: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-FileContributor: 2025-2026 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 # # Copyright (c) 2008, Luis R. Rodriguez @@ -60,6 +60,9 @@ country EU: DFS-ETSI # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries: https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country AD: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -67,6 +70,7 @@ country AD: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Etsi En 302 567 (57000 - 66000 @ 2160), (40) @@ -99,6 +103,9 @@ country AI: DFS-ETSI # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country AL: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -106,6 +113,7 @@ country AL: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR # Source: # 2.4 GHz https://www.psrc.am/contents/document/4749 @@ -146,6 +154,9 @@ country AS: DFS-FCC # Harmonized CEPT countries (February 2021): https://docdb.cept.org/download/25c41779-cd6e/Rec7003e.pdf # AT: https://www.rtr.at/TKP/was_wir_tun/telekommunikation/spectrum/bands/1997_bmvit-info-052010en.pdf # AT: acceptance https://www.ris.bka.gv.at/Dokumente/BgblAuth/BGBLA_2014_II_63/BGBLA_2014_II_63.pdfsig +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country AT: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -160,43 +171,43 @@ country AT: DFS-ETSI # Source: # 'Item' in the comments below refers to each numbered rule found at: -# https://www.legislation.gov.au/Details/F2023C00524 +# https://www.legislation.gov.au/Details/F2025L01047 within Table 8 +# except for 5850-5875 which is found in Table 1. # Both DFS-ETSI and DFS-FCC are acceptable per AS/NZS 4268 Appendix B. # The EIRP for DFS bands can be increased by 3dB if TPC is implemented. # In order to allow 80MHz operation between 5650-5730MHz the upper boundary # of this more restrictive band has been shifted up by 5MHz from 5725MHz. country AU: DFS-ETSI - # Item 58 - (915 - 920 @ 4), (1000 mW) - (920 - 928 @ 8), (1000 mW) + # Item 1 + (915 - 928 @ 8), (1000 mW) - # Item 59 + # Item 3 and 7 (2400 - 2483.5 @ 40), (4000 mW) - # Item 61 + # Item 10 (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW - # Item 62 (200 mW allowed if TPC is used) + # Item 11 (200 mW allowed if TPC is used) (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, AUTO-BW, DFS - # Item 63(a) (1000 mW with TPC) + # Item 12(a) (1000 mW with TPC) (5470 - 5600 @ 80), (500 mW), DFS - # Item 63(b) (1000 mW with TPC) + # Item 12(b) (1000 mW with TPC) # The end is 5725 but we borrow 5 MHz from the following less restrictive band # so we can get an 80 MHz channel. (5650 - 5730 @ 80), (500 mW), DFS - # Item 60 + # Item 9 (5730 - 5850 @ 80), (4000 mW), AUTO-BW - # Item 22 + # Item 22 of Table 1 (5850 - 5875 @ 20), (25 mW), AUTO-BW - # Item 63AA (25 mW if outdoors) - (5925 - 6425 @ 160), (250 mW), NO-OUTDOOR + # Item 13 (25 mW if outdoors) + (5925 - 6585 @ 320), (250 mW), NO-OUTDOOR - # Item 65 + # Item 18 (57000 - 71000 @ 2160), (20000 mW), NO-OUTDOOR country AW: DFS-ETSI @@ -216,6 +227,9 @@ country AZ: DFS-ETSI # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country BA: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -223,6 +237,7 @@ country BA: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Etsi En 302 567 (57000 - 66000 @ 2160), (40) @@ -246,6 +261,9 @@ country BD: DFS-JP # BE: https://www.ibpt.be/public/files/en/21761/B03-02_2.1_EN.pdf # BE: https://www.ibpt.be/public/files/en/21762/B03-03_2.1_EN.pdf # BE: https://www.ibpt.be/public/files/en/22165/B01-28_3.1_EN.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country BE: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -348,7 +366,7 @@ country BO: DFS-JP # Source: # https://www.gov.br/anatel/pt-br/regulado/radiofrequencia/radiacao-restrita # https://informacoes.anatel.gov.br/legislacao/resolucoes/2017/936-resolucao-680 -# https://informacoes.anatel.gov.br/legislacao/atos-de-certificacao-de-produtos/2017/1139-ato-14448 +# https://informacoes.anatel.gov.br/legislacao/atos-de-certificacao-de-produtos/2021/1510-ato-1306 country BR: DFS-FCC (2400 - 2483.5 @ 40), (30) # The next three ranges have been reduced by 3dB, could be increased @@ -357,7 +375,7 @@ country BR: DFS-FCC (5250 - 5350 @ 80), (27), NO-OUTDOOR, DFS, AUTO-BW (5470 - 5725 @ 160), (27), DFS, AUTO-BW (5725 - 5850 @ 80), (30), AUTO-BW - (5925 - 7125 @ 320), (12), NO-OUTDOOR, NO-IR + (5925 - 7125 @ 320), (12), NO-OUTDOOR # EIRP=40dBm (43dBm peak) (57000 - 71000 @ 2160), (40) @@ -376,6 +394,15 @@ country BT: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS +# Source: +# https://www.bocra.org.bw/sites/default/files/documents/Annexure_3.3.2A_SRDs_Guidelines_Feb_2022.pdf +country BW: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), AUTO-BW + (5250 - 5350 @ 80), (20), DFS, AUTO-BW + (5470 - 5725 @ 160), (250 mW), DFS + (5725 - 5850 @ 80), (24), DFS + country BY: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW @@ -387,15 +414,20 @@ country BZ: DFS-JP (5735 - 5835 @ 80), (30) # Sources: -# https://www.ic.gc.ca/eic/site/smt-gst.nsf/vwapj/rss-247-i2-e.pdf/$file/rss-247-i2-e.pdf +# RSS-247 Issue 4 +# https://ised-isde.canada.ca/site/spectrum-management-telecommunications/en/devices-and-equipment/radio-equipment-standards/radio-standards-specifications-rss/rss-247-digital-transmission-systems-dtss-frequency-hopping-systems-fhss-and-licence-exempt-local # https://www.ic.gc.ca/eic/site/smt-gst.nsf/eng/sf11750.html (6 GHz operation) country CA: DFS-FCC - (2402 - 2472 @ 40), (30) - (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW - (5250 - 5350 @ 80), (24), DFS, AUTO-BW - (5470 - 5600 @ 80), (24), DFS - (5650 - 5730 @ 80), (24), DFS - (5735 - 5835 @ 80), (30) + (2400 - 2483.5 @ 40), (4000 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (500 mW), DFS, AUTO-BW + # This range ends at 5725 MHz, but channel 144 extends to 5730 MHz. + # Since 5725 ~ 5730 MHz belongs to the next range which has looser + # requirements, we can extend the range by 5 MHz to make the kernel + # happy and be able to use channel 144. + (5470 - 5730 @ 160), (500 mW), DFS + (5730 - 5850 @ 80), (4000 mW), AUTO-BW + (5850 - 5895 @ 40), (27), AUTO-BW (5925 - 7125 @ 320), (12), NO-OUTDOOR # Source: @@ -417,6 +449,9 @@ country CF: DFS-FCC # CH: https://www.ofcomnet.ch/api/rir/1010/04 # CH: https://www.ofcomnet.ch/api/rir/1008/12 # CH: https://www.ofcomnet.ch/#/fatTable +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country CH: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -473,14 +508,17 @@ country CO: DFS-FCC # Source: # https://storage.googleapis.com/eleoscompliance1.appspot.com/public/PNAF%20modificaci%C3%B3n%20ALCA87_30_04_2021.pdf +# https://pgrweb.go.cr/scij/Busqueda/Normativa/Normas/nrm_texto_completo.aspx?param1=NRTC&nValor1=1&nValor2=99551&nValor3=144158&strTipM=TC country CR: DFS-FCC (2402 - 2482 @ 40), (36) - (5170 - 5250 @ 20), (30) - (5250 - 5330 @ 20), (30), DFS - (5490 - 5730 @ 20), (30), DFS - (5735 - 5835 @ 20), (36) - (5875 - 5925 @ 20), (30) + (5150 - 5250 @ 80), (30), AUTO-BW + (5250 - 5350 @ 80), (30), DFS, AUTO-BW + (5470 - 5730 @ 160), (30), DFS + (5730 - 5850 @ 80), (36), AUTO-BW + (5850 - 5895 @ 40), (36), AUTO-BW + (5895 - 5925 @ 20), (30), AUTO-BW (5925 - 7125 @ 320), (30), NO-OUTDOOR + (57000 - 71000 @ 2160), (43) # Source: # https://www.mincom.gob.cu/es/marco-legal @@ -643,26 +681,31 @@ country EC: DFS-FCC # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # EU decision 2021/1067/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32021D1067&from=EN # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf -# EE: https://www.ttja.ee/et/ettevottele-organisatsioonile/sideteenused/raadioseadmed/wifi-seade +# EE: https://ttja.ee/eraklient/side-ja-meediateenused/raadioside/wifi-seadmete-kasutus +# EE: https://www.riigiteataja.ee/akt/117052024018?leiaKehtiv (Lisa 6) # EE: https://www.itu.int/ITU-D/study_groups/SGP_1998-2002/JGRES09/pdf/estonia.pdf country EE: DFS-ETSI + (863 - 868 @ 1), (25 mW) + (915.8 - 919.4 @ 1), (25 mW) (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI - (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI + (5470 - 5725 @ 160), (500 mW), DFS, AUTO-BW, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) - (5725 - 5875 @ 80), (25 mW) + (5725 - 5875 @ 80), (25 mW), AUTO-BW # 6 GHz band - (5945 - 6425 @ 320), (23), NO-OUTDOOR, wmmrule=ETSI + (5945 - 6425 @ 320), (200 mW), NO-OUTDOOR, wmmrule=ETSI # 60 GHz band channels 1-4 (ETSI EN 302 567) - (57000 - 66000 @ 2160), (40) + (57000 - 71000 @ 8640), (40) # https://www.tra.gov.eg/wp-content/uploads/2022/03/EGY-NTRA-March-2022-SRD_English_Final.pdf +# https://www.tra.gov.eg/wp-content/uploads/2024/11/EGY-NTRA-November-2024-SRD_English-1.pdf country EG: DFS-ETSI - (2402 - 2483.5 @ 40), (20) - (5150 - 5250 @ 80), (23), AUTO-BW, wmmrule=ETSI - (5250 - 5350 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI - (57000 - 66000 @ 2160), (40) + (2402 - 2483.5 @ 40), (100 mW), NO-OUTDOOR + (5150 - 5250 @ 80), (200 mW), AUTO-BW, NO-OUTDOOR, wmmrule=ETSI + (5250 - 5350 @ 80), (100 mW), DFS, AUTO-BW, NO-OUTDOOR, wmmrule=ETSI + (5925 - 6425 @ 320), (250 mW), NO-OUTDOOR + (57000 - 66000 @ 2160), (40), NO-OUTDOOR # ES as part of EU/CEPT accepted decisions 2005/513/EC (5GHz RLAN, EN 301 893) # and 2006/771/EC (amended by 2008/432/EC, Short-Range Devices, EN 300 440) @@ -714,6 +757,13 @@ country FM: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) +country FO: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS + (5945 - 6425 @ 320), (23), NO-OUTDOOR + # FR as part of EU/CEPT accepted decisions 2005/513/EC (5GHz RLAN, EN 301 893) # and 2006/771/EC (amended by 2008/432/EC, Short-Range Devices, EN 300 440) # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 @@ -748,7 +798,7 @@ country GB: DFS-ETSI (5470 - 5730 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5850 @ 80), (200 mW), NO-OUTDOOR - (5925 - 6425 @ 160), (250 mW), NO-OUTDOOR, wmmrule=ETSI + (5925 - 6425 @ 320), (250 mW), NO-OUTDOOR, wmmrule=ETSI # 60 GHz band channels 1-6 (57000 - 71000 @ 2160), (40) @@ -759,10 +809,15 @@ country GD: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) +# Source: +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country GE: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (18), AUTO-BW (5250 - 5330 @ 80), (18), DFS, AUTO-BW + (5945 - 6425 @ 320), (23), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Etsi En 302 567 (57000 - 66000 @ 2160), (40) @@ -779,6 +834,13 @@ country GH: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) +country GI: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS + (5945 - 6425 @ 320), (23), NO-OUTDOOR + country GL: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI @@ -847,7 +909,7 @@ country HK: DFS-ETSI (5250 - 5350 @ 80), (23), DFS, AUTO-BW, NO-OUTDOOR (5470 - 5730 @ 160), (27), DFS (5730 - 5850 @ 80), (36) - (5925 - 6425 @ 160), (14) + (5945 - 6425 @ 160), (24), NO-OUTDOOR # Source: # https://www.conatel.gob.hn/doc/Regulacion/resoluciones/2023/NR05-23.pdf @@ -954,6 +1016,13 @@ country IL: DFS-ETSI (5725 - 5875 @ 80), (25 mW), AUTO-BW (5945 - 6425 @ 320), (200 mW), NO-OUTDOOR +country IM: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS + (5945 - 6425 @ 320), (23), NO-OUTDOOR + # Source: # https://dot.gov.in/spectrummanagement/delicensing-24-24835-ghz-band-gsr-45-e-5150-5350-ghz-gsr-46-e-and-5725-5875-ghz # https://dot.gov.in/spectrummanagement/license-exemption-5-ghz-gsr-1048e-dated-22102018 @@ -963,6 +1032,7 @@ country IN: (5250 - 5350 @ 80), (24), DFS (5470 - 5725 @ 160), (24), DFS (5725 - 5875 @ 80), (30) + (5925 - 6425 @ 320), (24), NO-OUTDOOR # Source: # https://asnad.cra.ir/fa/Public/Documents/Details/73af8590-f065-eb11-968f-0050569b0899 @@ -978,7 +1048,9 @@ country IR: DFS-ETSI # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf # IS: https://www.pfs.is/library/Skrar/Tidnir-og-taekni/MHZ_21022019.pdf -# CEPT ECC Decision (20)01 for 6GHz: https://docdb.cept.org/download/1448 +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country IS: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1089,8 +1161,9 @@ country KR: DFS-JP (5250 - 5350 @ 80), (20), DFS, AUTO-BW (5470 - 5725 @ 160), (20), DFS (5725 - 5850 @ 80), (23) - # 6 GHz band - (5925 - 7125 @ 160), (15), NO-OUTDOOR + # 6 GHz band - per MSIT Notice 2026-10 + (5925 - 6425 @ 320), (18), NO-OUTDOOR, AUTO-BW + (6425 - 7125 @ 320), (15), NO-OUTDOOR, AUTO-BW # 60 GHz band channels 1-4 (57000 - 66000 @ 2160), (43) @@ -1117,11 +1190,12 @@ country KY: DFS-FCC # http://adilet.zan.kz/rus/docs/V1500010730 # http://adilet.zan.kz/rus/docs/V1500010375 country KZ: DFS-ETSI - (2400 - 2483.5 @ 40), (20) - (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW (5250 - 5350 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW - (5470 - 5725 @ 160), (20), NO-OUTDOOR, DFS - (5725 - 5850 @ 80), (20), NO-OUTDOOR + (5470 - 5725 @ 160), (100 mW), NO-OUTDOOR, DFS + (5725 - 5850 @ 80), (100 mW), NO-OUTDOOR + (5925 - 6425 @ 320), (200 mW), NO-OUTDOOR (57000 - 66000 @ 2160), (40) country LB: DFS-FCC @@ -1149,8 +1223,10 @@ country LC: DFS-ETSI # LI: https://www.ofcomnet.ch/api/rir/1010/04 # LI: https://www.ofcomnet.ch/api/rir/1008/12 # LI: https://www.ofcomnet.ch/#/fatTable -# CEPT ECC Decision (20)01 for 6GHz: https://docdb.cept.org/download/1448 # LI: https://www.ofcomnet.ch/api/rir/1010/11 +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country LI: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1248,6 +1324,9 @@ country MA: DFS-ETSI # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country MC: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1255,6 +1334,7 @@ country MC: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR # Source: # http://www.cnfr.md/index.php?pag=sec&id=117&l=en @@ -1264,6 +1344,9 @@ country MC: DFS-ETSI # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf # https://www.legis.md/cautare/downloadpdf/134846 +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country MD: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1280,6 +1363,9 @@ country MD: DFS-ETSI # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country ME: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1287,6 +1373,7 @@ country ME: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR country MF: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -1306,6 +1393,9 @@ country MH: DFS-FCC # EU decision 2005/513/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02005D0513-20070213 # EU decision 2006/771/EC: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02008D0432-20080611 # Harmonized CEPT countries (July 2019): https://www.ecodocdb.dk/download/25c41779-cd6e/Rec7003e.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country MK: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1313,6 +1403,7 @@ country MK: DFS-ETSI (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI # short range devices (ETSI EN 300 440-1) (5725 - 5875 @ 80), (25 mW) + (5945 - 6425 @ 320), (23), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Etsi En 302 567 (57000 - 66000 @ 2160), (40) @@ -1413,14 +1504,16 @@ country MX: DFS-FCC (5925 - 6425 @ 320), (12), NO-OUTDOOR # Source: -# https://www.mcmc.gov.my/skmmgovmy/media/General/CA-No-1-of-2022_-signed_19012022.pdf +# https://www.mcmc.gov.my/skmmgovmy/media/General/pdf2/Class-Assignment-No-2-of-2025.pdf country MY: DFS-FCC - (2402 - 2482 @ 40), (500 mW) - (5170 - 5250 @ 80), (1000 mW), AUTO-BW - (5250 - 5330 @ 80), (1000 mW), DFS, AUTO-BW - (5490 - 5650 @ 160), (1000 mW), DFS - (5735 - 5835 @ 80), (1000 mW) - (5925 - 6425 @ 320), (200 mW), NO-OUTDOOR + (2400 - 2500 @ 40), (500 mW) + (5150 - 5250 @ 80), (1000 mW), AUTO-BW, NO-OUTDOOR + # 5250 - 5350 MHz regulatory limit is 1000 mW, but 200 mW reaches the PSD limit of 10 mW / MHz at 20 MHz channel width + (5250 - 5350 @ 80), (200 mW), DFS, AUTO-BW, NO-OUTDOOR + # 5470 - 5650 MHz regulatory limit is 1000 mW, but 200 mW reaches the PSD limit of 10 mW / MHz at 20 MHz channel width + (5470 - 5650 @ 160), (200 mW), DFS + (5725 - 5875 @ 80), (1000 mW) + (5925 - 6425 @ 320), (250 mW), NO-OUTDOOR # Source: # https://www.cran.na/yglilidy/2023/04/GG-8060-dated-3-April-2023.pdf @@ -1476,6 +1569,9 @@ country NL: DFS-ETSI # NO: https://eng.nkom.no/technical/temporary-licenses/mobile-videolink/wireless-cameras-mobile-video-links/_attachment/9947 # NO: http://www.lovdata.no/dokument/SF/forskrift/2012-01-19-77 # In addition to EU NO can use 5725–5795 MHz and 5815–5850 bands with limit of 4 W EIRP (with DFS and TPC) +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country NO: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW) (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1633,12 +1729,15 @@ country PW: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) +# Source: +# https://www.conatel.gov.py/conatel/wp-content/uploads/2025/05/2025-rd-1035-sistema-acceso-inalambrico-baja-potencia-6ghz-norma-tecnica.pdf country PY: DFS-FCC (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (24), AUTO-BW (5250 - 5330 @ 80), (24), DFS, AUTO-BW (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) + (5925 - 6425 @ 320), (12), NO-OUTDOOR # Source: # https://www.cra.gov.qa/-/media/System/D/2/5/8/D258CF18B83A5613B0D590193CB799CB/Class-License-WIFI-6E-Final-English-032022--V3.ashx @@ -1699,8 +1798,8 @@ country RS: DFS-ETSI country RU: (2400 - 2483.5 @ 40), (100mW) (5150 - 5350 @ 160), (100 mW), NO-OUTDOOR - (5650 - 5850 @ 160), (100 mW), NO-OUTDOOR - (5925 - 6425 @ 160), (100 mW), NO-OUTDOOR + (5650 - 5850 @ 160), (200 mW), NO-OUTDOOR + (5925 - 6425 @ 320), (200 mW), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Changes to NLA 124_Order №129_22042015.pdf (57000 - 66000 @ 2160), (40), NO-OUTDOOR @@ -1804,6 +1903,13 @@ country SK: DFS-ETSI # 60 GHz band channels 1-4 (ETSI EN 302 567) (57000 - 66000 @ 2160), (40) +country SM: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS + (5945 - 6425 @ 320), (23), NO-OUTDOOR + # Source: # Regulation N° 2004-005 ART/DG/DRC/D.Rég country SN: DFS-FCC @@ -1828,6 +1934,15 @@ country SV: DFS-FCC (5735 - 5835 @ 20), (30) (5925 - 7125 @ 320), (12), NO-OUTDOOR +# Source: +# https://btp.sx/dash/files/Telecommunications/Technical-Requirements/10t98466434723___TGVnYWwgYW5kIGlsbGVnYWwgd2lyZWxlc3MgY29tbXVuaWNhdGlvbiBkZXZpY2Vzb_64.pdf +country SX: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (50 mW), AUTO-BW + (5250 - 5350 @ 80), (21), DFS, AUTO-BW + (5470 - 5725 @ 160), (250 mW), DFS + (5725 - 5875 @ 80), (24), DFS + # Source: # https://sytpra.gov.sy/public/uploads/files/%D8%A7%D9%84%D8%A7%D8%B7%D8%A7%D8%B1%20%D8%A7%D9%84%D9%82%D8%A7%D9%86%D9%88%D9%86%D9%8A/%D9%84%D9%88%D8%A7%D8%A6%D8%AD%20%D8%AA%D9%86%D8%B8%D9%8A%D9%85%D9%8A%D8%A9/%D9%84%D9%88%D8%A7%D8%A6%D8%AD%20%D8%A7%D9%84%D8%B7%D9%8A%D9%81%20%D8%A7%D9%84%D8%AA%D8%B1%D8%AF%D8%AF%D9%8A%20%D8%A7%D9%84%D8%B1%D8%A7%D8%AF%D9%8A%D9%88%D9%8A/L1.pdf country SY: DFS-ETSI @@ -1875,14 +1990,20 @@ country TH: DFS-FCC (5735 - 5835 @ 80), (30) (5925 - 6425 @ 320), (250 mW), NO-OUTDOOR +# Source: +# https://www.anf.tn/sites/default/files/2025-01/Arr%C3%AAt%C3%A92024_4611.pdf country TN: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5925 - 6425 @ 320), (200 mW), NO-OUTDOOR # Source: # Technical Criteria for Radio Devices and Systems Excluded from Frequency Allocation, Sept 9, 2022 # https://www.btk.gov.tr/uploads/pages/ftm-teknik-olcutler-ek-5.pdf +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country TR: DFS-ETSI (2400 - 2483.5 @ 40), (20) (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI @@ -1939,14 +2060,18 @@ country TZ: DFS-ETSI # 2.4 GHz band channels can be used outdoors when some requirements are met. # 5 GHz band channels must be used only indoors in some cases. They are neither # permitted nor denied outdoors in others. +# Harmonized CEPT countries for 6 GHz (ECC Decision (20)01) +# https://docdb.cept.org/implementation/16737 +# https://docdb.cept.org/download/4685 country UA: DFS-ETSI (2400 - 2483.5 @ 40), (100 mW), NO-OUTDOOR (5150 - 5250 @ 80), (100 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW, wmmrule=ETSI (5470 - 5725 @ 160), (100 mW), DFS, NO-OUTDOOR, wmmrule=ETSI (5725 - 5850 @ 80), (100 mW), NO-OUTDOOR + (5945 - 6425 @ 320), (23), NO-OUTDOOR # 60 GHz band channels 1-4, ref: Etsi En 302 567 - (57000 - 66000 @ 2160), (40 mW), NO-OUTDOOR + (57000 - 66000 @ 2160), (40), NO-OUTDOOR country UG: DFS-FCC (2402 - 2482 @ 40), (20) @@ -1977,14 +2102,10 @@ country US: DFS-FCC # requirements, we can extend the range by 5 MHz to make the kernel # happy and be able to use channel 144. (5470 - 5730 @ 160), (24), DFS - # This range ends at 5850 MHz, but channel 169 extends to 5855 MHz. - # Since 5850 ~ 5855 MHz belongs to the next range which has looser - # requirements, we extend the range by 5 MHz to make the driver - # happy and be able to use channel 169. - (5730 - 5855 @ 80), (27), AUTO-BW + (5730 - 5850 @ 80), (30), AUTO-BW # https://www.federalregister.gov/documents/2021/05/03/2021-08802/use-of-the-5850-5925-ghz-band # max. 33 dBm AP @ 20MHz, 36 dBm AP @ 40Mhz+, 6 dB less for clients - (5855 - 5895 @ 40), (27), NO-OUTDOOR, AUTO-BW, NO-IR + (5850 - 5895 @ 40), (27), NO-OUTDOOR, AUTO-BW, NO-IR # 6g band # https://www.federalregister.gov/documents/2020/05/26/2020-11236/unlicensed-use-of-the-6ghz-band (5925 - 7125 @ 320), (12), NO-OUTDOOR, NO-IR @@ -2006,6 +2127,13 @@ country UZ: DFS-ETSI (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW +country VA: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS + (5945 - 6425 @ 320), (23), NO-OUTDOOR + # Source: # http://www.ntrc.vc/regulations/Jun_2006_Spectrum_Managment_Regulations.pdf country VC: DFS-ETSI @@ -2031,12 +2159,17 @@ country VI: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) +# Source: +# https://datafiles.chinhphu.vn/cpp/files/vbpq/2021/10/08-btttt.signed.pdf +# https://mic.gov.vn/van-ban-phap-luat/25099.htm country VN: DFS-FCC - (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (17) - (5250 - 5330 @ 80), (24), DFS - (5490 - 5730 @ 80), (24), DFS - (5735 - 5835 @ 80), (30) + (2400 - 2483.5 @ 40), (200 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, AUTO-BW + (5470 - 5725 @ 160), (500 mW), DFS, AUTO-BW + (5725 - 5850 @ 80), (1000 mW), AUTO-BW + (5925 - 6425 @ 320), (200 mW), NO-OUTDOOR, AUTO-BW + (57000 - 66000 @ 2160), (10000 mW), NO-OUTDOOR # Source: # http://www.trr.vu/attachments/category/130/GURL_for_Short-range_Radiocommunication_Devices2.pdf @@ -2074,7 +2207,7 @@ country ZA: DFS-ETSI (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (30) - (5925 - 6425 @ 320), (14) + (5925 - 6425 @ 320), (23), NO-OUTDOOR country ZW: DFS-ETSI (2402 - 2482 @ 40), (20) diff --git a/components/esp_wifi/regulatory/reg2fw.py b/components/esp_wifi/regulatory/reg2fw.py index 1a3eecf94b6..36a4b6bc7b5 100755 --- a/components/esp_wifi/regulatory/reg2fw.py +++ b/components/esp_wifi/regulatory/reg2fw.py @@ -1,15 +1,18 @@ #!/usr/bin/env python -# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import os -from typing import List +from datetime import datetime from typing import TextIO from reg_parse import DBParser from reg_parse import Regdomain +# Not a valid ISO 3166-1 alpha-2 code; marks end of regdomain_table for linear scans (matches wifi_regdomain_t.cn[2]). +REGDOMAIN_TABLE_SENTINEL_CC = '##' -def write_regulatory_rules(cfile: TextIO, perms: List, filter_5g: bool = False) -> None: + +def write_regulatory_rules(cfile: TextIO, perms: list, filter_5g: bool = False) -> None: """Helper function to write regulatory rules to the C file.""" filtered_perms = [perm for perm in perms if not filter_5g or (perm.freqband.start >= 1 and perm.freqband.end <= 14)] rule_count = len(filtered_perms) @@ -39,7 +42,7 @@ def write_regulatory_rules(cfile: TextIO, perms: List, filter_5g: bool = False) def write_regulatory_data( - cfile: TextIO, reg: Regdomain, type_list: List[str], perm_list: List[List], filter_5g: bool + cfile: TextIO, reg: Regdomain, type_list: list[str], perm_list: list[list], filter_5g: bool ) -> None: """Helper function to write regulatory data.""" cfile.write('typedef enum {\n') @@ -48,18 +51,29 @@ def write_regulatory_data( cfile.write(' ESP_WIFI_REGULATORY_TYPE_MAX,\n') cfile.write('} esp_wifi_regulatory_type_t;\n\n') - cfile.write('const wifi_regdomain_t regdomain_table[WIFI_MAX_SUPPORT_COUNTRY_NUM] = {\n') - country_map = reg.regdomain_countries if filter_5g else reg.regdomain_countries_2g + + cfile.write( + '/*\n' + ' * regdomain_table: ISO alpha-2 country codes and their regulatory profile indices.\n' + ' * Last row is a sentinel (not a real country code).\n' + ' */\n' + ) + cfile.write('const wifi_regdomain_t regdomain_table[] = {\n') + for cc, reg_type_index in country_map.items(): reg_type = f'ESP_WIFI_REGULATORY_TYPE_{type_list[reg_type_index]}' cfile.write(f' {{"{cc.decode("utf-8")}", {reg_type}}},\n') + cfile.write( + ' {"' + REGDOMAIN_TABLE_SENTINEL_CC + '", ESP_WIFI_REGULATORY_TYPE_MAX}, ' + '/* Sentinel: end of table; not a real country code — ' + 'do not use as wifi_country_t.cc. */\n' + ) cfile.write('};\n\n') cfile.write('const wifi_regulatory_t regulatory_data[] = {\n') - for perms in perm_list: - index = perm_list.index(perms) + for index, perms in enumerate(perm_list): regulatory_type = f'ESP_WIFI_REGULATORY_TYPE_{type_list[index]}' cfile.write(f' /* {regulatory_type} */\n') write_regulatory_rules(cfile, perms, not filter_5g) @@ -75,14 +89,34 @@ def main() -> None: directory = os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(directory, filename) try: - with open(file_path, 'r', encoding='utf-8') as file: + with open(file_path, encoding='utf-8') as file: regdomains = p.parse(file) + # Get the modification time of the source file to determine copyright year + mtime = os.path.getmtime(file_path) + copyright_year = datetime.fromtimestamp(mtime).year except FileNotFoundError: raise Exception(f'File {file_path} not found') reg.simplify_countries(regdomains) reg.simplify_countries_2g(regdomains) + total_countries = len(regdomains) + country_rules_count = {} + for country_code, country in regdomains.items(): + country_str = country_code.decode('utf-8') + rules_count = len(country.permissions) + country_rules_count[country_str] = rules_count + + max_rules_country = max(country_rules_count.items(), key=lambda x: x[1]) + max_rules_count = max_rules_country[1] + max_rules_countries = [cc for cc, count in country_rules_count.items() if count == max_rules_count] + + print('\n=== Regulatory Statistics ===') + print(f'Total supported countries: {total_countries}') + print(f'Country(ies) with most rules: {", ".join(max_rules_countries)}') + print(f'Maximum number of rules: {max_rules_count}') + print('=' * 30 + '\n') + type_list = list(reg.typical_regulatory.keys()) perm_list = list(reg.typical_regulatory.values()) @@ -93,7 +127,7 @@ def main() -> None: with open(output_file, 'w') as cfile: cfile.write('/*\n') - cfile.write(' * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD\n') + cfile.write(f' * SPDX-FileCopyrightText: 2025-{copyright_year} Espressif Systems (Shanghai) CO LTD\n') cfile.write(' *\n') cfile.write(' * SPDX-License-Identifier: Apache-2.0\n') cfile.write(' */\n\n') diff --git a/components/esp_wifi/regulatory/reg_parse.py b/components/esp_wifi/regulatory/reg_parse.py index fac1b8f534f..dd092982a24 100755 --- a/components/esp_wifi/regulatory/reg_parse.py +++ b/components/esp_wifi/regulatory/reg_parse.py @@ -3,7 +3,7 @@ # SPDX-FileCopyrightText: 2008 Johannes Berg # SPDX-FileCopyrightText: 2008 Michael Green # -# SPDX-FileContributor: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-FileContributor: 2025-2026 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 # # Copyright (c) 2008, Luis R. Rodriguez @@ -707,9 +707,25 @@ class DBParser: class Regdomain: def __init__(self) -> None: self.regdomain_countries: dict[bytes, int] = {} - self.typical_regulatory: dict[str, list] = {} + self.typical_regulatory: dict[str, tuple[Permission, ...]] = {} self.regdomain_countries_2g: dict[bytes, int] = {} - self.typical_regulatory_2g: dict[str, list] = {} + self.typical_regulatory_2g: dict[str, tuple[Permission, ...]] = {} + + @staticmethod + def _permission_cmp_key(permission: Permission) -> tuple[int, int, int, int, int]: + """Return reduced fields aligned with generated C rule granularity.""" + max_eirp = int(permission.power.max_eirp) if permission.power else 0 + return ( + int(permission.freqband.start), + int(permission.freqband.end), + int(permission.freqband.maxbw), + max_eirp, + permission.dfs, + ) + + def _permissions_cmp_key(self, permissions: tuple[Permission, ...]) -> tuple[tuple[int, int, int, int, int], ...]: + """Build a reduced comparison key from a country's permission set.""" + return tuple(self._permission_cmp_key(permission) for permission in permissions) def build_typical_regdomains(self, countries: dict[bytes, Country]) -> None: """Populate typical regulatory domains based on country permissions.""" @@ -731,26 +747,32 @@ class Regdomain: """Simplify country permissions by building typical regdomains.""" self.build_typical_regdomains(countries) perm_list = list(self.typical_regulatory.values()) + perm_key_to_index = {self._permissions_cmp_key(permissions): idx for idx, permissions in enumerate(perm_list)} for cn, country in countries.items(): cn_str = cn.decode('utf-8') permissions = country.permissions - if permissions not in perm_list: + permissions_key = self._permissions_cmp_key(permissions) + if permissions_key not in perm_key_to_index: self.typical_regulatory[cn_str] = permissions perm_list.append(permissions) - self.regdomain_countries[cn] = perm_list.index(permissions) + perm_key_to_index[permissions_key] = len(perm_list) - 1 + self.regdomain_countries[cn] = perm_key_to_index[permissions_key] def simplify_countries_2g(self, countries: dict[bytes, Country]) -> None: """Simplify country permissions by building typical regdomains.""" self.build_typical_regdomains_2g(countries) perm_list = list(self.typical_regulatory_2g.values()) + perm_key_to_index = {self._permissions_cmp_key(permissions): idx for idx, permissions in enumerate(perm_list)} for cn, country in countries.items(): cn_str = cn.decode('utf-8') permissions = country.permissions_2g + permissions_key = self._permissions_cmp_key(permissions) - if permissions not in perm_list: + if permissions_key not in perm_key_to_index: self.typical_regulatory_2g[cn_str] = permissions perm_list.append(permissions) - self.regdomain_countries_2g[cn] = perm_list.index(permissions) + perm_key_to_index[permissions_key] = len(perm_list) - 1 + self.regdomain_countries_2g[cn] = perm_key_to_index[permissions_key]