From 426681aeb2625f2df8de1be68db78b5354d68c20 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Thu, 2 Apr 2020 00:30:17 -0500 Subject: [PATCH] netdev: Add support for extended errors --- src/netdev.c | 105 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 73 insertions(+), 32 deletions(-) diff --git a/src/netdev.c b/src/netdev.c index e1afeb63..e00f880a 100644 --- a/src/netdev.c +++ b/src/netdev.c @@ -974,8 +974,15 @@ static struct l_genl_msg *netdev_build_cmd_del_station(struct netdev *netdev, static void netdev_del_sta_cb(struct l_genl_msg *msg, void *user_data) { - if (l_genl_msg_get_error(msg) < 0) - l_error("DEL_STATION failed: %i", l_genl_msg_get_error(msg)); + int err = l_genl_msg_get_error(msg); + const char *ext_error; + + if (err >= 0) + return; + + ext_error = l_genl_msg_get_extended_error(msg); + l_error("DEL_STATION failed: %s", + ext_error ? ext_error : strerror(-err)); } int netdev_del_station(struct netdev *netdev, const uint8_t *sta, @@ -1096,7 +1103,11 @@ static void netdev_set_station_cb(struct l_genl_msg *msg, void *user_data) goto done; if (err < 0) { - l_error("Set Station failed for ifindex %d", netdev->index); + const char *ext_error = l_genl_msg_get_extended_error(msg); + + l_error("Set Station failed for ifindex %d:%s", netdev->index, + ext_error ? ext_error : strerror(-err)); + netdev_setting_keys_failed(nhs, err); return; } @@ -1114,8 +1125,12 @@ static void netdev_new_group_key_cb(struct l_genl_msg *msg, void *data) nhs->group_new_key_cmd_id = 0; if (err < 0) { - l_error("New Key for Group Key failed for ifindex: %d", - netdev->index); + const char *ext_error = l_genl_msg_get_extended_error(msg); + + l_error("New Key for Group Key failed for ifindex: %d:%s", + netdev->index, + ext_error ? ext_error : strerror(-err)); + netdev_setting_keys_failed(nhs, err); return; } @@ -1134,8 +1149,12 @@ static void netdev_new_group_management_key_cb(struct l_genl_msg *msg, nhs->group_management_new_key_cmd_id = 0; if (err < 0) { - l_error("New Key for Group Mgmt failed for ifindex: %d", - netdev->index); + const char *ext_error = l_genl_msg_get_extended_error(msg); + + l_error("New Key for Group Mgmt failed for ifindex: %d:%s", + netdev->index, + ext_error ? ext_error : strerror(-err)); + netdev_setting_keys_failed(nhs, err); return; } @@ -1303,8 +1322,11 @@ static void netdev_new_pairwise_key_cb(struct l_genl_msg *msg, void *data) nhs->pairwise_new_key_cmd_id = 0; if (err < 0) { - l_error("New Key for Pairwise Key failed for ifindex: %d", - netdev->index); + const char *ext_error = l_genl_msg_get_extended_error(msg); + + l_error("New Key for Pairwise Key failed for ifindex: %d:%s", + netdev->index, + ext_error ? ext_error : strerror(-err)); goto error; } @@ -1540,11 +1562,16 @@ static void netdev_qos_map_cb(struct l_genl_msg *msg, void *user_data) { struct netdev *netdev = user_data; int err = l_genl_msg_get_error(msg); - - if (err < 0) - l_error("Could not set QoS Map in kernel: %d", err); + const char *ext_error; netdev->qos_map_cmd_id = 0; + + if (err >= 0) + return; + + ext_error = l_genl_msg_get_extended_error(msg); + l_error("Couuld not set QoS Map in kernel: %s", + ext_error ? ext_error : strerror(-err)); } /* @@ -3323,11 +3350,17 @@ static void netdev_neighbor_report_frame_event(const struct mmpdu_header *hdr, l_timeout_remove(netdev->neighbor_report_timeout); } -static void netdev_sa_query_resp_cb(struct l_genl_msg *msg, - void *user_data) +static void netdev_sa_query_resp_cb(struct l_genl_msg *msg, void *user_data) { - if (l_genl_msg_get_error(msg) < 0) - l_debug("error sending SA Query request"); + int err = l_genl_msg_get_error(msg); + const char *ext_error; + + if (err >= 0) + return; + + ext_error = l_genl_msg_get_extended_error(msg); + l_debug("error sending SA Query request: %s", + ext_error ? ext_error : strerror(-err)); } static void netdev_sa_query_req_frame_event(const struct mmpdu_header *hdr, @@ -3406,17 +3439,21 @@ static void netdev_sa_query_resp_frame_event(const struct mmpdu_header *hdr, netdev->sa_query_timeout = NULL; } -static void netdev_sa_query_req_cb(struct l_genl_msg *msg, - void *user_data) +static void netdev_sa_query_req_cb(struct l_genl_msg *msg, void *user_data) { struct netdev *netdev = user_data; + int err = l_genl_msg_get_error(msg); + const char *ext_error; - if (l_genl_msg_get_error(msg) < 0) { - l_debug("error sending SA Query request"); + if (err >= 0) + return; - l_timeout_remove(netdev->sa_query_timeout); - netdev->sa_query_timeout = NULL; - } + ext_error = l_genl_msg_get_extended_error(msg); + l_debug("error sending SA Query request: %s", + ext_error ? ext_error : strerror(-err)); + + l_timeout_remove(netdev->sa_query_timeout); + netdev->sa_query_timeout = NULL; } static void netdev_sa_query_timeout(struct l_timeout *timeout, @@ -3720,14 +3757,15 @@ static struct l_genl_msg *netdev_build_control_port_frame(struct netdev *netdev, static void netdev_control_port_frame_cb(struct l_genl_msg *msg, void *user_data) { - int err; + int err = l_genl_msg_get_error(msg); + const char *ext_error; - err = l_genl_msg_get_error(msg); + if (err >= 0) + return; - l_debug("%d", err); - - if (err < 0) - l_info("CMD_CONTROL_PORT failed: %s", strerror(-err)); + ext_error = l_genl_msg_get_extended_error(msg); + l_error("CMD_CONTROL_PORT failed: %s", + ext_error ? ext_error : strerror(-err)); } static int netdev_control_port_write_pae(struct netdev *netdev, @@ -3889,12 +3927,15 @@ static struct l_genl_msg *netdev_build_cmd_cqm_rssi_update( static void netdev_cmd_set_cqm_cb(struct l_genl_msg *msg, void *user_data) { - int r = l_genl_msg_get_error(msg); + int err = l_genl_msg_get_error(msg); + const char *ext_error; - if (!r) + if (err >= 0) return; - l_error("CMD_SET_CQM failed: %d(%s)", r, strerror(-r)); + ext_error = l_genl_msg_get_extended_error(msg); + l_error("CMD_SET_CQM failed: %s", + ext_error ? ext_error : strerror(-err)); } int netdev_set_rssi_report_levels(struct netdev *netdev, const int8_t *levels,