Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp2966666ybz; Sun, 19 Apr 2020 14:12:10 -0700 (PDT) X-Google-Smtp-Source: APiQypKVw8diGbNkVi+WhzxAAlj8XMv+5BVaSL42W742/mSRza6M85fPx372QS8cX8kjRGGwwG6T X-Received: by 2002:a17:906:7045:: with SMTP id r5mr13297728ejj.29.1587330730492; Sun, 19 Apr 2020 14:12:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587330730; cv=none; d=google.com; s=arc-20160816; b=QIp0vF0vIoitRJ+ZVSDxahyCtgRxlSQ443pkJIFovfyJ9XYgqwQfGmk24DwZaTZCKx KzZv1r7KMl/p1p+bsKMPE45sG4HWG7q8zkDHgc2QSplkKoeoUYOYuCbEUZ2DMcFt6rN+ 754h+jQVi/aJfjaPzwdTfMlKLPsxbFM2iqlbIWEWiZlSrDU3W/XNLpT/SYgw6ZuLgW36 kcJhHTftWw15Rioon3R41JKS7jv3sYyCevzg/qxeGB4v1oSrQfWqhtAuKDjTkk2aFSGo 4BDVB9mL1OsmUxg0jd7P5iX8BV/ouLwQlHkKZq5+o2Kt9c7ESa17AzTKfJYb7MoYeXMq PVIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:to:from:dkim-signature; bh=ot/Wpg4t4CnYQdkFFdVNpmk++WKl8UZW8TjPNdXw5dM=; b=pyAii1/9Ux/rNOreMWgAuw02+ZtoCmYq+NDbUVXZhUUUm0h+6Mr9w/WhKVUWbNhAr5 tTk7+N27ny0Uq/UyNbwT9xQBzTOOjWjJRAM+bOY6n57KURVL6rmSKQ7RwOxkoHuxLvUj StYiuiCRucJsEagZd47bmKxgaRBkWOmAB3bSwuoLRepYNz2O6QFFBlSzO4Xve0+3hK4Q mQw0hZfMfrCxHS13VpHDCDsIF8Rpuliw7k4GsIw8mm1GJTXcjhVMobE5N4fyuaD/T5kw weCkF4MngFTBnySCxyQeP6gA0OpjQWDLG3uCsu8j2qg/Zhu/+58Ajhe9HrWaoDqH1JJG asfw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1Qm2dOy3; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p5si16938102ejo.467.2020.04.19.14.11.26; Sun, 19 Apr 2020 14:12:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1Qm2dOy3; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725947AbgDSVLS (ORCPT + 99 others); Sun, 19 Apr 2020 17:11:18 -0400 Received: from mail.kernel.org ([198.145.29.99]:42144 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725891AbgDSVLS (ORCPT ); Sun, 19 Apr 2020 17:11:18 -0400 Received: from pali.im (pali.im [31.31.79.79]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E07672137B for ; Sun, 19 Apr 2020 21:11:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587330678; bh=tAlNDDF/rveRZkts9H2EploORCgvy18fXVIRmitWUTk=; h=From:To:Subject:Date:From; b=1Qm2dOy3rHQoZn/cqxyareYCfsByOGiz1jmWrehNgWp5AvD+4iXYI+bMCwHzha/5U uJ12a2Caguvyg1mymN3L/eZEYGqb3mh7iQr1omCq3BABp6G+tHaerWq42/1s5vKR2E jwnOgUkvKAxt/teF+hF+WkqyvINTJXfTutFKvEbk= Received: by pali.im (Postfix) id C8CDF8A3; Sun, 19 Apr 2020 23:11:15 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: linux-bluetooth@vger.kernel.org Subject: [PATCH] profile: Fix reporting error message when connection failed Date: Sun, 19 Apr 2020 23:10:58 +0200 Message-Id: <20200419211058.31987-1-pali@kernel.org> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Some bluetooth headsets do not support connecting more then one bluetooth profile (e.g. in parallel A2DP and HSP, or HSP and HFP) and issuing connect() syscall for second profile returns just ECONNREFUSED. Prior this patch bluetooth daemon for such situation reported following message to log: Unable to get connect data for Headset Voice gateway: getpeername: Transport endpoint is not connected (107) Message is incorrect as connect() syscall failed, not getpeername(). This patch fixes this problem and logs correct error message: Headset Voice gateway failed connect to XX:XX:XX:XX:XX:XX: Connection refused (111) Main problem was in ext_connect() function which called bt_io_get() for retrieving remote address (BT_IO_OPT_DEST) and if it failed then original error from connect() syscall was masked. Because it is not possible to retrieve BT_IO_OPT_DEST for unconnected socket, original destination address for error message is propagated via connect_add() function in btio. -- Having correct error message in logs is important. Due to this mangled error message I was not able to easily debug why particular bluetooth headset sometimes connection with nonsense error that Transport endpoint was not connected. --- btio/btio.c | 19 ++++++++++++++----- src/profile.c | 5 +++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/btio/btio.c b/btio/btio.c index e7b4db16b..3ea73faea 100644 --- a/btio/btio.c +++ b/btio/btio.c @@ -85,6 +85,7 @@ struct connect { BtIOConnect connect; gpointer user_data; GDestroyNotify destroy; + bdaddr_t dst; }; struct accept { @@ -214,6 +215,7 @@ static gboolean connect_cb(GIOChannel *io, GIOCondition cond, GError *gerr = NULL; int err, sk_err, sock; socklen_t len = sizeof(sk_err); + char addr[18]; /* If the user aborted this connect attempt */ if ((cond & G_IO_NVAL) || check_nval(io)) @@ -226,8 +228,11 @@ static gboolean connect_cb(GIOChannel *io, GIOCondition cond, else err = -sk_err; - if (err < 0) - ERROR_FAILED(&gerr, "connect error", -err); + if (err < 0) { + ba2str(&conn->dst, addr); + g_set_error(&gerr, BT_IO_ERROR, err, + "connect to %s: %s (%d)", addr, strerror(-err), -err); + } conn->connect(io, gerr, conn->user_data); @@ -286,7 +291,7 @@ static void server_add(GIOChannel *io, BtIOConnect connect, (GDestroyNotify) server_remove); } -static void connect_add(GIOChannel *io, BtIOConnect connect, +static void connect_add(GIOChannel *io, BtIOConnect connect, bdaddr_t dst, gpointer user_data, GDestroyNotify destroy) { struct connect *conn; @@ -296,6 +301,7 @@ static void connect_add(GIOChannel *io, BtIOConnect connect, conn->connect = connect; conn->user_data = user_data; conn->destroy = destroy; + conn->dst = dst; cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL; g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, connect_cb, conn, @@ -1671,6 +1677,7 @@ GIOChannel *bt_io_connect(BtIOConnect connect, gpointer user_data, struct set_opts opts; int err, sock; gboolean ret; + char addr[18]; va_start(args, opt1); ret = parse_set_opts(&opts, gerr, opt1, args); @@ -1710,12 +1717,14 @@ GIOChannel *bt_io_connect(BtIOConnect connect, gpointer user_data, } if (err < 0) { - ERROR_FAILED(gerr, "connect", -err); + ba2str(&opts.dst, addr); + g_set_error(gerr, BT_IO_ERROR, err, + "connect to %s: %s (%d)", addr, strerror(-err), -err); g_io_channel_unref(io); return NULL; } - connect_add(io, connect, user_data, destroy); + connect_add(io, connect, opts.dst, user_data, destroy); return io; } diff --git a/src/profile.c b/src/profile.c index c2992e795..6961a107b 100644 --- a/src/profile.c +++ b/src/profile.c @@ -1085,12 +1085,13 @@ static void ext_connect(GIOChannel *io, GError *err, gpointer user_data) if (!bt_io_get(io, &io_err, BT_IO_OPT_DEST, addr, BT_IO_OPT_INVALID)) { - error("Unable to get connect data for %s: %s", ext->name, - io_err->message); if (err) { + error("%s failed %s", ext->name, err->message); g_error_free(io_err); io_err = NULL; } else { + error("Unable to get connect data for %s: %s", + ext->name, io_err->message); err = io_err; } goto drop; -- 2.20.1