#include "oic_malloc.h"
#include "oic_string.h"
#include "caremotehandler.h"
+#include "pdu.h"
/**
* Logging tag for module name.
CALEClearSenderInfoImpl(&g_bleClientSenderInfo);
}
+static size_t CAGetMessageLengthFromData(const unsigned char *recvBuffer)
+{
+ coap_transport_type transport = coap_get_tcp_header_type_from_initbyte(
+ ((unsigned char *)recvBuffer)[0] >> 4);
+ size_t optPaylaodLen = coap_get_length_from_header((unsigned char *)recvBuffer,
+ transport);
+ size_t headerLen = coap_get_tcp_header_length((unsigned char *)recvBuffer);
+
+ OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "option/paylaod length [%d]", optPaylaodLen);
+ OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "header length [%d]", headerLen);
+ OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "total data length [%d]", headerLen + optPaylaodLen);
+
+ return headerLen + optPaylaodLen;
+}
+
static CAResult_t CAInitLEClientSenderQueue()
{
OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN - CAInitLEClientSenderQueue");
newSender->remoteEndpoint = NULL;
OIC_LOG(DEBUG, CALEADAPTER_TAG, "Parsing the header");
- newSender->totalDataLen = CAParseHeader(bleData->data,
- bleData->dataLen);
+
+ newSender->totalDataLen = CAGetMessageLengthFromData(bleData->data);
+
if(!(newSender->totalDataLen))
{
OIC_LOG(ERROR, CALEADAPTER_TAG, "Total Data Length is parsed as 0!!!");
ca_mutex_unlock(g_bleReceiveDataMutex);
return;
}
- memcpy(newSender->defragData, bleData->data + CA_HEADER_LENGTH,
- bleData->dataLen - CA_HEADER_LENGTH);
- newSender->recvDataLen += bleData->dataLen - CA_HEADER_LENGTH;
- u_arraylist_add(bleData->senderInfo, (void *)newSender);
+
+ if (newSender->recvDataLen + bleData->dataLen > newSender->totalDataLen)
+ {
+ OIC_LOG(ERROR, CALEADAPTER_TAG, "buffer is smaller than received data");
+ OICFree(newSender->defragData);
+ CAFreeEndpoint(newSender->remoteEndpoint);
+ OICFree(newSender);
+ ca_mutex_unlock(g_bleReceiveDataMutex);
+ return;
+ }
+ memcpy(newSender->defragData, bleData->data, bleData->dataLen);
+ newSender->recvDataLen += bleData->dataLen;
+
+ u_arraylist_add(bleData->senderInfo,(void *)newSender);
//Getting newSender index position in bleSenderInfo array list
if(CA_STATUS_OK !=
return;
}
- uint8_t * const header = OICCalloc(CA_HEADER_LENGTH, 1);
- VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "Malloc failed");
-
- const uint32_t totalLength = bleData->dataLen + CA_HEADER_LENGTH;
+ const uint32_t totalLength = bleData->dataLen;
OIC_LOG_V(DEBUG,
CALEADAPTER_TAG,
if (NULL == dataSegment)
{
OIC_LOG(ERROR, CALEADAPTER_TAG, "Malloc failed");
- OICFree(header);
- return;
- }
-
- CAResult_t result = CAGenerateHeader(header,
- CA_HEADER_LENGTH,
- bleData->dataLen);
- if (CA_STATUS_OK != result )
- {
- OIC_LOG(ERROR, CALEADAPTER_TAG, "Generate header failed");
- OICFree(header);
- OICFree(dataSegment);
return;
}
- memcpy(dataSegment, header, CA_HEADER_LENGTH);
- OICFree(header);
-
uint32_t length = 0;
if (CA_SUPPORTED_BLE_MTU_SIZE > totalLength)
{
length = totalLength;
- memcpy(dataSegment + CA_HEADER_LENGTH, bleData->data, bleData->dataLen);
+ memcpy(dataSegment, bleData->data, bleData->dataLen);
}
else
{
length = CA_SUPPORTED_BLE_MTU_SIZE;
- memcpy(dataSegment + CA_HEADER_LENGTH, bleData->data,
- CA_SUPPORTED_BLE_MTU_SIZE - CA_HEADER_LENGTH);
+ memcpy(dataSegment, bleData->data, CA_SUPPORTED_BLE_MTU_SIZE);
}
uint32_t iter = totalLength / CA_SUPPORTED_BLE_MTU_SIZE;
uint32_t index = 0;
+ CAResult_t result = CA_STATUS_FAILED;
// Send the first segment with the header.
if (NULL != bleData->remoteEndpoint) // Sending Unicast Data
result =
CAUpdateCharacteristicsToGattClient(
bleData->remoteEndpoint->addr,
- bleData->data + ((index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH),
+ bleData->data + ((index * CA_SUPPORTED_BLE_MTU_SIZE)),
CA_SUPPORTED_BLE_MTU_SIZE);
+
if (CA_STATUS_OK != result)
{
OIC_LOG_V(ERROR, CALEADAPTER_TAG,
// send the last segment of the data (Ex: 22 bytes of 622
// bytes of data when MTU is 200)
OIC_LOG(DEBUG, CALEADAPTER_TAG, "Sending the last chunk");
+
result = CAUpdateCharacteristicsToGattClient(
bleData->remoteEndpoint->addr,
- bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
+ bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE),
remainingLen);
+
if (CA_STATUS_OK != result)
{
OIC_LOG_V(ERROR,
{
// Send the remaining header.
OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Sending the chunk number [%d]", index);
+
result = CAUpdateCharacteristicsToAllGattClients(
- bleData->data + ((index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH),
+ bleData->data + ((index * CA_SUPPORTED_BLE_MTU_SIZE)),
CA_SUPPORTED_BLE_MTU_SIZE);
+
if (CA_STATUS_OK != result)
{
OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics failed, result [%d]",
{
// send the last segment of the data
OIC_LOG(DEBUG, CALEADAPTER_TAG, "Sending the last chunk");
+
result = CAUpdateCharacteristicsToAllGattClients(
- bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
+ bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE),
remainingLen);
+
if (CA_STATUS_OK != result)
{
OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics failed, result [%d]",
return;
}
- uint8_t * const header = OICCalloc(CA_HEADER_LENGTH, 1);
- VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "Malloc failed");
+ const uint32_t totalLength = bleData->dataLen;
- const uint32_t totalLength = bleData->dataLen + CA_HEADER_LENGTH;
uint8_t *dataSegment = OICCalloc(totalLength, 1);
if (NULL == dataSegment)
{
OIC_LOG(ERROR, CALEADAPTER_TAG, "Malloc failed");
- OICFree(header);
return;
}
- CAResult_t result = CAGenerateHeader(header,
- CA_HEADER_LENGTH,
- bleData->dataLen);
- if (CA_STATUS_OK != result )
- {
- OIC_LOG(ERROR, CALEADAPTER_TAG, "Generate header failed");
- OICFree(header);
- OICFree(dataSegment);
- return ;
- }
- memcpy(dataSegment, header, CA_HEADER_LENGTH);
- OICFree(header);
-
uint32_t length = 0;
if (CA_SUPPORTED_BLE_MTU_SIZE > totalLength)
{
length = totalLength;
- memcpy(dataSegment + CA_HEADER_LENGTH,
+ memcpy(dataSegment,
bleData->data,
bleData->dataLen);
}
else
{
length = CA_SUPPORTED_BLE_MTU_SIZE;
- memcpy(dataSegment + CA_HEADER_LENGTH,
+ memcpy(dataSegment,
bleData->data,
- CA_SUPPORTED_BLE_MTU_SIZE - CA_HEADER_LENGTH);
+ CA_SUPPORTED_BLE_MTU_SIZE);
}
+ CAResult_t result = CA_STATUS_FAILED;
const uint32_t iter = totalLength / CA_SUPPORTED_BLE_MTU_SIZE;
uint32_t index = 0;
if (NULL != bleData->remoteEndpoint) //Sending Unicast Data
// Send the remaining header.
result = CAUpdateCharacteristicsToGattServer(
bleData->remoteEndpoint->addr,
- bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
+ bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE),
CA_SUPPORTED_BLE_MTU_SIZE,
LE_UNICAST, 0);
+
if (CA_STATUS_OK != result)
{
OIC_LOG_V(ERROR,
// send the last segment of the data (Ex: 22 bytes of 622
// bytes of data when MTU is 200)
OIC_LOG(DEBUG, CALEADAPTER_TAG, "Sending the last chunk");
+
result = CAUpdateCharacteristicsToGattServer(
bleData->remoteEndpoint->addr,
- bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
+ bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE),
remainingLen,
LE_UNICAST, 0);
for (index = 1; index < iter; index++)
{
result = CAUpdateCharacteristicsToAllGattServers(
- bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
+ bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE),
CA_SUPPORTED_BLE_MTU_SIZE);
+
if (CA_STATUS_OK != result)
{
OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics failed, result [%d]",
OIC_LOG(DEBUG, CALEADAPTER_TAG, "Sending the last chunk");
result =
CAUpdateCharacteristicsToAllGattServers(
- bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
+ bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE),
remainingLen);
+
if (CA_STATUS_OK != result)
{
OIC_LOG_V(ERROR, CALEADAPTER_TAG,
VERIFY_NON_NULL_RET(endpoint, TAG, "endpoint", NULL);
coap_transport_type transport;
-#ifdef TCP_ADAPTER
- if (CA_ADAPTER_TCP == endpoint->adapter)
+#ifdef WITH_TCP
+ if (CAIsSupportedCoAPOverTCP(endpoint->adapter))
{
transport = coap_get_tcp_header_type_from_initbyte(((unsigned char *)data)[0] >> 4);
}
return NULL;
}
-#ifdef TCP_ADAPTER
- if (CA_ADAPTER_TCP == endpoint->adapter)
+#ifdef WITH_TCP
+ if (CAIsSupportedCoAPOverTCP(endpoint->adapter))
{
OIC_LOG(INFO, TAG, "there is no version info in coap header");
}
VERIFY_NON_NULL_RET(transport, TAG, "transport", NULL);
unsigned int length = COAP_MAX_PDU_SIZE;
-#ifdef TCP_ADAPTER
+#ifdef WITH_TCP
unsigned int msgLength = 0;
- if (CA_ADAPTER_TCP == endpoint->adapter)
+ if (CAIsSupportedCoAPOverTCP(endpoint->adapter))
{
if (options)
{
OIC_LOG_V(DEBUG, TAG, "transport type: %d, payload size: %zu",
*transport, info->payloadSize);
-#ifdef TCP_ADAPTER
- if (CA_ADAPTER_TCP == endpoint->adapter)
+#ifdef WITH_TCP
+ if (CAIsSupportedCoAPOverTCP(endpoint->adapter))
{
coap_add_length(pdu, *transport, msgLength);
}
#ifdef WITH_BWT
if (CA_ADAPTER_GATT_BTLE != endpoint->adapter
-#ifdef TCP_ADAPTER
- && CA_ADAPTER_TCP != endpoint->adapter
+#ifdef WITH_TCP
+ && !CAIsSupportedCoAPOverTCP(endpoint->adapter)
#endif
)
{
VERIFY_NON_NULL(outInfo, TAG, "outInfo");
coap_transport_type transport;
-#ifdef TCP_ADAPTER
- if (CA_ADAPTER_TCP == endpoint->adapter)
+#ifdef WITH_TCP
+ if (CAIsSupportedCoAPOverTCP(endpoint->adapter))
{
transport = coap_get_tcp_header_type_from_initbyte(((unsigned char *)pdu->hdr)[0] >> 4);
}
outInfo->numOptions = count;
-#ifdef TCP_ADAPTER
- if (CA_ADAPTER_TCP == endpoint->adapter)
+#ifdef WITH_TCP
+ if (CAIsSupportedCoAPOverTCP(endpoint->adapter))
{
// set type
outInfo->type = CA_MSG_NONCONFIRM;
outInfo->payloadFormat = CA_FORMAT_UNDEFINED;
}
else
+#else
+ (void) endpoint;
#endif
{
// set type
VERIFY_NON_NULL(endpoint, TAG, "endpoint");
coap_transport_type transport;
-#ifdef TCP_ADAPTER
- if (CA_ADAPTER_TCP == endpoint->adapter)
+#ifdef WITH_TCP
+ if (CAIsSupportedCoAPOverTCP(endpoint->adapter))
{
transport = coap_get_tcp_header_type_from_initbyte(((unsigned char *)pdu_hdr)[0] >> 4);
}
else
-#else
- (void) endpoint;
#endif
{
transport = coap_udp;
return CA_FORMAT_UNSUPPORTED;
}
}
+
+#ifdef WITH_TCP
+bool CAIsSupportedCoAPOverTCP(CATransportAdapter_t adapter)
+{
+ if (CA_ADAPTER_GATT_BTLE == adapter || CA_ADAPTER_RFCOMM_BTEDR == adapter
+ || CA_ADAPTER_TCP == adapter)
+ {
+ return true;
+ }
+ return false;
+}
+#endif