diff --git a/drivers/wifi/infineon/airoc_wifi.c b/drivers/wifi/infineon/airoc_wifi.c index e3d8e6a3c7d3b..70db2935d51aa 100644 --- a/drivers/wifi/infineon/airoc_wifi.c +++ b/drivers/wifi/infineon/airoc_wifi.c @@ -363,6 +363,37 @@ static void airoc_wifi_network_process_ethernet_data(whd_interface_t interface, } } +static enum ethernet_hw_caps airoc_get_capabilities(const struct device *dev) +{ + ARG_UNUSED(dev); + + return ETHERNET_HW_FILTERING; +} + +static int airoc_set_config(const struct device *dev, + enum ethernet_config_type type, + const struct ethernet_config *config) +{ + ARG_UNUSED(dev); + whd_mac_t whd_mac_addr; + + switch (type) { + case ETHERNET_CONFIG_TYPE_FILTER: + for (int i = 0; i < WHD_ETHER_ADDR_LEN; i++) { + whd_mac_addr.octet[i] = config->filter.mac_address.addr[i]; + } + if (config->filter.set) { + whd_wifi_register_multicast_address(airoc_if, &whd_mac_addr); + } else { + whd_wifi_unregister_multicast_address(airoc_if, &whd_mac_addr); + } + return 0; + default: + break; + } + return -ENOTSUP; +} + static void *link_events_handler(whd_interface_t ifp, const whd_event_header_t *event_header, const uint8_t *event_data, void *handler_user_data) { @@ -502,7 +533,7 @@ static int airoc_mgmt_connect(const struct device *dev, struct wifi_connect_req_ goto error; } - if (usr_result.security == 0) { + if (usr_result.security == WHD_SECURITY_UNKNOWN) { ret = -EAGAIN; LOG_ERR("Could not scan device"); goto error; @@ -620,10 +651,18 @@ static int airoc_mgmt_ap_enable(const struct device *dev, struct wifi_connect_re params->channel); } - if (params->psk_length == 0) { + switch (params->security) { + case WIFI_SECURITY_TYPE_NONE: security = WHD_SECURITY_OPEN; - } else { + break; + case WIFI_SECURITY_TYPE_PSK: security = WHD_SECURITY_WPA2_AES_PSK; + break; + case WIFI_SECURITY_TYPE_SAE: + security = WHD_SECURITY_WPA3_SAE; + break; + default: + goto error; } if (whd_wifi_init_ap(airoc_ap_if, &ssid, security, (const uint8_t *)params->psk, @@ -650,6 +689,7 @@ static int airoc_mgmt_ap_enable(const struct device *dev, struct wifi_connect_re data->is_ap_up = true; airoc_if = airoc_ap_if; + net_if_dormant_off(data->iface); error: k_sem_give(&data->sema_common); @@ -695,6 +735,7 @@ static int airoc_mgmt_ap_disable(const struct device *dev) if (whd_ret == CY_RSLT_SUCCESS) { data->is_ap_up = false; airoc_if = airoc_sta_if; + net_if_dormant_on(data->iface); } else { LOG_ERR("Can't stop wifi ap: %u", whd_ret); } @@ -769,6 +810,8 @@ static const struct wifi_mgmt_ops airoc_wifi_mgmt = { static const struct net_wifi_mgmt_offload airoc_api = { .wifi_iface.iface_api.init = airoc_mgmt_init, .wifi_iface.send = airoc_mgmt_send, + .wifi_iface.get_capabilities = airoc_get_capabilities, + .wifi_iface.set_config = airoc_set_config, .wifi_mgmt_api = &airoc_wifi_mgmt, };