/******************************************************************************
 *
 *  Copyright (C) 1999-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  Port Emulation entity utilities
 *
 ******************************************************************************/
#include <string.h>

#include "osi/include/mutex.h"

#include "bt_target.h"
#include "bt_common.h"
#include "btm_int.h"
#include "btu.h"
#include "l2cdefs.h"
#include "port_api.h"
#include "port_int.h"
#include "rfc_int.h"
#include "rfcdefs.h"

static const tPORT_STATE default_port_pars =
{
    PORT_BAUD_RATE_9600,
    PORT_8_BITS,
    PORT_ONESTOPBIT,
    PORT_PARITY_NO,
    PORT_ODD_PARITY,
    PORT_FC_OFF,
    0,                      /* No rx_char */
    PORT_XON_DC1,
    PORT_XOFF_DC3,
};



/*******************************************************************************
**
** Function         port_allocate_port
**
** Description      Look through the Port Control Blocks for a free one.  Note
**                  that one server can open several ports with the same SCN
**                  if it can support simulteneous requests from different
**                  clients.
**
** Returns          Pointer to the PORT or NULL if not found
**
*******************************************************************************/
tPORT *port_allocate_port (uint8_t dlci, BD_ADDR bd_addr)
{
    tPORT  *p_port = &rfc_cb.port.port[0];
    uint8_t xx, yy;

    for (xx = 0, yy = rfc_cb.rfc.last_port + 1; xx < MAX_RFC_PORTS; xx++, yy++)
    {
        if (yy >= MAX_RFC_PORTS)
            yy = 0;

        p_port = &rfc_cb.port.port[yy];
        if (!p_port->in_use)
        {
            memset(p_port, 0, sizeof (tPORT));

            p_port->in_use = true;
            p_port->inx    = yy + 1;

            /* During the open set default state for the port connection */
            port_set_defaults (p_port);

            p_port->rfc.port_timer = alarm_new("rfcomm_port.port_timer");
            rfc_cb.rfc.last_port = yy;

            p_port->dlci   = dlci;
            memcpy (p_port->bd_addr, bd_addr, BD_ADDR_LEN);

            RFCOMM_TRACE_DEBUG("rfc_cb.port.port[%d]:%p allocated, last_port:%d", yy, p_port, rfc_cb.rfc.last_port);
            RFCOMM_TRACE_DEBUG("port_allocate_port:bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
                                bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
            return (p_port);
        }
    }

    /* If here, no free PORT found */
    return (NULL);
}


/*******************************************************************************
**
** Function         port_set_defaults
**
** Description      Set defualt port parameters
**
**
*******************************************************************************/
void port_set_defaults (tPORT *p_port)
{
    p_port->ev_mask        = 0;
    p_port->p_callback     = NULL;
    p_port->port_ctrl      = 0;
    p_port->error          = 0;
    p_port->line_status    = 0;
    p_port->rx_flag_ev_pending = false;
    p_port->peer_mtu       = RFCOMM_DEFAULT_MTU;

    p_port->user_port_pars = default_port_pars;
    p_port->peer_port_pars = default_port_pars;

    p_port->credit_tx      = 0;
    p_port->credit_rx      = 0;

    memset (&p_port->local_ctrl, 0, sizeof (p_port->local_ctrl));
    memset (&p_port->peer_ctrl, 0, sizeof (p_port->peer_ctrl));
    memset (&p_port->rx, 0, sizeof (p_port->rx));
    memset (&p_port->tx, 0, sizeof (p_port->tx));

    p_port->tx.queue = fixed_queue_new(SIZE_MAX);
    p_port->rx.queue = fixed_queue_new(SIZE_MAX);
}

/*******************************************************************************
**
** Function         port_select_mtu
**
** Description      Select MTU which will best serve connection from our
**                  point of view.
**                  If our device is 1.2 or lower we calculate how many DH5s
**                  fit into 1 RFCOMM buffer.
**
**
*******************************************************************************/
void port_select_mtu (tPORT *p_port)
{
    uint16_t packet_size;

    /* Will select MTU only if application did not setup something */
    if (p_port->mtu == 0)
    {
        /* find packet size which connection supports */
        packet_size = btm_get_max_packet_size (p_port->bd_addr);
        if (packet_size == 0)
        {
            /* something is very wrong */
            RFCOMM_TRACE_WARNING ("port_select_mtu bad packet size");
            p_port->mtu = RFCOMM_DEFAULT_MTU;
        }
        else
        {
            /* We try to negotiate MTU that each packet can be split into whole
            number of max packets.  For example if link is 1.2 max packet size is 339 bytes.
            At first calculate how many whole packets it is.  MAX L2CAP is 1691 + 4 overhead.
            1695, that will be 5 Dh5 packets.  Now maximum RFCOMM packet is
            5 * 339 = 1695. Minus 4 bytes L2CAP header 1691.  Minus RFCOMM 6 bytes header overhead 1685

            For EDR 2.0 packet size is 1027.  So we better send RFCOMM packet as 1 3DH5 packet
            1 * 1027 = 1027.  Minus 4 bytes L2CAP header 1023.  Minus RFCOMM 6 bytes header overhead 1017 */
            if ((L2CAP_MTU_SIZE + L2CAP_PKT_OVERHEAD) >= packet_size)
            {
                p_port->mtu = ((L2CAP_MTU_SIZE + L2CAP_PKT_OVERHEAD) / packet_size * packet_size) - RFCOMM_DATA_OVERHEAD - L2CAP_PKT_OVERHEAD;
                RFCOMM_TRACE_DEBUG ("port_select_mtu selected %d based on connection speed", p_port->mtu);
            }
            else
            {
                p_port->mtu = L2CAP_MTU_SIZE - RFCOMM_DATA_OVERHEAD;
                RFCOMM_TRACE_DEBUG ("port_select_mtu selected %d based on l2cap PDU size", p_port->mtu);
            }
        }
    }
    else
    {
        RFCOMM_TRACE_DEBUG ("port_select_mtu application selected %d", p_port->mtu);
    }
    p_port->credit_rx_max  = (PORT_RX_HIGH_WM / p_port->mtu);
    if( p_port->credit_rx_max > PORT_RX_BUF_HIGH_WM )
        p_port->credit_rx_max = PORT_RX_BUF_HIGH_WM;
    p_port->credit_rx_low  = (PORT_RX_LOW_WM / p_port->mtu);
    if( p_port->credit_rx_low > PORT_RX_BUF_LOW_WM )
        p_port->credit_rx_low = PORT_RX_BUF_LOW_WM;
    p_port->rx_buf_critical = (PORT_RX_CRITICAL_WM / p_port->mtu);
    if( p_port->rx_buf_critical > PORT_RX_BUF_CRITICAL_WM )
        p_port->rx_buf_critical = PORT_RX_BUF_CRITICAL_WM;
    RFCOMM_TRACE_DEBUG ("port_select_mtu credit_rx_max %d, credit_rx_low %d, rx_buf_critical %d",
                          p_port->credit_rx_max, p_port->credit_rx_low, p_port->rx_buf_critical);
}

/*******************************************************************************
**
** Function         port_release_port
**
** Description      Release port control block.
**
** Returns          Pointer to the PORT or NULL if not found
**
*******************************************************************************/
void port_release_port(tPORT *p_port)
{
    RFCOMM_TRACE_DEBUG("%s p_port: %p state: %d keep_handle: %d", __func__,
        p_port, p_port->rfc.state, p_port->keep_port_handle);

    mutex_global_lock();
    BT_HDR *p_buf;
    while ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(p_port->rx.queue)) != NULL)
        osi_free(p_buf);
    p_port->rx.queue_size = 0;

    while ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(p_port->tx.queue)) != NULL)
        osi_free(p_buf);
    p_port->tx.queue_size = 0;
    mutex_global_unlock();

    alarm_cancel(p_port->rfc.port_timer);

    p_port->state = PORT_STATE_CLOSED;

    if (p_port->rfc.state == RFC_STATE_CLOSED)
    {
        if (p_port->rfc.p_mcb)
        {
            p_port->rfc.p_mcb->port_inx[p_port->dlci] = 0;

            /* If there are no more ports opened on this MCB release it */
            rfc_check_mcb_active(p_port->rfc.p_mcb);
        }

        rfc_port_timer_stop (p_port);
        fixed_queue_free(p_port->tx.queue, NULL);
        p_port->tx.queue = NULL;
        fixed_queue_free(p_port->rx.queue, NULL);
        p_port->rx.queue = NULL;

        if (p_port->keep_port_handle)
        {
            RFCOMM_TRACE_DEBUG("%s Re-initialize handle: %d", __func__, p_port->inx);

            /* save event mask and callback */
            uint32_t mask = p_port->ev_mask;
            tPORT_CALLBACK *p_port_cb = p_port->p_callback;
            tPORT_STATE user_port_pars = p_port->user_port_pars;

            port_set_defaults(p_port);

            /* restore */
            p_port->ev_mask         = mask;
            p_port->p_callback      = p_port_cb;
            p_port->user_port_pars  = user_port_pars;
            p_port->mtu             = p_port->keep_mtu;

            p_port->state           = PORT_STATE_OPENING;
            p_port->rfc.p_mcb       = NULL;
            if (p_port->is_server)
                p_port->dlci       &= 0xfe;

            p_port->local_ctrl.modem_signal = p_port->default_signal_state;
            memcpy (p_port->bd_addr, BT_BD_ANY, BD_ADDR_LEN);
        } else {
            RFCOMM_TRACE_DEBUG("%s Clean-up handle: %d", __func__, p_port->inx);
            alarm_free(p_port->rfc.port_timer);
            memset (p_port, 0, sizeof (tPORT));
        }
    }
}

