• Home
  • Raw
  • Download

Lines Matching refs:client

55 static void fragment_packet(l2cap_client_t *client, buffer_t *packet);
56 static void dispatch_fragments(l2cap_client_t *client);
121 void l2cap_client_free(l2cap_client_t *client) { in l2cap_client_free() argument
122 if (!client) in l2cap_client_free()
125 list_remove(l2cap_clients, client); in l2cap_client_free()
126 l2cap_client_disconnect(client); in l2cap_client_free()
127 list_free(client->outbound_fragments); in l2cap_client_free()
128 osi_free(client); in l2cap_client_free()
131 bool l2cap_client_connect(l2cap_client_t *client, const bt_bdaddr_t *remote_bdaddr, uint16_t psm) { in l2cap_client_connect() argument
132 assert(client != NULL); in l2cap_client_connect()
136 assert(client->local_channel_id == 0); in l2cap_client_connect()
137 assert(!client->configured_self); in l2cap_client_connect()
138 assert(!client->configured_peer); in l2cap_client_connect()
141 client->local_channel_id = L2CA_ConnectReq(psm, (uint8_t *)remote_bdaddr); in l2cap_client_connect()
142 if (!client->local_channel_id) { in l2cap_client_connect()
147 L2CA_SetConnectionCallbacks(client->local_channel_id, &l2cap_callbacks); in l2cap_client_connect()
151 void l2cap_client_disconnect(l2cap_client_t *client) { in l2cap_client_disconnect() argument
152 assert(client != NULL); in l2cap_client_disconnect()
154 if (client->local_channel_id && !L2CA_DisconnectReq(client->local_channel_id)) in l2cap_client_disconnect()
155 …LOG_ERROR(LOG_TAG, "%s unable to send disconnect message for LCID 0x%04x.", __func__, client->loca… in l2cap_client_disconnect()
157 client->local_channel_id = 0; in l2cap_client_disconnect()
158 client->remote_mtu = L2CAP_MTU_DEFAULT; in l2cap_client_disconnect()
159 client->configured_self = false; in l2cap_client_disconnect()
160 client->configured_peer = false; in l2cap_client_disconnect()
161 client->is_congested = false; in l2cap_client_disconnect()
163 …for (const list_node_t *node = list_begin(client->outbound_fragments); node != list_end(client->ou… in l2cap_client_disconnect()
166 list_clear(client->outbound_fragments); in l2cap_client_disconnect()
169 bool l2cap_client_is_connected(const l2cap_client_t *client) { in l2cap_client_is_connected() argument
170 assert(client != NULL); in l2cap_client_is_connected()
172 return client->local_channel_id != 0 && client->configured_self && client->configured_peer; in l2cap_client_is_connected()
175 bool l2cap_client_write(l2cap_client_t *client, buffer_t *packet) { in l2cap_client_write() argument
176 assert(client != NULL); in l2cap_client_write()
178 assert(l2cap_client_is_connected(client)); in l2cap_client_write()
180 if (client->is_congested) in l2cap_client_write()
183 fragment_packet(client, packet); in l2cap_client_write()
184 dispatch_fragments(client); in l2cap_client_write()
191 l2cap_client_t *client = find(local_channel_id); in connect_completed_cb() local
192 if (!client) { in connect_completed_cb()
199 client->callbacks.disconnected(client, client->context); in connect_completed_cb()
208 client->callbacks.disconnected(client, client->context); in connect_completed_cb()
214 l2cap_client_t *client = find(local_channel_id); in config_request_cb() local
216 if (!client) { in config_request_cb()
232 client->remote_mtu = requested_parameters->mtu; in config_request_cb()
247 l2cap_client_disconnect(client); in config_request_cb()
252 client->configured_peer = true; in config_request_cb()
253 if (l2cap_client_is_connected(client)) in config_request_cb()
254 client->callbacks.connected(client, client->context); in config_request_cb()
258 l2cap_client_t *client = find(local_channel_id); in config_completed_cb() local
260 if (!client) { in config_completed_cb()
273 l2cap_client_disconnect(client); in config_completed_cb()
278 client->configured_self = true; in config_completed_cb()
279 if (l2cap_client_is_connected(client)) in config_completed_cb()
280 client->callbacks.connected(client, client->context); in config_completed_cb()
286 l2cap_client_disconnect(client); in config_completed_cb()
292 l2cap_client_t *client = find(local_channel_id); in disconnect_request_cb() local
293 if (!client) { in disconnect_request_cb()
302 client->local_channel_id = 0; in disconnect_request_cb()
303 l2cap_client_disconnect(client); in disconnect_request_cb()
305 client->callbacks.disconnected(client, client->context); in disconnect_request_cb()
311 l2cap_client_t *client = find(local_channel_id); in disconnect_completed_cb() local
312 if (!client) { in disconnect_completed_cb()
317 client->local_channel_id = 0; in disconnect_completed_cb()
318 l2cap_client_disconnect(client); in disconnect_completed_cb()
320 client->callbacks.disconnected(client, client->context); in disconnect_completed_cb()
326 l2cap_client_t *client = find(local_channel_id); in congestion_cb() local
327 if (!client) { in congestion_cb()
332 client->is_congested = is_congested; in congestion_cb()
338 dispatch_fragments(client); in congestion_cb()
339 if (!client->is_congested) in congestion_cb()
340 client->callbacks.write_ready(client, client->context); in congestion_cb()
347 l2cap_client_t *client = find(local_channel_id); in read_ready_cb() local
348 if (!client) { in read_ready_cb()
358 client->callbacks.read_ready(client, buffer, client->context); in read_ready_cb()
368 static void fragment_packet(l2cap_client_t *client, buffer_t *packet) { in fragment_packet() argument
369 assert(client != NULL); in fragment_packet()
379 if (bt_packet->len <= client->remote_mtu) { in fragment_packet()
381 list_append(client->outbound_fragments, bt_packet); in fragment_packet()
387 BT_HDR *fragment = osi_malloc(client->remote_mtu + L2CAP_MIN_OFFSET); in fragment_packet()
389 fragment->len = client->remote_mtu; in fragment_packet()
390 …memcpy(fragment->data + fragment->offset, bt_packet->data + bt_packet->offset, client->remote_mtu); in fragment_packet()
392 list_append(client->outbound_fragments, fragment); in fragment_packet()
394 bt_packet->offset += client->remote_mtu; in fragment_packet()
395 bt_packet->len -= client->remote_mtu; in fragment_packet()
399 static void dispatch_fragments(l2cap_client_t *client) { in dispatch_fragments() argument
400 assert(client != NULL); in dispatch_fragments()
401 assert(!client->is_congested); in dispatch_fragments()
403 while (!list_is_empty(client->outbound_fragments)) { in dispatch_fragments()
404 BT_HDR *packet = (BT_HDR *)list_front(client->outbound_fragments); in dispatch_fragments()
405 list_remove(client->outbound_fragments, packet); in dispatch_fragments()
407 switch (L2CA_DataWrite(client->local_channel_id, packet)) { in dispatch_fragments()
409 client->is_congested = true; in dispatch_fragments()
413 …writing data to L2CAP connection LCID 0x%04x; disconnecting.", __func__, client->local_channel_id); in dispatch_fragments()
414 l2cap_client_disconnect(client); in dispatch_fragments()
427 l2cap_client_t *client = (l2cap_client_t *)list_node(node); in find() local
428 if (client->local_channel_id == local_channel_id) in find()
429 return client; in find()