Skip to content

Commit 7fc8051

Browse files
mniestrojcfriedt
authored andcommitted
drivers: wifi: esp_at: return WIFI_STATUS_* connect error codes
Return `enum wifi_conn_status` after failed connection attempt. Parse `+CWJAP:` messages to get failure reason. Signed-off-by: Marcin Niestroj <[email protected]>
1 parent 601f2fd commit 7fc8051

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

drivers/wifi/esp_at/esp.c

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_cwlap)
416416
}
417417

418418
/* +CWJAP:(ssid,bssid,channel,rssi) */
419-
MODEM_CMD_DIRECT_DEFINE(on_cmd_cwjap)
419+
MODEM_CMD_DIRECT_DEFINE(on_cmd_cwjap_status)
420420
{
421421
struct esp_data *dev = CONTAINER_OF(data, struct esp_data,
422422
cmd_handler_data);
@@ -483,6 +483,34 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_cwjap)
483483
return str - cwjap_buf;
484484
}
485485

486+
/* +CWJAP:(error) */
487+
MODEM_CMD_DEFINE(on_cmd_cwjap_connect)
488+
{
489+
struct esp_data *dev = CONTAINER_OF(data, struct esp_data,
490+
cmd_handler_data);
491+
long errcode = strtol(argv[0], NULL, 10);
492+
493+
switch (errcode) {
494+
case 1:
495+
dev->conn_status = WIFI_STATUS_CONN_TIMEOUT;
496+
break;
497+
case 2:
498+
dev->conn_status = WIFI_STATUS_CONN_WRONG_PASSWORD;
499+
break;
500+
case 3:
501+
dev->conn_status = WIFI_STATUS_CONN_AP_NOT_FOUND;
502+
break;
503+
case 4:
504+
dev->conn_status = WIFI_STATUS_CONN_FAIL;
505+
break;
506+
default:
507+
LOG_WRN("Unknown CWJAP error code: %ld", errcode);
508+
break;
509+
}
510+
511+
return 0;
512+
}
513+
486514
static void esp_dns_work(struct k_work *work)
487515
{
488516
#if defined(ESP_MAX_DNS)
@@ -1032,7 +1060,7 @@ static void esp_mgmt_iface_status_work(struct k_work *work)
10321060
struct wifi_iface_status *status = data->wifi_status;
10331061
int ret;
10341062
static const struct modem_cmd cmds[] = {
1035-
MODEM_CMD_DIRECT("+CWJAP:", on_cmd_cwjap),
1063+
MODEM_CMD_DIRECT("+CWJAP:", on_cmd_cwjap_status),
10361064
};
10371065

10381066
ret = esp_cmd_send(data, cmds, ARRAY_SIZE(cmds), "AT+CWJAP?",
@@ -1144,6 +1172,7 @@ static void esp_mgmt_connect_work(struct k_work *work)
11441172
int ret;
11451173
static const struct modem_cmd cmds[] = {
11461174
MODEM_CMD("FAIL", on_cmd_fail, 0U, ""),
1175+
MODEM_CMD("+CWJAP:", on_cmd_cwjap_connect, 1U, ""),
11471176
};
11481177

11491178
dev = CONTAINER_OF(work, struct esp_data, connect_work);
@@ -1153,6 +1182,8 @@ static void esp_mgmt_connect_work(struct k_work *work)
11531182
goto out;
11541183
}
11551184

1185+
dev->conn_status = WIFI_STATUS_CONN_FAIL;
1186+
11561187
ret = esp_cmd_send(dev, cmds, ARRAY_SIZE(cmds), dev->conn_cmd,
11571188
ESP_CONNECT_TIMEOUT);
11581189

@@ -1166,11 +1197,12 @@ static void esp_mgmt_connect_work(struct k_work *work)
11661197
0);
11671198
} else {
11681199
wifi_mgmt_raise_connect_result_event(dev->net_iface,
1169-
ret);
1200+
dev->conn_status);
11701201
}
11711202
} else if (!esp_flags_are_set(dev, EDF_STA_CONNECTED)) {
11721203
esp_flags_set(dev, EDF_STA_CONNECTED);
1173-
wifi_mgmt_raise_connect_result_event(dev->net_iface, 0);
1204+
wifi_mgmt_raise_connect_result_event(dev->net_iface,
1205+
WIFI_STATUS_CONN_SUCCESS);
11741206
net_if_dormant_off(dev->net_iface);
11751207
}
11761208

drivers/wifi/esp_at/esp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ struct esp_data {
221221
uint8_t mode;
222222

223223
char conn_cmd[CONN_CMD_MAX_LEN];
224+
enum wifi_conn_status conn_status;
224225

225226
/* addresses */
226227
struct in_addr ip;

0 commit comments

Comments
 (0)