Received: by 2002:a05:6358:45e:b0:b5:b6eb:e1f9 with SMTP id 30csp272781rwe; Wed, 31 Aug 2022 02:32:05 -0700 (PDT) X-Google-Smtp-Source: AA6agR7jlhDDEWrKUzSKglfNm9fbwLtxwpovnEmuZvC/3FpQ5tYuGlc1lRVB6E0xVpPLTZXFzb9k X-Received: by 2002:a63:1242:0:b0:430:4e49:edc0 with SMTP id 2-20020a631242000000b004304e49edc0mr169363pgs.2.1661938324810; Wed, 31 Aug 2022 02:32:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661938324; cv=none; d=google.com; s=arc-20160816; b=WtIpQev5E1QSP+kNCBHSkavXpLEGlo0l7VT++at6Sit8XKvVNu1WZXyKLTi+SrnDvB PgrjqIhvlfb6NlWXtCvuRb4/Dgi8IWZWnN3bZFbR4ZU6wmQJLjwKBq3VH0g04KPn5M3g HaJqmx94CGaC9gPNvhUjfbqOwa//xIJAENgF9/aaKQnIyywIK6rz9IHWz77PNPLrytGf 8taxx+15JfnchecdU89/Mk+uPwua5OVHd7IfXWejBqMsKkG9qm0ObQD7hDZuYrw3FUGA 4HO3k34yP9vnk2goJSJXkseaRThY2IxpaU1CgJTbanby1EccZavF/sLmBzGEYm2NiN5E LvCQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:to:from; bh=YSrSxyKQ9vPDHJQD5Lt4Vu0NA42WJkoYBg533qAhLDg=; b=Ld2+vy+CBUDn6yOMa012+CT5jsa0amLTuQU28y2wYgoz+Y9AVH3Fs5hvksShrxza2G tuek5MQMihdCpp3BvvKzM/+FUJppWSxQNqBsZr3K9Ftqw0Nes6VukIP58fk7wsxfxWce 6wHbY3jjIsjpf/u8xPfqux8+yDMr8LDQqgr8jIhXN83s8fJEJHSnVSa0MT0BLJOG9/+H 7xn3uyuHUKdH+YQCH/lXxjPc5C9DzDTOPY7s4qNxul0iNReAGSyI/DnpJKBIbAdAamzM DSpYJXTv4ahTkTtJiIOxBAr42rvZUPLsEH8xzVymbTMQL+ViiMVqJeX+05nCFCNdFGmr wf5g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id px9-20020a17090b270900b001f557276cecsi1446772pjb.52.2022.08.31.02.31.53; Wed, 31 Aug 2022 02:32:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229647AbiHaJUB (ORCPT + 99 others); Wed, 31 Aug 2022 05:20:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32812 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230108AbiHaJTg (ORCPT ); Wed, 31 Aug 2022 05:19:36 -0400 Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [IPv6:2001:4b98:dc4:8::232]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 88B2ECACB7 for ; Wed, 31 Aug 2022 02:19:14 -0700 (PDT) Received: (Authenticated sender: hadess@hadess.net) by mail.gandi.net (Postfix) with ESMTPSA id A2BCD200012 for ; Wed, 31 Aug 2022 09:19:12 +0000 (UTC) From: Bastien Nocera To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v4 1/6] adapter: Keep track of whether the adapter is rfkill'ed Date: Wed, 31 Aug 2022 11:19:07 +0200 Message-Id: <20220831091912.47894-1-hadess@hadess.net> X-Mailer: git-send-email 2.37.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Instead of only replying to D-Bus requests with an error saying the adapter is blocked, keep track of the rfkill being enabled or disabled so we know the rfkill state of the adapter at all times. --- src/adapter.c | 25 +++++++++++++++++++++++-- src/adapter.h | 1 + src/rfkill.c | 8 ++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index b453e86a0..641db67f9 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -250,6 +250,7 @@ struct btd_adapter { uint32_t dev_class; /* controller class of device */ char *name; /* controller device name */ char *short_name; /* controller short name */ + bool blocked; /* whether rfkill is enabled */ uint32_t supported_settings; /* controller supported settings */ uint32_t pending_settings; /* pending controller settings */ uint32_t current_settings; /* current controller settings */ @@ -654,6 +655,8 @@ static void set_mode_complete(uint8_t status, uint16_t length, if (status != MGMT_STATUS_SUCCESS) { btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)", mgmt_errstr(status), status); + if (status == MGMT_STATUS_RFKILLED) + adapter->blocked = true; adapter->pending_settings &= ~data->setting; return; } @@ -2914,10 +2917,12 @@ static void property_set_mode_complete(uint8_t status, uint16_t length, btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)", mgmt_errstr(status), status); - if (status == MGMT_STATUS_RFKILLED) + if (status == MGMT_STATUS_RFKILLED) { dbus_err = ERROR_INTERFACE ".Blocked"; - else + adapter->blocked = true; + } else { dbus_err = ERROR_INTERFACE ".Failed"; + } g_dbus_pending_property_error(data->id, dbus_err, mgmt_errstr(status)); @@ -7548,6 +7553,12 @@ int btd_cancel_authorization(guint id) int btd_adapter_restore_powered(struct btd_adapter *adapter) { + if (adapter->blocked) { + adapter->blocked = false; + g_dbus_emit_property_changed(dbus_conn, adapter->path, + ADAPTER_INTERFACE, "PowerState"); + } + if (btd_adapter_get_powered(adapter)) return 0; @@ -7556,6 +7567,16 @@ int btd_adapter_restore_powered(struct btd_adapter *adapter) return 0; } +int btd_adapter_set_blocked(struct btd_adapter *adapter) +{ + if (!adapter->blocked) { + adapter->blocked = true; + g_dbus_emit_property_changed(dbus_conn, adapter->path, + ADAPTER_INTERFACE, "PowerState"); + } + return 0; +} + void btd_adapter_register_pin_cb(struct btd_adapter *adapter, btd_adapter_pin_cb_t cb) { diff --git a/src/adapter.h b/src/adapter.h index b09044edd..332c0b239 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -143,6 +143,7 @@ guint btd_request_authorization_cable_configured(const bdaddr_t *src, const bdad int btd_cancel_authorization(guint id); int btd_adapter_restore_powered(struct btd_adapter *adapter); +int btd_adapter_set_blocked(struct btd_adapter *adapter); typedef ssize_t (*btd_adapter_pin_cb_t) (struct btd_adapter *adapter, struct btd_device *dev, char *out, bool *display, diff --git a/src/rfkill.c b/src/rfkill.c index 2099c5ac5..93f8e0e12 100644 --- a/src/rfkill.c +++ b/src/rfkill.c @@ -61,6 +61,7 @@ static gboolean rfkill_event(GIOChannel *chan, struct rfkill_event event = { 0 }; struct btd_adapter *adapter; char sysname[PATH_MAX]; + bool blocked = false; ssize_t len; int fd, id; @@ -84,7 +85,7 @@ static gboolean rfkill_event(GIOChannel *chan, event.soft, event.hard); if (event.soft || event.hard) - return TRUE; + blocked = true; if (event.op != RFKILL_OP_CHANGE) return TRUE; @@ -122,7 +123,10 @@ static gboolean rfkill_event(GIOChannel *chan, DBG("RFKILL unblock for hci%d", id); - btd_adapter_restore_powered(adapter); + if (blocked) + btd_adapter_set_blocked(adapter); + else + btd_adapter_restore_powered(adapter); return TRUE; } -- 2.37.2