#ifndef GATTM_TASK_H_ #define GATTM_TASK_H_ /** **************************************************************************************** * @addtogroup GATTMTASK Task * @ingroup GATTM * @brief Handles ALL GATT block operations not related to a connection. * * The GATTMTASK is responsible for managing internal attribute database and state of * GATT controller which manage GATT block operations related to a connection. * * Messages may originate from @ref ATTM "ATTM", @ref GAP "GAP" and Application. * * @{ **************************************************************************************** */ /* * INCLUDE FILES **************************************************************************************** */ #include "rwip_task.h" // Task definitions #include "att.h" /* * DEFINES **************************************************************************************** */ /// GATT Task messages enum gattm_msg_id { /* Database Management */ /// Add service in database request GATTM_ADD_SVC_REQ = TASK_FIRST_MSG(TASK_ID_GATTM), /// Add service in database response GATTM_ADD_SVC_RSP, /* Service management */ /// Get permission settings of service request GATTM_SVC_GET_PERMISSION_REQ, /// Get permission settings of service response GATTM_SVC_GET_PERMISSION_RSP, /// Set permission settings of service request GATTM_SVC_SET_PERMISSION_REQ, /// Set permission settings of service response GATTM_SVC_SET_PERMISSION_RSP, /* Attribute Manipulation */ /// Get permission settings of attribute request GATTM_ATT_GET_PERMISSION_REQ, /// Get permission settings of attribute response GATTM_ATT_GET_PERMISSION_RSP, /// Set permission settings of attribute request GATTM_ATT_SET_PERMISSION_REQ, /// Set permission settings of attribute response GATTM_ATT_SET_PERMISSION_RSP, /// Get attribute value request GATTM_ATT_GET_VALUE_REQ, /// Get attribute value response GATTM_ATT_GET_VALUE_RSP, /// Set attribute value request GATTM_ATT_SET_VALUE_REQ, /// Set attribute value response GATTM_ATT_SET_VALUE_RSP, /* Debug messages */ /// DEBUG ONLY: Destroy Attribute database request GATTM_DESTROY_DB_REQ, /// DEBUG ONLY: Destroy Attribute database response GATTM_DESTROY_DB_RSP, /// DEBUG ONLY: Retrieve list of services request GATTM_SVC_GET_LIST_REQ, /// DEBUG ONLY: Retrieve list of services response GATTM_SVC_GET_LIST_RSP, /// DEBUG ONLY: Retrieve information of attribute request GATTM_ATT_GET_INFO_REQ, /// DEBUG ONLY: Retrieve information of attribute response GATTM_ATT_GET_INFO_RSP, }; /** * Attribute Description */ struct gattm_att_desc { /** Attribute UUID (LSB First) */ uint8_t uuid[ATT_UUID_128_LEN]; /** * Attribute Permission (@see attm_perm_mask) */ uint16_t perm; /** * Maximum length of the attribute * * Note: * For Included Services and Characteristic Declarations, this field contains targeted * handle. * * For Characteristic Extended Properties, this field contains 2 byte value * * Not used Client Characteristic Configuration and Server Characteristic Configuration, * this field is not used. */ uint16_t max_len; /** * Attribute Extended permissions * * Extended Value permission bit field * * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ * | RI |UUID_LEN |EKS | Reserved | * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ * * Bit [0-11] : Reserved * Bit [12] : Encryption key Size must be 16 bytes * Bit [13-14]: UUID Length (0 = 16 bits, 1 = 32 bits, 2 = 128 bits, 3 = RFU) * Bit [15] : Trigger Read Indication (0 = Value present in Database, 1 = Value not present in Database) */ uint16_t ext_perm; }; /** * Service description */ struct gattm_svc_desc { /// Attribute Start Handle (0 = dynamically allocated) uint16_t start_hdl; /// Task identifier that manages service uint16_t task_id; /** * 7 6 5 4 3 2 1 0 * +----+----+----+----+----+----+----+----+ * |SEC |UUID_LEN |DIS | AUTH |EKS | MI | * +----+----+----+----+----+----+----+----+ * * Bit [0] : Task that manage service is multi-instantiated (Connection index is conveyed) * Bit [1] : Encryption key Size must be 16 bytes * Bit [2-3]: Service Permission (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = Secure Connect) * Bit [4] : Disable the service * Bit [5-6]: UUID Length (0 = 16 bits, 1 = 32 bits, 2 = 128 bits, 3 = RFU) * Bit [7] : Secondary Service (0 = Primary Service, 1 = Secondary Service) */ uint8_t perm; /// Number of attributes uint8_t nb_att; /** Service UUID */ uint8_t uuid[ATT_UUID_128_LEN]; /** * List of attribute description present in service. */ struct gattm_att_desc atts[__ARRAY_EMPTY]; }; /// Add service in database request struct gattm_add_svc_req { /// service description struct gattm_svc_desc svc_desc; }; /// Add service in database response struct gattm_add_svc_rsp { /// Start handle of allocated service in attribute database uint16_t start_hdl; /// Return status of service allocation in attribute database. uint8_t status; }; /* Service management */ /// Get permission settings of service request struct gattm_svc_get_permission_req { /// Service start attribute handle uint16_t start_hdl; }; /// Get permission settings of service response struct gattm_svc_get_permission_rsp { /// Service start attribute handle uint16_t start_hdl; /// service permission uint8_t perm; /// Return status uint8_t status; }; /// Set permission settings of service request struct gattm_svc_set_permission_req { /// Service start attribute handle uint16_t start_hdl; /// service permission uint8_t perm; }; /// Set permission settings of service response struct gattm_svc_set_permission_rsp { /// Service start attribute handle uint16_t start_hdl; /// Return status uint8_t status; }; /* Attribute management */ /// Get permission settings of attribute request struct gattm_att_get_permission_req { /// Handle of the attribute uint16_t handle; }; /// Get permission settings of attribute response struct gattm_att_get_permission_rsp { /// Handle of the attribute uint16_t handle; /// Attribute permission uint16_t perm; /// Extended Attribute permission uint16_t ext_perm; /// Return status uint8_t status; }; /// Set permission settings of attribute request struct gattm_att_set_permission_req { /// Handle of the attribute uint16_t handle; /// Attribute permission uint16_t perm; /// Extended Attribute permission uint16_t ext_perm; }; /// Set permission settings of attribute response struct gattm_att_set_permission_rsp { /// Handle of the attribute uint16_t handle; /// Return status uint8_t status; }; /// Get attribute value request struct gattm_att_get_value_req { /// Handle of the attribute uint16_t handle; }; /// Get attribute value response struct gattm_att_get_value_rsp { /// Handle of the attribute uint16_t handle; /// Attribute value length uint16_t length; /// Return status uint8_t status; /// Attribute value uint8_t value[__ARRAY_EMPTY]; }; /// Set attribute value request struct gattm_att_set_value_req { /// Handle of the attribute uint16_t handle; /// Attribute value length uint16_t length; /// Attribute value uint8_t value[__ARRAY_EMPTY]; }; /// Set attribute value response struct gattm_att_set_value_rsp { /// Handle of the attribute uint16_t handle; /// Return status uint8_t status; }; /// DEBUG ONLY: Destroy Attribute database request struct gattm_destroy_db_req { /// New Gap Start Handle uint16_t gap_hdl; /// New Gatt Start Handle uint16_t gatt_hdl; }; /// DEBUG ONLY: Destroy Attribute database Response struct gattm_destroy_db_rsp { /// Return status uint8_t status; }; /// Service information struct gattm_svc_info { /// Service start handle uint16_t start_hdl; /// Service end handle uint16_t end_hdl; /// Service task_id uint16_t task_id; /// Service permission uint8_t perm; }; /// DEBUG ONLY: Retrieve list of services response struct gattm_svc_get_list_rsp { /// Return status uint8_t status; /// Number of services uint8_t nb_svc; /// Array of information about services struct gattm_svc_info svc[__ARRAY_EMPTY]; }; /// DEBUG ONLY: Retrieve information of attribute request struct gattm_att_get_info_req { /// Attribute Handle uint16_t handle; }; /// DEBUG ONLY: Retrieve information of attribute response struct gattm_att_get_info_rsp { /// Return status uint8_t status; /// UUID Length uint8_t uuid_len; /// Attribute Handle uint16_t handle; /// Attribute Permissions uint16_t perm; /// Extended Attribute permission uint16_t ext_perm; /// UUID value uint8_t uuid[ATT_UUID_128_LEN]; }; /* * FUNCTION DECLARATIONS **************************************************************************************** */ /// @} GATTMTASK #endif // GATTM_TASK_H_