Exemple #1
0
bool SDP_create()
{
    UINT i;
    L2CAP_API sL2CAP;
    SDP_API sAPI;

    /* Allocate the control block */
    if (NULL == gpsSDPCB)
    {
        gpsSDPCB = BT_malloc(sizeof(SDP_CONTROL_BLOCK));
    }

    /* Initialise the control block structure */
    gpsSDPCB->bInitialised = true;
    for (i = 0; i < SDP_SERVICE_COUNT; ++i)
    {
        gpsSDPCB->pService[i] = NULL;
    }
    #ifdef SDP_SERVICE_RFCOMM_ENABLE
        gpsSDPCB->pService[0] = (SDP_SERVICE *)&sServiceRFCOMM;
    #else
        #error
    #endif /*SDP_SERVICE_RFCOMM_ENABLE*/

    L2CAP_getAPI(&sL2CAP);
    gpsSDPCB->L2CAPsendData = sL2CAP.sendData;

    sAPI.putData = &SDP_API_putPetition;
    L2CAP_installSDP(&sAPI);

    DBG_INFO("SDP Initialised\n");
    return true;
}
Exemple #2
0
BOOL L2CAP_create()
{
    UINT i;
    HCI_API sHCI;
    L2CAP_API sAPI;
    
    /*Allocate the control block*/
    if (NULL == gpsL2CAPCB)
    {
        gpsL2CAPCB = BT_malloc(sizeof(L2CAP_CONTROL_BLOCK));
    }

    /*Initialise the structure*/
    gpsL2CAPCB->isInitialised = TRUE;
    gpsL2CAPCB->bSigID = 0;

    for (i = 0; i < L2CAP_MAX_CHANNELS; ++i)
    {
        gpsL2CAPCB->pasChannel[i] = NULL;
    }

    /* Get the HCI API */
    HCI_getAPI(&sHCI);
    gpsL2CAPCB->HCIsendData = sHCI.sendData;
    sAPI.sendData = &L2CAP_API_sendData;
    sAPI.putData = &L2CAP_API_putData;
    HCI_installL2CAP(&sAPI);

    DBG_INFO("L2CAP Initialised\n");
    return TRUE;
}
Exemple #3
0
BOOL L2CAP_API_sendData(UINT16 uPSM, const BYTE *pData, UINT16 uLen)
{
    BYTE *pL2CAPData = NULL;
    UINT16 i, uL2CAPLength;
    L2CAP_CHANNEL *pChannel = NULL;

    ASSERT(NULL != gpsL2CAPCB);
    ASSERT(gpsL2CAPCB->isInitialised);
    
    pChannel = _L2CAP_getChannelByPSM(uPSM);
    if (NULL == pChannel)
    {
        DBG_INFO("Non-existant channel\n");
        return FALSE;
    }
    
    /*Generate an L2CAP data frame*/
    /*Set the length*/
    uL2CAPLength  = uLen + L2CAP_HDR_LEN;
    /*Allocate the memory (mind the L2CAP HDR)*/
    pL2CAPData = (BYTE *) BT_malloc(uL2CAPLength);
    if(NULL == pL2CAPData)
    {
        DBG_ERROR("Not enough memory!\n");
        return FALSE;
    }

    /*Set the L2CAP frame header*/
    /*Length*/
    BT_storeLE16(uLen, pL2CAPData, 0);
    /*Channel*/
    BT_storeLE16(pChannel->uRemoteCID, pL2CAPData, 2);

    /*Do a simple memcopy to get the payload*/
    for (i=0; i<uLen; ++i)
    {
        pL2CAPData[i + L2CAP_HDR_LEN] = pData[i];
    }

    /*Send the local frame*/
    if (!gpsL2CAPCB->HCIsendData(pL2CAPData, uL2CAPLength))
    {
        DBG_ERROR("Unexpected error\n");
        return FALSE;
    }

    /*Free the memory*/
    BT_free(pL2CAPData);

    DBG_INFO("L2CAP Data sent\n");

    return TRUE;
}
Exemple #4
0
BOOL BTAPP_Initialise(BT_DEVICE **ppsBTDevice)
{
    BT_DEVICE *psBTDev = NULL;

    ASSERT(NULL != ppsBTDevice);
    
    *ppsBTDevice = (BT_DEVICE *) BT_malloc(sizeof(BT_DEVICE));
    psBTDev = *ppsBTDevice;

    ASSERT(NULL != psBTDev);

    /* Initialise all the BT stack layers */
    HCIUSB_create();
    HCI_create();
    L2CAP_create();
    SDP_create();
    RFCOMM_create();
    
    DBG_INFO("BTAPP: Bluetooth stack initialized\n\r");

    return TRUE;
}
Exemple #5
0
BOOL L2CAP_API_disconnect(UINT16 uPSM)
{
    UINT16 uReqLen;
    BYTE *pReqData = NULL;
    L2CAP_CHANNEL *pChannel = NULL;
    UINT uOffset = 0;
    BOOL bRetVal = FALSE;

    ASSERT(NULL != gpsL2CAPCB);
    ASSERT(gpsL2CAPCB->isInitialised);

    pChannel = _L2CAP_getChannelByPSM(uPSM);
    if (NULL == pChannel)
    {
        DBG_INFO("Non-existant channel\n");
        return FALSE;
    }

    /*Generate a connection response frame*/
    /*Set the length*/
    uReqLen = L2CAP_DISCONN_REQ_SIZE + L2CAP_SIGHDR_LEN + L2CAP_HDR_LEN;
    /*Allocate the memory (mind the L2CAP HDR)*/
    pReqData = BT_malloc(uReqLen);
    if(NULL == pReqData)
    {
        DBG_ERROR("Not enough memory!\n");
        return FALSE;
    }

    /*Set the L2CAP frame header*/
    /*Length*/
    BT_storeLE16(uReqLen - L2CAP_HDR_LEN, pReqData, 0);
    /*Channel*/
    BT_storeLE16(L2CAP_SIG_CID, pReqData, 2);

    /* Set the response command header values */
    uOffset = L2CAP_HDR_LEN;
    /* Command code */
    pReqData[uOffset + 0] = L2CAP_DISCONN_REQ;
    /* Command id (we can randomize it) */
    pReqData[uOffset + 1] = 0x01;
    /* Command length */
    BT_storeLE16(L2CAP_DISCONN_REQ_SIZE, pReqData, uOffset + 2);

    /*
     * Set the response command data values
     * RemoteCID (2 octet)
     * LocalCID (2 octet)
     */
    uOffset = L2CAP_HDR_LEN + L2CAP_SIGHDR_LEN;
    /*Remote CID*/
    BT_storeLE16(pChannel->uRemoteCID, pReqData, uOffset);
    /*Local CID*/
    BT_storeLE16(pChannel->uLocalCID, pReqData, uOffset + 2);

    /*Send the frame to the remote device*/
    bRetVal = gpsL2CAPCB->HCIsendData(pReqData, uReqLen);
    if(bRetVal)
    {
        DBG_INFO("L2CAP Disconn req sent\n")
    }
    else
    {