Bluetooth: GATT: introduce volatile subscription flag
Some application protocol required non-persistente subscription across connection even in bonded case. Flag BT_GATT_SUBSCRIBE_FLAG_VOLATILE specify if subscription must be remove during disonnection. Change-Id: I1bc2bbbb4bc86f58905e44a7eb267ca0871f2fdb Signed-off-by: Jonathan Gelie <jonathanx.gelie@intel.com>
This commit is contained in:
parent
8fe69090e5
commit
b3ac77becd
3 changed files with 38 additions and 34 deletions
|
@ -1218,8 +1218,10 @@ static void remove_subscriptions(struct bt_conn *conn)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove subscription */
|
if (params->flags & BT_GATT_SUBSCRIBE_FLAG_VOLATILE) {
|
||||||
gatt_subscription_remove(conn, prev, params);
|
/* Remove subscription */
|
||||||
|
gatt_subscription_remove(conn, prev, params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -960,6 +960,20 @@ typedef uint8_t (*bt_gatt_notify_func_t)(struct bt_conn *conn,
|
||||||
struct bt_gatt_subscribe_params *params,
|
struct bt_gatt_subscribe_params *params,
|
||||||
const void *data, uint16_t length);
|
const void *data, uint16_t length);
|
||||||
|
|
||||||
|
/* Subscription flags */
|
||||||
|
enum {
|
||||||
|
/** Persistence flag
|
||||||
|
*
|
||||||
|
* If set, indicates that the subscription is not saved
|
||||||
|
* on the GATT server side. Therefore, upon disconnection,
|
||||||
|
* the subscription will be automatically removed
|
||||||
|
* from the client's subscriptions list and
|
||||||
|
* when the client reconnects, it will have to
|
||||||
|
* issue a new subscription.
|
||||||
|
*/
|
||||||
|
BT_GATT_SUBSCRIBE_FLAG_VOLATILE = BIT(0),
|
||||||
|
};
|
||||||
|
|
||||||
/** @brief GATT Subscribe parameters */
|
/** @brief GATT Subscribe parameters */
|
||||||
struct bt_gatt_subscribe_params {
|
struct bt_gatt_subscribe_params {
|
||||||
struct bt_att_req _req;
|
struct bt_att_req _req;
|
||||||
|
@ -972,6 +986,8 @@ struct bt_gatt_subscribe_params {
|
||||||
uint16_t ccc_handle;
|
uint16_t ccc_handle;
|
||||||
/** Subscribe value */
|
/** Subscribe value */
|
||||||
uint16_t value;
|
uint16_t value;
|
||||||
|
/** Subscription flags */
|
||||||
|
uint8_t flags;
|
||||||
sys_snode_t node;
|
sys_snode_t node;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -722,6 +722,17 @@ void bt_gatt_notification(struct bt_conn *conn, uint16_t handle,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void update_subscription(struct bt_conn *conn,
|
||||||
|
struct bt_gatt_subscribe_params *params)
|
||||||
|
{
|
||||||
|
if (params->_peer.type == BT_ADDR_LE_PUBLIC) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update address */
|
||||||
|
bt_addr_le_copy(¶ms->_peer, &conn->le.dst);
|
||||||
|
}
|
||||||
|
|
||||||
static void gatt_subscription_remove(struct bt_conn *conn, sys_snode_t *prev,
|
static void gatt_subscription_remove(struct bt_conn *conn, sys_snode_t *prev,
|
||||||
struct bt_gatt_subscribe_params *params)
|
struct bt_gatt_subscribe_params *params)
|
||||||
{
|
{
|
||||||
|
@ -747,8 +758,13 @@ static void remove_subscriptions(struct bt_conn *conn)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove subscription */
|
if (!bt_addr_le_is_bonded(&conn->le.dst) ||
|
||||||
gatt_subscription_remove(conn, prev, params);
|
(params->flags & BT_GATT_SUBSCRIBE_FLAG_VOLATILE)) {
|
||||||
|
/* Remove subscription */
|
||||||
|
gatt_subscription_remove(conn, prev, params);
|
||||||
|
} else {
|
||||||
|
update_subscription(conn, params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1812,30 +1828,6 @@ static void add_subscriptions(struct bt_conn *conn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_subscriptions(struct bt_conn *conn)
|
|
||||||
{
|
|
||||||
sys_snode_t *node;
|
|
||||||
|
|
||||||
/* Update existing subscriptions */
|
|
||||||
SYS_SLIST_FOR_EACH_NODE(&subscriptions, node) {
|
|
||||||
struct bt_gatt_subscribe_params *params;
|
|
||||||
|
|
||||||
params = CONTAINER_OF(node, struct bt_gatt_subscribe_params,
|
|
||||||
node);
|
|
||||||
|
|
||||||
if (params->_peer.type == BT_ADDR_LE_PUBLIC) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bt_conn_addr_le_cmp(conn, ¶ms->_peer)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update address */
|
|
||||||
bt_addr_le_copy(¶ms->_peer, &conn->le.dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_BLUETOOTH_GATT_CLIENT */
|
#endif /* CONFIG_BLUETOOTH_GATT_CLIENT */
|
||||||
|
|
||||||
void bt_gatt_connected(struct bt_conn *conn)
|
void bt_gatt_connected(struct bt_conn *conn)
|
||||||
|
@ -1853,12 +1845,6 @@ void bt_gatt_disconnected(struct bt_conn *conn)
|
||||||
bt_gatt_foreach_attr(0x0001, 0xffff, disconnected_cb, conn);
|
bt_gatt_foreach_attr(0x0001, 0xffff, disconnected_cb, conn);
|
||||||
|
|
||||||
#if defined(CONFIG_BLUETOOTH_GATT_CLIENT)
|
#if defined(CONFIG_BLUETOOTH_GATT_CLIENT)
|
||||||
/* If bonded don't remove subscriptions */
|
|
||||||
if (bt_addr_le_is_bonded(&conn->le.dst)) {
|
|
||||||
update_subscriptions(conn);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_subscriptions(conn);
|
remove_subscriptions(conn);
|
||||||
#endif /* CONFIG_BLUETOOTH_GATT_CLIENT */
|
#endif /* CONFIG_BLUETOOTH_GATT_CLIENT */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue