[PATCH v9 0/7] Introduce Automated Frequency Coordination (AFC) support
Jouni Malinen
j at w1.fi
Mon Jan 26 13:12:28 PST 2026
On Mon, Dec 01, 2025 at 07:10:35PM +0800, Allen Ye wrote:
> This patch series introduces Automated Frequency Coordination (AFC) support
> for Standard Power Devices (SPDs) operating in the 6GHz UNII-5 and UNII-7
> bands. AFC is a regulatory requirement for SPDs to determine a list of
> available channels and their permissible power levels.
>
> The implementation introduces a new standalone daemon, afcd, to manage
> communication with the AFC server. A client within hostapd then interacts
> with afcd via a Unix socket to fetch spectrum availability and update AP
> parameters accordingly. The series also includes hwsim tests for validation.
> Changes since v8:
> - rebase on top of hostapd main branch
There were a couple of conflicts with the current snapshot, so it is
possible that something went wrong when I merged the conflicts. However,
I don't think all of these would be caused by that.. In any case, I
cannot compile this due to following warnings or errors:
config_file.c: In function ‘hostapd_afc_parse_cert_ids’:
config_file.c:1323:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
1323 | for (i = 0; i < conf->afc.n_cert_ids; i++) {
| ^
../src/ap/afc.c: In function ‘hostapd_afc_build_location_request’:
../src/ap/afc.c:87:24: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
87 | i < iconf->afc.location.n_linear_polygon_data; i++) {
| ^
../src/ap/afc.c:125:24: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
125 | i < iconf->afc.location.n_radial_polygon_data; i++) {
| ^
../src/ap/afc.c: In function ‘hostapd_afc_build_req_chan_list’:
../src/ap/afc.c:285:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
285 | for (i = 0; i < iconf->afc.n_op_class; i++) {
| ^
../src/ap/afc.c: In function ‘hostapd_afc_build_request’:
../src/ap/afc.c:352:31: error: ‘struct <anonymous>’ has no member named ‘id’
352 | if (iconf->afc.request.id) {
| ^
../src/ap/afc.c:353:68: error: ‘struct <anonymous>’ has no member named ‘id’
353 | str_obj = json_object_new_string(iconf->afc.request.id);
| ^
../src/ap/afc.c:378:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
378 | for (i = 0; i < iconf->afc.n_cert_ids; i++) {
| ^
../src/ap/afc.c:419:31: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
419 | for (i = 0; i < iconf->afc.n_freq_range; i++) {
| ^
../src/ap/afc.c: In function ‘hostad_afc_parse_available_freq_info’:
../src/ap/afc.c:471:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare]
471 | for (i = 0; i < json_object_array_length(obj); i++) {
| ^
../src/ap/afc.c: In function ‘hostad_afc_parse_available_chan_info’:
../src/ap/afc.c:585:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare]
585 | for (i = 0; i < json_object_array_length(obj); i++) {
| ^
../src/ap/afc.c:609:25: warning: comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare]
609 | ch < json_object_array_length(chan_cfi_obj); ch++) {
| ^
../src/ap/afc.c: In function ‘hostapd_afc_parse_reply’:
../src/ap/afc.c:689:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare]
689 | for (i = 0; i < json_object_array_length(reply_obj); i++) {
| ^
../src/ap/afc.c:708:39: error: ‘struct <anonymous>’ has no member named ‘id’
708 | if (iconf->afc.request.id &&
| ^
In file included from /Git/hostap/src/utils/common.h:12,
from ../src/ap/afc.c:14:
../src/ap/afc.c:709:49: error: ‘struct <anonymous>’ has no member named ‘id’
709 | os_strcmp(iconf->afc.request.id,
| ^
/Git/hostap/src/utils/os.h:556:35: note: in definition of macro ‘os_strcmp’
556 | #define os_strcmp(s1, s2) strcmp((s1), (s2))
| ^~
../src/ap/afc.c:724:31: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
724 | for (j = 0; j < iconf->afc.n_cert_ids; j++) {
| ^
../src/ap/afc.c:730:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
730 | if (j == iconf->afc.n_cert_ids) {
| ^~
../src/ap/afc.c: In function ‘hostap_afc_disable_channels’:
../src/ap/afc.c:1087:31: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
1087 | for (j = 0; j < iface->afc.num_freq_range; j++) {
| ^
../src/ap/afc.c:1093:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
1093 | if (j != iface->afc.num_freq_range)
| ^~
../src/ap/afc.c:1096:31: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
1096 | for (j = 0; j < iface->afc.num_chan_info; j++) {
| ^
../src/ap/afc.c:1101:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
1101 | if (j != iface->afc.num_chan_info)
| ^~
../src/ap/afc.c: In function ‘hostap_afc_get_chan_max_eirp_power’:
../src/ap/afc.c:1124:31: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
1124 | for (i = 0; i < iface->afc.num_freq_range; i++) {
| ^
../src/ap/afc.c:1135:31: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
1135 | for (i = 0; i < iface->afc.num_chan_info; i++) {
| ^
../src/ap/afc.c:1143:47: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
1143 | for (j = 0; j < ARRAY_SIZE(c->power); j++)
| ^
ctrl_iface.c:3965:1: warning: ‘hostapd_cli_cmd_afc_send_request’ defined but not used [-Wunused-function]
3965 | hostapd_cli_cmd_afc_send_request(struct hostapd_data *hapd, char *cmd,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ctrl_iface.c:3954:1: warning: ‘hostapd_cli_cmd_afc_get_response’ defined but not used [-Wunused-function]
3954 | hostapd_cli_cmd_afc_get_response(struct hostapd_data *hapd, char *cmd,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ctrl_iface.c:3942:1: warning: ‘hostapd_cli_cmd_afc_get_request’ defined but not used [-Wunused-function]
3942 | hostapd_cli_cmd_afc_get_request(struct hostapd_data *hapd, char *cmd,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/ld: /Git/hostap/build/hostapd/src/ap/hostapd.o: in function `hostapd_cleanup_iface':
/Git/hostap/hostapd/../src/ap/hostapd.c:763:(.text+0x309d): undefined reference to `hostapd_afc_stop'
/usr/bin/ld: /Git/hostap/build/hostapd/src/ap/hostapd.o: in function `hostapd_interface_deinit':
/Git/hostap/hostapd/../src/ap/hostapd.c:3054:(.text+0x5152): undefined reference to `hostapd_afc_stop'
/usr/bin/ld: /Git/hostap/build/hostapd/src/ap/hostapd.o: in function `hostapd_setup_interface_complete_sync':
/Git/hostap/hostapd/../src/ap/hostapd.c:2656:(.text+0x6053): undefined reference to `hostapd_afc_handle_request'
/usr/bin/ld: /Git/hostap/build/hostapd/src/ap/hw_features.o: in function `hostapd_get_hw_features':
/Git/hostap/hostapd/../src/ap/hw_features.c:160:(.text+0x2483): undefined reference to `hostap_afc_disable_channels'
/usr/bin/ld: /Git/hostap/hostapd/../src/ap/hw_features.c:160:(.text+0x276e): undefined reference to `hostap_afc_disable_channels'
--
Jouni Malinen PGP id EFC895FA
More information about the Hostap
mailing list