Hi Arman, > +/* Error response */ > +#define ATT_OP_ERROR_RESP 0x01 > +struct bt_att_error_rsp_param { > + uint8_t request_opcode; > + uint16_t handle; > + uint8_t error_code; > +}; > + > +/* Exchange MTU */ > +#define ATT_OP_EXCHANGE_MTU_REQ 0x02 > +struct bt_att_exchange_mtu_req_param { > + uint16_t client_rx_mtu; > +}; > + > +#define ATT_OP_EXCHANGE_MTU_RESP 0x03 > +struct bt_att_exchange_mtu_rsp_param { > + uint16_t server_rx_mtu; > +}; I would keep the PDU internally and have functions for that e.g. bt_att_error_rsp, btw you can probably drop the _param suffix since it is quite obvious what it is for. > +/* Error codes for Error response PDU */ > +#define ATT_ERROR_INVALID_HANDLE 0x01 > +#define ATT_ERROR_READ_NOT_PERMITTED 0x02 > +#define ATT_ERROR_WRITE_NOT_PERMITTED 0x03 > +#define ATT_ERROR_INVALID_PDU 0x04 > +#define ATT_ERROR_AUTHENTICATION 0x05 > +#define ATT_ERROR_REQUEST_NOT_SUPPORTED 0x06 > +#define ATT_ERROR_INVALID_OFFSET 0x07 > +#define ATT_ERROR_AUTHORIZATION 0x08 > +#define ATT_ERROR_PREPARE_QUEUE_FULL 0x09 > +#define ATT_ERROR_ATTRIBUTE_NOT_FOUND 0x0A > +#define ATT_ERROR_ATTRIBUTE_NOT_LONG 0x0B > +#define ATT_ERROR_INSUFFICIENT_ENCRYPTION_KEY_SIZE 0x0C > +#define ATT_ERROR_INVALID_ATTRIBUTE_VALUE_LEN 0x0D > +#define ATT_ERROR_UNLIKELY 0x0E > +#define ATT_ERROR_INSUFFICIENT_ENCRYPTION 0x0F > +#define ATT_ERROR_UNSUPPORTED_GROUP_TYPE 0x10 > +#define ATT_ERROR_INSUFFICIENT_RESOURCES 0x11 > +/* Application defined errors */ > +#define ATT_ERROR_IO 0x80 > +#define ATT_ERROR_TIMEOUT 0x81 > +#define ATT_ERROR_ABORTED 0x82 Perhaps we could map errno to ATT errors, that way this can also be made internal to the library. > +typedef void (*bt_att_destroy_func_t)(void *user_data); > + > +struct bt_att; > + > +struct bt_att *bt_att_new(int fd); > + > +struct bt_att *bt_att_ref(struct bt_att *att); > +void bt_att_unref(struct bt_att *att); > + > +typedef void (*bt_att_debug_func_t)(const char *str, void *user_data); > + > +bool bt_att_set_debug(struct bt_att *att, bt_att_debug_func_t callback, > + void *user_data, bt_att_destroy_func_t destroy); > + > +bool bt_att_set_close_on_unref(struct bt_att *att, bool do_close); > + > +uint16_t bt_att_get_mtu(struct bt_att *att); > +bool bt_att_set_mtu(struct bt_att *att, uint16_t mtu); > + > +typedef void (*bt_att_request_func_t)(uint8_t opcode, const void *param, > + uint16_t length, void *user_data); I think we should make the callback receive the bt_att session as well. > +unsigned int bt_att_send(struct bt_att *att, uint8_t opcode, > + const void *param, uint16_t length, > + bt_att_request_func_t callback, void *user_data, > + bt_att_destroy_func_t destroy); > + > +bool bt_att_cancel(struct bt_att *att, unsigned int id); > +bool bt_att_cancel_all(struct bt_att *att); > -- > 1.9.1.423.g4596e3a > > -- > To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Luiz Augusto von Dentz -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html