This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Problem with queued writes handled by stack and require authorization

Hi all

I'm using the GATT server on the nRF51822 with the SoftDevice S130 V2.0.1. I've implemented a service and a characteristic which supports only write requests (including reliable write) and requires authorization. I tried to implement the handling according to this MSC to write e.g. 48 bytes to my characteristic.

When I receive the event BLE_EVT_USER_MEM_REQUEST, I deliver a buffer with 256 bytes to the SoftDevice using the function sd_ble_user_mem_reply(). Afterwards I receive the event BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST, but when I call the function sd_ble_gatts_rw_authorize_reply() I receive the NRF_ERROR_INVALID_PARAM error.

   case BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST:
      if (pAuth_request->type == BLE_GATTS_AUTHORIZE_TYPE_WRITE)
      {
         if (pAuth_request->request.write.handle == gService.char_handle.value_handle)
         {
            reply.type = BLE_GATTS_AUTHORIZE_TYPE_WRITE;
            reply.params.write.gatt_status = BLE_GATT_STATUS_SUCCESS;
            reply.params.write.update = 1;
            reply.params.write.len = pAuth_request->request.write.len;
            reply.params.write.offset = pAuth_request->request.write.offset;
            reply.params.write.p_data = pAuth_request->request.write.data;

            sd_stat = sd_ble_gatts_rw_authorize_reply(gConn_handle, &reply);
            if (sd_stat != NRF_SUCCESS) {goto exception;}
		 }

I've initialized the characteristic the following way:

   char_md.char_props.auth_signed_wr = 0;
   char_md.char_props.broadcast = 0;
   char_md.char_props.indicate = 0;
   char_md.char_props.notify = 0;
   char_md.char_props.read = 0;
   char_md.char_props.write = 1;
   char_md.char_props.write_wo_resp = 0;

   char_md.char_ext_props.reliable_wr = 1;
   char_md.char_ext_props.wr_aux = 0;
   char_md.char_user_desc_max_size = 0;
   char_md.char_user_desc_size = 0;
   char_md.p_char_user_desc = NULL;
   char_md.p_char_pf = NULL;
   char_md.p_user_desc_md = NULL;
   char_md.p_cccd_md = NULL;
   char_md.p_sccd_md = NULL;

   BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm);
   attr_md.rd_auth = 0;
   attr_md.wr_auth = 1;
   attr_md.vlen = 1;
   attr_md.vloc = BLE_GATTS_VLOC_STACK;

   BLE_UUID_BLE_ASSIGN(uuid, 0xABCD);
   attr_char_value.p_uuid = &uuid;
   attr_char_value.p_attr_md = &attr_md;
   attr_char_value.init_offs = 0;
   attr_char_value.init_len = 0;
   attr_char_value.max_len = 256;
   attr_char_value.p_value = NULL;

   sd_stat = sd_ble_gatts_characteristic_add(
      pSrv->service_handle,
      &char_md,
      &attr_char_value,
      &pSrv->char_handle);
   if (sd_stat != NRF_SUCCESS) {goto exception;}

Does anyone have an idea what I am doing wrong? Why do I receive the status NRF_ERROR_INVALID_PARAM? Many thanks in advance.

Kind regards

  • I'm not seeing any obvious errors in your code, but have not tried to do queued writes with authorization either. However, in case you have not seen it, we did include an example for this in SDK 12 that you may use as reference: Experimental: Queued Writes Application

  • Thank you for your answer. I saw in your example that the update flag in the reply struct is NOT set when the write operation is BLE_GATTS_OP_PREP_WRITE_REQ. Now it works :-)

    Am I right that the update flag must only be set in case of BLE_GATTS_OP_WRITE_REQ, BLE_GATTS_OP_WRITE_CMD and BLE_GATTS_OP_SIGN_WRITE_CMD?

  • The reply.params.write.update flag must not be set when the write operation is BLE_GATTS_OP_PREP_WRITE_REQ.