| | |
| | | gatt_svr_chr_access_smp(uint16_t conn_handle, uint16_t attr_handle, |
| | | struct ble_gatt_access_ctxt *ctxt, void *arg); |
| | | |
| | | static const struct ble_gatt_svc_def gatt_svr_svcs[] = { |
| | | static const struct ble_gatt_svc_def gatt_svr_svcs[] = |
| | | { |
| | | { |
| | | /* Service: smp */ |
| | | .type = BLE_GATT_SVC_TYPE_PRIMARY, |
| | | .uuid = &gatt_svr_svc_smp.u, |
| | | .characteristics = (struct ble_gatt_chr_def[]) { { |
| | | /* Characteristic: Write No Rsp */ |
| | | .uuid = &gatt_svr_chr_smp.u, |
| | | .access_cb = gatt_svr_chr_access_smp, |
| | | .flags = BLE_GATT_CHR_F_WRITE_NO_RSP | BLE_GATT_CHR_F_NOTIFY, |
| | | .val_handle = &g_ble_smp_attr_handle, |
| | | }, { |
| | | 0, /* No more characteristics in this service */ |
| | | } }, |
| | | .characteristics = (struct ble_gatt_chr_def[]) |
| | | { |
| | | { |
| | | /* Characteristic: Write No Rsp */ |
| | | .uuid = &gatt_svr_chr_smp.u, |
| | | .access_cb = gatt_svr_chr_access_smp, |
| | | .flags = BLE_GATT_CHR_F_WRITE_NO_RSP | BLE_GATT_CHR_F_NOTIFY, |
| | | .val_handle = &g_ble_smp_attr_handle, |
| | | }, |
| | | { |
| | | 0, /* No more characteristics in this service */ |
| | | } |
| | | }, |
| | | }, |
| | | |
| | | { |
| | | 0, /* No more services */ |
| | | }, |
| | |
| | | /* Sufficient usrhdr space already present. */ |
| | | m_req = ctxt->om; |
| | | ctxt->om = NULL; |
| | | } else if (OS_MBUF_LEADINGSPACE(ctxt->om) >= |
| | | sizeof (conn_handle)) { |
| | | |
| | | } else if (OS_MBUF_LEADINGSPACE(ctxt->om) >= sizeof (conn_handle)) { |
| | | /* Usrhdr isn't present, but there is enough leading space to |
| | | * add one. |
| | | */ |
| | |
| | | * copy. Don't set ctxt->om to NULL; let the NimBLE host free |
| | | * it. |
| | | */ |
| | | m_req = os_msys_get_pkthdr(OS_MBUF_PKTLEN(ctxt->om), |
| | | sizeof (conn_handle)); |
| | | m_req = os_msys_get_pkthdr(OS_MBUF_PKTLEN(ctxt->om), sizeof (conn_handle)); |
| | | if (!m_req) { |
| | | return BLE_ATT_ERR_INSUFFICIENT_RES; |
| | | } |
| | | rc = os_mbuf_appendfrom(m_req, ctxt->om, 0, |
| | | OS_MBUF_PKTLEN(ctxt->om)); |
| | | rc = os_mbuf_appendfrom(m_req, ctxt->om, 0, OS_MBUF_PKTLEN(ctxt->om)); |
| | | if (rc) { |
| | | return BLE_ATT_ERR_INSUFFICIENT_RES; |
| | | } |
| | |
| | | |
| | | while ((m_resp = os_mqueue_get(&g_smp_ble_mq)) != NULL) { |
| | | assert(OS_MBUF_USRHDR_LEN(m_resp) >= sizeof (conn_handle)); |
| | | |
| | | memcpy(&conn_handle, OS_MBUF_USRHDR(m_resp), sizeof (conn_handle)); |
| | | ble_gattc_notify_custom(conn_handle, g_ble_smp_attr_handle, |
| | | m_resp); |
| | | |
| | | ble_gattc_notify_custom(conn_handle, g_ble_smp_attr_handle, m_resp); |
| | | } |
| | | } |
| | | |