From patchwork Wed Jul 10 18:37:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Greear X-Patchwork-Id: 1958977 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=AuOTos9Y; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=candelatech.com header.i=@candelatech.com header.a=rsa-sha256 header.s=default header.b=Cz2Wg8P8; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4WK67539tNz1xpN for ; Thu, 11 Jul 2024 04:38:07 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=dBYaKBO7zdbNBSE5BZ+FsH0aHlbIpTDz+skM4WgTypI=; b=AuOTos9YfGByes oGsf2fG4NYgR2TDQRzzbA/Ocx93/BUEoRKh/n9/3kcF5+aIEHwHOMV5yA6y/IjbN8zlRyhRizJbit 91vFFnkF/KtVISP/20hI4pngSCRW8JIViJpQRXkrREtd6QcoOtBniveSJl1Z380+ETU8MR2vTBVvy SGdFzRaBsYftlwYm3fzM7pDJwbeFmz/UwhLAyGEsKqJRMUGzHA02sXh/fRBSURjv0sBPRdT51F0d3 WFMH25S6P5HoLdLeJr5TDwM2TUnCoeCKfTZrsMwcXgnP05ZRXxUbxQHpDZGve6Qi7Hr3eaZKdORL5 7jv8UMwlAib7ubUSclIA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sRcC1-0000000BR2D-1opL; Wed, 10 Jul 2024 18:37:29 +0000 Received: from dispatch1-us1.ppe-hosted.com ([67.231.154.164]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sRcBw-0000000BR1m-3xWW for hostap@lists.infradead.org; Wed, 10 Jul 2024 18:37:26 +0000 X-Virus-Scanned: Proofpoint Essentials engine Received: from mail3.candelatech.com (mail.candelatech.com [208.74.158.173]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 6DBA82C0088 for ; Wed, 10 Jul 2024 18:37:22 +0000 (UTC) Received: from ben-dt5.candelatech.com (unknown [50.251.239.81]) by mail3.candelatech.com (Postfix) with ESMTP id C77D313C2B1; Wed, 10 Jul 2024 11:37:21 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 mail3.candelatech.com C77D313C2B1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=candelatech.com; s=default; t=1720636641; bh=79NPye0wt+O1eC3fIbm0xWwZiwh8vjMa81clYLEA1KU=; h=From:To:Cc:Subject:Date:From; b=Cz2Wg8P8o9E+DIIOMcYcv50U8BljOgtiKHHbXYw62ZnOcJtb4+7q5B5xUkA6qfxIs w+OgoK201ugr/bmG7A37K9R4Pj+xTXv85Wmv4Q+AUBss8o4fhp3bfA57oVBskBXBA7 LlTYc3Evqgf9AN+bWHtChySZEN0C5ooZ7dlKK4ZU= From: greearb@candelatech.com To: hostap@lists.infradead.org Cc: Ben Greear Subject: [PATCH] driver-nl80211: Use wpa_msg to report netlink errors. Date: Wed, 10 Jul 2024 11:37:11 -0700 Message-ID: <20240710183711.3753220-1-greearb@candelatech.com> X-Mailer: git-send-email 2.42.0 MIME-Version: 1.0 X-MDID: 1720636643-c_z7KWk9uPci X-MDID-O: us5;at1;1720636643;c_z7KWk9uPci;;19b12d1ff1464714abe912ee75a411c0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240710_113725_098679_3F2D5ED0 X-CRM114-Status: GOOD ( 15.62 ) X-Spam-Score: -2.8 (--) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: From: Ben Greear This allows errors to be propagated to listeners instead of just buried in the logs. Signed-off-by: Ben Greear --- src/drivers/driver_nl80211.c | 55 ++++++++++++++++++++ src/drivers/driver_nl80211.h | 33 ++++++++++++++++------ 2 files changed, [...] Content analysis details: (-2.8 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at https://www.dnswl.org/, low trust [67.231.154.164 listed in list.dnswl.org] 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.0 SPF_PASS SPF: sender matches SPF record -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [67.231.154.164 listed in wl.mailspike.net] X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Ben Greear This allows errors to be propagated to listeners instead of just buried in the logs. Signed-off-by: Ben Greear --- src/drivers/driver_nl80211.c | 55 ++++++++++++++++++++---------------- src/drivers/driver_nl80211.h | 33 ++++++++++++++++------ 2 files changed, 55 insertions(+), 33 deletions(-) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 4f79ac4b4..c9654d7db 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -349,6 +349,7 @@ struct nl80211_ack_err_args { int err; struct nl_msg *orig_msg; struct nl80211_err_info *err_info; + struct wpa_driver_nl80211_data *drv; }; static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, @@ -385,8 +386,12 @@ static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, if (tb[NLMSGERR_ATTR_MSG]) { len = strnlen((char *) nla_data(tb[NLMSGERR_ATTR_MSG]), nla_len(tb[NLMSGERR_ATTR_MSG])); - wpa_printf(MSG_ERROR, "nl80211: kernel reports: %*s", - len, (char *) nla_data(tb[NLMSGERR_ATTR_MSG])); + if (err_args->drv) + wpa_msg(err_args->drv->ctx, MSG_ERROR, "nl80211: kernel reports: %*s", + len, (char *) nla_data(tb[NLMSGERR_ATTR_MSG])); + else + wpa_printf(MSG_ERROR, "nl80211: kernel reports: %*s", + len, (char *) nla_data(tb[NLMSGERR_ATTR_MSG])); } if (!err_args->err_info) @@ -491,13 +496,14 @@ out: } -int send_and_recv(struct nl80211_global *global, - struct nl_sock *nl_handle, struct nl_msg *msg, - int (*valid_handler)(struct nl_msg *, void *), - void *valid_data, - int (*ack_handler_custom)(struct nl_msg *, void *), - void *ack_data, - struct nl80211_err_info *err_info) +int send_and_recv_glb(struct nl80211_global *global, + struct wpa_driver_nl80211_data *drv, /* may be NULL */ + struct nl_sock *nl_handle, struct nl_msg *msg, + int (*valid_handler)(struct nl_msg *, void *), + void *valid_data, + int (*ack_handler_custom)(struct nl_msg *, void *), + void *ack_data, + struct nl80211_err_info *err_info) { struct nl_cb *cb, *s_nl_cb; struct nl80211_ack_err_args err; @@ -539,6 +545,7 @@ int send_and_recv(struct nl80211_global *global, err.err = 1; err.orig_msg = msg; err.err_info = err_info; + err.drv = drv; nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err); nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err.err); @@ -654,8 +661,8 @@ static int nl_get_multicast_id(struct nl80211_global *global, return -1; } - ret = send_and_recv(global, global->nl, msg, family_handler, &res, - NULL, NULL, NULL); + ret = send_and_recv_glb(global, NULL, global->nl, msg, family_handler, &res, + NULL, NULL, NULL); if (ret == 0) ret = res.id; return ret; @@ -850,7 +857,7 @@ static int nl80211_register_beacons(struct wpa_driver_nl80211_data *drv, return -1; } - ret = send_and_recv(drv->global, w->nl_beacons, msg, NULL, NULL, + ret = send_and_recv(drv, w->nl_beacons, msg, NULL, NULL, NULL, NULL, NULL); if (ret) { wpa_printf(MSG_DEBUG, "nl80211: Register beacons command " @@ -2461,7 +2468,7 @@ static int nl80211_register_frame(struct i802_bss *bss, return -1; } - ret = send_and_recv(drv->global, nl_handle, msg, NULL, NULL, + ret = send_and_recv(drv, nl_handle, msg, NULL, NULL, NULL, NULL, NULL); if (ret) { wpa_printf(MSG_DEBUG, "nl80211: Register frame command " @@ -2729,7 +2736,7 @@ static int nl80211_register_spurious_class3(struct i802_bss *bss) int ret; msg = nl80211_bss_msg(bss, 0, NL80211_CMD_UNEXPECTED_FRAME); - ret = send_and_recv(bss->drv->global, bss->nl_mgmt, msg, NULL, NULL, + ret = send_and_recv(bss->drv, bss->nl_mgmt, msg, NULL, NULL, NULL, NULL, NULL); if (ret) { wpa_printf(MSG_DEBUG, "nl80211: Register spurious class3 " @@ -3806,7 +3813,7 @@ int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv, return -1; } - ret = send_and_recv(drv->global, bss->nl_connect, msg, + ret = send_and_recv(drv, bss->nl_connect, msg, NULL, NULL, NULL, NULL, NULL); if (ret) { wpa_dbg(drv->ctx, MSG_INFO, @@ -5437,7 +5444,7 @@ static int wpa_driver_nl80211_set_ap(void *priv, if (nla_put_flag(msg, NL80211_ATTR_SOCKET_OWNER)) goto fail; - ret = send_and_recv(drv->global, bss->nl_connect, msg, NULL, NULL, NULL, + ret = send_and_recv(drv, bss->nl_connect, msg, NULL, NULL, NULL, NULL, NULL); if (ret) { wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)", @@ -6235,7 +6242,7 @@ static int nl80211_tx_control_port(void *priv, const u8 *dest, os_memset(&ext_arg, 0, sizeof(struct nl80211_ack_ext_arg)); ext_arg.ext_data = &cookie; - ret = send_and_recv(bss->drv->global, bss->drv->global->nl, msg, + ret = send_and_recv(bss->drv, bss->drv->global->nl, msg, NULL, NULL, ack_handler_cookie, &ext_arg, NULL); if (ret) { wpa_printf(MSG_DEBUG, @@ -6476,7 +6483,7 @@ static int nl80211_leave_ibss(struct wpa_driver_nl80211_data *drv, int ret; msg = nl80211_drv_msg(drv, 0, NL80211_CMD_LEAVE_IBSS); - ret = send_and_recv(drv->global, drv->first_bss->nl_connect, msg, NULL, + ret = send_and_recv(drv, drv->first_bss->nl_connect, msg, NULL, NULL, NULL, NULL, NULL); if (ret) { wpa_printf(MSG_DEBUG, "nl80211: Leave IBSS failed: ret=%d " @@ -6655,7 +6662,7 @@ retry: if (nla_put_flag(msg, NL80211_ATTR_SOCKET_OWNER)) goto fail; - ret = send_and_recv(drv->global, drv->first_bss->nl_connect, msg, NULL, + ret = send_and_recv(drv, drv->first_bss->nl_connect, msg, NULL, NULL, NULL, NULL, NULL); msg = NULL; if (ret) { @@ -7211,7 +7218,7 @@ skip_auth_type: if (nla_put_flag(msg, NL80211_ATTR_SOCKET_OWNER)) goto fail; - ret = send_and_recv(drv->global, bss->nl_connect, msg, NULL, NULL, NULL, + ret = send_and_recv(drv, bss->nl_connect, msg, NULL, NULL, NULL, NULL, NULL); msg = NULL; if (ret) { @@ -7330,7 +7337,7 @@ static int wpa_driver_nl80211_associate( if (!TEST_FAIL_TAG("assoc")) { if (nla_put_flag(msg, NL80211_ATTR_SOCKET_OWNER)) goto fail; - ret = send_and_recv(drv->global, drv->first_bss->nl_connect, + ret = send_and_recv(drv, drv->first_bss->nl_connect, msg, NULL, NULL, NULL, NULL, &err_info); msg = NULL; } else { @@ -11950,7 +11957,7 @@ static int nl80211_vendor_cmd(void *priv, unsigned int vendor_id, /* This test vendor_cmd can be used with nl80211 commands that * need the connect nl_sock, so use the variant that takes in * bss->nl_connect as the handle. */ - ret = send_and_recv(drv->global, bss->nl_connect, msg, + ret = send_and_recv(drv, bss->nl_connect, msg, cmd_reply_handler, buf, NULL, NULL, NULL); if (ret) wpa_printf(MSG_DEBUG, "nl80211: command failed err=%d", @@ -12425,7 +12432,7 @@ static int nl80211_join_mesh(struct i802_bss *bss, if (nla_put_flag(msg, NL80211_ATTR_SOCKET_OWNER)) return -1; - ret = send_and_recv(drv->global, bss->nl_connect, msg, NULL, NULL, NULL, + ret = send_and_recv(drv, bss->nl_connect, msg, NULL, NULL, NULL, NULL, NULL); msg = NULL; if (ret) { @@ -12483,7 +12490,7 @@ static int wpa_driver_nl80211_leave_mesh(void *priv) wpa_printf(MSG_DEBUG, "nl80211: mesh leave (ifindex=%d)", drv->ifindex); msg = nl80211_drv_msg(drv, 0, NL80211_CMD_LEAVE_MESH); - ret = send_and_recv(drv->global, bss->nl_connect, msg, NULL, NULL, NULL, + ret = send_and_recv(drv, bss->nl_connect, msg, NULL, NULL, NULL, NULL, NULL); if (ret) { wpa_printf(MSG_DEBUG, "nl80211: mesh leave failed: ret=%d (%s)", diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h index 4958e163e..5e42e7936 100644 --- a/src/drivers/driver_nl80211.h +++ b/src/drivers/driver_nl80211.h @@ -289,19 +289,34 @@ struct nl_msg * nl80211_drv_msg(struct wpa_driver_nl80211_data *drv, int flags, uint8_t cmd); struct nl_msg * nl80211_bss_msg(struct i802_bss *bss, int flags, uint8_t cmd); -int send_and_recv(struct nl80211_global *global, - struct nl_sock *nl_handle, struct nl_msg *msg, - int (*valid_handler)(struct nl_msg *, void *), - void *valid_data, - int (*ack_handler_custom)(struct nl_msg *, void *), - void *ack_data, - struct nl80211_err_info *err_info); +int send_and_recv_glb(struct nl80211_global *global, + struct wpa_driver_nl80211_data *drv, /* may be NULL */ + struct nl_sock *nl_handle, struct nl_msg *msg, + int (*valid_handler)(struct nl_msg *, void *), + void *valid_data, + int (*ack_handler_custom)(struct nl_msg *, void *), + void *ack_data, + struct nl80211_err_info *err_info); + +static inline int +send_and_recv(struct wpa_driver_nl80211_data *drv, + struct nl_sock *nl_handle, struct nl_msg *msg, + int (*valid_handler)(struct nl_msg *, void *), + void *valid_data, + int (*ack_handler_custom)(struct nl_msg *, void *), + void *ack_data, + struct nl80211_err_info *err_info) +{ + return send_and_recv_glb(drv->global, drv, nl_handle, msg, + valid_handler, valid_data, + ack_handler_custom, ack_data, err_info); +} static inline int send_and_recv_cmd(struct wpa_driver_nl80211_data *drv, struct nl_msg *msg) { - return send_and_recv(drv->global, drv->global->nl, msg, + return send_and_recv(drv, drv->global->nl, msg, NULL, NULL, NULL, NULL, NULL); } @@ -311,7 +326,7 @@ send_and_recv_resp(struct wpa_driver_nl80211_data *drv, int (*valid_handler)(struct nl_msg *, void *), void *valid_data) { - return send_and_recv(drv->global, drv->global->nl, msg, + return send_and_recv(drv, drv->global->nl, msg, valid_handler, valid_data, NULL, NULL, NULL); }