Home | History | Annotate | Download | only in src
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2009-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /************************************************************************************
     20  *
     21  *  Filename:      btif_sock_rfc.c
     22  *
     23  *  Description:   Handsfree Profile Bluetooth Interface
     24  *
     25  ***********************************************************************************/
     26 #include <hardware/bluetooth.h>
     27 #include <hardware/bt_sock.h>
     28 #include <sys/types.h>
     29 #include <sys/socket.h>
     30 #include <errno.h>
     31 #include <sys/ioctl.h>
     32 
     33 #define LOG_TAG "BTIF_SOCK"
     34 #include "btif_common.h"
     35 #include "btif_util.h"
     36 
     37 #include "bd.h"
     38 
     39 #include "bta_api.h"
     40 #include "btif_sock_thread.h"
     41 #include "btif_sock_sdp.h"
     42 #include "btif_sock_util.h"
     43 
     44 #include "bt_target.h"
     45 #include "gki.h"
     46 #include "hcimsgs.h"
     47 #include "sdp_api.h"
     48 #include "btu.h"
     49 #include "btm_api.h"
     50 #include "btm_int.h"
     51 #include "bta_jv_api.h"
     52 #include "bta_jv_co.h"
     53 #include "port_api.h"
     54 
     55 #include <cutils/log.h>
     56 #include <hardware/bluetooth.h>
     57 #define asrt(s) if(!(s)) APPL_TRACE_ERROR3("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
     58 
     59 extern void uuid_to_string(bt_uuid_t *p_uuid, char *str);
     60 static inline void logu(const char* title, const uint8_t * p_uuid)
     61 {
     62     char uuids[128];
     63     uuid_to_string((bt_uuid_t*)p_uuid, uuids);
     64     ALOGD("%s: %s", title, uuids);
     65 }
     66 
     67 
     68 
     69 #define MAX_RFC_CHANNEL 30
     70 #define MAX_RFC_SESSION BTA_JV_MAX_RFC_SR_SESSION //3 by default
     71 typedef struct {
     72     int outgoing_congest : 1;
     73     int pending_sdp_request : 1;
     74     int doing_sdp_request : 1;
     75     int server : 1;
     76     int connected : 1;
     77     int closing : 1;
     78 } flags_t;
     79 
     80 typedef struct {
     81   flags_t f;
     82   uint32_t id;
     83   int security;
     84   int scn;
     85   bt_bdaddr_t addr;
     86   uint8_t service_uuid[16];
     87   char service_name[256];
     88   int fd, app_fd;
     89   int mtu;
     90   uint8_t* packet;
     91   int sdp_handle;
     92   int rfc_handle;
     93   int rfc_port_handle;
     94   int role;
     95   BUFFER_Q incoming_que;
     96 } rfc_slot_t;
     97 
     98 static rfc_slot_t rfc_slots[MAX_RFC_CHANNEL];
     99 static uint32_t rfc_slot_id;
    100 static volatile int pth = -1; //poll thread handle
    101 static void jv_dm_cback(tBTA_JV_EVT event, tBTA_JV *p_data, void *user_data);
    102 static void cleanup_rfc_slot(rfc_slot_t* rs);
    103 static inline void close_rfc_connection(int rfc_handle, int server);
    104 static bt_status_t dm_get_remote_service_record(bt_bdaddr_t *remote_addr,
    105                                                     bt_uuid_t *uuid);
    106 static void *rfcomm_cback(tBTA_JV_EVT event, tBTA_JV *p_data, void *user_data);
    107 static inline BOOLEAN send_app_scn(rfc_slot_t* rs);
    108 static pthread_mutex_t slot_lock;
    109 #define is_init_done() (pth != -1)
    110 static inline void clear_slot_flag(flags_t* f)
    111 {
    112     memset(f, 0, sizeof(*f));
    113 }
    114 
    115 static inline void bd_copy(UINT8* dest, UINT8* src, BOOLEAN swap)
    116 {
    117     if (swap)
    118     {
    119         int i;
    120         for (i =0; i < 6 ;i++)
    121             dest[i]= src[5-i];
    122     }
    123     else memcpy(dest, src, 6);
    124 }
    125 static inline void free_gki_que(BUFFER_Q* q)
    126 {
    127     while(!GKI_queue_is_empty(q))
    128            GKI_freebuf(GKI_dequeue(q));
    129 }
    130 static void init_rfc_slots()
    131 {
    132     int i;
    133     memset(rfc_slots, 0, sizeof(rfc_slot_t)*MAX_RFC_CHANNEL);
    134     for(i = 0; i < MAX_RFC_CHANNEL; i++)
    135     {
    136         rfc_slots[i].scn = -1;
    137         rfc_slots[i].sdp_handle = 0;
    138         rfc_slots[i].fd = rfc_slots[i].app_fd = -1;
    139         GKI_init_q(&rfc_slots[i].incoming_que);
    140     }
    141     BTA_JvEnable(jv_dm_cback);
    142     init_slot_lock(&slot_lock);
    143 }
    144 bt_status_t btsock_rfc_init(int poll_thread_handle)
    145 {
    146     pth = poll_thread_handle;
    147     init_rfc_slots();
    148     return BT_STATUS_SUCCESS;
    149 }
    150 void btsock_rfc_cleanup()
    151 {
    152     int curr_pth = pth;
    153     pth = -1;
    154     btsock_thread_exit(curr_pth);
    155     lock_slot(&slot_lock);
    156     int i;
    157     for(i = 0; i < MAX_RFC_CHANNEL; i++)
    158     {
    159         if(rfc_slots[i].id)
    160             cleanup_rfc_slot(&rfc_slots[i]);
    161     }
    162     unlock_slot(&slot_lock);
    163 }
    164 static inline rfc_slot_t* find_free_slot()
    165 {
    166     int i;
    167     for(i = 0; i < MAX_RFC_CHANNEL; i++)
    168     {
    169         if(rfc_slots[i].fd == -1)
    170         {
    171              return &rfc_slots[i];
    172         }
    173     }
    174     return NULL;
    175 }
    176 static inline rfc_slot_t* find_rfc_slot_by_id(uint32_t id)
    177 {
    178     int i;
    179     if(id)
    180     {
    181         for(i = 0; i < MAX_RFC_CHANNEL; i++)
    182         {
    183             if(rfc_slots[i].id == id)
    184             {
    185                 return &rfc_slots[i];
    186             }
    187         }
    188     }
    189     APPL_TRACE_WARNING1("invalid rfc slot id: %d", id);
    190     return NULL;
    191 }
    192 static inline rfc_slot_t* find_rfc_slot_by_pending_sdp()
    193 {
    194     uint32_t min_id = (uint32_t)-1;
    195     int slot = -1;
    196     int i;
    197     for(i = 0; i < MAX_RFC_CHANNEL; i++)
    198     {
    199         if(rfc_slots[i].id && rfc_slots[i].f.pending_sdp_request)
    200         {
    201             if(rfc_slots[i].id < min_id)
    202             {
    203                 min_id = rfc_slots[i].id;
    204                 slot = i;
    205             }
    206         }
    207     }
    208     if(0<= slot && slot < MAX_RFC_CHANNEL)
    209         return &rfc_slots[slot];
    210     return NULL;
    211 }
    212 static inline rfc_slot_t* find_rfc_slot_requesting_sdp()
    213 {
    214     int i;
    215     for(i = 0; i < MAX_RFC_CHANNEL; i++)
    216     {
    217         if(rfc_slots[i].id && rfc_slots[i].f.doing_sdp_request)
    218                 return &rfc_slots[i];
    219     }
    220     APPL_TRACE_DEBUG0("can not find any slot is requesting sdp");
    221     return NULL;
    222 }
    223 
    224 static inline rfc_slot_t* find_rfc_slot_by_fd(int fd)
    225 {
    226     int i;
    227     if(fd >= 0)
    228     {
    229         for(i = 0; i < MAX_RFC_CHANNEL; i++)
    230         {
    231             if(rfc_slots[i].fd == fd)
    232             {
    233                 if(rfc_slots[i].id)
    234                     return &rfc_slots[i];
    235                 else
    236                 {
    237                     APPL_TRACE_ERROR0("invalid rfc slot id, cannot be 0");
    238                     break;
    239                 }
    240             }
    241         }
    242     }
    243     return NULL;
    244 }
    245 static rfc_slot_t* alloc_rfc_slot(const bt_bdaddr_t *addr, const char* name, const uint8_t* uuid, int channel, int flags, BOOLEAN server)
    246 {
    247     int security = 0;
    248     if(flags & BTSOCK_FLAG_ENCRYPT)
    249         security |= server ? BTM_SEC_IN_ENCRYPT : BTM_SEC_OUT_ENCRYPT;
    250     if(flags & BTSOCK_FLAG_AUTH)
    251         security |= server ? BTM_SEC_IN_AUTHENTICATE : BTM_SEC_OUT_AUTHENTICATE;
    252 
    253     rfc_slot_t* rs = find_free_slot();
    254     if(rs)
    255     {
    256         int fds[2] = {-1, -1};
    257         if(socketpair(AF_LOCAL, SOCK_STREAM, 0, fds))
    258         {
    259             APPL_TRACE_ERROR1("socketpair failed, errno:%d", errno);
    260             return NULL;
    261         }
    262         rs->fd = fds[0];
    263         rs->app_fd = fds[1];
    264         rs->security = security;
    265         rs->scn = channel;
    266         if(uuid)
    267             memcpy(rs->service_uuid, uuid, sizeof(rs->service_uuid));
    268         else memset(rs->service_uuid, 0, sizeof(rs->service_uuid));
    269         if(name && *name)
    270             strncpy(rs->service_name, name, sizeof(rs->service_name) -1);
    271         if(addr)
    272             rs->addr = *addr;
    273         ++rfc_slot_id;
    274         if(rfc_slot_id == 0)
    275             rfc_slot_id = 1; //skip 0 when wrapped
    276         rs->id = rfc_slot_id;
    277         rs->f.server = server;
    278     }
    279     return rs;
    280 }
    281 // rfc_slot_t* accept_rs = create_srv_accept_rfc_slot(srv_rs, p_open->rem_bda,p_opne->handle,  p_open->new_listen_handle);
    282 static inline rfc_slot_t* create_srv_accept_rfc_slot(rfc_slot_t* srv_rs, const bt_bdaddr_t* addr,
    283                                         int open_handle, int new_listen_handle)
    284 {
    285     rfc_slot_t *accept_rs = alloc_rfc_slot(addr, srv_rs->service_name, srv_rs->service_uuid, srv_rs->scn, 0, FALSE);
    286     clear_slot_flag(&accept_rs->f);
    287     accept_rs->f.server = FALSE;
    288     accept_rs->f.connected = TRUE;
    289     accept_rs->security = srv_rs->security;
    290     accept_rs->mtu = srv_rs->mtu;
    291     accept_rs->role = srv_rs->role;
    292     accept_rs->rfc_handle = open_handle;
    293     accept_rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(open_handle);
    294     asrt(accept_rs->rfc_handle == srv_rs->rfc_handle);
    295     asrt(accept_rs->rfc_port_handle == srv_rs->rfc_port_handle);
    296     //now update listen handle of server slot
    297     srv_rs->rfc_handle = new_listen_handle;
    298     srv_rs->rfc_port_handle =  BTA_JvRfcommGetPortHdl(new_listen_handle);
    299     //now swap the slot id
    300     uint32_t new_listen_id = accept_rs->id;
    301     accept_rs->id = srv_rs->id;
    302     srv_rs->id = new_listen_id;
    303     return accept_rs;
    304 }
    305 bt_status_t btsock_rfc_listen(const char* service_name, const uint8_t* service_uuid, int channel,
    306                             int* sock_fd, int flags)
    307 {
    308     if(sock_fd == NULL || (service_uuid == NULL && (channel < 1 || channel > 30)))
    309     {
    310         APPL_TRACE_ERROR3("invalid rfc channel:%d or sock_fd:%p, uuid:%p", channel, sock_fd, service_uuid);
    311         return BT_STATUS_PARM_INVALID;
    312     }
    313     *sock_fd = -1;
    314     if(!is_init_done())
    315         return BT_STATUS_NOT_READY;
    316     if(is_uuid_empty(service_uuid))
    317         service_uuid = UUID_SPP; //use serial port profile to listen to specified channel
    318     else
    319     {
    320         //Check the service_uuid. overwrite the channel # if reserved
    321         int reserved_channel = get_reserved_rfc_channel(service_uuid);
    322         if(reserved_channel > 0)
    323         {
    324             channel = reserved_channel;
    325         }
    326     }
    327     int status = BT_STATUS_FAIL;
    328     lock_slot(&slot_lock);
    329     rfc_slot_t* rs = alloc_rfc_slot(NULL, service_name, service_uuid, channel, flags, TRUE);
    330     if(rs)
    331     {
    332         BTA_JvCreateRecordByUser((void *)rs->id);
    333         *sock_fd = rs->app_fd;
    334         rs->app_fd = -1; //the fd ownership is transferred to app
    335         status = BT_STATUS_SUCCESS;
    336         btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_EXCEPTION, rs->id);
    337     }
    338     unlock_slot(&slot_lock);
    339     return status;
    340 }
    341 bt_status_t btsock_rfc_connect(const bt_bdaddr_t *bd_addr, const uint8_t* service_uuid,
    342         int channel, int* sock_fd, int flags)
    343 {
    344     if(sock_fd == NULL || (service_uuid == NULL && (channel < 1 || channel > 30)))
    345     {
    346         APPL_TRACE_ERROR3("invalid rfc channel:%d or sock_fd:%p, uuid:%p", channel, sock_fd,
    347                           service_uuid);
    348         return BT_STATUS_PARM_INVALID;
    349     }
    350     *sock_fd = -1;
    351     if(!is_init_done())
    352         return BT_STATUS_NOT_READY;
    353     int status = BT_STATUS_FAIL;
    354     lock_slot(&slot_lock);
    355     rfc_slot_t* rs = alloc_rfc_slot(bd_addr, NULL, service_uuid, channel, flags, FALSE);
    356     if(rs)
    357     {
    358         if(is_uuid_empty(service_uuid))
    359         {
    360             APPL_TRACE_DEBUG1("connecting to rfcomm channel:%d without service discovery", channel);
    361             if(BTA_JvRfcommConnect(rs->security, rs->role, rs->scn, rs->addr.address,
    362                         rfcomm_cback, (void*)rs->id) == BTA_JV_SUCCESS)
    363             {
    364                 if(send_app_scn(rs))
    365                 {
    366                     btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM,
    367                                                         SOCK_THREAD_FD_RD, rs->id);
    368                     *sock_fd = rs->app_fd;
    369                     rs->app_fd = -1; //the fd ownership is transferred to app
    370                     status = BT_STATUS_SUCCESS;
    371                 }
    372                 else cleanup_rfc_slot(rs);
    373             }
    374             else cleanup_rfc_slot(rs);
    375         }
    376         else
    377         {
    378             tSDP_UUID sdp_uuid;
    379             sdp_uuid.len = 16;
    380             memcpy(sdp_uuid.uu.uuid128, service_uuid, sizeof(sdp_uuid.uu.uuid128));
    381             logu("service_uuid", service_uuid);
    382             *sock_fd = rs->app_fd;
    383             rs->app_fd = -1; //the fd ownership is transferred to app
    384             status = BT_STATUS_SUCCESS;
    385             rfc_slot_t* rs_doing_sdp = find_rfc_slot_requesting_sdp();
    386             if(rs_doing_sdp == NULL)
    387             {
    388                 BTA_JvStartDiscovery((UINT8*)bd_addr->address, 1, &sdp_uuid, (void*)rs->id);
    389                 rs->f.pending_sdp_request = FALSE;
    390                 rs->f.doing_sdp_request = TRUE;
    391             }
    392             else
    393             {
    394                 rs->f.pending_sdp_request = TRUE;
    395                 rs->f.doing_sdp_request = FALSE;
    396             }
    397             btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_RD, rs->id);
    398         }
    399     }
    400     unlock_slot(&slot_lock);
    401     return status;
    402 }
    403 
    404 static int create_server_sdp_record(rfc_slot_t* rs)
    405 {
    406     int scn = rs->scn;
    407     if(rs->scn > 0)
    408     {
    409         if(BTM_TryAllocateSCN(rs->scn) == FALSE)
    410         {
    411             APPL_TRACE_ERROR1("rfc channel:%d already in use", scn);
    412             return FALSE;
    413         }
    414     }
    415     else if((rs->scn = BTM_AllocateSCN()) == 0)
    416     {
    417         APPL_TRACE_ERROR0("run out of rfc channels");
    418         return FALSE;
    419     }
    420     if((rs->sdp_handle = add_rfc_sdp_rec(rs->service_name, rs->service_uuid, rs->scn)) <= 0)
    421     {
    422         return FALSE;
    423     }
    424     return TRUE;
    425 }
    426 const char * jv_evt[] = {
    427     "BTA_JV_ENABLE_EVT",
    428     "BTA_JV_SET_DISCOVER_EVT",
    429     "BTA_JV_LOCAL_ADDR_EVT",
    430     "BTA_JV_LOCAL_NAME_EVT",
    431     "BTA_JV_REMOTE_NAME_EVT",
    432     "BTA_JV_SET_ENCRYPTION_EVT",
    433     "BTA_JV_GET_SCN_EVT",
    434     "BTA_JV_GET_PSM_EVT",
    435     "BTA_JV_DISCOVERY_COMP_EVT",
    436     "BTA_JV_SERVICES_LEN_EVT",
    437     "BTA_JV_SERVICE_SEL_EVT",
    438     "BTA_JV_CREATE_RECORD_EVT",
    439     "BTA_JV_UPDATE_RECORD_EVT",
    440     "BTA_JV_ADD_ATTR_EVT",
    441     "BTA_JV_DELETE_ATTR_EVT",
    442     "BTA_JV_CANCEL_DISCVRY_EVT",
    443 
    444     "BTA_JV_L2CAP_OPEN_EVT",
    445     "BTA_JV_L2CAP_CLOSE_EVT",
    446     "BTA_JV_L2CAP_START_EVT",
    447     "BTA_JV_L2CAP_CL_INIT_EVT",
    448     "BTA_JV_L2CAP_DATA_IND_EVT",
    449     "BTA_JV_L2CAP_CONG_EVT",
    450     "BTA_JV_L2CAP_READ_EVT",
    451     "BTA_JV_L2CAP_RECEIVE_EVT",
    452     "BTA_JV_L2CAP_WRITE_EVT",
    453 
    454     "BTA_JV_RFCOMM_OPEN_EVT",
    455     "BTA_JV_RFCOMM_CLOSE_EVT",
    456     "BTA_JV_RFCOMM_START_EVT",
    457     "BTA_JV_RFCOMM_CL_INIT_EVT",
    458     "BTA_JV_RFCOMM_DATA_IND_EVT",
    459     "BTA_JV_RFCOMM_CONG_EVT",
    460     "BTA_JV_RFCOMM_READ_EVT",
    461     "BTA_JV_RFCOMM_WRITE_EVT",
    462     "BTA_JV_RFCOMM_SRV_OPEN_EVT", //  33 /* open status of Server RFCOMM connection */
    463     "BTA_JV_MAX_EVT"
    464 };
    465 static inline void free_rfc_slot_scn(rfc_slot_t* rs)
    466 {
    467     if(rs->scn > 0)
    468     {
    469         if(rs->f.server && !rs->f.closing)
    470         {
    471             BTA_JvRfcommStopServer(rs->rfc_handle);
    472             rs->rfc_handle = 0;
    473         }
    474         BTM_FreeSCN(rs->scn);
    475         rs->scn = 0;
    476     }
    477 }
    478 static void cleanup_rfc_slot(rfc_slot_t* rs)
    479 {
    480     APPL_TRACE_DEBUG3("cleanup slot:%d, fd:%d, scn:%d", rs->id, rs->fd, rs->scn);
    481     if(rs->fd != -1)
    482     {
    483         shutdown(rs->fd, 2);
    484         close(rs->fd);
    485         rs->fd = -1;
    486     }
    487     if(rs->app_fd != -1)
    488     {
    489         close(rs->app_fd);
    490         rs->app_fd = -1;
    491     }
    492     if(rs->sdp_handle > 0)
    493     {
    494         del_rfc_sdp_rec(rs->sdp_handle);
    495         rs->sdp_handle = 0;
    496     }
    497     if(rs->rfc_handle && !rs->f.closing && !rs->f.server)
    498     {
    499         APPL_TRACE_DEBUG1("closing rfcomm connection, rfc_handle:%d", rs->rfc_handle);
    500         BTA_JvRfcommClose(rs->rfc_handle);
    501         rs->rfc_handle = 0;
    502     }
    503     free_rfc_slot_scn(rs);
    504     free_gki_que(&rs->incoming_que);
    505 
    506     rs->rfc_port_handle = 0;
    507     //cleanup the flag
    508     memset(&rs->f, 0, sizeof(rs->f));
    509     rs->id = 0;
    510 }
    511 static inline BOOLEAN send_app_scn(rfc_slot_t* rs)
    512 {
    513     if(sock_send_all(rs->fd, (const uint8_t*)&rs->scn, sizeof(rs->scn)) == sizeof(rs->scn))
    514     {
    515         return TRUE;
    516     }
    517 
    518     return FALSE;
    519 }
    520 static BOOLEAN send_app_connect_signal(int fd, const bt_bdaddr_t* addr, int channel, int status, int send_fd)
    521 {
    522 /*
    523     typedef struct {
    524     short size;
    525     bt_bdaddr_t bd_addr;
    526     int channel;
    527     int status;
    528 } __attribute__((packed)) sock_connect_signal_t;
    529 */
    530     sock_connect_signal_t cs;
    531     cs.size = sizeof(cs);
    532     cs.bd_addr = *addr;
    533     cs.channel = channel;
    534     cs.status = status;
    535     if(send_fd != -1)
    536     {
    537         if(sock_send_fd(fd, (const uint8_t*)&cs, sizeof(cs), send_fd) == sizeof(cs))
    538             return TRUE;
    539         else APPL_TRACE_ERROR2("sock_send_fd failed, fd:%d, send_fd:%d", fd, send_fd);
    540     }
    541     else if(sock_send_all(fd, (const uint8_t*)&cs, sizeof(cs)) == sizeof(cs))
    542     {
    543         return TRUE;
    544     }
    545     return FALSE;
    546 }
    547 static void on_cl_rfc_init(tBTA_JV_RFCOMM_CL_INIT *p_init, uint32_t id)
    548 {
    549    lock_slot(&slot_lock);
    550     rfc_slot_t* rs = find_rfc_slot_by_id(id);
    551     if(rs)
    552     {
    553         if (p_init->status != BTA_JV_SUCCESS)
    554             cleanup_rfc_slot(rs);
    555         else
    556         {
    557             rs->rfc_handle = p_init->handle;
    558         }
    559     }
    560     unlock_slot(&slot_lock);
    561 }
    562 static void  on_srv_rfc_listen_started(tBTA_JV_RFCOMM_START *p_start, uint32_t id)
    563 {
    564     lock_slot(&slot_lock);
    565     rfc_slot_t* rs = find_rfc_slot_by_id(id);
    566     if(rs)
    567     {
    568         if (p_start->status != BTA_JV_SUCCESS)
    569             cleanup_rfc_slot(rs);
    570         else
    571         {
    572             rs->rfc_handle = p_start->handle;
    573 
    574             if(!send_app_scn(rs))
    575             {
    576                 //closed
    577                 APPL_TRACE_DEBUG1("send_app_scn() failed, close rs->id:%d", rs->id);
    578                 cleanup_rfc_slot(rs);
    579             }
    580         }
    581     }
    582     unlock_slot(&slot_lock);
    583 }
    584 static uint32_t on_srv_rfc_connect(tBTA_JV_RFCOMM_SRV_OPEN *p_open, uint32_t id)
    585 {
    586     uint32_t new_listen_slot_id = 0;
    587     lock_slot(&slot_lock);
    588     rfc_slot_t* srv_rs = find_rfc_slot_by_id(id);
    589     if(srv_rs)
    590     {
    591         rfc_slot_t* accept_rs = create_srv_accept_rfc_slot(srv_rs, (const bt_bdaddr_t*)p_open->rem_bda,
    592                                                            p_open->handle, p_open->new_listen_handle);
    593         if(accept_rs)
    594         {
    595             //start monitor the socket
    596             btsock_thread_add_fd(pth, srv_rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_EXCEPTION, srv_rs->id);
    597             btsock_thread_add_fd(pth, accept_rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_RD, accept_rs->id);
    598             APPL_TRACE_DEBUG1("sending connect signal & app fd:%dto app server to accept() the connection",
    599                              accept_rs->app_fd);
    600             APPL_TRACE_DEBUG2("server fd:%d, scn:%d", srv_rs->fd, srv_rs->scn);
    601             send_app_connect_signal(srv_rs->fd, &accept_rs->addr, srv_rs->scn, 0, accept_rs->app_fd);
    602             accept_rs->app_fd = -1; //the fd is closed after sent to app
    603             new_listen_slot_id = srv_rs->id;
    604         }
    605     }
    606     unlock_slot(&slot_lock);
    607     return new_listen_slot_id;
    608 }
    609 static void on_cli_rfc_connect(tBTA_JV_RFCOMM_OPEN *p_open, uint32_t id)
    610 {
    611     lock_slot(&slot_lock);
    612     rfc_slot_t* rs = find_rfc_slot_by_id(id);
    613     if(rs && p_open->status == BTA_JV_SUCCESS)
    614     {
    615         rs->rfc_port_handle = BTA_JvRfcommGetPortHdl(p_open->handle);
    616         bd_copy(rs->addr.address, p_open->rem_bda, 0);
    617         //notify app rfc is connected
    618         APPL_TRACE_DEBUG4("call send_app_connect_signal, slot id:%d, fd:%d, rfc scn:%d, server:%d",
    619                          rs->id, rs->fd, rs->scn, rs->f.server);
    620         if(send_app_connect_signal(rs->fd, &rs->addr, rs->scn, 0, -1))
    621         {
    622             //start monitoring the socketpair to get call back when app writing data
    623             APPL_TRACE_DEBUG3("on_rfc_connect_ind, connect signal sent, slot id:%d, rfc scn:%d, server:%d",
    624                              rs->id, rs->scn, rs->f.server);
    625             rs->f.connected = TRUE;
    626         }
    627         else APPL_TRACE_ERROR0("send_app_connect_signal failed");
    628     }
    629     else if(rs)
    630         cleanup_rfc_slot(rs);
    631     unlock_slot(&slot_lock);
    632 }
    633 static void on_rfc_close(tBTA_JV_RFCOMM_CLOSE * p_close, uint32_t id)
    634 {
    635     lock_slot(&slot_lock);
    636     rfc_slot_t* rs = find_rfc_slot_by_id(id);
    637     if(rs)
    638     {
    639         APPL_TRACE_DEBUG4("on_rfc_close, slot id:%d, fd:%d, rfc scn:%d, server:%d",
    640                          rs->id, rs->fd, rs->scn, rs->f.server);
    641         free_rfc_slot_scn(rs);
    642         //rfc_handle already closed when receiving rfcomm close event from stack.
    643         rs->rfc_handle = 0;
    644         rs->f.connected = FALSE;
    645         cleanup_rfc_slot(rs);
    646     }
    647     unlock_slot(&slot_lock);
    648 }
    649 static void on_rfc_write_done(tBTA_JV_RFCOMM_WRITE *p, uint32_t id)
    650 {
    651     lock_slot(&slot_lock);
    652     rfc_slot_t* rs = find_rfc_slot_by_id(id);
    653     if(rs && !rs->f.outgoing_congest)
    654     {
    655         //mointer the fd for any outgoing data
    656         btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_RD, rs->id);
    657     }
    658     unlock_slot(&slot_lock);
    659 }
    660 static void on_rfc_outgoing_congest(tBTA_JV_RFCOMM_CONG *p, uint32_t id)
    661 {
    662     lock_slot(&slot_lock);
    663     rfc_slot_t* rs = find_rfc_slot_by_id(id);
    664     if(rs)
    665     {
    666         rs->f.outgoing_congest = p->cong ? 1 : 0;
    667         //mointer the fd for any outgoing data
    668         if(!rs->f.outgoing_congest)
    669             btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_RD, rs->id);
    670     }
    671     unlock_slot(&slot_lock);
    672 }
    673 
    674 static void *rfcomm_cback(tBTA_JV_EVT event, tBTA_JV *p_data, void *user_data)
    675 {
    676     int rc;
    677     void* new_user_data = NULL;
    678     APPL_TRACE_DEBUG1("event=%s", jv_evt[event]);
    679 
    680     switch (event)
    681     {
    682     case BTA_JV_RFCOMM_START_EVT:
    683         on_srv_rfc_listen_started(&p_data->rfc_start, (uint32_t)user_data);
    684         break;
    685 
    686     case BTA_JV_RFCOMM_CL_INIT_EVT:
    687         on_cl_rfc_init(&p_data->rfc_cl_init, (uint32_t)user_data);
    688         break;
    689 
    690     case BTA_JV_RFCOMM_OPEN_EVT:
    691         on_cli_rfc_connect(&p_data->rfc_open, (uint32_t)user_data);
    692         break;
    693     case BTA_JV_RFCOMM_SRV_OPEN_EVT:
    694         new_user_data = (void*)on_srv_rfc_connect(&p_data->rfc_srv_open, (uint32_t)user_data);
    695         break;
    696 
    697     case BTA_JV_RFCOMM_CLOSE_EVT:
    698         on_rfc_close(&p_data->rfc_close, (uint32_t)user_data);
    699         break;
    700 
    701     case BTA_JV_RFCOMM_READ_EVT:
    702         APPL_TRACE_DEBUG0("BTA_JV_RFCOMM_READ_EVT not used");
    703         break;
    704 
    705     case BTA_JV_RFCOMM_WRITE_EVT:
    706         on_rfc_write_done(&p_data->rfc_write, (uint32_t)user_data);
    707         break;
    708 
    709     case BTA_JV_RFCOMM_DATA_IND_EVT:
    710         APPL_TRACE_DEBUG0("BTA_JV_RFCOMM_DATA_IND_EVT not used");
    711         break;
    712 
    713     case BTA_JV_RFCOMM_CONG_EVT:
    714         //on_rfc_cong(&p_data->rfc_cong);
    715         on_rfc_outgoing_congest(&p_data->rfc_cong, (uint32_t)user_data);
    716         break;
    717     default:
    718         APPL_TRACE_ERROR2("unhandled event %d, slot id:%d", event, (uint32_t)user_data);
    719         break;
    720     }
    721     return new_user_data;
    722 }
    723 
    724 static void jv_dm_cback(tBTA_JV_EVT event, tBTA_JV *p_data, void *user_data)
    725 {
    726     uint32_t id = (uint32_t)user_data;
    727     APPL_TRACE_DEBUG2("event:%d, slot id:%d", event, id);
    728     switch(event)
    729     {
    730         case BTA_JV_CREATE_RECORD_EVT:
    731             {
    732                 lock_slot(&slot_lock);
    733                 rfc_slot_t* rs = find_rfc_slot_by_id(id);
    734                 if(rs && create_server_sdp_record(rs))
    735                 {
    736                     //now start the rfcomm server after sdp & channel # assigned
    737                     BTA_JvRfcommStartServer(rs->security, rs->role, rs->scn, MAX_RFC_SESSION, rfcomm_cback,
    738                                             (void*)rs->id);
    739                 }
    740                 unlock_slot(&slot_lock);
    741                 break;
    742             }
    743         case BTA_JV_DISCOVERY_COMP_EVT:
    744             {
    745                 rfc_slot_t* rs = NULL;
    746                 lock_slot(&slot_lock);
    747                 if(p_data->disc_comp.status == BTA_JV_SUCCESS && p_data->disc_comp.scn)
    748                 {
    749                     APPL_TRACE_DEBUG3("BTA_JV_DISCOVERY_COMP_EVT, slot id:%d, status:%d, scn:%d",
    750                                       id, p_data->disc_comp.status, p_data->disc_comp.scn);
    751 
    752                     rs = find_rfc_slot_by_id(id);
    753                     if(rs && rs->f.doing_sdp_request)
    754                     {
    755                         if(BTA_JvRfcommConnect(rs->security, rs->role, p_data->disc_comp.scn, rs->addr.address,
    756                                     rfcomm_cback, (void*)rs->id) == BTA_JV_SUCCESS)
    757                         {
    758                             rs->scn = p_data->disc_comp.scn;
    759                             rs->f.doing_sdp_request = FALSE;
    760                             if(!send_app_scn(rs))
    761                                 cleanup_rfc_slot(rs);
    762                         }
    763                         else cleanup_rfc_slot(rs);
    764                     }
    765                     else if(rs)
    766                     {
    767                         APPL_TRACE_ERROR3("DISCOVERY_COMP_EVT no pending sdp request, slot id:%d, \
    768                                 flag sdp pending:%d, flag sdp doing:%d",
    769                                 id, rs->f.pending_sdp_request, rs->f.doing_sdp_request);
    770                     }
    771                 }
    772                 else
    773                 {
    774                     APPL_TRACE_ERROR3("DISCOVERY_COMP_EVT slot id:%d, failed to find channle, \
    775                                       status:%d, scn:%d", id, p_data->disc_comp.status,
    776                                       p_data->disc_comp.scn);
    777                     rs = find_rfc_slot_by_id(id);
    778                     if(rs)
    779                         cleanup_rfc_slot(rs);
    780                 }
    781                 rs = find_rfc_slot_by_pending_sdp();
    782                 if(rs)
    783                 {
    784                     APPL_TRACE_DEBUG0("BTA_JV_DISCOVERY_COMP_EVT, start another pending scn sdp request");
    785                     tSDP_UUID sdp_uuid;
    786                     sdp_uuid.len = 16;
    787                     memcpy(sdp_uuid.uu.uuid128, rs->service_uuid, sizeof(sdp_uuid.uu.uuid128));
    788                     BTA_JvStartDiscovery((UINT8*)rs->addr.address, 1, &sdp_uuid, (void*)rs->id);
    789                     rs->f.pending_sdp_request = FALSE;
    790                     rs->f.doing_sdp_request = TRUE;
    791                 }
    792                 unlock_slot(&slot_lock);
    793                 break;
    794             }
    795         default:
    796             APPL_TRACE_DEBUG2("unhandled event:%d, slot id:%d", event, id);
    797             break;
    798     }
    799 
    800 }
    801 #define SENT_ALL 2
    802 #define SENT_PARTIAL 1
    803 #define SENT_NONE 0
    804 #define SENT_FAILED (-1)
    805 static int send_data_to_app(int fd, BT_HDR *p_buf)
    806 {
    807     if(p_buf->len == 0)
    808         return SENT_ALL;
    809     int sent = send(fd, (UINT8 *)(p_buf + 1) + p_buf->offset,  p_buf->len, MSG_DONTWAIT);
    810     if(sent == p_buf->len)
    811         return SENT_ALL;
    812 
    813     if(sent > 0 && sent < p_buf->len)
    814     {
    815         //sent partial
    816         APPL_TRACE_ERROR2("send partial, sent:%d, p_buf->len:%d", sent, p_buf->len);
    817         p_buf->offset += sent;
    818         p_buf->len -= sent;
    819         return SENT_PARTIAL;
    820 
    821     }
    822     if(sent < 0 &&
    823         (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR))
    824     {
    825         APPL_TRACE_ERROR1("send none, EAGAIN or EWOULDBLOCK, errno:%d", errno);
    826         return SENT_NONE;
    827     }
    828     APPL_TRACE_ERROR3("unknown send() error, sent:%d, p_buf->len:%d,  errno:%d", sent, p_buf->len, errno);
    829     return SENT_FAILED;
    830 }
    831 static BOOLEAN flush_incoming_que_on_wr_signal(rfc_slot_t* rs)
    832 {
    833     while(!GKI_queue_is_empty(&rs->incoming_que))
    834     {
    835         BT_HDR *p_buf = GKI_dequeue(&rs->incoming_que);
    836         int sent = send_data_to_app(rs->fd, p_buf);
    837         switch(sent)
    838         {
    839             case SENT_NONE:
    840             case SENT_PARTIAL:
    841                 //add it back to the queue at same position
    842                 GKI_enqueue_head (&rs->incoming_que, p_buf);
    843                 //monitor the fd to get callback when app is ready to receive data
    844                 btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_WR, rs->id);
    845                 return TRUE;
    846             case SENT_ALL:
    847                 GKI_freebuf(p_buf);
    848                 break;
    849             case SENT_FAILED:
    850                 GKI_freebuf(p_buf);
    851                 return FALSE;
    852         }
    853     }
    854 
    855     //app is ready to receive data, tell stack to start the data flow
    856     //fix me: need a jv flow control api to serialize the call in stack
    857     PORT_FlowControl(rs->rfc_port_handle, TRUE);
    858     return TRUE;
    859 }
    860 void btsock_rfc_signaled(int fd, int flags, uint32_t user_id)
    861 {
    862     lock_slot(&slot_lock);
    863     rfc_slot_t* rs = find_rfc_slot_by_id(user_id);
    864     if(rs)
    865     {
    866         APPL_TRACE_DEBUG3("rfc slot id:%d, fd:%d, flags:%x", rs->id, fd, flags);
    867         BOOLEAN need_close = FALSE;
    868         if(flags & SOCK_THREAD_FD_RD)
    869         {
    870             //data available from app, tell stack we have outgoing data
    871             if(!rs->f.server)
    872             {
    873                 if(rs->f.connected)
    874                     BTA_JvRfcommWrite(rs->rfc_handle, (UINT32)rs->id);
    875                 else
    876                 {
    877                     APPL_TRACE_ERROR2("SOCK_THREAD_FD_RD signaled when rfc is not connected, \
    878                                       slot id:%d, channel:%d", rs->id, rs->scn);
    879                     need_close = TRUE;
    880                 }
    881             }
    882         }
    883         if(flags & SOCK_THREAD_FD_WR)
    884         {
    885             //app is ready to receive more data, tell stack to enable the data flow
    886             if(!rs->f.connected || !flush_incoming_que_on_wr_signal(rs))
    887             {
    888                 need_close = TRUE;
    889                 APPL_TRACE_ERROR2("SOCK_THREAD_FD_WR signaled when rfc is not connected \
    890                                   or app closed fd, slot id:%d, channel:%d", rs->id, rs->scn);
    891             }
    892 
    893         }
    894         if(need_close || (flags & SOCK_THREAD_FD_EXCEPTION))
    895         {
    896             APPL_TRACE_DEBUG1("SOCK_THREAD_FD_EXCEPTION, flags:%x", flags);
    897             rs->f.closing = TRUE;
    898             if(rs->f.server)
    899                BTA_JvRfcommStopServer(rs->rfc_handle);
    900             else
    901                 BTA_JvRfcommClose(rs->rfc_handle);
    902         }
    903     }
    904     unlock_slot(&slot_lock);
    905 }
    906 //stack rfcomm callout functions
    907 //[
    908 int bta_co_rfc_data_incoming(void *user_data, BT_HDR *p_buf)
    909 {
    910     uint32_t id = (uint32_t)user_data;
    911     int ret = 0;
    912     lock_slot(&slot_lock);
    913     rfc_slot_t* rs = find_rfc_slot_by_id(id);
    914     if(rs)
    915     {
    916 
    917         int sent = send_data_to_app(rs->fd, p_buf);
    918         switch(sent)
    919         {
    920             case SENT_NONE:
    921             case SENT_PARTIAL:
    922                 //add it to the end of the queue
    923                 GKI_enqueue(&rs->incoming_que, p_buf);
    924                 //monitor the fd to get callback when app is ready to receive data
    925                 btsock_thread_add_fd(pth, rs->fd, BTSOCK_RFCOMM, SOCK_THREAD_FD_WR, rs->id);
    926                 break;
    927             case SENT_ALL:
    928                 GKI_freebuf(p_buf);
    929                 ret = 1;//enable the data flow
    930                 break;
    931             case SENT_FAILED:
    932                 GKI_freebuf(p_buf);
    933                 cleanup_rfc_slot(rs);
    934                 break;
    935         }
    936      }
    937     unlock_slot(&slot_lock);
    938     return ret;//return 0 to disable data flow
    939 }
    940 int bta_co_rfc_data_outgoing_size(void *user_data, int *size)
    941 {
    942     uint32_t id = (uint32_t)user_data;
    943     int ret = FALSE;
    944     *size = 0;
    945     lock_slot(&slot_lock);
    946     rfc_slot_t* rs = find_rfc_slot_by_id(id);
    947     if(rs)
    948     {
    949         if(ioctl(rs->fd, FIONREAD, size) == 0)
    950         {
    951             APPL_TRACE_DEBUG2("ioctl read avaiable size:%d, fd:%d", *size, rs->fd);
    952             ret = TRUE;
    953         }
    954         else
    955         {
    956             APPL_TRACE_ERROR2("ioctl FIONREAD error, errno:%d, fd:%d", errno, rs->fd);
    957             cleanup_rfc_slot(rs);
    958         }
    959     }
    960     unlock_slot(&slot_lock);
    961     return ret;
    962 }
    963 int bta_co_rfc_data_outgoing(void *user_data, UINT8* buf, UINT16 size)
    964 {
    965     uint32_t id = (uint32_t)user_data;
    966     int ret = FALSE;
    967     lock_slot(&slot_lock);
    968     rfc_slot_t* rs = find_rfc_slot_by_id(id);
    969     if(rs)
    970     {
    971         int received = recv(rs->fd, buf, size, 0);
    972         if(received == size)
    973             ret = TRUE;
    974         else
    975         {
    976             APPL_TRACE_ERROR4("recv error, errno:%d, fd:%d, size:%d, received:%d",
    977                              errno, rs->fd, size, received);
    978             cleanup_rfc_slot(rs);
    979         }
    980     }
    981     unlock_slot(&slot_lock);
    982     return ret;
    983 }
    984 //]
    985 
    986