1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef SOFTBUS_ADAPTER_BLE_GATT_SERVER_H 17 #define SOFTBUS_ADAPTER_BLE_GATT_SERVER_H 18 19 #include "stdbool.h" 20 #include "stdint.h" 21 #include "common_list.h" 22 #include "softbus_adapter_bt_common.h" 23 #include "softbus_def.h" 24 25 #ifdef __cplusplus 26 #if __cplusplus 27 extern "C" { 28 #endif 29 #endif 30 31 typedef enum { 32 SOFTBUS_GATT_SUCCESS = 0x00, 33 SOFTBUS_GATT_INVALID_HANDLE = 0x01, 34 SOFTBUS_GATT_READ_NOT_PERMITTED = 0x02, 35 SOFTBUS_GATT_WRITE_NOT_PERMITTED = 0x03, 36 SOFTBUS_GATT_INVALID_PDU = 0x04, 37 SOFTBUS_GATT_INSUFFICIENT_AUTHENTICATION = 0x05, 38 SOFTBUS_GATT_REQUEST_NOT_SUPPORTED = 0x06, 39 SOFTBUS_GATT_INVALID_OFFSET = 0x07, 40 SOFTBUS_GATT_INSUFFICIENT_AUTHORIZATION = 0x08, 41 SOFTBUS_GATT_PREPARE_QUEUE_FULL = 0x09, 42 SOFTBUS_GATT_ATTRIBUTE_NOT_FOUND = 0x0A, 43 SOFTBUS_GATT_ATTRIBUTE_NOT_LONG = 0x0B, 44 SOFTBUS_GATT_INSUFFICIENT_ENCRYPTION_KEY_SIZE = 0x0C, 45 SOFTBUS_GATT_INVALID_ATTRIBUTE_VALUE_LENGTH = 0x0D, 46 SOFTBUS_GATT_UNLIKELY_ERROR = 0x0E, 47 SOFTBUS_GATT_INSUFFICIENT_ENCRYPTION = 0x0F, 48 SOFTBUS_GATT_UNSUPPORTED_GROUP_TYPE = 0x10, 49 SOFTBUS_GATT_INSUFFICIENT_RESOURCES = 0x11, 50 SOFTBUS_GATT_DATABASE_OUT_OF_SYNC = 0x12, 51 SOFTBUS_GATT_VALUE_NOT_ALLOWED = 0x13, 52 } SoftBusGattStatus; 53 54 typedef enum { 55 SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_BROADCAST = 0x01, 56 SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_READ = 0x02, 57 SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP = 0x04, 58 SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_WRITE = 0x08, 59 SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_NOTIFY = 0x10, 60 SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_INDICATE = 0x20, 61 SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_SIGNED_WRITE = 0x40, 62 SOFTBUS_GATT_CHARACTER_PROPERTY_BIT_EXTENDED_PROPERTY = 0x80 63 } SoftBusGattCharaProperty; 64 65 typedef enum { 66 SOFTBUS_GATT_PERMISSION_READ = 0x01, 67 SOFTBUS_GATT_PERMISSION_READ_ENCRYPTED = 0x02, 68 SOFTBUS_GATT_PERMISSION_READ_ENCRYPTED_MITM = 0x04, 69 SOFTBUS_GATT_PERMISSION_WRITE = 0x10, 70 SOFTBUS_GATT_PERMISSION_WRITE_ENCRYPTED = 0x20, 71 SOFTBUS_GATT_PERMISSION_WRITE_ENCRYPTED_MITM = 0x40, 72 SOFTBUS_GATT_PERMISSION_WRITE_SIGNED = 0x80, 73 SOFTBUS_GATT_PERMISSION_WRITE_SIGNED_MITM = 0x100 74 } SoftBusGattAttrPermission; 75 76 typedef struct { 77 int connId; 78 int transId; 79 SoftBusBtAddr *btAddr; 80 int attrHandle; 81 int offset; 82 bool isLong; 83 } SoftBusGattReadRequest; 84 85 typedef struct { 86 int connId; 87 int transId; 88 SoftBusBtAddr *btAddr; 89 int attrHandle; 90 int offset; 91 int length; 92 bool needRsp; 93 bool isPrep; 94 unsigned char *value; 95 } SoftBusGattWriteRequest; 96 97 98 typedef struct { 99 void (*ServiceAddCallback)(int status, SoftBusBtUuid *uuid, int srvcHandle); 100 void (*CharacteristicAddCallback)(int status, SoftBusBtUuid *uuid, int srvcHandle, int characteristicHandle); 101 void (*DescriptorAddCallback)(int status, SoftBusBtUuid *uuid, int srvcHandle, int descriptorHandle); 102 void (*ServiceStartCallback)(int status, int srvcHandle); 103 void (*ServiceStopCallback)(int status, int srvcHandle); 104 void (*ServiceDeleteCallback)(int status, int srvcHandle); 105 void (*ConnectServerCallback)(int connId, const SoftBusBtAddr *btAddr); 106 void (*DisconnectServerCallback)(int connId, const SoftBusBtAddr *btAddr); 107 void (*RequestReadCallback)(SoftBusGattReadRequest readCbPara); 108 void (*RequestWriteCallback)(SoftBusGattWriteRequest writeCbPara); 109 void (*ResponseConfirmationCallback)(int status, int handle); 110 void (*NotifySentCallback)(int connId, int status); 111 void (*MtuChangeCallback)(int connId, int mtu); 112 bool (*IsConcernedAttrHandle)(int srvcHandle, int attrHandle); 113 } SoftBusGattsCallback; 114 115 typedef struct { 116 int connectId; 117 int transId; 118 int status; 119 int attrHandle; 120 int offset; 121 int valueLen; 122 char *value; 123 } SoftBusGattsResponse; 124 125 typedef struct { 126 int connectId; 127 int attrHandle; 128 int confirm; 129 int valueLen; 130 char *value; 131 } SoftBusGattsNotify; 132 133 typedef struct { 134 ListNode node; 135 int32_t connId; 136 SoftBusBtAddr btAddr; 137 int32_t mtu; 138 int32_t handle; // the id of start server 139 bool notifyConnected; 140 } ServerConnection; 141 142 typedef struct { 143 SoftBusGattsCallback callback; 144 ListNode node; 145 SoftBusBtUuid serviceUuid; 146 int32_t handle; // the id of start server 147 } ServerService; 148 149 typedef struct { 150 ListNode services; 151 ListNode connections; // as server connected 152 SoftBusMutex lock; 153 } SoftBusGattsManager; 154 155 int SoftBusRegisterGattsCallbacks(SoftBusGattsCallback *callback, SoftBusBtUuid srvcUuid); 156 void SoftBusUnRegisterGattsCallbacks(SoftBusBtUuid srvcUuid); 157 int SoftBusGattsAddService(SoftBusBtUuid srvcUuid, bool isPrimary, int number); 158 int SoftBusGattsAddCharacteristic(int srvcHandle, SoftBusBtUuid characUuid, int properties, int permissions); 159 int SoftBusGattsAddDescriptor(int srvcHandle, SoftBusBtUuid descUuid, int permissions); 160 int SoftBusGattsStartService(int srvcHandle); 161 int SoftBusGattsStopService(int srvcHandle); 162 int SoftBusGattsDeleteService(int srvcHandle); 163 int SoftBusGattsConnect(SoftBusBtAddr btAddr); 164 int SoftBusGattsDisconnect(SoftBusBtAddr btAddr, int connId); 165 int SoftBusGattsSendResponse(SoftBusGattsResponse *param); 166 int SoftBusGattsSendNotify(SoftBusGattsNotify *param); 167 int InitSoftbusAdapterServer(void); 168 169 #ifdef __cplusplus 170 #if __cplusplus 171 } 172 #endif /* __cplusplus */ 173 #endif /* __cplusplus */ 174 #endif