Commit ffab099e authored by Jordan Yates's avatar Jordan Yates Committed by Carles Cufi
Browse files

Bluetooth: add destroy callback to indication



Adds a `destroy` callback to the `struct bt_gatt_indicate_params` which
is used to signify to the application that the indication operation has
completed and the struct instance can be freed/destroyed.

This is required as the number of indication value callbacks that will
be triggered is not known by the caller when the `conn` parameter is
`NULL`.

Tracking when this callback should be run is mananged by a private
reference counter inside the struct.

Signed-off-by: default avatarJordan Yates <jordan.yates@data61.csiro.au>
parent 170f17e0
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -1013,6 +1013,9 @@ typedef void (*bt_gatt_indicate_func_t)(struct bt_conn *conn,
					struct bt_gatt_indicate_params *params,
					uint8_t err);

typedef void (*bt_gatt_indicate_params_destroy_t)(
		struct bt_gatt_indicate_params *params);

/** @brief GATT Indicate Value parameters */
struct bt_gatt_indicate_params {
	/** Notification Attribute UUID type */
@@ -1021,10 +1024,14 @@ struct bt_gatt_indicate_params {
	const struct bt_gatt_attr *attr;
	/** Indicate Value callback */
	bt_gatt_indicate_func_t func;
	/** Indicate operation complete callback */
	bt_gatt_indicate_params_destroy_t destroy;
	/** Indicate Value data*/
	const void *data;
	/** Indicate Value length*/
	uint16_t len;
	/** Private reference counter */
	uint8_t _ref;
};

/** @brief Indicate attribute value change.
@@ -1046,7 +1053,8 @@ struct bt_gatt_indicate_params {
 *  start range when looking up for possible matches.
 *
 *  @note This procedure is asynchronous therefore the parameters need to
 *        remains valid while it is active.
 *        remains valid while it is active. The procedure is active until
 *        the destroy callback is run.
 *
 *  @param conn Connection object.
 *  @param params Indicate parameters.
+1 −0
Original line number Diff line number Diff line
@@ -356,6 +356,7 @@ void main(void)

			ind_params.attr = &vnd_svc.attrs[2];
			ind_params.func = indicate_cb;
			ind_params.destroy = NULL;
			ind_params.data = &indicating;
			ind_params.len = sizeof(indicating);

+1 −0
Original line number Diff line number Diff line
@@ -117,6 +117,7 @@ gatt_indicate:

		ind_params.attr = &hts_svc.attrs[2];
		ind_params.func = indicate_cb;
		ind_params.destroy = NULL;
		ind_params.data = &htm;
		ind_params.len = sizeof(htm);

+9 −0
Original line number Diff line number Diff line
@@ -1900,7 +1900,11 @@ static void gatt_indicate_rsp(struct bt_conn *conn, uint8_t err,
{
	struct bt_gatt_indicate_params *params = user_data;

	params->_ref--;
	params->func(conn, params, err);
	if (params->destroy && (params->_ref == 0)) {
		params->destroy(params);
	}
}

static int gatt_send(struct bt_conn *conn, struct net_buf *buf,
@@ -2056,6 +2060,9 @@ static uint8_t notify_cb(const struct bt_gatt_attr *attr, uint16_t handle,
		if (data->type == BT_GATT_CCC_INDICATE) {
			err = gatt_indicate(conn, data->handle,
					    data->ind_params);
			if (err == 0) {
				data->ind_params->_ref++;
			}
		} else {
			err = gatt_notify(conn, data->handle, data->nfy_params);
		}
@@ -2212,6 +2219,7 @@ int bt_gatt_indicate(struct bt_conn *conn,
	}

	if (conn) {
		params->_ref = 1;
		return gatt_indicate(conn, data.handle, params);
	}

@@ -2219,6 +2227,7 @@ int bt_gatt_indicate(struct bt_conn *conn,
	data.type = BT_GATT_CCC_INDICATE;
	data.ind_params = params;

	params->_ref = 0;
	bt_gatt_foreach_attr_type(data.handle, 0xffff, BT_UUID_GATT_CCC, NULL,
				  1, notify_cb, &data);

+1 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@ void service_b_3_2_value_v6_indicate(void)
	 */
	ind_params.attr = &service_b_3_2_attrs[2];
	ind_params.func = value_v6_indicate_cb;
	ind_params.destroy = NULL;
	ind_params.data = &value_v6_value;
	ind_params.len = sizeof(value_v6_value);

Loading