Home | History | Annotate | Download | only in rfcomm
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 1999-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  *  this file contains the Serial Port API code
     22  *
     23  ******************************************************************************/
     24 
     25 #define LOG_TAG "bt_port_api"
     26 
     27 #include <string.h>
     28 
     29 #include "osi/include/log.h"
     30 #include "osi/include/mutex.h"
     31 
     32 #include "bt_common.h"
     33 #include "btm_api.h"
     34 #include "btm_int.h"
     35 #include "l2c_api.h"
     36 #include "port_api.h"
     37 #include "port_int.h"
     38 #include "rfc_int.h"
     39 #include "rfcdefs.h"
     40 #include "sdp_api.h"
     41 
     42 /* duration of break in 200ms units */
     43 #define PORT_BREAK_DURATION 1
     44 
     45 #define info(fmt, ...) LOG_INFO(LOG_TAG, "%s: " fmt, __func__, ##__VA_ARGS__)
     46 #define debug(fmt, ...) LOG_DEBUG(LOG_TAG, "%s: " fmt, __func__, ##__VA_ARGS__)
     47 #define error(fmt, ...) \
     48   LOG_ERROR(LOG_TAG, "## ERROR : %s: " fmt "##", __func__, ##__VA_ARGS__)
     49 #define asrt(s)                                                            \
     50   if (!(s))                                                                \
     51   LOG_ERROR(LOG_TAG, "## %s assert %s failed at line:%d ##", __func__, #s, \
     52             __LINE__)
     53 
     54 /* Mapping from PORT_* result codes to human readable strings. */
     55 static const char* result_code_strings[] = {"Success",
     56                                             "Unknown error",
     57                                             "Already opened",
     58                                             "Command pending",
     59                                             "App not registered",
     60                                             "No memory",
     61                                             "No resources",
     62                                             "Bad BD address",
     63                                             "Unspecified error",
     64                                             "Bad handle",
     65                                             "Not opened",
     66                                             "Line error",
     67                                             "Start failed",
     68                                             "Parameter negotiation failed",
     69                                             "Port negotiation failed",
     70                                             "Sec failed",
     71                                             "Peer connection failed",
     72                                             "Peer failed",
     73                                             "Peer timeout",
     74                                             "Closed",
     75                                             "TX full",
     76                                             "Local closed",
     77                                             "Local timeout",
     78                                             "TX queue disabled",
     79                                             "Page timeout",
     80                                             "Invalid SCN",
     81                                             "Unknown result code"};
     82 
     83 /*******************************************************************************
     84  *
     85  * Function         RFCOMM_CreateConnection
     86  *
     87  * Description      RFCOMM_CreateConnection function is used from the
     88  *                  application to establish serial port connection to the peer
     89  *                  device, or allow RFCOMM to accept a connection from the peer
     90  *                  application.
     91  *
     92  * Parameters:      scn          - Service Channel Number as registered with
     93  *                                 the SDP (server) or obtained using SDP from
     94  *                                 the peer device (client).
     95  *                  is_server    - true if requesting application is a server
     96  *                  mtu          - Maximum frame size the application can accept
     97  *                  bd_addr      - BD_ADDR of the peer (client)
     98  *                  mask         - specifies events to be enabled.  A value
     99  *                                 of zero disables all events.
    100  *                  p_handle     - OUT pointer to the handle.
    101  *                  p_mgmt_cb    - pointer to callback function to receive
    102  *                                 connection up/down events.
    103  * Notes:
    104  *
    105  * Server can call this function with the same scn parameter multiple times if
    106  * it is ready to accept multiple simulteneous connections.
    107  *
    108  * DLCI for the connection is (scn * 2 + 1) if client originates connection on
    109  * existing none initiator multiplexer channel.  Otherwise it is (scn * 2).
    110  * For the server DLCI can be changed later if client will be calling it using
    111  * (scn * 2 + 1) dlci.
    112  *
    113  ******************************************************************************/
    114 int RFCOMM_CreateConnection(uint16_t uuid, uint8_t scn, bool is_server,
    115                             uint16_t mtu, BD_ADDR bd_addr, uint16_t* p_handle,
    116                             tPORT_CALLBACK* p_mgmt_cb) {
    117   tPORT* p_port;
    118   int i;
    119   uint8_t dlci;
    120   tRFC_MCB* p_mcb = port_find_mcb(bd_addr);
    121   uint16_t rfcomm_mtu;
    122 
    123   RFCOMM_TRACE_API(
    124       "RFCOMM_CreateConnection()  BDA: %02x-%02x-%02x-%02x-%02x-%02x",
    125       bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
    126 
    127   *p_handle = 0;
    128 
    129   if ((scn == 0) || (scn >= PORT_MAX_RFC_PORTS)) {
    130     /* Server Channel Number(SCN) should be in range 1...30 */
    131     RFCOMM_TRACE_ERROR("RFCOMM_CreateConnection - invalid SCN");
    132     return (PORT_INVALID_SCN);
    133   }
    134 
    135   /* For client that originate connection on the existing none initiator */
    136   /* multiplexer channel DLCI should be odd */
    137   if (p_mcb && !p_mcb->is_initiator && !is_server)
    138     dlci = (scn << 1) + 1;
    139   else
    140     dlci = (scn << 1);
    141   RFCOMM_TRACE_API(
    142       "RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, "
    143       "p_mcb:%p",
    144       scn, dlci, is_server, mtu, p_mcb);
    145 
    146   /* For the server side always allocate a new port.  On the client side */
    147   /* do not allow the same (dlci, bd_addr) to be opened twice by application */
    148   if (!is_server) {
    149     p_port = port_find_port(dlci, bd_addr);
    150     if (p_port != NULL) {
    151       /* if existing port is also a client port */
    152       if (p_port->is_server == false) {
    153         RFCOMM_TRACE_ERROR(
    154             "RFCOMM_CreateConnection - already opened state:%d, RFC state:%d, "
    155             "MCB state:%d",
    156             p_port->state, p_port->rfc.state,
    157             p_port->rfc.p_mcb ? p_port->rfc.p_mcb->state : 0);
    158         *p_handle = p_port->inx;
    159         return (PORT_ALREADY_OPENED);
    160       }
    161     }
    162   }
    163 
    164   p_port = port_allocate_port(dlci, bd_addr);
    165   if (p_port == NULL) {
    166     RFCOMM_TRACE_WARNING("RFCOMM_CreateConnection - no resources");
    167     return (PORT_NO_RESOURCES);
    168   }
    169   RFCOMM_TRACE_API(
    170       "RFCOMM_CreateConnection(): scn:%d, dlci:%d, is_server:%d mtu:%d, "
    171       "p_mcb:%p, p_port:%p",
    172       scn, dlci, is_server, mtu, p_mcb, p_port);
    173 
    174   p_port->default_signal_state =
    175       (PORT_DTRDSR_ON | PORT_CTSRTS_ON | PORT_DCD_ON);
    176 
    177   switch (uuid) {
    178     case UUID_PROTOCOL_OBEX:
    179       p_port->default_signal_state = PORT_OBEX_DEFAULT_SIGNAL_STATE;
    180       break;
    181     case UUID_SERVCLASS_SERIAL_PORT:
    182       p_port->default_signal_state = PORT_SPP_DEFAULT_SIGNAL_STATE;
    183       break;
    184     case UUID_SERVCLASS_LAN_ACCESS_USING_PPP:
    185       p_port->default_signal_state = PORT_PPP_DEFAULT_SIGNAL_STATE;
    186       break;
    187     case UUID_SERVCLASS_DIALUP_NETWORKING:
    188     case UUID_SERVCLASS_FAX:
    189       p_port->default_signal_state = PORT_DUN_DEFAULT_SIGNAL_STATE;
    190       break;
    191   }
    192 
    193   RFCOMM_TRACE_EVENT("RFCOMM_CreateConnection dlci:%d signal state:0x%x", dlci,
    194                      p_port->default_signal_state);
    195 
    196   *p_handle = p_port->inx;
    197 
    198   p_port->state = PORT_STATE_OPENING;
    199   p_port->uuid = uuid;
    200   p_port->is_server = is_server;
    201   p_port->scn = scn;
    202   p_port->ev_mask = 0;
    203 
    204   /* If the MTU is not specified (0), keep MTU decision until the
    205    * PN frame has to be send
    206    * at that time connection should be established and we
    207    * will know for sure our prefered MTU
    208    */
    209 
    210   rfcomm_mtu = L2CAP_MTU_SIZE - RFCOMM_DATA_OVERHEAD;
    211 
    212   if (mtu)
    213     p_port->mtu = (mtu < rfcomm_mtu) ? mtu : rfcomm_mtu;
    214   else
    215     p_port->mtu = rfcomm_mtu;
    216 
    217   /* server doesn't need to release port when closing */
    218   if (is_server) {
    219     p_port->keep_port_handle = true;
    220 
    221     /* keep mtu that user asked, p_port->mtu could be updated during param
    222      * negotiation */
    223     p_port->keep_mtu = p_port->mtu;
    224   }
    225 
    226   p_port->local_ctrl.modem_signal = p_port->default_signal_state;
    227   p_port->local_ctrl.fc = false;
    228 
    229   p_port->p_mgmt_callback = p_mgmt_cb;
    230 
    231   for (i = 0; i < BD_ADDR_LEN; i++) p_port->bd_addr[i] = bd_addr[i];
    232 
    233   /* If this is not initiator of the connection need to just wait */
    234   if (p_port->is_server) {
    235     return (PORT_SUCCESS);
    236   }
    237 
    238   /* Open will be continued after security checks are passed */
    239   return port_open_continue(p_port);
    240 }
    241 
    242 /*******************************************************************************
    243  *
    244  * Function         RFCOMM_RemoveConnection
    245  *
    246  * Description      This function is called to close the specified connection.
    247  *
    248  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    249  *
    250  ******************************************************************************/
    251 int RFCOMM_RemoveConnection(uint16_t handle) {
    252   tPORT* p_port;
    253 
    254   RFCOMM_TRACE_API("RFCOMM_RemoveConnection() handle:%d", handle);
    255 
    256   /* Check if handle is valid to avoid crashing */
    257   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    258     RFCOMM_TRACE_ERROR("RFCOMM_RemoveConnection() BAD handle:%d", handle);
    259     return (PORT_BAD_HANDLE);
    260   }
    261   p_port = &rfc_cb.port.port[handle - 1];
    262 
    263   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    264     RFCOMM_TRACE_EVENT("RFCOMM_RemoveConnection() Not opened:%d", handle);
    265     return (PORT_SUCCESS);
    266   }
    267 
    268   p_port->state = PORT_STATE_CLOSING;
    269 
    270   port_start_close(p_port);
    271 
    272   return (PORT_SUCCESS);
    273 }
    274 
    275 /*******************************************************************************
    276  *
    277  * Function         RFCOMM_RemoveServer
    278  *
    279  * Description      This function is called to close the server port.
    280  *
    281  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    282  *
    283  ******************************************************************************/
    284 int RFCOMM_RemoveServer(uint16_t handle) {
    285   tPORT* p_port;
    286 
    287   RFCOMM_TRACE_API("RFCOMM_RemoveServer() handle:%d", handle);
    288 
    289   /* Check if handle is valid to avoid crashing */
    290   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    291     RFCOMM_TRACE_ERROR("RFCOMM_RemoveServer() BAD handle:%d", handle);
    292     return (PORT_BAD_HANDLE);
    293   }
    294   p_port = &rfc_cb.port.port[handle - 1];
    295 
    296   /* Do not report any events to the client any more. */
    297   p_port->p_mgmt_callback = NULL;
    298 
    299   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    300     RFCOMM_TRACE_EVENT("RFCOMM_RemoveServer() Not opened:%d", handle);
    301     return (PORT_SUCCESS);
    302   }
    303 
    304   /* this port will be deallocated after closing */
    305   p_port->keep_port_handle = false;
    306   p_port->state = PORT_STATE_CLOSING;
    307 
    308   port_start_close(p_port);
    309 
    310   return (PORT_SUCCESS);
    311 }
    312 
    313 /*******************************************************************************
    314  *
    315  * Function         PORT_SetEventCallback
    316  *
    317  * Description      This function is called to provide an address of the
    318  *                  function which will be called when one of the events
    319  *                  specified in the mask occures.
    320  *
    321  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    322  *                  p_callback - address of the callback function which should
    323  *                               be called from the RFCOMM when an event
    324  *                               specified in the mask occures.
    325  *
    326  *
    327  ******************************************************************************/
    328 int PORT_SetEventCallback(uint16_t port_handle, tPORT_CALLBACK* p_port_cb) {
    329   tPORT* p_port;
    330 
    331   /* Check if handle is valid to avoid crashing */
    332   if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) {
    333     return (PORT_BAD_HANDLE);
    334   }
    335 
    336   p_port = &rfc_cb.port.port[port_handle - 1];
    337 
    338   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    339     return (PORT_NOT_OPENED);
    340   }
    341 
    342   RFCOMM_TRACE_API("PORT_SetEventCallback() handle:%d", port_handle);
    343 
    344   p_port->p_callback = p_port_cb;
    345 
    346   return (PORT_SUCCESS);
    347 }
    348 /*******************************************************************************
    349  *
    350  * Function         PORT_ClearKeepHandleFlag
    351  *
    352  * Description      Clear the keep handle flag, which will cause not to keep the
    353  *                  port handle open when closed
    354  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    355  *
    356  ******************************************************************************/
    357 
    358 int PORT_ClearKeepHandleFlag(uint16_t port_handle) {
    359   tPORT* p_port;
    360 
    361   /* Check if handle is valid to avoid crashing */
    362   if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) {
    363     return (PORT_BAD_HANDLE);
    364   }
    365 
    366   p_port = &rfc_cb.port.port[port_handle - 1];
    367   p_port->keep_port_handle = 0;
    368   return (PORT_SUCCESS);
    369 }
    370 
    371 /*******************************************************************************
    372  *
    373  * Function         PORT_SetDataCallback
    374  *
    375  * Description      This function is when a data packet is received
    376  *
    377  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    378  *                  p_callback - address of the callback function which should
    379  *                               be called from the RFCOMM when data packet
    380  *                               is received.
    381  *
    382  *
    383  ******************************************************************************/
    384 int PORT_SetDataCallback(uint16_t port_handle, tPORT_DATA_CALLBACK* p_port_cb) {
    385   tPORT* p_port;
    386 
    387   RFCOMM_TRACE_API("PORT_SetDataCallback() handle:%d cb 0x%x", port_handle,
    388                    p_port_cb);
    389 
    390   /* Check if handle is valid to avoid crashing */
    391   if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) {
    392     return (PORT_BAD_HANDLE);
    393   }
    394 
    395   p_port = &rfc_cb.port.port[port_handle - 1];
    396 
    397   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    398     return (PORT_NOT_OPENED);
    399   }
    400 
    401   p_port->p_data_callback = p_port_cb;
    402 
    403   return (PORT_SUCCESS);
    404 }
    405 /*******************************************************************************
    406  *
    407  * Function         PORT_SetCODataCallback
    408  *
    409  * Description      This function is when a data packet is received
    410  *
    411  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    412  *                  p_callback - address of the callback function which should
    413  *                               be called from the RFCOMM when data packet
    414  *                               is received.
    415  *
    416  *
    417  ******************************************************************************/
    418 int PORT_SetDataCOCallback(uint16_t port_handle,
    419                            tPORT_DATA_CO_CALLBACK* p_port_cb) {
    420   tPORT* p_port;
    421 
    422   RFCOMM_TRACE_API("PORT_SetDataCOCallback() handle:%d cb 0x%x", port_handle,
    423                    p_port_cb);
    424 
    425   /* Check if handle is valid to avoid crashing */
    426   if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) {
    427     return (PORT_BAD_HANDLE);
    428   }
    429 
    430   p_port = &rfc_cb.port.port[port_handle - 1];
    431 
    432   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    433     return (PORT_NOT_OPENED);
    434   }
    435 
    436   p_port->p_data_co_callback = p_port_cb;
    437 
    438   return (PORT_SUCCESS);
    439 }
    440 
    441 /*******************************************************************************
    442  *
    443  * Function         PORT_SetEventMask
    444  *
    445  * Description      This function is called to close the specified connection.
    446  *
    447  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    448  *                  mask   - Bitmask of the events the host is interested in
    449  *
    450  ******************************************************************************/
    451 int PORT_SetEventMask(uint16_t port_handle, uint32_t mask) {
    452   tPORT* p_port;
    453 
    454   RFCOMM_TRACE_API("PORT_SetEventMask() handle:%d mask:0x%x", port_handle,
    455                    mask);
    456 
    457   /* Check if handle is valid to avoid crashing */
    458   if ((port_handle == 0) || (port_handle > MAX_RFC_PORTS)) {
    459     return (PORT_BAD_HANDLE);
    460   }
    461 
    462   p_port = &rfc_cb.port.port[port_handle - 1];
    463 
    464   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    465     return (PORT_NOT_OPENED);
    466   }
    467 
    468   p_port->ev_mask = mask;
    469 
    470   return (PORT_SUCCESS);
    471 }
    472 
    473 /*******************************************************************************
    474  *
    475  * Function         PORT_CheckConnection
    476  *
    477  * Description      This function returns PORT_SUCCESS if connection referenced
    478  *                  by handle is up and running
    479  *
    480  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    481  *                  bd_addr    - OUT bd_addr of the peer
    482  *                  p_lcid     - OUT L2CAP's LCID
    483  *
    484  ******************************************************************************/
    485 int PORT_CheckConnection(uint16_t handle, BD_ADDR bd_addr, uint16_t* p_lcid) {
    486   tPORT* p_port;
    487 
    488   RFCOMM_TRACE_API("PORT_CheckConnection() handle:%d", handle);
    489 
    490   /* Check if handle is valid to avoid crashing */
    491   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    492     return (PORT_BAD_HANDLE);
    493   }
    494 
    495   p_port = &rfc_cb.port.port[handle - 1];
    496 
    497   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    498     return (PORT_NOT_OPENED);
    499   }
    500 
    501   if (!p_port->rfc.p_mcb || !p_port->rfc.p_mcb->peer_ready ||
    502       (p_port->rfc.state != RFC_STATE_OPENED)) {
    503     return (PORT_LINE_ERR);
    504   }
    505 
    506   memcpy(bd_addr, p_port->rfc.p_mcb->bd_addr, BD_ADDR_LEN);
    507   if (p_lcid) *p_lcid = p_port->rfc.p_mcb->lcid;
    508 
    509   return (PORT_SUCCESS);
    510 }
    511 
    512 /*******************************************************************************
    513  *
    514  * Function         PORT_IsOpening
    515  *
    516  * Description      This function returns true if there is any RFCOMM connection
    517  *                  opening in process.
    518  *
    519  * Parameters:      true if any connection opening is found
    520  *                  bd_addr    - bd_addr of the peer
    521  *
    522  ******************************************************************************/
    523 bool PORT_IsOpening(BD_ADDR bd_addr) {
    524   uint8_t xx, yy;
    525   tRFC_MCB* p_mcb = NULL;
    526   tPORT* p_port;
    527   bool found_port;
    528 
    529   /* Check for any rfc_mcb which is in the middle of opening. */
    530   for (xx = 0; xx < MAX_BD_CONNECTIONS; xx++) {
    531     if ((rfc_cb.port.rfc_mcb[xx].state > RFC_MX_STATE_IDLE) &&
    532         (rfc_cb.port.rfc_mcb[xx].state < RFC_MX_STATE_CONNECTED)) {
    533       memcpy(bd_addr, rfc_cb.port.rfc_mcb[xx].bd_addr, BD_ADDR_LEN);
    534       return true;
    535     }
    536 
    537     if (rfc_cb.port.rfc_mcb[xx].state == RFC_MX_STATE_CONNECTED) {
    538       found_port = false;
    539       p_mcb = &rfc_cb.port.rfc_mcb[xx];
    540       p_port = &rfc_cb.port.port[0];
    541 
    542       for (yy = 0; yy < MAX_RFC_PORTS; yy++, p_port++) {
    543         if (p_port->rfc.p_mcb == p_mcb) {
    544           found_port = true;
    545           break;
    546         }
    547       }
    548 
    549       if ((!found_port) ||
    550           (found_port && (p_port->rfc.state < RFC_STATE_OPENED))) {
    551         /* Port is not established yet. */
    552         memcpy(bd_addr, rfc_cb.port.rfc_mcb[xx].bd_addr, BD_ADDR_LEN);
    553         return true;
    554       }
    555     }
    556   }
    557 
    558   return false;
    559 }
    560 
    561 /*******************************************************************************
    562  *
    563  * Function         PORT_SetState
    564  *
    565  * Description      This function configures connection according to the
    566  *                  specifications in the tPORT_STATE structure.
    567  *
    568  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    569  *                  p_settings - Pointer to a tPORT_STATE structure containing
    570  *                               configuration information for the connection.
    571  *
    572  *
    573  ******************************************************************************/
    574 int PORT_SetState(uint16_t handle, tPORT_STATE* p_settings) {
    575   tPORT* p_port;
    576   uint8_t baud_rate;
    577 
    578   RFCOMM_TRACE_API("PORT_SetState() handle:%d", handle);
    579 
    580   /* Check if handle is valid to avoid crashing */
    581   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    582     return (PORT_BAD_HANDLE);
    583   }
    584 
    585   p_port = &rfc_cb.port.port[handle - 1];
    586 
    587   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    588     return (PORT_NOT_OPENED);
    589   }
    590 
    591   if (p_port->line_status) {
    592     return (PORT_LINE_ERR);
    593   }
    594 
    595   RFCOMM_TRACE_API("PORT_SetState() handle:%d FC_TYPE:0x%x", handle,
    596                    p_settings->fc_type);
    597 
    598   baud_rate = p_port->user_port_pars.baud_rate;
    599   p_port->user_port_pars = *p_settings;
    600 
    601   /* for now we've been asked to pass only baud rate */
    602   if (baud_rate != p_settings->baud_rate) {
    603     port_start_par_neg(p_port);
    604   }
    605   return (PORT_SUCCESS);
    606 }
    607 
    608 /*******************************************************************************
    609  *
    610  * Function         PORT_GetRxQueueCnt
    611  *
    612  * Description      This function return number of buffers on the rx queue.
    613  *
    614  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    615  *                  p_rx_queue_count - Pointer to return queue count in.
    616  *
    617  ******************************************************************************/
    618 int PORT_GetRxQueueCnt(uint16_t handle, uint16_t* p_rx_queue_count) {
    619   tPORT* p_port;
    620 
    621   RFCOMM_TRACE_API("PORT_GetRxQueueCnt() handle:%d", handle);
    622 
    623   /* Check if handle is valid to avoid crashing */
    624   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    625     return (PORT_BAD_HANDLE);
    626   }
    627 
    628   p_port = &rfc_cb.port.port[handle - 1];
    629 
    630   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    631     return (PORT_NOT_OPENED);
    632   }
    633 
    634   if (p_port->line_status) {
    635     return (PORT_LINE_ERR);
    636   }
    637 
    638   *p_rx_queue_count = p_port->rx.queue_size;
    639 
    640   RFCOMM_TRACE_API(
    641       "PORT_GetRxQueueCnt() p_rx_queue_count:%d, p_port->rx.queue.count = %d",
    642       *p_rx_queue_count, p_port->rx.queue_size);
    643 
    644   return (PORT_SUCCESS);
    645 }
    646 
    647 /*******************************************************************************
    648  *
    649  * Function         PORT_GetState
    650  *
    651  * Description      This function is called to fill tPORT_STATE structure
    652  *                  with the curremt control settings for the port
    653  *
    654  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    655  *                  p_settings - Pointer to a tPORT_STATE structure in which
    656  *                               configuration information is returned.
    657  *
    658  ******************************************************************************/
    659 int PORT_GetState(uint16_t handle, tPORT_STATE* p_settings) {
    660   tPORT* p_port;
    661 
    662   RFCOMM_TRACE_API("PORT_GetState() handle:%d", handle);
    663 
    664   /* Check if handle is valid to avoid crashing */
    665   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    666     return (PORT_BAD_HANDLE);
    667   }
    668 
    669   p_port = &rfc_cb.port.port[handle - 1];
    670 
    671   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    672     return (PORT_NOT_OPENED);
    673   }
    674 
    675   if (p_port->line_status) {
    676     return (PORT_LINE_ERR);
    677   }
    678 
    679   *p_settings = p_port->user_port_pars;
    680   return (PORT_SUCCESS);
    681 }
    682 
    683 /*******************************************************************************
    684  *
    685  * Function         PORT_Control
    686  *
    687  * Description      This function directs a specified connection to pass control
    688  *                  control information to the peer device.
    689  *
    690  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    691  *                  signal     = specify the function to be passed
    692  *
    693  ******************************************************************************/
    694 int PORT_Control(uint16_t handle, uint8_t signal) {
    695   tPORT* p_port;
    696   uint8_t old_modem_signal;
    697 
    698   RFCOMM_TRACE_API("PORT_Control() handle:%d signal:0x%x", handle, signal);
    699 
    700   /* Check if handle is valid to avoid crashing */
    701   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    702     return (PORT_BAD_HANDLE);
    703   }
    704 
    705   p_port = &rfc_cb.port.port[handle - 1];
    706 
    707   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    708     return (PORT_NOT_OPENED);
    709   }
    710 
    711   old_modem_signal = p_port->local_ctrl.modem_signal;
    712   p_port->local_ctrl.break_signal = 0;
    713 
    714   switch (signal) {
    715     case PORT_SET_CTSRTS:
    716       p_port->local_ctrl.modem_signal |= PORT_CTSRTS_ON;
    717       break;
    718 
    719     case PORT_CLR_CTSRTS:
    720       p_port->local_ctrl.modem_signal &= ~PORT_CTSRTS_ON;
    721       break;
    722 
    723     case PORT_SET_DTRDSR:
    724       p_port->local_ctrl.modem_signal |= PORT_DTRDSR_ON;
    725       break;
    726 
    727     case PORT_CLR_DTRDSR:
    728       p_port->local_ctrl.modem_signal &= ~PORT_DTRDSR_ON;
    729       break;
    730 
    731     case PORT_SET_RI:
    732       p_port->local_ctrl.modem_signal |= PORT_RING_ON;
    733       break;
    734 
    735     case PORT_CLR_RI:
    736       p_port->local_ctrl.modem_signal &= ~PORT_RING_ON;
    737       break;
    738 
    739     case PORT_SET_DCD:
    740       p_port->local_ctrl.modem_signal |= PORT_DCD_ON;
    741       break;
    742 
    743     case PORT_CLR_DCD:
    744       p_port->local_ctrl.modem_signal &= ~PORT_DCD_ON;
    745       break;
    746   }
    747 
    748   if (signal == PORT_BREAK)
    749     p_port->local_ctrl.break_signal = PORT_BREAK_DURATION;
    750   else if (p_port->local_ctrl.modem_signal == old_modem_signal)
    751     return (PORT_SUCCESS);
    752 
    753   port_start_control(p_port);
    754 
    755   RFCOMM_TRACE_EVENT(
    756       "PORT_Control DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d",
    757       ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0),
    758       ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0),
    759       ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0),
    760       ((p_port->local_ctrl.modem_signal & MODEM_SIGNAL_DCD) ? 1 : 0));
    761 
    762   return (PORT_SUCCESS);
    763 }
    764 
    765 /*******************************************************************************
    766  *
    767  * Function         PORT_FlowControl
    768  *
    769  * Description      This function directs a specified connection to pass
    770  *                  flow control message to the peer device.  Enable flag passed
    771  *                  shows if port can accept more data.
    772  *
    773  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    774  *                  enable     - enables data flow
    775  *
    776  ******************************************************************************/
    777 int PORT_FlowControl(uint16_t handle, bool enable) {
    778   tPORT* p_port;
    779   bool old_fc;
    780   uint32_t events;
    781 
    782   RFCOMM_TRACE_API("PORT_FlowControl() handle:%d enable: %d", handle, enable);
    783 
    784   /* Check if handle is valid to avoid crashing */
    785   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    786     return (PORT_BAD_HANDLE);
    787   }
    788 
    789   p_port = &rfc_cb.port.port[handle - 1];
    790 
    791   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    792     return (PORT_NOT_OPENED);
    793   }
    794 
    795   if (!p_port->rfc.p_mcb) {
    796     return (PORT_NOT_OPENED);
    797   }
    798 
    799   p_port->rx.user_fc = !enable;
    800 
    801   if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) {
    802     if (!p_port->rx.user_fc) {
    803       port_flow_control_peer(p_port, true, 0);
    804     }
    805   } else {
    806     old_fc = p_port->local_ctrl.fc;
    807 
    808     /* FC is set if user is set or peer is set */
    809     p_port->local_ctrl.fc = (p_port->rx.user_fc | p_port->rx.peer_fc);
    810 
    811     if (p_port->local_ctrl.fc != old_fc) port_start_control(p_port);
    812   }
    813 
    814   /* Need to take care of the case when we could not deliver events */
    815   /* to the application because we were flow controlled */
    816   if (enable && (p_port->rx.queue_size != 0)) {
    817     events = PORT_EV_RXCHAR;
    818     if (p_port->rx_flag_ev_pending) {
    819       p_port->rx_flag_ev_pending = false;
    820       events |= PORT_EV_RXFLAG;
    821     }
    822 
    823     events &= p_port->ev_mask;
    824     if (p_port->p_callback && events) {
    825       p_port->p_callback(events, p_port->inx);
    826     }
    827   }
    828   return (PORT_SUCCESS);
    829 }
    830 /*******************************************************************************
    831  *
    832  * Function         PORT_FlowControl_MaxCredit
    833  *
    834  * Description      This function directs a specified connection to pass
    835  *                  flow control message to the peer device.  Enable flag passed
    836  *                  shows if port can accept more data. It also sends max credit
    837  *                  when data flow enabled
    838  *
    839  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    840  *                  enable     - enables data flow
    841  *
    842  ******************************************************************************/
    843 
    844 int PORT_FlowControl_MaxCredit(uint16_t handle, bool enable) {
    845   tPORT* p_port;
    846   bool old_fc;
    847   uint32_t events;
    848 
    849   RFCOMM_TRACE_API("PORT_FlowControl() handle:%d enable: %d", handle, enable);
    850 
    851   /* Check if handle is valid to avoid crashing */
    852   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    853     return (PORT_BAD_HANDLE);
    854   }
    855 
    856   p_port = &rfc_cb.port.port[handle - 1];
    857 
    858   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    859     return (PORT_NOT_OPENED);
    860   }
    861 
    862   if (!p_port->rfc.p_mcb) {
    863     return (PORT_NOT_OPENED);
    864   }
    865 
    866   p_port->rx.user_fc = !enable;
    867 
    868   if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT) {
    869     if (!p_port->rx.user_fc) {
    870       port_flow_control_peer(p_port, true, p_port->credit_rx);
    871     }
    872   } else {
    873     old_fc = p_port->local_ctrl.fc;
    874 
    875     /* FC is set if user is set or peer is set */
    876     p_port->local_ctrl.fc = (p_port->rx.user_fc | p_port->rx.peer_fc);
    877 
    878     if (p_port->local_ctrl.fc != old_fc) port_start_control(p_port);
    879   }
    880 
    881   /* Need to take care of the case when we could not deliver events */
    882   /* to the application because we were flow controlled */
    883   if (enable && (p_port->rx.queue_size != 0)) {
    884     events = PORT_EV_RXCHAR;
    885     if (p_port->rx_flag_ev_pending) {
    886       p_port->rx_flag_ev_pending = false;
    887       events |= PORT_EV_RXFLAG;
    888     }
    889 
    890     events &= p_port->ev_mask;
    891     if (p_port->p_callback && events) {
    892       p_port->p_callback(events, p_port->inx);
    893     }
    894   }
    895   return (PORT_SUCCESS);
    896 }
    897 
    898 /*******************************************************************************
    899  *
    900  * Function         PORT_GetModemStatus
    901  *
    902  * Description      This function retrieves modem control signals.  Normally
    903  *                  application will call this function after a callback
    904  *                  function is called with notification that one of signals
    905  *                  has been changed.
    906  *
    907  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    908  *                  p_signal   - specify the pointer to control signals info
    909  *
    910  ******************************************************************************/
    911 int PORT_GetModemStatus(uint16_t handle, uint8_t* p_signal) {
    912   tPORT* p_port;
    913 
    914   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    915     return (PORT_BAD_HANDLE);
    916   }
    917 
    918   p_port = &rfc_cb.port.port[handle - 1];
    919 
    920   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    921     return (PORT_NOT_OPENED);
    922   }
    923 
    924   *p_signal = p_port->peer_ctrl.modem_signal;
    925 
    926   RFCOMM_TRACE_API("PORT_GetModemStatus() handle:%d signal:%x", handle,
    927                    *p_signal);
    928 
    929   return (PORT_SUCCESS);
    930 }
    931 
    932 /*******************************************************************************
    933  *
    934  * Function         PORT_ClearError
    935  *
    936  * Description      This function retreives information about a communications
    937  *                  error and reports current status of a connection.  The
    938  *                  function should be called when an error occures to clear
    939  *                  the connection error flag and to enable additional read
    940  *                  and write operations.
    941  *
    942  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    943  *                  p_errors   - pointer of the variable to receive error codes
    944  *                  p_status   - pointer to the tPORT_STATUS structur to receive
    945  *                               connection status
    946  *
    947  ******************************************************************************/
    948 int PORT_ClearError(uint16_t handle, uint16_t* p_errors,
    949                     tPORT_STATUS* p_status) {
    950   tPORT* p_port;
    951 
    952   RFCOMM_TRACE_API("PORT_ClearError() handle:%d", handle);
    953 
    954   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    955     return (PORT_BAD_HANDLE);
    956   }
    957 
    958   p_port = &rfc_cb.port.port[handle - 1];
    959 
    960   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    961     return (PORT_NOT_OPENED);
    962   }
    963 
    964   *p_errors = p_port->line_status;
    965 
    966   /* This is the only call to clear error status.  We can not clear */
    967   /* connection failed status.  To clean it port should be closed and reopened
    968    */
    969   p_port->line_status = (p_port->line_status & LINE_STATUS_FAILED);
    970 
    971   PORT_GetQueueStatus(handle, p_status);
    972   return (PORT_SUCCESS);
    973 }
    974 
    975 /*******************************************************************************
    976  *
    977  * Function         PORT_SendError
    978  *
    979  * Description      This function send a communications error to the peer device
    980  *
    981  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
    982  *                  errors     - receive error codes
    983  *
    984  ******************************************************************************/
    985 int PORT_SendError(uint16_t handle, uint8_t errors) {
    986   tPORT* p_port;
    987 
    988   RFCOMM_TRACE_API("PORT_SendError() handle:%d errors:0x%x", handle, errors);
    989 
    990   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
    991     return (PORT_BAD_HANDLE);
    992   }
    993 
    994   p_port = &rfc_cb.port.port[handle - 1];
    995 
    996   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
    997     return (PORT_NOT_OPENED);
    998   }
    999 
   1000   if (!p_port->rfc.p_mcb) {
   1001     return (PORT_NOT_OPENED);
   1002   }
   1003 
   1004   RFCOMM_LineStatusReq(p_port->rfc.p_mcb, p_port->dlci, errors);
   1005   return (PORT_SUCCESS);
   1006 }
   1007 
   1008 /*******************************************************************************
   1009  *
   1010  * Function         PORT_GetQueueStatus
   1011  *
   1012  * Description      This function reports current status of a connection.
   1013  *
   1014  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
   1015  *                  p_status   - pointer to the tPORT_STATUS structur to receive
   1016  *                               connection status
   1017  *
   1018  ******************************************************************************/
   1019 int PORT_GetQueueStatus(uint16_t handle, tPORT_STATUS* p_status) {
   1020   tPORT* p_port;
   1021 
   1022   /* RFCOMM_TRACE_API ("PORT_GetQueueStatus() handle:%d", handle); */
   1023 
   1024   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
   1025     return (PORT_BAD_HANDLE);
   1026   }
   1027 
   1028   p_port = &rfc_cb.port.port[handle - 1];
   1029 
   1030   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
   1031     return (PORT_NOT_OPENED);
   1032   }
   1033 
   1034   p_status->in_queue_size = (uint16_t)p_port->rx.queue_size;
   1035   p_status->out_queue_size = (uint16_t)p_port->tx.queue_size;
   1036 
   1037   p_status->mtu_size = (uint16_t)p_port->peer_mtu;
   1038 
   1039   p_status->flags = 0;
   1040 
   1041   if (!(p_port->peer_ctrl.modem_signal & PORT_CTSRTS_ON))
   1042     p_status->flags |= PORT_FLAG_CTS_HOLD;
   1043 
   1044   if (!(p_port->peer_ctrl.modem_signal & PORT_DTRDSR_ON))
   1045     p_status->flags |= PORT_FLAG_DSR_HOLD;
   1046 
   1047   if (!(p_port->peer_ctrl.modem_signal & PORT_DCD_ON))
   1048     p_status->flags |= PORT_FLAG_RLSD_HOLD;
   1049 
   1050   return (PORT_SUCCESS);
   1051 }
   1052 
   1053 /*******************************************************************************
   1054  *
   1055  * Function         PORT_Purge
   1056  *
   1057  * Description      This function discards all the data from the output or
   1058  *                  input queues of the specified connection.
   1059  *
   1060  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
   1061  *                  purge_flags - specify the action to take.
   1062  *
   1063  ******************************************************************************/
   1064 int PORT_Purge(uint16_t handle, uint8_t purge_flags) {
   1065   tPORT* p_port;
   1066   BT_HDR* p_buf;
   1067   uint16_t count;
   1068   uint32_t events;
   1069 
   1070   RFCOMM_TRACE_API("PORT_Purge() handle:%d flags:0x%x", handle, purge_flags);
   1071 
   1072   /* Check if handle is valid to avoid crashing */
   1073   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
   1074     return (PORT_BAD_HANDLE);
   1075   }
   1076 
   1077   p_port = &rfc_cb.port.port[handle - 1];
   1078 
   1079   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
   1080     return (PORT_NOT_OPENED);
   1081   }
   1082 
   1083   if (purge_flags & PORT_PURGE_RXCLEAR) {
   1084     mutex_global_lock(); /* to prevent missing credit */
   1085 
   1086     count = fixed_queue_length(p_port->rx.queue);
   1087 
   1088     while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_port->rx.queue)) != NULL)
   1089       osi_free(p_buf);
   1090 
   1091     p_port->rx.queue_size = 0;
   1092 
   1093     mutex_global_unlock();
   1094 
   1095     /* If we flowed controlled peer based on rx_queue size enable data again */
   1096     if (count) port_flow_control_peer(p_port, true, count);
   1097   }
   1098 
   1099   if (purge_flags & PORT_PURGE_TXCLEAR) {
   1100     mutex_global_lock(); /* to prevent tx.queue_size from being negative */
   1101 
   1102     while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_port->tx.queue)) != NULL)
   1103       osi_free(p_buf);
   1104 
   1105     p_port->tx.queue_size = 0;
   1106 
   1107     mutex_global_unlock();
   1108 
   1109     events = PORT_EV_TXEMPTY;
   1110 
   1111     events |= port_flow_control_user(p_port);
   1112 
   1113     events &= p_port->ev_mask;
   1114 
   1115     if ((p_port->p_callback != NULL) && events)
   1116       (p_port->p_callback)(events, p_port->inx);
   1117   }
   1118 
   1119   return (PORT_SUCCESS);
   1120 }
   1121 
   1122 /*******************************************************************************
   1123  *
   1124  * Function         PORT_ReadData
   1125  *
   1126  * Description      Normally not GKI aware application will call this function
   1127  *                  after receiving PORT_EV_RXCHAR event.
   1128  *
   1129  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
   1130  *                  p_data      - Data area
   1131  *                  max_len     - Byte count requested
   1132  *                  p_len       - Byte count received
   1133  *
   1134  ******************************************************************************/
   1135 int PORT_ReadData(uint16_t handle, char* p_data, uint16_t max_len,
   1136                   uint16_t* p_len) {
   1137   tPORT* p_port;
   1138   BT_HDR* p_buf;
   1139   uint16_t count;
   1140 
   1141   RFCOMM_TRACE_API("PORT_ReadData() handle:%d max_len:%d", handle, max_len);
   1142 
   1143   /* Initialize this in case of an error */
   1144   *p_len = 0;
   1145 
   1146   /* Check if handle is valid to avoid crashing */
   1147   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
   1148     return (PORT_BAD_HANDLE);
   1149   }
   1150 
   1151   p_port = &rfc_cb.port.port[handle - 1];
   1152 
   1153   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
   1154     return (PORT_NOT_OPENED);
   1155   }
   1156 
   1157   if (p_port->line_status) {
   1158     return (PORT_LINE_ERR);
   1159   }
   1160 
   1161   if (fixed_queue_is_empty(p_port->rx.queue)) return (PORT_SUCCESS);
   1162 
   1163   count = 0;
   1164 
   1165   while (max_len) {
   1166     p_buf = (BT_HDR*)fixed_queue_try_peek_first(p_port->rx.queue);
   1167     if (p_buf == NULL) break;
   1168 
   1169     if (p_buf->len > max_len) {
   1170       memcpy(p_data, (uint8_t*)(p_buf + 1) + p_buf->offset, max_len);
   1171       p_buf->offset += max_len;
   1172       p_buf->len -= max_len;
   1173 
   1174       *p_len += max_len;
   1175 
   1176       mutex_global_lock();
   1177 
   1178       p_port->rx.queue_size -= max_len;
   1179 
   1180       mutex_global_unlock();
   1181 
   1182       break;
   1183     } else {
   1184       memcpy(p_data, (uint8_t*)(p_buf + 1) + p_buf->offset, p_buf->len);
   1185 
   1186       *p_len += p_buf->len;
   1187       max_len -= p_buf->len;
   1188 
   1189       mutex_global_lock();
   1190 
   1191       p_port->rx.queue_size -= p_buf->len;
   1192 
   1193       if (max_len) {
   1194         p_data += p_buf->len;
   1195       }
   1196 
   1197       osi_free(fixed_queue_try_dequeue(p_port->rx.queue));
   1198 
   1199       mutex_global_unlock();
   1200 
   1201       count++;
   1202     }
   1203   }
   1204 
   1205   if (*p_len == 1) {
   1206     RFCOMM_TRACE_EVENT("PORT_ReadData queue:%d returned:%d %x",
   1207                        p_port->rx.queue_size, *p_len, (p_data[0]));
   1208   } else {
   1209     RFCOMM_TRACE_EVENT("PORT_ReadData queue:%d returned:%d",
   1210                        p_port->rx.queue_size, *p_len);
   1211   }
   1212 
   1213   /* If rfcomm suspended traffic from the peer based on the rx_queue_size */
   1214   /* check if it can be resumed now */
   1215   port_flow_control_peer(p_port, true, count);
   1216 
   1217   return (PORT_SUCCESS);
   1218 }
   1219 
   1220 /*******************************************************************************
   1221  *
   1222  * Function         PORT_Read
   1223  *
   1224  * Description      Normally application will call this function after receiving
   1225  *                  PORT_EV_RXCHAR event.
   1226  *
   1227  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
   1228  *                  pp_buf      - pointer to address of buffer with data,
   1229  *
   1230  ******************************************************************************/
   1231 int PORT_Read(uint16_t handle, BT_HDR** pp_buf) {
   1232   tPORT* p_port;
   1233   BT_HDR* p_buf;
   1234 
   1235   RFCOMM_TRACE_API("PORT_Read() handle:%d", handle);
   1236 
   1237   /* Check if handle is valid to avoid crashing */
   1238   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
   1239     return (PORT_BAD_HANDLE);
   1240   }
   1241   p_port = &rfc_cb.port.port[handle - 1];
   1242 
   1243   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
   1244     return (PORT_NOT_OPENED);
   1245   }
   1246 
   1247   if (p_port->line_status) {
   1248     return (PORT_LINE_ERR);
   1249   }
   1250 
   1251   mutex_global_lock();
   1252 
   1253   p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_port->rx.queue);
   1254   if (p_buf) {
   1255     p_port->rx.queue_size -= p_buf->len;
   1256 
   1257     mutex_global_unlock();
   1258 
   1259     /* If rfcomm suspended traffic from the peer based on the rx_queue_size */
   1260     /* check if it can be resumed now */
   1261     port_flow_control_peer(p_port, true, 1);
   1262   } else {
   1263     mutex_global_unlock();
   1264   }
   1265 
   1266   *pp_buf = p_buf;
   1267   return (PORT_SUCCESS);
   1268 }
   1269 
   1270 /*******************************************************************************
   1271  *
   1272  * Function         port_write
   1273  *
   1274  * Description      This function when a data packet is received from the apper
   1275  *                  layer task.
   1276  *
   1277  * Parameters:      p_port     - pointer to address of port control block
   1278  *                  p_buf      - pointer to address of buffer with data,
   1279  *
   1280  ******************************************************************************/
   1281 static int port_write(tPORT* p_port, BT_HDR* p_buf) {
   1282   /* We should not allow to write data in to server port when connection is not
   1283    * opened */
   1284   if (p_port->is_server && (p_port->rfc.state != RFC_STATE_OPENED)) {
   1285     osi_free(p_buf);
   1286     return (PORT_CLOSED);
   1287   }
   1288 
   1289   /* Keep the data in pending queue if peer does not allow data, or */
   1290   /* Peer is not ready or Port is not yet opened or initial port control */
   1291   /* command has not been sent */
   1292   if (p_port->tx.peer_fc || !p_port->rfc.p_mcb ||
   1293       !p_port->rfc.p_mcb->peer_ready ||
   1294       (p_port->rfc.state != RFC_STATE_OPENED) ||
   1295       ((p_port->port_ctrl & (PORT_CTRL_REQ_SENT | PORT_CTRL_IND_RECEIVED)) !=
   1296        (PORT_CTRL_REQ_SENT | PORT_CTRL_IND_RECEIVED))) {
   1297     if ((p_port->tx.queue_size > PORT_TX_CRITICAL_WM) ||
   1298         (fixed_queue_length(p_port->tx.queue) > PORT_TX_BUF_CRITICAL_WM)) {
   1299       RFCOMM_TRACE_WARNING("PORT_Write: Queue size: %d", p_port->tx.queue_size);
   1300 
   1301       osi_free(p_buf);
   1302 
   1303       if ((p_port->p_callback != NULL) && (p_port->ev_mask & PORT_EV_ERR))
   1304         p_port->p_callback(PORT_EV_ERR, p_port->inx);
   1305 
   1306       return (PORT_TX_FULL);
   1307     }
   1308 
   1309     RFCOMM_TRACE_EVENT(
   1310         "PORT_Write : Data is enqued. flow disabled %d peer_ready %d state %d "
   1311         "ctrl_state %x",
   1312         p_port->tx.peer_fc,
   1313         (p_port->rfc.p_mcb && p_port->rfc.p_mcb->peer_ready), p_port->rfc.state,
   1314         p_port->port_ctrl);
   1315 
   1316     fixed_queue_enqueue(p_port->tx.queue, p_buf);
   1317     p_port->tx.queue_size += p_buf->len;
   1318 
   1319     return (PORT_CMD_PENDING);
   1320   } else {
   1321     RFCOMM_TRACE_EVENT("PORT_Write : Data is being sent");
   1322 
   1323     RFCOMM_DataReq(p_port->rfc.p_mcb, p_port->dlci, p_buf);
   1324     return (PORT_SUCCESS);
   1325   }
   1326 }
   1327 
   1328 /*******************************************************************************
   1329  *
   1330  * Function         PORT_Write
   1331  *
   1332  * Description      This function when a data packet is received from the apper
   1333  *                  layer task.
   1334  *
   1335  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
   1336  *                  pp_buf      - pointer to address of buffer with data,
   1337  *
   1338  ******************************************************************************/
   1339 int PORT_Write(uint16_t handle, BT_HDR* p_buf) {
   1340   tPORT* p_port;
   1341   uint32_t event = 0;
   1342   int rc;
   1343 
   1344   RFCOMM_TRACE_API("PORT_Write() handle:%d", handle);
   1345 
   1346   /* Check if handle is valid to avoid crashing */
   1347   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
   1348     osi_free(p_buf);
   1349     return (PORT_BAD_HANDLE);
   1350   }
   1351 
   1352   p_port = &rfc_cb.port.port[handle - 1];
   1353 
   1354   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
   1355     osi_free(p_buf);
   1356     return (PORT_NOT_OPENED);
   1357   }
   1358 
   1359   if (p_port->line_status) {
   1360     RFCOMM_TRACE_WARNING("PORT_Write: Data dropped line_status:0x%x",
   1361                          p_port->line_status);
   1362     osi_free(p_buf);
   1363     return (PORT_LINE_ERR);
   1364   }
   1365 
   1366   rc = port_write(p_port, p_buf);
   1367   event |= port_flow_control_user(p_port);
   1368 
   1369   switch (rc) {
   1370     case PORT_TX_FULL:
   1371       event |= PORT_EV_ERR;
   1372       break;
   1373 
   1374     case PORT_SUCCESS:
   1375       event |= (PORT_EV_TXCHAR | PORT_EV_TXEMPTY);
   1376       break;
   1377   }
   1378   /* Mask out all events that are not of interest to user */
   1379   event &= p_port->ev_mask;
   1380 
   1381   /* Send event to the application */
   1382   if (p_port->p_callback && event) (p_port->p_callback)(event, p_port->inx);
   1383 
   1384   return (PORT_SUCCESS);
   1385 }
   1386 /*******************************************************************************
   1387  *
   1388  * Function         PORT_WriteDataCO
   1389  *
   1390  * Description      Normally not GKI aware application will call this function
   1391  *                  to send data to the port by callout functions
   1392  *
   1393  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
   1394  *                  fd         - socket fd
   1395  *                  p_len      - Byte count returned
   1396  *
   1397  ******************************************************************************/
   1398 int PORT_WriteDataCO(uint16_t handle, int* p_len) {
   1399   tPORT* p_port;
   1400   BT_HDR* p_buf;
   1401   uint32_t event = 0;
   1402   int rc = 0;
   1403   uint16_t length;
   1404 
   1405   RFCOMM_TRACE_API("PORT_WriteDataCO() handle:%d", handle);
   1406   *p_len = 0;
   1407 
   1408   /* Check if handle is valid to avoid crashing */
   1409   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
   1410     return (PORT_BAD_HANDLE);
   1411   }
   1412   p_port = &rfc_cb.port.port[handle - 1];
   1413 
   1414   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
   1415     RFCOMM_TRACE_WARNING("PORT_WriteDataByFd() no port state:%d",
   1416                          p_port->state);
   1417     return (PORT_NOT_OPENED);
   1418   }
   1419 
   1420   if (!p_port->peer_mtu) {
   1421     RFCOMM_TRACE_ERROR("PORT_WriteDataByFd() peer_mtu:%d", p_port->peer_mtu);
   1422     return (PORT_UNKNOWN_ERROR);
   1423   }
   1424   int available = 0;
   1425   // if(ioctl(fd, FIONREAD, &available) < 0)
   1426   if (p_port->p_data_co_callback(
   1427           handle, (uint8_t*)&available, sizeof(available),
   1428           DATA_CO_CALLBACK_TYPE_OUTGOING_SIZE) == false) {
   1429     RFCOMM_TRACE_ERROR(
   1430         "p_data_co_callback DATA_CO_CALLBACK_TYPE_INCOMING_SIZE failed, "
   1431         "available:%d",
   1432         available);
   1433     return (PORT_UNKNOWN_ERROR);
   1434   }
   1435   if (available == 0) return PORT_SUCCESS;
   1436   /* Length for each buffer is the smaller of GKI buffer, peer MTU, or max_len
   1437    */
   1438   length = RFCOMM_DATA_BUF_SIZE -
   1439            (uint16_t)(sizeof(BT_HDR) + L2CAP_MIN_OFFSET + RFCOMM_DATA_OVERHEAD);
   1440 
   1441   /* If there are buffers scheduled for transmission check if requested */
   1442   /* data fits into the end of the queue */
   1443   mutex_global_lock();
   1444 
   1445   p_buf = (BT_HDR*)fixed_queue_try_peek_last(p_port->tx.queue);
   1446   if ((p_buf != NULL) &&
   1447       (((int)p_buf->len + available) <= (int)p_port->peer_mtu) &&
   1448       (((int)p_buf->len + available) <= (int)length)) {
   1449     // if(recv(fd, (uint8_t *)(p_buf + 1) + p_buf->offset + p_buf->len,
   1450     // available, 0) != available)
   1451     if (p_port->p_data_co_callback(
   1452             handle, (uint8_t*)(p_buf + 1) + p_buf->offset + p_buf->len,
   1453             available, DATA_CO_CALLBACK_TYPE_OUTGOING) == false)
   1454 
   1455     {
   1456       error(
   1457           "p_data_co_callback DATA_CO_CALLBACK_TYPE_OUTGOING failed, "
   1458           "available:%d",
   1459           available);
   1460       mutex_global_unlock();
   1461       return (PORT_UNKNOWN_ERROR);
   1462     }
   1463     // memcpy ((uint8_t *)(p_buf + 1) + p_buf->offset + p_buf->len, p_data,
   1464     // max_len);
   1465     p_port->tx.queue_size += (uint16_t)available;
   1466 
   1467     *p_len = available;
   1468     p_buf->len += (uint16_t)available;
   1469 
   1470     mutex_global_unlock();
   1471 
   1472     return (PORT_SUCCESS);
   1473   }
   1474 
   1475   mutex_global_unlock();
   1476 
   1477   // int max_read = length < p_port->peer_mtu ? length : p_port->peer_mtu;
   1478 
   1479   // max_read = available < max_read ? available : max_read;
   1480 
   1481   while (available) {
   1482     /* if we're over buffer high water mark, we're done */
   1483     if ((p_port->tx.queue_size > PORT_TX_HIGH_WM) ||
   1484         (fixed_queue_length(p_port->tx.queue) > PORT_TX_BUF_HIGH_WM)) {
   1485       port_flow_control_user(p_port);
   1486       event |= PORT_EV_FC;
   1487       RFCOMM_TRACE_EVENT(
   1488           "tx queue is full,tx.queue_size:%d,tx.queue.count:%d,available:%d",
   1489           p_port->tx.queue_size, fixed_queue_length(p_port->tx.queue),
   1490           available);
   1491       break;
   1492     }
   1493 
   1494     /* continue with rfcomm data write */
   1495     p_buf = (BT_HDR*)osi_malloc(RFCOMM_DATA_BUF_SIZE);
   1496     p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET;
   1497     p_buf->layer_specific = handle;
   1498 
   1499     if (p_port->peer_mtu < length) length = p_port->peer_mtu;
   1500     if (available < (int)length) length = (uint16_t)available;
   1501     p_buf->len = length;
   1502     p_buf->event = BT_EVT_TO_BTU_SP_DATA;
   1503 
   1504     // memcpy ((uint8_t *)(p_buf + 1) + p_buf->offset, p_data, length);
   1505     // if(recv(fd, (uint8_t *)(p_buf + 1) + p_buf->offset, (int)length, 0) !=
   1506     // (int)length)
   1507     if (p_port->p_data_co_callback(
   1508             handle, (uint8_t*)(p_buf + 1) + p_buf->offset, length,
   1509             DATA_CO_CALLBACK_TYPE_OUTGOING) == false) {
   1510       error(
   1511           "p_data_co_callback DATA_CO_CALLBACK_TYPE_OUTGOING failed, length:%d",
   1512           length);
   1513       return (PORT_UNKNOWN_ERROR);
   1514     }
   1515 
   1516     RFCOMM_TRACE_EVENT("PORT_WriteData %d bytes", length);
   1517 
   1518     rc = port_write(p_port, p_buf);
   1519 
   1520     /* If queue went below the threashold need to send flow control */
   1521     event |= port_flow_control_user(p_port);
   1522 
   1523     if (rc == PORT_SUCCESS) event |= PORT_EV_TXCHAR;
   1524 
   1525     if ((rc != PORT_SUCCESS) && (rc != PORT_CMD_PENDING)) break;
   1526 
   1527     *p_len += length;
   1528     available -= (int)length;
   1529   }
   1530   if (!available && (rc != PORT_CMD_PENDING) && (rc != PORT_TX_QUEUE_DISABLED))
   1531     event |= PORT_EV_TXEMPTY;
   1532 
   1533   /* Mask out all events that are not of interest to user */
   1534   event &= p_port->ev_mask;
   1535 
   1536   /* Send event to the application */
   1537   if (p_port->p_callback && event) (p_port->p_callback)(event, p_port->inx);
   1538 
   1539   return (PORT_SUCCESS);
   1540 }
   1541 
   1542 /*******************************************************************************
   1543  *
   1544  * Function         PORT_WriteData
   1545  *
   1546  * Description      Normally not GKI aware application will call this function
   1547  *                  to send data to the port.
   1548  *
   1549  * Parameters:      handle     - Handle returned in the RFCOMM_CreateConnection
   1550  *                  p_data      - Data area
   1551  *                  max_len     - Byte count requested
   1552  *                  p_len       - Byte count received
   1553  *
   1554  ******************************************************************************/
   1555 int PORT_WriteData(uint16_t handle, const char* p_data, uint16_t max_len,
   1556                    uint16_t* p_len) {
   1557   tPORT* p_port;
   1558   BT_HDR* p_buf;
   1559   uint32_t event = 0;
   1560   int rc = 0;
   1561   uint16_t length;
   1562 
   1563   RFCOMM_TRACE_API("PORT_WriteData() max_len:%d", max_len);
   1564 
   1565   *p_len = 0;
   1566 
   1567   /* Check if handle is valid to avoid crashing */
   1568   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
   1569     return (PORT_BAD_HANDLE);
   1570   }
   1571   p_port = &rfc_cb.port.port[handle - 1];
   1572 
   1573   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
   1574     RFCOMM_TRACE_WARNING("PORT_WriteData() no port state:%d", p_port->state);
   1575     return (PORT_NOT_OPENED);
   1576   }
   1577 
   1578   if (!max_len || !p_port->peer_mtu) {
   1579     RFCOMM_TRACE_ERROR("PORT_WriteData() peer_mtu:%d", p_port->peer_mtu);
   1580     return (PORT_UNKNOWN_ERROR);
   1581   }
   1582 
   1583   /* Length for each buffer is the smaller of GKI buffer, peer MTU, or max_len
   1584    */
   1585   length = RFCOMM_DATA_BUF_SIZE -
   1586            (uint16_t)(sizeof(BT_HDR) + L2CAP_MIN_OFFSET + RFCOMM_DATA_OVERHEAD);
   1587 
   1588   /* If there are buffers scheduled for transmission check if requested */
   1589   /* data fits into the end of the queue */
   1590   mutex_global_lock();
   1591 
   1592   p_buf = (BT_HDR*)fixed_queue_try_peek_last(p_port->tx.queue);
   1593   if ((p_buf != NULL) && ((p_buf->len + max_len) <= p_port->peer_mtu) &&
   1594       ((p_buf->len + max_len) <= length)) {
   1595     memcpy((uint8_t*)(p_buf + 1) + p_buf->offset + p_buf->len, p_data, max_len);
   1596     p_port->tx.queue_size += max_len;
   1597 
   1598     *p_len = max_len;
   1599     p_buf->len += max_len;
   1600 
   1601     mutex_global_unlock();
   1602 
   1603     return (PORT_SUCCESS);
   1604   }
   1605 
   1606   mutex_global_unlock();
   1607 
   1608   while (max_len) {
   1609     /* if we're over buffer high water mark, we're done */
   1610     if ((p_port->tx.queue_size > PORT_TX_HIGH_WM) ||
   1611         (fixed_queue_length(p_port->tx.queue) > PORT_TX_BUF_HIGH_WM))
   1612       break;
   1613 
   1614     /* continue with rfcomm data write */
   1615     p_buf = (BT_HDR*)osi_malloc(RFCOMM_DATA_BUF_SIZE);
   1616     p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET;
   1617     p_buf->layer_specific = handle;
   1618 
   1619     if (p_port->peer_mtu < length) length = p_port->peer_mtu;
   1620     if (max_len < length) length = max_len;
   1621     p_buf->len = length;
   1622     p_buf->event = BT_EVT_TO_BTU_SP_DATA;
   1623 
   1624     memcpy((uint8_t*)(p_buf + 1) + p_buf->offset, p_data, length);
   1625 
   1626     RFCOMM_TRACE_EVENT("PORT_WriteData %d bytes", length);
   1627 
   1628     rc = port_write(p_port, p_buf);
   1629 
   1630     /* If queue went below the threashold need to send flow control */
   1631     event |= port_flow_control_user(p_port);
   1632 
   1633     if (rc == PORT_SUCCESS) event |= PORT_EV_TXCHAR;
   1634 
   1635     if ((rc != PORT_SUCCESS) && (rc != PORT_CMD_PENDING)) break;
   1636 
   1637     *p_len += length;
   1638     max_len -= length;
   1639     p_data += length;
   1640   }
   1641   if (!max_len && (rc != PORT_CMD_PENDING) && (rc != PORT_TX_QUEUE_DISABLED))
   1642     event |= PORT_EV_TXEMPTY;
   1643 
   1644   /* Mask out all events that are not of interest to user */
   1645   event &= p_port->ev_mask;
   1646 
   1647   /* Send event to the application */
   1648   if (p_port->p_callback && event) (p_port->p_callback)(event, p_port->inx);
   1649 
   1650   return (PORT_SUCCESS);
   1651 }
   1652 
   1653 /*******************************************************************************
   1654  *
   1655  * Function         PORT_Test
   1656  *
   1657  * Description      Application can call this function to send RFCOMM Test frame
   1658  *
   1659  * Parameters:      handle      - Handle returned in the RFCOMM_CreateConnection
   1660  *                  p_data      - Data area
   1661  *                  max_len     - Byte count requested
   1662  *
   1663  ******************************************************************************/
   1664 int PORT_Test(uint16_t handle, uint8_t* p_data, uint16_t len) {
   1665   tPORT* p_port;
   1666 
   1667   RFCOMM_TRACE_API("PORT_Test() len:%d", len);
   1668 
   1669   if ((handle == 0) || (handle > MAX_RFC_PORTS)) {
   1670     return (PORT_BAD_HANDLE);
   1671   }
   1672   p_port = &rfc_cb.port.port[handle - 1];
   1673 
   1674   if (!p_port->in_use || (p_port->state == PORT_STATE_CLOSED)) {
   1675     return (PORT_NOT_OPENED);
   1676   }
   1677 
   1678   if (len > ((p_port->mtu == 0) ? RFCOMM_DEFAULT_MTU : p_port->mtu)) {
   1679     return (PORT_UNKNOWN_ERROR);
   1680   }
   1681 
   1682   BT_HDR* p_buf = (BT_HDR*)osi_malloc(RFCOMM_CMD_BUF_SIZE);
   1683   p_buf->offset = L2CAP_MIN_OFFSET + RFCOMM_MIN_OFFSET + 2;
   1684   p_buf->len = len;
   1685 
   1686   memcpy((uint8_t*)(p_buf + 1) + p_buf->offset, p_data, p_buf->len);
   1687 
   1688   rfc_send_test(p_port->rfc.p_mcb, true, p_buf);
   1689 
   1690   return (PORT_SUCCESS);
   1691 }
   1692 
   1693 /*******************************************************************************
   1694  *
   1695  * Function         RFCOMM_Init
   1696  *
   1697  * Description      This function is called to initialize RFCOMM layer
   1698  *
   1699  ******************************************************************************/
   1700 void RFCOMM_Init(void) {
   1701   memset(&rfc_cb, 0, sizeof(tRFC_CB)); /* Init RFCOMM control block */
   1702 
   1703   rfc_cb.rfc.last_mux = MAX_BD_CONNECTIONS;
   1704 
   1705 #if defined(RFCOMM_INITIAL_TRACE_LEVEL)
   1706   rfc_cb.trace_level = RFCOMM_INITIAL_TRACE_LEVEL;
   1707 #else
   1708   rfc_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */
   1709 #endif
   1710 
   1711   rfcomm_l2cap_if_init();
   1712 }
   1713 
   1714 /*******************************************************************************
   1715  *
   1716  * Function         PORT_SetTraceLevel
   1717  *
   1718  * Description      Set the trace level for RFCOMM. If called with 0xFF, it
   1719  *                  simply reads the current trace level.
   1720  *
   1721  * Returns          the new (current) trace level
   1722  *
   1723  ******************************************************************************/
   1724 uint8_t PORT_SetTraceLevel(uint8_t new_level) {
   1725   if (new_level != 0xFF) rfc_cb.trace_level = new_level;
   1726 
   1727   return (rfc_cb.trace_level);
   1728 }
   1729 
   1730 /*******************************************************************************
   1731  *
   1732  * Function         PORT_GetResultString
   1733  *
   1734  * Description      This function returns the human-readable string for a given
   1735  *                  result code.
   1736  *
   1737  * Returns          a pointer to the human-readable string for the given result.
   1738  *
   1739  ******************************************************************************/
   1740 const char* PORT_GetResultString(const uint8_t result_code) {
   1741   if (result_code > PORT_ERR_MAX) {
   1742     return result_code_strings[PORT_ERR_MAX];
   1743   }
   1744 
   1745   return result_code_strings[result_code];
   1746 }
   1747