Lines Matching refs:rs

104 static void cleanup_rfc_slot(rfc_slot_t* rs);
106 static inline BOOLEAN send_app_scn(rfc_slot_t* rs);
250 rfc_slot_t* rs = find_free_slot();
251 if(rs)
259 rs->fd = fds[0];
260 rs->app_fd = fds[1];
261 rs->security = security;
262 rs->scn = channel;
264 memcpy(rs->service_uuid, uuid, sizeof(rs->service_uuid));
265 else memset(rs->service_uuid, 0, sizeof(rs->service_uuid));
267 strncpy(rs->service_name, name, sizeof(rs->service_name) -1);
269 rs->addr = *addr;
273 rs->id = rfc_slot_id;
274 rs->f.server = server;
276 return rs;
339 rfc_slot_t* rs = alloc_rfc_slot(NULL, service_name, service_uuid, channel, flags, TRUE);
340 if(rs)
343 BTA_JvCreateRecordByUser((void *)(intptr_t)rs->id);
344 *sock_fd = rs->app_fd;
345 rs->app_fd = -1; //the fd ownership is transferred to app
346 if (btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_EXCEPTION, rs->id)) {
351 cleanup_rfc_slot(rs);
371 rfc_slot_t* rs = alloc_rfc_slot(bd_addr, NULL, service_uuid, channel, flags, FALSE);
372 if(rs)
377 if(BTA_JvRfcommConnect(rs->security, rs->role, rs->scn, rs->addr.address,
378 rfcomm_cback, (void*)(intptr_t)rs->id) == BTA_JV_SUCCESS)
380 if(send_app_scn(rs))
382 btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM,
383 SOCK_THREAD_FD_RD, rs->id);
384 *sock_fd = rs->app_fd;
385 rs->app_fd = -1; //the fd ownership is transferred to app
388 else cleanup_rfc_slot(rs);
390 else cleanup_rfc_slot(rs);
398 *sock_fd = rs->app_fd;
399 rs->app_fd = -1; //the fd ownership is transferred to app
404 BTA_JvStartDiscovery((UINT8*)bd_addr->address, 1, &sdp_uuid, (void*)(intptr_t)rs->id);
405 rs->f.pending_sdp_request = FALSE;
406 rs->f.doing_sdp_request = TRUE;
410 rs->f.pending_sdp_request = TRUE;
411 rs->f.doing_sdp_request = FALSE;
413 btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_RD, rs->id);
420 static int create_server_sdp_record(rfc_slot_t* rs)
422 int scn = rs->scn;
423 if(rs->scn > 0)
425 if(BTM_TryAllocateSCN(rs->scn) == FALSE)
431 else if((rs->scn = BTM_AllocateSCN()) == 0)
436 if((rs->sdp_handle = add_rfc_sdp_rec(rs->service_name, rs->service_uuid, rs->scn)) <= 0)
481 static inline void free_rfc_slot_scn(rfc_slot_t* rs)
483 if(rs->scn > 0)
485 if(rs->f.server && !rs->f.closing && rs->rfc_handle)
487 BTA_JvRfcommStopServer(rs->rfc_handle, (void*)(uintptr_t)rs->id);
488 rs->rfc_handle = 0;
490 if(rs->f.server)
491 BTM_FreeSCN(rs->scn);
492 rs->scn = 0;
495 static void cleanup_rfc_slot(rfc_slot_t* rs)
497 APPL_TRACE_DEBUG("cleanup slot:%d, fd:%d, scn:%d, sdp_handle:0x%x", rs->id, rs->fd, rs->scn, rs->sdp_handle);
498 if(rs->fd != -1)
500 shutdown(rs->fd, 2);
501 close(rs->fd);
502 rs->fd = -1;
504 if(rs->app_fd != -1)
506 close(rs->app_fd);
507 rs->app_fd = -1;
509 if(rs->sdp_handle > 0)
511 del_rfc_sdp_rec(rs->sdp_handle);
512 rs->sdp_handle = 0;
514 if(rs->rfc_handle && !rs->f.closing && !rs->f.server)
516 APPL_TRACE_DEBUG("closing rfcomm connection, rfc_handle:0x%x", rs->rfc_handle);
517 BTA_JvRfcommClose(rs->rfc_handle, (void*)(uintptr_t)rs->id);
518 rs->rfc_handle = 0;
520 free_rfc_slot_scn(rs);
521 list_clear(rs->incoming_queue);
523 rs->rfc_port_handle = 0;
525 memset(&rs->f, 0, sizeof(rs->f));
526 rs->id = 0;
528 static inline BOOLEAN send_app_scn(rfc_slot_t* rs)
530 if(sock_send_all(rs->fd, (const uint8_t*)&rs->scn, sizeof(rs->scn)) == sizeof(rs->scn))
567 rfc_slot_t* rs = find_rfc_slot_by_id(id);
568 if(rs)
571 cleanup_rfc_slot(rs);
574 rs->rfc_handle = p_init->handle;
582 rfc_slot_t* rs = find_rfc_slot_by_id(id);
583 if(rs)
586 cleanup_rfc_slot(rs);
589 rs->rfc_handle = p_start->handle;
591 if(!send_app_scn(rs))
594 APPL_TRACE_DEBUG("send_app_scn() failed, close rs->id:%d", rs->id);
595 cleanup_rfc_slot(rs);
629 rfc_slot_t* rs = find_rfc_slot_by_id(id);
630 if(rs && p_open->status == BTA_JV_SUCCESS)
632 rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(p_open->handle);
633 bd_copy(rs->addr.address, p_open->rem_bda, 0);
636 rs->id, rs->fd, rs->scn, rs->f.server);
637 if(send_app_connect_signal(rs->fd, &rs->addr, rs->scn, 0, -1))
641 rs->id, rs->scn, rs->f.server);
642 rs->f.connected = TRUE;
646 else if(rs)
647 cleanup_rfc_slot(rs);
654 rfc_slot_t* rs = find_rfc_slot_by_id(id);
655 if(rs)
658 rs->id, rs->fd, rs->scn, rs->f.server);
659 free_rfc_slot_scn(rs);
661 rs->f.connected = FALSE;
662 cleanup_rfc_slot(rs);
671 rfc_slot_t* rs = find_rfc_slot_by_id(id);
672 if(rs && !rs->f.outgoing_congest)
675 btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_RD, rs->id);
682 rfc_slot_t* rs = find_rfc_slot_by_id(id);
683 if(rs)
685 rs->f.outgoing_congest = p->cong ? 1 : 0;
687 if(!rs->f.outgoing_congest)
688 btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_RD, rs->id);
755 rfc_slot_t* rs = find_rfc_slot_by_id(id);
756 if(rs && create_server_sdp_record(rs))
759 BTA_JvRfcommStartServer(rs->security, rs->role, rs->scn, MAX_RFC_SESSION, rfcomm_cback,
760 (void*)(uintptr_t)rs->id);
762 else if(rs)
764 APPL_TRACE_ERROR("jv_dm_cback: cannot start server, slot found:%p", rs);
765 cleanup_rfc_slot(rs);
772 rfc_slot_t* rs = NULL;
779 rs = find_rfc_slot_by_id(id);
780 if(rs && rs->f.doing_sdp_request)
782 if(BTA_JvRfcommConnect(rs->security, rs->role, p_data->disc_comp.scn, rs->addr.address,
783 rfcomm_cback, (void*)(uintptr_t)rs->id) == BTA_JV_SUCCESS)
785 rs->scn = p_data->disc_comp.scn;
786 rs->f.doing_sdp_request = FALSE;
787 if(!send_app_scn(rs))
788 cleanup_rfc_slot(rs);
790 else cleanup_rfc_slot(rs);
792 else if(rs)
796 id, rs->f.pending_sdp_request, rs->f.doing_sdp_request);
804 rs = find_rfc_slot_by_id(id);
805 if(rs)
806 cleanup_rfc_slot(rs);
808 rs = find_rfc_slot_by_pending_sdp();
809 if(rs)
814 memcpy(sdp_uuid.uu.uuid128, rs->service_uuid, sizeof(sdp_uuid.uu.uuid128));
815 BTA_JvStartDiscovery((UINT8*)rs->addr.address, 1, &sdp_uuid, (void*)(uintptr_t)rs->id);
816 rs->f.pending_sdp_request = FALSE;
817 rs->f.doing_sdp_request = TRUE;
858 static BOOLEAN flush_incoming_que_on_wr_signal(rfc_slot_t* rs)
860 while(!list_is_empty(rs->incoming_queue))
862 BT_HDR *p_buf = list_front(rs->incoming_queue);
863 int sent = send_data_to_app(rs->fd, p_buf);
869 btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_WR, rs->id);
872 list_remove(rs->incoming_queue, p_buf);
875 list_remove(rs->incoming_queue, p_buf);
883 rs->rfc_handle, rs->rfc_port_handle, rs->id);
885 PORT_FlowControl_MaxCredit(rs->rfc_port_handle, TRUE);
891 rfc_slot_t* rs = find_rfc_slot_by_id(user_id);
892 if(rs)
894 APPL_TRACE_DEBUG("rfc slot id:%d, fd:%d, flags:%x", rs->id, fd, flags);
899 if(!rs->f.server)
901 if(rs->f.connected)
906 (ioctl(rs->fd, FIONREAD, &size) == 0 && size))
908 int rfc_handle = rs->rfc_handle;
909 UINT32 rs_id = rs->id;
919 slot id:%d, channel:%d", rs->id, rs->scn);
927 if(!rs->f.connected || !flush_incoming_que_on_wr_signal(rs))
931 or app closed fd, slot id:%d, channel:%d", rs->id, rs->scn);
938 if(need_close || ioctl(rs->fd, FIONREAD, &size) != 0 || size == 0 )
943 cleanup_rfc_slot(rs);
958 rfc_slot_t* rs = find_rfc_slot_by_id(id);
959 if(rs)
961 if(!list_is_empty(rs->incoming_queue))
962 list_append(rs->incoming_queue, p_buf);
965 int sent = send_data_to_app(rs->fd, p_buf);
971 list_append(rs->incoming_queue, p_buf);
973 btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_WR, rs->id);
981 cleanup_rfc_slot(rs);
995 rfc_slot_t* rs = find_rfc_slot_by_id(id);
996 if(rs)
998 if(ioctl(rs->fd, FIONREAD, size) == 0)
1000 APPL_TRACE_DEBUG("ioctl read avaiable size:%d, fd:%d", *size, rs->fd);
1005 APPL_TRACE_ERROR("ioctl FIONREAD error, errno:%d, fd:%d", errno, rs->fd);
1006 cleanup_rfc_slot(rs);
1018 rfc_slot_t* rs = find_rfc_slot_by_id(id);
1019 if(rs)
1021 int received = recv(rs->fd, buf, size, 0);
1027 errno, rs->fd, size, received);
1028 cleanup_rfc_slot(rs);