Lines Matching refs:conn

94 static ssize_t read_name(struct bt_conn *conn, const struct bt_gatt_attr *attr,  in read_name()  argument
99 return bt_gatt_attr_read(conn, attr, buf, len, offset, name, in read_name()
105 static ssize_t write_name(struct bt_conn *conn, const struct bt_gatt_attr *attr, in write_name() argument
128 static ssize_t read_appearance(struct bt_conn *conn, in read_appearance() argument
134 return bt_gatt_attr_read(conn, attr, buf, len, offset, &appearance, in read_appearance()
150 static ssize_t read_ppcp(struct bt_conn *conn, const struct bt_gatt_attr *attr, in read_ppcp() argument
165 return bt_gatt_attr_read(conn, attr, buf, len, offset, &ppcp, in read_ppcp()
171 static ssize_t read_central_addr_res(struct bt_conn *conn, in read_central_addr_res() argument
177 return bt_gatt_attr_read(conn, attr, buf, len, offset, in read_central_addr_res()
311 static void sc_clear(struct bt_conn *conn) in sc_clear() argument
313 if (bt_addr_le_is_bonded(conn->id, &conn->le.dst)) { in sc_clear()
316 err = bt_gatt_clear_sc(conn->id, &conn->le.dst); in sc_clear()
323 cfg = find_sc_cfg(conn->id, &conn->le.dst); in sc_clear()
402 static ssize_t sc_ccc_cfg_write(struct bt_conn *conn, in sc_ccc_cfg_write() argument
409 sc_save(conn->id, &conn->le.dst, 0, 0); in sc_ccc_cfg_write()
411 sc_clear(conn); in sc_ccc_cfg_write()
463 static struct gatt_cf_cfg *find_cf_cfg(struct bt_conn *conn) in find_cf_cfg() argument
470 if (!conn) { in find_cf_cfg()
474 } else if (bt_conn_is_peer_addr_le(conn, cfg->id, &cfg->peer)) { in find_cf_cfg()
482 static ssize_t cf_read(struct bt_conn *conn, const struct bt_gatt_attr *attr, in cf_read() argument
488 cfg = find_cf_cfg(conn); in cf_read()
493 return bt_gatt_attr_read(conn, attr, buf, len, offset, data, in cf_read()
527 static ssize_t cf_write(struct bt_conn *conn, const struct bt_gatt_attr *attr, in cf_write() argument
541 cfg = find_cf_cfg(conn); in cf_write()
557 bt_addr_le_copy(&cfg->peer, &conn->le.dst); in cf_write()
558 cfg->id = conn->id; in cf_write()
704 static ssize_t db_hash_read(struct bt_conn *conn, in db_hash_read() argument
724 bt_gatt_change_aware(conn, true); in db_hash_read()
726 return bt_gatt_attr_read(conn, attr, buf, len, offset, db_hash, in db_hash_read()
730 static void remove_cf_cfg(struct bt_conn *conn) in remove_cf_cfg() argument
734 cfg = find_cf_cfg(conn); in remove_cf_cfg()
745 if (!bt_addr_le_is_bonded(conn->id, &conn->le.dst)) { in remove_cf_cfg()
749 bt_addr_le_copy(&cfg->peer, &conn->le.dst); in remove_cf_cfg()
758 static ssize_t sf_read(struct bt_conn *conn, const struct bt_gatt_attr *attr, in sf_read() argument
763 return bt_gatt_attr_read(conn, attr, buf, len, offset, &value, in sf_read()
900 static void sc_indicate_rsp(struct bt_conn *conn, in sc_indicate_rsp() argument
923 cfg = find_cf_cfg(conn); in sc_indicate_rsp()
967 static bool gatt_ccc_conn_is_queued(struct bt_conn *conn) in gatt_ccc_conn_is_queued() argument
969 return (conn == gatt_ccc_store.conn_list[bt_conn_index(conn)]); in gatt_ccc_conn_is_queued()
972 static void gatt_ccc_conn_unqueue(struct bt_conn *conn) in gatt_ccc_conn_unqueue() argument
974 u8_t index = bt_conn_index(conn); in gatt_ccc_conn_unqueue()
999 struct bt_conn *conn = ccc_store->conn_list[i]; in ccc_delayed_store() local
1001 if (!conn) { in ccc_delayed_store()
1005 if (bt_addr_le_is_bonded(conn->id, &conn->le.dst)) { in ccc_delayed_store()
1006 bt_gatt_store_ccc(conn->id, &conn->le.dst); in ccc_delayed_store()
1007 bt_conn_unref(conn); in ccc_delayed_store()
1168 ssize_t bt_gatt_attr_read(struct bt_conn *conn, const struct bt_gatt_attr *attr, in bt_gatt_attr_read() argument
1188 ssize_t bt_gatt_attr_read_service(struct bt_conn *conn, in bt_gatt_attr_read_service() argument
1197 return bt_gatt_attr_read(conn, attr, buf, len, offset, in bt_gatt_attr_read_service()
1201 return bt_gatt_attr_read(conn, attr, buf, len, offset, in bt_gatt_attr_read_service()
1245 ssize_t bt_gatt_attr_read_included(struct bt_conn *conn, in bt_gatt_attr_read_included() argument
1272 return bt_gatt_attr_read(conn, attr, buf, len, offset, &pdu, value_len); in bt_gatt_attr_read_included()
1302 ssize_t bt_gatt_attr_read_chrc(struct bt_conn *conn, in bt_gatt_attr_read_chrc() argument
1330 return bt_gatt_attr_read(conn, attr, buf, len, offset, &pdu, value_len); in bt_gatt_attr_read_chrc()
1486 static struct bt_gatt_ccc_cfg *find_ccc_cfg(const struct bt_conn *conn, in find_ccc_cfg() argument
1492 if (conn) { in find_ccc_cfg()
1493 if (bt_conn_is_peer_addr_le(conn, cfg->id, in find_ccc_cfg()
1505 ssize_t bt_gatt_attr_read_ccc(struct bt_conn *conn, in bt_gatt_attr_read_ccc() argument
1513 cfg = find_ccc_cfg(conn, ccc); in bt_gatt_attr_read_ccc()
1521 return bt_gatt_attr_read(conn, attr, buf, len, offset, &value, in bt_gatt_attr_read_ccc()
1547 ssize_t bt_gatt_attr_write_ccc(struct bt_conn *conn, in bt_gatt_attr_write_ccc() argument
1569 cfg = find_ccc_cfg(conn, ccc); in bt_gatt_attr_write_ccc()
1585 bt_addr_le_copy(&cfg->peer, &conn->le.dst); in bt_gatt_attr_write_ccc()
1586 cfg->id = conn->id; in bt_gatt_attr_write_ccc()
1591 ssize_t write = ccc->cfg_write(conn, attr, value); in bt_gatt_attr_write_ccc()
1612 if ((!gatt_ccc_conn_is_queued(conn)) && in bt_gatt_attr_write_ccc()
1613 bt_addr_le_is_bonded(conn->id, &conn->le.dst)) { in bt_gatt_attr_write_ccc()
1617 gatt_ccc_store.conn_list[bt_conn_index(conn)] = in bt_gatt_attr_write_ccc()
1618 bt_conn_ref(conn); in bt_gatt_attr_write_ccc()
1633 ssize_t bt_gatt_attr_read_cep(struct bt_conn *conn, in bt_gatt_attr_read_cep() argument
1640 return bt_gatt_attr_read(conn, attr, buf, len, offset, &props, in bt_gatt_attr_read_cep()
1644 ssize_t bt_gatt_attr_read_cud(struct bt_conn *conn, in bt_gatt_attr_read_cud() argument
1650 return bt_gatt_attr_read(conn, attr, buf, len, offset, value, in bt_gatt_attr_read_cud()
1654 ssize_t bt_gatt_attr_read_cpf(struct bt_conn *conn, in bt_gatt_attr_read_cpf() argument
1660 return bt_gatt_attr_read(conn, attr, buf, len, offset, value, in bt_gatt_attr_read_cpf()
1688 static int gatt_notify_mult_send(struct bt_conn *conn, struct net_buf **buf) in gatt_notify_mult_send() argument
1693 ret = bt_att_send(conn, *buf, data->func, data->user_data); in gatt_notify_mult_send()
1712 struct bt_conn *conn = bt_conn_lookup_index(i); in notify_mult_process() local
1714 gatt_notify_mult_send(conn, buf); in notify_mult_process()
1715 bt_conn_unref(conn); in notify_mult_process()
1722 static bool gatt_cf_notify_multi(struct bt_conn *conn) in gatt_cf_notify_multi() argument
1726 cfg = find_cf_cfg(conn); in gatt_cf_notify_multi()
1734 static int gatt_notify_mult(struct bt_conn *conn, u16_t handle, in gatt_notify_mult() argument
1737 struct net_buf **buf = &nfy_mult[bt_conn_index(conn)]; in gatt_notify_mult()
1747 ret = gatt_notify_mult_send(conn, buf); in gatt_notify_mult()
1754 *buf = bt_att_create_pdu(conn, BT_ATT_OP_NOTIFY_MULT, in gatt_notify_mult()
1780 static int gatt_notify(struct bt_conn *conn, u16_t handle, in gatt_notify() argument
1792 if (!bt_gatt_change_aware(conn, false)) { in gatt_notify()
1798 if (gatt_cf_notify_multi(conn)) { in gatt_notify()
1799 return gatt_notify_mult(conn, handle, params); in gatt_notify()
1803 buf = bt_att_create_pdu(conn, BT_ATT_OP_NOTIFY, in gatt_notify()
1810 BT_DBG("conn %p handle 0x%04x", conn, handle); in gatt_notify()
1818 return bt_att_send(conn, buf, params->func, params->user_data); in gatt_notify()
1821 static void gatt_indicate_rsp(struct bt_conn *conn, u8_t err, in gatt_indicate_rsp() argument
1826 params->func(conn, params->attr, err); in gatt_indicate_rsp()
1829 static int gatt_send(struct bt_conn *conn, struct net_buf *buf, in gatt_send() argument
1849 err = bt_att_req_send(conn, req); in gatt_send()
1854 err = bt_att_send(conn, buf, NULL, NULL); in gatt_send()
1864 static int gatt_indicate(struct bt_conn *conn, u16_t handle, in gatt_indicate() argument
1878 !bt_gatt_change_aware(conn, false)) { in gatt_indicate()
1883 buf = bt_att_create_pdu(conn, BT_ATT_OP_INDICATE, in gatt_indicate()
1890 BT_DBG("conn %p handle 0x%04x", conn, handle); in gatt_indicate()
1899 return gatt_send(conn, buf, NULL, NULL, NULL); in gatt_indicate()
1902 return gatt_send(conn, buf, gatt_indicate_rsp, params, NULL); in gatt_indicate()
1922 struct bt_conn *conn; in notify_cb() local
1928 conn = bt_conn_lookup_state_le(cfg->id, &cfg->peer, in notify_cb()
1930 if (!conn) { in notify_cb()
1940 bt_conn_unref(conn); in notify_cb()
1947 struct bt_conn *conn; in notify_cb() local
1957 conn = bt_conn_lookup_addr_le(cfg->id, &cfg->peer); in notify_cb()
1958 if (!conn) { in notify_cb()
1962 if (conn->state != BT_CONN_CONNECTED) { in notify_cb()
1963 bt_conn_unref(conn); in notify_cb()
1968 if (ccc->cfg_match && !ccc->cfg_match(conn, attr)) { in notify_cb()
1969 bt_conn_unref(conn); in notify_cb()
1974 err = gatt_indicate(conn, attr->handle - 1, in notify_cb()
1977 err = gatt_notify(conn, attr->handle - 1, in notify_cb()
1981 bt_conn_unref(conn); in notify_cb()
2002 int bt_gatt_notify_cb(struct bt_conn *conn, in bt_gatt_notify_cb() argument
2018 if (conn && conn->state != BT_CONN_CONNECTED) { in bt_gatt_notify_cb()
2054 if (conn) { in bt_gatt_notify_cb()
2055 return gatt_notify(conn, handle, params); in bt_gatt_notify_cb()
2069 int bt_gatt_notify_multiple(struct bt_conn *conn, u16_t num_params, in bt_gatt_notify_multiple() argument
2079 ret = bt_gatt_notify_cb(conn, &params[i]); in bt_gatt_notify_multiple()
2089 int bt_gatt_indicate(struct bt_conn *conn, in bt_gatt_indicate() argument
2105 if (conn && conn->state != BT_CONN_CONNECTED) { in bt_gatt_indicate()
2141 if (conn) { in bt_gatt_indicate()
2142 return gatt_indicate(conn, handle, params); in bt_gatt_indicate()
2155 u16_t bt_gatt_get_mtu(struct bt_conn *conn) in bt_gatt_get_mtu() argument
2157 return bt_att_get_mtu(conn); in bt_gatt_get_mtu()
2160 u8_t bt_gatt_check_perm(struct bt_conn *conn, const struct bt_gatt_attr *attr, in bt_gatt_check_perm() argument
2175 if (bt_conn_get_security(conn) < BT_SECURITY_L3) { in bt_gatt_check_perm()
2182 if (!conn->encrypt) { in bt_gatt_check_perm()
2193 static void sc_restore_rsp(struct bt_conn *conn, in sc_restore_rsp() argument
2208 cfg = find_cf_cfg(conn); in sc_restore_rsp()
2218 static void sc_restore(struct bt_conn *conn) in sc_restore() argument
2224 cfg = find_sc_cfg(conn->id, &conn->le.dst); in sc_restore()
2240 index = bt_conn_index(conn); in sc_restore()
2246 if (bt_gatt_indicate(conn, &sc_restore_params[index])) { in sc_restore()
2255 struct bt_conn *conn; member
2262 struct bt_conn *conn = data->conn; in update_ccc() local
2279 !bt_conn_is_peer_addr_le(conn, cfg->id, &cfg->peer)) { in update_ccc()
2284 err = bt_gatt_check_perm(conn, attr, BT_GATT_PERM_WRITE_MASK); in update_ccc()
2301 bt_conn_get_security(conn) < sec) { in update_ccc()
2313 sc_restore(conn); in update_ccc()
2324 struct bt_conn *conn = user_data; in disconnected_cb() local
2352 if (!bt_conn_is_peer_addr_le(conn, cfg->id, &cfg->peer)) { in disconnected_cb()
2366 if (!bt_addr_le_is_bonded(conn->id, &conn->le.dst)) { in disconnected_cb()
2368 sc_clear(conn); in disconnected_cb()
2374 bt_addr_le_copy(&cfg->peer, &conn->le.dst); in disconnected_cb()
2392 bool bt_gatt_is_subscribed(struct bt_conn *conn, in bt_gatt_is_subscribed() argument
2397 __ASSERT(conn, "invalid parameter\n"); in bt_gatt_is_subscribed()
2400 if (conn->state != BT_CONN_CONNECTED) { in bt_gatt_is_subscribed()
2433 if (bt_conn_is_peer_addr_le(conn, cfg->id, &cfg->peer) && in bt_gatt_is_subscribed()
2442 static void gatt_sub_remove(struct bt_conn *conn, struct gatt_sub *sub, in gatt_sub_remove() argument
2450 params->notify(conn, params, NULL, 0); in gatt_sub_remove()
2460 static struct gatt_sub *gatt_sub_find_free(struct bt_conn *conn, in gatt_sub_find_free() argument
2472 if (bt_conn_is_peer_addr_le(conn, sub->id, &sub->peer)) { in gatt_sub_find_free()
2486 static struct gatt_sub *gatt_sub_add(struct bt_conn *conn) in gatt_sub_add() argument
2490 sub = gatt_sub_find_free(conn, &free_sub); in gatt_sub_add()
2496 bt_addr_le_copy(&free_sub->peer, &conn->le.dst); in gatt_sub_add()
2497 free_sub->id = conn->id; in gatt_sub_add()
2512 void bt_gatt_notification(struct bt_conn *conn, u16_t handle, in bt_gatt_notification() argument
2520 ble_stack_gatt_notify_cb(bt_conn_index(conn), handle, data, length); in bt_gatt_notification()
2522 sub = gatt_sub_find(conn); in bt_gatt_notification()
2532 if (params->notify(conn, params, data, length) == in bt_gatt_notification()
2534 bt_gatt_unsubscribe(conn, params); in bt_gatt_notification()
2539 void bt_gatt_mult_notification(struct bt_conn *conn, const void *data, in bt_gatt_mult_notification() argument
2549 sub = gatt_sub_find(conn); in bt_gatt_mult_notification()
2578 if (params->notify(conn, params, nfy->value, len) == in bt_gatt_mult_notification()
2580 bt_gatt_unsubscribe(conn, params); in bt_gatt_mult_notification()
2588 static void gatt_sub_update(struct bt_conn *conn, struct gatt_sub *sub) in gatt_sub_update() argument
2595 bt_addr_le_copy(&sub->peer, &conn->le.dst); in gatt_sub_update()
2598 static void remove_subscriptions(struct bt_conn *conn) in remove_subscriptions() argument
2604 sub = gatt_sub_find(conn); in remove_subscriptions()
2611 if (!bt_addr_le_is_bonded(conn->id, &conn->le.dst) || in remove_subscriptions()
2616 gatt_sub_remove(conn, sub, prev, params); in remove_subscriptions()
2618 gatt_sub_update(conn, sub); in remove_subscriptions()
2624 static void gatt_mtu_rsp(struct bt_conn *conn, u8_t err, const void *pdu, in gatt_mtu_rsp() argument
2629 params->func(conn, err, params); in gatt_mtu_rsp()
2632 int bt_gatt_exchange_mtu(struct bt_conn *conn, in bt_gatt_exchange_mtu() argument
2639 __ASSERT(conn, "invalid parameter\n"); in bt_gatt_exchange_mtu()
2642 if (conn->state != BT_CONN_CONNECTED) { in bt_gatt_exchange_mtu()
2646 buf = bt_att_create_pdu(conn, BT_ATT_OP_MTU_REQ, sizeof(*req)); in bt_gatt_exchange_mtu()
2658 return gatt_send(conn, buf, gatt_mtu_rsp, params, NULL); in bt_gatt_exchange_mtu()
2661 static void gatt_discover_next(struct bt_conn *conn, u16_t last_handle, in gatt_discover_next() argument
2683 if (!bt_gatt_discover(conn, params)) { in gatt_discover_next()
2688 params->func(conn, NULL, params); in gatt_discover_next()
2691 static void gatt_find_type_rsp(struct bt_conn *conn, u8_t err, in gatt_find_type_rsp() argument
2733 if (params->func(conn, &attr, params) == BT_GATT_ITER_STOP) { in gatt_find_type_rsp()
2743 gatt_discover_next(conn, end_handle, params); in gatt_find_type_rsp()
2747 params->func(conn, NULL, params); in gatt_find_type_rsp()
2750 static int gatt_find_type(struct bt_conn *conn, in gatt_find_type() argument
2757 buf = bt_att_create_pdu(conn, BT_ATT_OP_FIND_TYPE_REQ, sizeof(*req)); in gatt_find_type()
2791 return gatt_send(conn, buf, gatt_find_type_rsp, params, NULL); in gatt_find_type()
2794 static void read_included_uuid_cb(struct bt_conn *conn, u8_t err, in read_included_uuid_cb() argument
2808 params->func(conn, NULL, params); in read_included_uuid_cb()
2832 if (params->func(conn, attr, params) == BT_GATT_ITER_STOP) { in read_included_uuid_cb()
2836 gatt_discover_next(conn, params->start_handle, params); in read_included_uuid_cb()
2841 static int read_included_uuid(struct bt_conn *conn, in read_included_uuid() argument
2847 buf = bt_att_create_pdu(conn, BT_ATT_OP_READ_REQ, sizeof(*req)); in read_included_uuid()
2857 return gatt_send(conn, buf, read_included_uuid_cb, params, NULL); in read_included_uuid()
2860 static u16_t parse_include(struct bt_conn *conn, const void *pdu, in parse_include() argument
2920 return read_included_uuid(conn, params); in parse_include()
2937 if (params->func(conn, attr, params) == BT_GATT_ITER_STOP) { in parse_include()
2948 params->func(conn, NULL, params); in parse_include()
2959 static u16_t parse_characteristic(struct bt_conn *conn, const void *pdu, in parse_characteristic() argument
3019 if (params->func(conn, attr, params) == BT_GATT_ITER_STOP) { in parse_characteristic()
3030 params->func(conn, NULL, params); in parse_characteristic()
3034 static void gatt_read_type_rsp(struct bt_conn *conn, u8_t err, in gatt_read_type_rsp() argument
3044 params->func(conn, NULL, params); in gatt_read_type_rsp()
3049 handle = parse_include(conn, pdu, params, length); in gatt_read_type_rsp()
3051 handle = parse_characteristic(conn, pdu, params, length); in gatt_read_type_rsp()
3058 gatt_discover_next(conn, handle, params); in gatt_read_type_rsp()
3061 static int gatt_read_type(struct bt_conn *conn, in gatt_read_type() argument
3067 buf = bt_att_create_pdu(conn, BT_ATT_OP_READ_TYPE_REQ, sizeof(*req)); in gatt_read_type()
3085 return gatt_send(conn, buf, gatt_read_type_rsp, params, NULL); in gatt_read_type()
3088 static u16_t parse_service(struct bt_conn *conn, const void *pdu, in parse_service() argument
3158 if (params->func(conn, &attr, params) == BT_GATT_ITER_STOP) { in parse_service()
3169 params->func(conn, NULL, params); in parse_service()
3173 static void gatt_read_group_rsp(struct bt_conn *conn, u8_t err, in gatt_read_group_rsp() argument
3183 params->func(conn, NULL, params); in gatt_read_group_rsp()
3187 handle = parse_service(conn, pdu, params, length); in gatt_read_group_rsp()
3192 gatt_discover_next(conn, handle, params); in gatt_read_group_rsp()
3195 static int gatt_read_group(struct bt_conn *conn, in gatt_read_group() argument
3201 buf = bt_att_create_pdu(conn, BT_ATT_OP_READ_GROUP_REQ, sizeof(*req)); in gatt_read_group()
3219 return gatt_send(conn, buf, gatt_read_group_rsp, params, NULL); in gatt_read_group()
3222 static void gatt_find_info_rsp(struct bt_conn *conn, u8_t err, in gatt_find_info_rsp() argument
3322 if (params->func(conn, attr, params) == BT_GATT_ITER_STOP) { in gatt_find_info_rsp()
3327 gatt_discover_next(conn, handle, params); in gatt_find_info_rsp()
3332 params->func(conn, NULL, params); in gatt_find_info_rsp()
3335 static int gatt_find_info(struct bt_conn *conn, in gatt_find_info() argument
3341 buf = bt_att_create_pdu(conn, BT_ATT_OP_FIND_INFO_REQ, sizeof(*req)); in gatt_find_info()
3353 return gatt_send(conn, buf, gatt_find_info_rsp, params, NULL); in gatt_find_info()
3356 int bt_gatt_discover(struct bt_conn *conn, in bt_gatt_discover() argument
3359 __ASSERT(conn, "invalid parameters\n"); in bt_gatt_discover()
3366 if (conn->state != BT_CONN_CONNECTED) { in bt_gatt_discover()
3374 return gatt_find_type(conn, params); in bt_gatt_discover()
3376 return gatt_read_group(conn, params); in bt_gatt_discover()
3379 return gatt_read_type(conn, params); in bt_gatt_discover()
3391 return gatt_find_info(conn, params); in bt_gatt_discover()
3399 static void parse_read_by_uuid(struct bt_conn *conn, in parse_read_by_uuid() argument
3427 if (params->func(conn, 0, params, data->value, len) == in parse_read_by_uuid()
3439 params->func(conn, 0, params, NULL, 0); in parse_read_by_uuid()
3447 if (bt_gatt_read(conn, params) < 0) { in parse_read_by_uuid()
3448 params->func(conn, BT_ATT_ERR_UNLIKELY, params, NULL, 0); in parse_read_by_uuid()
3452 static void gatt_read_rsp(struct bt_conn *conn, u8_t err, const void *pdu, in gatt_read_rsp() argument
3460 params->func(conn, err, params, NULL, 0); in gatt_read_rsp()
3465 parse_read_by_uuid(conn, params, pdu, length); in gatt_read_rsp()
3469 if (params->func(conn, 0, params, pdu, length) == BT_GATT_ITER_STOP) { in gatt_read_rsp()
3479 if (length < (bt_att_get_mtu(conn) - 1)) { in gatt_read_rsp()
3480 params->func(conn, 0, params, NULL, 0); in gatt_read_rsp()
3487 if (bt_gatt_read(conn, params) < 0) { in gatt_read_rsp()
3488 params->func(conn, BT_ATT_ERR_UNLIKELY, params, NULL, 0); in gatt_read_rsp()
3492 static int gatt_read_blob(struct bt_conn *conn, in gatt_read_blob() argument
3498 buf = bt_att_create_pdu(conn, BT_ATT_OP_READ_BLOB_REQ, sizeof(*req)); in gatt_read_blob()
3510 return gatt_send(conn, buf, gatt_read_rsp, params, NULL); in gatt_read_blob()
3513 static int gatt_read_uuid(struct bt_conn *conn, in gatt_read_uuid() argument
3519 buf = bt_att_create_pdu(conn, BT_ATT_OP_READ_TYPE_REQ, sizeof(*req)); in gatt_read_uuid()
3538 return gatt_send(conn, buf, gatt_read_rsp, params, NULL); in gatt_read_uuid()
3542 static void gatt_read_mult_rsp(struct bt_conn *conn, u8_t err, const void *pdu, in gatt_read_mult_rsp() argument
3550 params->func(conn, err, params, NULL, 0); in gatt_read_mult_rsp()
3554 params->func(conn, 0, params, pdu, length); in gatt_read_mult_rsp()
3557 params->func(conn, 0, params, NULL, 0); in gatt_read_mult_rsp()
3560 static int gatt_read_mult(struct bt_conn *conn, in gatt_read_mult() argument
3566 buf = bt_att_create_pdu(conn, BT_ATT_OP_READ_MULT_REQ, in gatt_read_mult()
3576 return gatt_send(conn, buf, gatt_read_mult_rsp, params, NULL); in gatt_read_mult()
3580 static void gatt_read_mult_vl_rsp(struct bt_conn *conn, u8_t err, in gatt_read_mult_vl_rsp() argument
3592 gatt_read_mult(conn, params); in gatt_read_mult_vl_rsp()
3594 params->func(conn, err, params, NULL, 0); in gatt_read_mult_vl_rsp()
3614 params->func(conn, 0, params, rsp->value, len); in gatt_read_mult_vl_rsp()
3620 params->func(conn, 0, params, NULL, 0); in gatt_read_mult_vl_rsp()
3623 static int gatt_read_mult_vl(struct bt_conn *conn, in gatt_read_mult_vl() argument
3629 buf = bt_att_create_pdu(conn, BT_ATT_OP_READ_MULT_VL_REQ, in gatt_read_mult_vl()
3639 return gatt_send(conn, buf, gatt_read_mult_vl_rsp, params, NULL); in gatt_read_mult_vl()
3644 static int gatt_read_mult(struct bt_conn *conn, in gatt_read_mult() argument
3650 static int gatt_read_mult_vl(struct bt_conn *conn, in gatt_read_mult_vl() argument
3657 int bt_gatt_read(struct bt_conn *conn, struct bt_gatt_read_params *params) in bt_gatt_read() argument
3662 __ASSERT(conn, "invalid parameters\n"); in bt_gatt_read()
3665 if (conn->state != BT_CONN_CONNECTED) { in bt_gatt_read()
3670 return gatt_read_uuid(conn, params); in bt_gatt_read()
3675 return gatt_read_mult_vl(conn, params); in bt_gatt_read()
3677 return gatt_read_mult(conn, params); in bt_gatt_read()
3682 return gatt_read_blob(conn, params); in bt_gatt_read()
3685 buf = bt_att_create_pdu(conn, BT_ATT_OP_READ_REQ, sizeof(*req)); in bt_gatt_read()
3695 return gatt_send(conn, buf, gatt_read_rsp, params, NULL); in bt_gatt_read()
3698 static void gatt_write_rsp(struct bt_conn *conn, u8_t err, const void *pdu, in gatt_write_rsp() argument
3705 params->func(conn, err, params); in gatt_write_rsp()
3708 int bt_gatt_write_without_response_cb(struct bt_conn *conn, u16_t handle, in bt_gatt_write_without_response_cb() argument
3717 __ASSERT(conn, "invalid parameters\n"); in bt_gatt_write_without_response_cb()
3720 if (conn->state != BT_CONN_CONNECTED) { in bt_gatt_write_without_response_cb()
3725 if (conn->encrypt) { in bt_gatt_write_without_response_cb()
3732 buf = bt_att_create_pdu(conn, BT_ATT_OP_SIGNED_WRITE_CMD, in bt_gatt_write_without_response_cb()
3735 buf = bt_att_create_pdu(conn, BT_ATT_OP_WRITE_CMD, in bt_gatt_write_without_response_cb()
3755 return bt_att_send(conn, buf, func, user_data); in bt_gatt_write_without_response_cb()
3758 static int gatt_exec_write(struct bt_conn *conn, in gatt_exec_write() argument
3764 buf = bt_att_create_pdu(conn, BT_ATT_OP_EXEC_WRITE_REQ, sizeof(*req)); in gatt_exec_write()
3774 return gatt_send(conn, buf, gatt_write_rsp, params, NULL); in gatt_exec_write()
3777 static void gatt_prepare_write_rsp(struct bt_conn *conn, u8_t err, in gatt_prepare_write_rsp() argument
3788 params->func(conn, err, params); in gatt_prepare_write_rsp()
3794 gatt_exec_write(conn, params); in gatt_prepare_write_rsp()
3799 bt_gatt_write(conn, params); in gatt_prepare_write_rsp()
3802 static int gatt_prepare_write(struct bt_conn *conn, in gatt_prepare_write() argument
3810 len = MIN(params->length, bt_att_get_mtu(conn) - sizeof(*req) - 1); in gatt_prepare_write()
3812 buf = bt_att_create_pdu(conn, BT_ATT_OP_PREPARE_WRITE_REQ, in gatt_prepare_write()
3834 return gatt_send(conn, buf, gatt_prepare_write_rsp, params, NULL); in gatt_prepare_write()
3837 int bt_gatt_write(struct bt_conn *conn, struct bt_gatt_write_params *params) in bt_gatt_write() argument
3843 __ASSERT(conn, "invalid parameters\n"); in bt_gatt_write()
3847 if (conn->state != BT_CONN_CONNECTED) { in bt_gatt_write()
3853 params->length > (bt_att_get_mtu(conn) - sizeof(*req) - 1)) { in bt_gatt_write()
3854 return gatt_prepare_write(conn, params); in bt_gatt_write()
3857 buf = bt_att_create_pdu(conn, BT_ATT_OP_WRITE_REQ, in bt_gatt_write()
3875 return gatt_send(conn, buf, gatt_write_rsp, params, NULL); in bt_gatt_write()
3878 static void gatt_write_ccc_rsp(struct bt_conn *conn, u8_t err, in gatt_write_ccc_rsp() argument
3893 sub = gatt_sub_find(conn); in gatt_write_ccc_rsp()
3900 gatt_sub_remove(conn, sub, tmp, params); in gatt_write_ccc_rsp()
3909 params->notify(conn, params, NULL, 0); in gatt_write_ccc_rsp()
3913 static int gatt_write_ccc(struct bt_conn *conn, u16_t handle, u16_t value, in gatt_write_ccc() argument
3920 buf = bt_att_create_pdu(conn, BT_ATT_OP_WRITE_REQ, in gatt_write_ccc()
3934 return gatt_send(conn, buf, func, params, NULL); in gatt_write_ccc()
3937 int bt_gatt_subscribe(struct bt_conn *conn, in bt_gatt_subscribe() argument
3944 __ASSERT(conn, "invalid parameters\n"); in bt_gatt_subscribe()
3949 if (conn->state != BT_CONN_CONNECTED) { in bt_gatt_subscribe()
3953 sub = gatt_sub_add(conn); in bt_gatt_subscribe()
3962 gatt_sub_remove(conn, sub, NULL, NULL); in bt_gatt_subscribe()
3977 err = gatt_write_ccc(conn, params->ccc_handle, params->value, in bt_gatt_subscribe()
3980 gatt_sub_remove(conn, sub, NULL, NULL); in bt_gatt_subscribe()
3994 int bt_gatt_unsubscribe(struct bt_conn *conn, in bt_gatt_unsubscribe() argument
4002 __ASSERT(conn, "invalid parameters\n"); in bt_gatt_unsubscribe()
4005 if (conn->state != BT_CONN_CONNECTED) { in bt_gatt_unsubscribe()
4009 sub = gatt_sub_find(conn); in bt_gatt_unsubscribe()
4023 bt_gatt_cancel(conn, params); in bt_gatt_unsubscribe()
4042 params->notify(conn, params, NULL, 0); in bt_gatt_unsubscribe()
4048 return gatt_write_ccc(conn, params->ccc_handle, params->value, in bt_gatt_unsubscribe()
4052 void bt_gatt_cancel(struct bt_conn *conn, void *params) in bt_gatt_cancel() argument
4054 bt_att_req_cancel(conn, params); in bt_gatt_cancel()
4057 static void add_subscriptions(struct bt_conn *conn) in add_subscriptions() argument
4062 sub = gatt_sub_find(conn); in add_subscriptions()
4069 if (bt_addr_le_is_bonded(conn->id, &conn->le.dst) && in add_subscriptions()
4075 gatt_write_ccc(conn, params->ccc_handle, params->value, in add_subscriptions()
4266 void bt_gatt_connected(struct bt_conn *conn) in bt_gatt_connected() argument
4270 BT_DBG("conn %p", conn); in bt_gatt_connected()
4272 data.conn = conn; in bt_gatt_connected()
4277 bt_addr_le_is_bonded(conn->id, &conn->le.dst)) { in bt_gatt_connected()
4280 if (conn->id) { in bt_gatt_connected()
4283 u8_to_dec(id_str, sizeof(id_str), conn->id); in bt_gatt_connected()
4285 &conn->le.dst, id_str); in bt_gatt_connected()
4288 &conn->le.dst, NULL); in bt_gatt_connected()
4313 bt_conn_get_security(conn) < data.sec) { in bt_gatt_connected()
4314 bt_conn_set_security(conn, data.sec); in bt_gatt_connected()
4318 add_subscriptions(conn); in bt_gatt_connected()
4322 void bt_gatt_encrypt_change(struct bt_conn *conn) in bt_gatt_encrypt_change() argument
4326 BT_DBG("conn %p", conn); in bt_gatt_encrypt_change()
4328 data.conn = conn; in bt_gatt_encrypt_change()
4334 bool bt_gatt_change_aware(struct bt_conn *conn, bool req) in bt_gatt_change_aware() argument
4339 cfg = find_cf_cfg(conn); in bt_gatt_change_aware()
4378 static int bt_gatt_store_cf(struct bt_conn *conn) in bt_gatt_store_cf() argument
4387 cfg = find_cf_cfg(conn); in bt_gatt_store_cf()
4397 if (conn->id) { in bt_gatt_store_cf()
4400 u8_to_dec(id_str, sizeof(id_str), conn->id); in bt_gatt_store_cf()
4402 &conn->le.dst, id_str); in bt_gatt_store_cf()
4406 if (!cfg || !conn->id) { in bt_gatt_store_cf()
4408 &conn->le.dst, NULL); in bt_gatt_store_cf()
4417 BT_DBG("Stored CF for %s (%s)", bt_addr_le_str(&conn->le.dst), log_strdup(key)); in bt_gatt_store_cf()
4423 void bt_gatt_disconnected(struct bt_conn *conn) in bt_gatt_disconnected() argument
4425 BT_DBG("conn %p", conn); in bt_gatt_disconnected()
4426 bt_gatt_foreach_attr(0x0001, 0xffff, disconnected_cb, conn); in bt_gatt_disconnected()
4429 gatt_ccc_conn_unqueue(conn); in bt_gatt_disconnected()
4437 bt_addr_le_is_bonded(conn->id, &conn->le.dst)) { in bt_gatt_disconnected()
4438 bt_gatt_store_ccc(conn->id, &conn->le.dst); in bt_gatt_disconnected()
4439 bt_gatt_store_cf(conn); in bt_gatt_disconnected()
4443 remove_subscriptions(conn); in bt_gatt_disconnected()
4447 remove_cf_cfg(conn); in bt_gatt_disconnected()