/*******************************************************************************
**
** Function         port_find_mcb
**
** Description      This function checks if connection exists to device with
**                  the BD_ADDR.
**
*******************************************************************************/
tRFC_MCB *port_find_mcb (BD_ADDR bd_addr)
{
    int      i;

    for (i = 0; i < MAX_BD_CONNECTIONS; i++)
    {
        if ((rfc_cb.port.rfc_mcb[i].state != RFC_MX_STATE_IDLE)
         && !memcmp (rfc_cb.port.rfc_mcb[i].bd_addr, bd_addr, BD_ADDR_LEN))
        {
            /* Multiplexer channel found do not change anything */
            RFCOMM_TRACE_DEBUG("port_find_mcb: found  bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
                                bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
            RFCOMM_TRACE_DEBUG("port_find_mcb: rfc_cb.port.rfc_mcb:index:%d, %p, lcid:%d",
                                i, &rfc_cb.port.rfc_mcb[i], rfc_cb.port.rfc_mcb[i].lcid);
            return (&rfc_cb.port.rfc_mcb[i]);
        }
    }
    RFCOMM_TRACE_DEBUG("port_find_mcb: not found, bd_addr:%02x:%02x:%02x:%02x:%02x:%02x",
                         bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
    return (NULL);
}


/*******************************************************************************
**
** Function         port_find_mcb_dlci_port
**
** Description      Find port on the multiplexer channel based on DLCI.  If
**                  this port with DLCI not found try to use even DLCI.  This
**                  is for the case when client is establishing connection on
**                  none-initiator MCB.
**
** Returns          Pointer to the PORT or NULL if not found
**
*******************************************************************************/
tPORT *port_find_mcb_dlci_port (tRFC_MCB *p_mcb, uint8_t dlci)
{
    uint8_t inx;

    if (!p_mcb)
        return (NULL);

    if (dlci > RFCOMM_MAX_DLCI)
        return (NULL);

    inx = p_mcb->port_inx[dlci];
    if (inx == 0)
    {
        RFCOMM_TRACE_DEBUG("port_find_mcb_dlci_port: p_mcb:%p, port_inx[dlci:%d] is 0", p_mcb, dlci);
        return (NULL);
    }
    else
        return (&rfc_cb.port.port[inx - 1]);
}


/*******************************************************************************
**
** Function         port_find_dlci_port
**
** Description      Find port with DLCI not assigned to multiplexer channel
**
** Returns          Pointer to the PORT or NULL if not found
**
*******************************************************************************/
tPORT *port_find_dlci_port (uint8_t dlci)
{
    uint16_t i;
    tPORT  *p_port;

    for (i = 0; i < MAX_RFC_PORTS; i++)
    {
        p_port = &rfc_cb.port.port[i];

        if (p_port->in_use && (p_port->rfc.p_mcb == NULL))
        {
            if (p_port->dlci == dlci)
            {
                return (p_port);
            }
            else if ((dlci & 0x01) && (p_port->dlci == (dlci - 1)))
            {
                p_port->dlci++;
                return (p_port);
            }
        }
    }
    return (NULL);
}


/*******************************************************************************
**
** Function         port_find_port
**
** Description      Find port with DLCI, BD_ADDR
**
** Returns          Pointer to the PORT or NULL if not found
**
*******************************************************************************/
tPORT *port_find_port (uint8_t dlci, BD_ADDR bd_addr)
{
    uint16_t i;
    tPORT  *p_port;

    for (i = 0; i < MAX_RFC_PORTS; i++)
    {
        p_port = &rfc_cb.port.port[i];
        if (p_port->in_use
         && (p_port->dlci == dlci)
         && !memcmp (p_port->bd_addr, bd_addr, BD_ADDR_LEN))
        {
            return (p_port);
        }
    }
    return (NULL);
}


/*******************************************************************************
**
** Function         port_flow_control_user
**
** Description      Check the current user flow control and if necessary return
**                  events to be send to the user based on the user's specified
**                  flow control type.
**
** Returns          event mask to be returned to the application
**
*******************************************************************************/
uint32_t port_flow_control_user (tPORT *p_port)
{
    uint32_t event = 0;

    /* Flow control to the user can be caused by flow controlling by the peer */
    /* (FlowInd, or flow control by the peer RFCOMM (Fcon) or internally if */
    /* tx_queue is full */
    bool    fc = p_port->tx.peer_fc
              || !p_port->rfc.p_mcb
              || !p_port->rfc.p_mcb->peer_ready
              || (p_port->tx.queue_size > PORT_TX_HIGH_WM)
              || (fixed_queue_length(p_port->tx.queue) > PORT_TX_BUF_HIGH_WM);

    if (p_port->tx.user_fc == fc)
        return (0);

    p_port->tx.user_fc = fc;

    if (fc)
        event = PORT_EV_FC;
    else
        event = PORT_EV_FC | PORT_EV_FCS;

    return (event);
}


/*******************************************************************************
**
** Function         port_get_signal_changes
**
** Description      Check modem signals that has been changed
**
** Returns          event mask to be returned to the application
**
*******************************************************************************/
uint32_t port_get_signal_changes (tPORT *p_port, uint8_t old_signals, uint8_t signal)
{
    uint8_t changed_signals = (signal ^ old_signals);
    uint32_t events = 0;

    if (changed_signals & PORT_DTRDSR_ON)
    {
        events |= PORT_EV_DSR;

        if (signal & PORT_DTRDSR_ON)
            events |= PORT_EV_DSRS;
    }

    if (changed_signals & PORT_CTSRTS_ON)
    {
        events |= PORT_EV_CTS;

        if (signal & PORT_CTSRTS_ON)
            events |= PORT_EV_CTSS;
    }

    if (changed_signals & PORT_RING_ON)
        events |= PORT_EV_RING;

    if (changed_signals & PORT_DCD_ON)
    {
        events |= PORT_EV_RLSD;

        if (signal & PORT_DCD_ON)
            events |= PORT_EV_RLSDS;
    }

    return (p_port->ev_mask & events);
}

/*******************************************************************************
**
** Function         port_flow_control_peer
**
** Description      Send flow control messages to the peer for both enabling
**                  and disabling flow control, for both credit-based and
**                  TS 07.10 flow control mechanisms.
**
** Returns          nothing
**
*******************************************************************************/
void port_flow_control_peer(tPORT *p_port, bool    enable, uint16_t count)
{
    if (!p_port->rfc.p_mcb)
        return;

    /* If using credit based flow control */
    if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT)
    {
        /* if want to enable flow from peer */
        if (enable)
        {
            /* update rx credits */
            if (count > p_port->credit_rx)
            {
                p_port->credit_rx = 0;
            }
            else
            {
                p_port->credit_rx -= count;
            }

            /* If credit count is less than low credit watermark, and user */
            /* did not force flow control, send a credit update */
            /* There might be a special case when we just adjusted rx_max */
            if ((p_port->credit_rx <= p_port->credit_rx_low)
             && !p_port->rx.user_fc
             && (p_port->credit_rx_max > p_port->credit_rx))
            {
                rfc_send_credit(p_port->rfc.p_mcb, p_port->dlci,
                                (uint8_t) (p_port->credit_rx_max - p_port->credit_rx));

                p_port->credit_rx = p_port->credit_rx_max;

                p_port->rx.peer_fc = false;
            }
        }
        /* else want to disable flow from peer */
        else
        {
            /* if client registered data callback, just do what they want */
            if (p_port->p_data_callback || p_port->p_data_co_callback)
            {
                p_port->rx.peer_fc = true;
            }
            /* if queue count reached credit rx max, set peer fc */
            else if (fixed_queue_length(p_port->rx.queue) >= p_port->credit_rx_max)
            {
                p_port->rx.peer_fc = true;
            }
        }
    }
    /* else using TS 07.10 flow control */
    else
    {
        /* if want to enable flow from peer */
        if (enable)
        {
            /* If rfcomm suspended traffic from the peer based on the rx_queue_size */
            /* check if it can be resumed now */
            if (p_port->rx.peer_fc
             && (p_port->rx.queue_size < PORT_RX_LOW_WM)
             && (fixed_queue_length(p_port->rx.queue) < PORT_RX_BUF_LOW_WM))
            {
                p_port->rx.peer_fc = false;

                /* If user did not force flow control allow traffic now */
                if (!p_port->rx.user_fc)
                    RFCOMM_FlowReq (p_port->rfc.p_mcb, p_port->dlci, true);
            }
        }
        /* else want to disable flow from peer */
        else
        {
            /* if client registered data callback, just do what they want */
            if (p_port->p_data_callback || p_port->p_data_co_callback)
            {
                p_port->rx.peer_fc = true;
                RFCOMM_FlowReq (p_port->rfc.p_mcb, p_port->dlci, false);
            }
            /* Check the size of the rx queue.  If it exceeds certain */
            /* level and flow control has not been sent to the peer do it now */
            else if ( ((p_port->rx.queue_size > PORT_RX_HIGH_WM)
                     || (fixed_queue_length(p_port->rx.queue) > PORT_RX_BUF_HIGH_WM))
                     && !p_port->rx.peer_fc)
            {
                RFCOMM_TRACE_EVENT ("PORT_DataInd Data reached HW. Sending FC set.");

                p_port->rx.peer_fc = true;
                RFCOMM_FlowReq (p_port->rfc.p_mcb, p_port->dlci, false);
            }
        }
    }
}

