1 /* 2 * Copyright (C) 2021-2022 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 SOCKET_H 17 #define SOCKET_H 18 19 #include <map> 20 #include <mutex> 21 #include <string> 22 #include <vector> 23 #include "base_def.h" 24 #include "transport/transport.h" 25 #include "transport/transport_factory.h" 26 #include "transport/transport_rfcomm.h" 27 28 #include "socket_def.h" 29 #include "socket_gap_client.h" 30 #include "socket_gap_server.h" 31 #include "socket_sdp_client.h" 32 #include "socket_sdp_server.h" 33 34 namespace OHOS { 35 namespace bluetooth { 36 // result of sending data to app 37 typedef enum { 38 SOCKET_SEND_NONE = 0, 39 SOCKET_SEND_ERROR, 40 SOCKET_SEND_PARTIAL, 41 SOCKET_SEND_ALL, 42 } SocketSendRet; 43 44 /** 45 * @brief This Socket class provides a set of methods that client initiates the connection and 46 * server listen and accept the connection. 47 */ 48 class Socket { 49 public: 50 /** 51 * @brief Constructor. 52 */ 53 Socket(); 54 55 /** 56 * @brief Destructor. 57 */ 58 virtual ~Socket(); 59 60 /** 61 * @brief The client initiates the connection. 62 * @details The client queries the SDP and finds the channel to be connected through UUID. 63 * Client sets security level to GAP. 64 * @param addr address. 65 * @param uuid server record uuid to search scn. 66 * @param securityFlag require the connection to be encrypted and authenticated. 67 * @param sockfd the upper socket fd that generated by the socketpair. 68 * @return int 69 */ 70 int Connect(const std::string &addr, const Uuid &uuid, int securityFlag, int &sockfd); 71 72 /** 73 * @brief The server listen and accept the connection. 74 * @details The server registers service records to SDP with service name, uuid and server channel 75 * number that assigned by rfcomm. Server sets security level to GAP. 76 * @param name server service name. 77 * @param uuid server uuid. 78 * @param securityFlag require the connection to be encrypted and authenticated. 79 * @param sockfd the upper socket fd that generated by the socketpair. 80 * @return int 81 */ 82 int Listen(const std::string &name, const Uuid &uuid, int securityFlag, int &sockfd); 83 84 /** 85 * @brief SDP query completed. 86 * 87 * @param context socket object. 88 * @return int 89 */ 90 int ReceiveSdpResult(uint8_t scn); 91 92 /** 93 * @brief close socket. 94 * 95 */ 96 void CloseSocket(bool isDisable); 97 98 /** 99 * @brief erase socket 100 * 101 * @param socket 102 */ 103 void RemoveServerSocket(); 104 105 /** 106 * @brief close socket fd 107 * 108 * @param socket 109 */ 110 void CloseSocketFd(); 111 112 /** 113 * @brief clear up socket 114 * 115 * @param socket 116 */ 117 static void ClearUpAllSocket(); 118 119 /** 120 * @brief Poll thread notify the socket that it has data. 121 * 122 * @param context socket object. 123 */ 124 static void OnSocketReadReady(Socket &sock); 125 126 /** 127 * @brief Poll thread notify the socket that it can receive data. 128 * 129 * @param context socket object. 130 */ 131 static void OnSocketWriteReady(Socket &sock); 132 133 /** 134 * @brief Poll thread notify the socket that it exception occurred. 135 * 136 * @param context socket object. 137 */ 138 static void OnSocketException(Socket &sock); 139 140 private: 141 // remote device address. 142 BtAddr remoteAddr_ {{0}, 0}; 143 // server channel number. 144 uint8_t scn_ {0}; 145 // send mtu. 146 uint16_t sendMTU_ {0}; 147 // recv mtu 148 uint16_t recvMTU_ {0}; 149 // is server or not. 150 bool isServer_ {false}; 151 // connect state. 152 SocketState state_ {}; 153 // the transport socket fd that generated by the socketpair. 154 int upperlayerFd_ {-1}; 155 // the transport socket fd that generated by the socketpair. 156 int transportFd_ {-1}; 157 // require the connection to be encrypted and authenticated. 158 int securityFlag_ {0}; 159 // number of connected clients. 160 int clientNumber_ {0}; 161 // The maximum number of connected devices. 162 int maxConnectedNum_ {SOCK_MAX_CLIENT}; 163 // service id. 164 GAP_Service serviceId_ {SPP_ID_START}; 165 // can read data from Rfcomm. 166 bool isCanRead_ {true}; 167 // can read data from Rfcomm. 168 bool isCanWrite_ {true}; 169 // is or not new socket 170 bool isNewSocket_ {false}; 171 // length of data that send to app failed. 172 size_t recvBufLen_ {0}; 173 // length of data that send to stack failed. 174 size_t sendBufLen_ {0}; 175 // save data that sent to app failed. 176 uint8_t recvDataBuf_[SOCK_DEF_RFC_MTU] = {0}; 177 // save data that sent to stack failed. 178 uint8_t sendDataBuf_[SOCK_DEF_RFC_MTU] = {0}; 179 std::mutex mutex_ {}; 180 std::mutex fdMutex_ {}; 181 std::recursive_mutex writeMutex_ {}; 182 static std::recursive_mutex g_socketMutex; 183 // new transport that server accept 184 DataTransport *newSockTransport_ {nullptr}; 185 // the pointer of the SockTransport. 186 std::unique_ptr<DataTransport> sockTransport_ {nullptr}; 187 // the pointer of the transportFactory_. 188 std::unique_ptr<TransportFactory> transportFactory_ {nullptr}; 189 // the pointer of the SocketSdpClient. 190 std::unique_ptr<SocketSdpClient> sdpClient_ {nullptr}; 191 // the pointer of the SocketSdpServer. 192 std::unique_ptr<SocketSdpServer> sdpServer_ {nullptr}; 193 // the pointer of the SocketGapClient. 194 std::unique_ptr<SocketGapClient> socketGapClient_ {nullptr}; 195 // the pointer of the SocketGapServer. 196 std::unique_ptr<SocketGapServer> socketGapServer_ {nullptr}; 197 // the map manages the correspondence between new socket and transport. 198 std::map<DataTransport *, std::unique_ptr<Socket>> socketMap_ {}; 199 // the map manages all sockets; 200 static std::vector<Socket *> g_allServerSockets; 201 202 /** 203 * @brief is server or not. 204 * 205 * @return true: the role is server. 206 * @return false :the role is client. 207 */ IsServer()208 bool IsServer() const 209 { 210 return isServer_; 211 } 212 213 /** 214 * @brief address translation. 215 * 216 * @param addr remote device address. 217 */ 218 void SetRemoteAddr(std::string addr); 219 220 /** 221 * @brief Send connection scn to app. 222 * 223 * @param fd socket fd. 224 * @param scn socket scn. 225 * @return true 226 * @return false 227 */ 228 static bool SendAppConnectScn(int fd, int scn); 229 230 /** 231 * @brief Send connection information to app. 232 * 233 * @param fd socket fd. 234 * @param addr remote device address. 235 * @param status connect state. 236 * @param send_fd accept socket fd. 237 * @return true 238 * @return false 239 */ 240 static bool SendAppConnectInfo(int fd, int acceptFd, const SocketConnectInfo &connectInfo); 241 242 /** 243 * @brief When server accept a connection request, generate a new socket. 244 * 245 * @param addr remote device address. 246 * @param transport transport object. 247 */ 248 int AddSocketInternal(BtAddr addr, DataTransport *transport, uint16_t sendMTU, uint16_t recvMTU); 249 250 /** 251 * @brief PPoll thread notify the socket that it can receive data. 252 * 253 * @param context socket object. 254 */ 255 void OnSocketWriteReadyNative(Socket &sock); 256 257 /** 258 * @brief Poll thread notify the socket that it exception occurred. 259 * 260 * @param context socket object. 261 */ 262 void OnSocketExceptionNative(Socket &sock); 263 264 /** 265 * @brief Assign serviceId to service 266 * 267 * @return int 268 */ 269 static GAP_Service AssignServiceId(); 270 271 /** 272 * @brief free serviceId 273 * 274 * @param serviceId 275 */ 276 static void FreeServiceId(GAP_Service serviceId); 277 278 /** 279 * @brief Send data to app. 280 * 281 * @param fd socket fd. 282 * @param buf data to send. 283 * @param len the size of the data to send. 284 * @return SocketSendRet 285 */ 286 static SocketSendRet SendDataToApp(int fd, const uint8_t *buf, size_t len); 287 288 /** 289 * @brief Read data from Rfcomm. 290 * 291 */ 292 void ReadData(); 293 294 /** 295 * @brief Write data from Rfcomm. 296 * 297 */ 298 void WriteData(); 299 300 /** 301 * @brief Write data to transport. 302 * 303 */ 304 int TransportWrite(Packet *subPkt); 305 306 /** 307 * @brief Notify Service Delete Socket 308 * 309 * @param socket 310 */ 311 static void NotifyServiceDeleteSocket(Socket &sock); 312 313 /** 314 * @brief erase socket 315 * 316 * @param socket 317 */ 318 static void EraseSocket(Socket &socket); 319 320 /** 321 * @brief write data to app 322 * 323 * @param socket 324 */ 325 void WriteDataToAPP(const uint8_t *buffer, size_t len); 326 327 /** 328 * @brief process disconnect 329 * 330 * @param socket 331 */ 332 void ProcessDisconnection(Socket &socket, DataTransport *transport); 333 334 /** 335 * @brief Get service dispatcher. 336 * 337 * @return service dispatcher. 338 */ 339 utility::Dispatcher *GetDispatchter(); 340 341 BT_DISALLOW_COPY_AND_ASSIGN(Socket); 342 DECLARE_IMPL(); 343 }; 344 } // namespace bluetooth 345 } // namespace OHOS 346 #endif // SOCKET_H