static void CAProcessData(const CAData_t *data) { OIC_LOG(DEBUG, TAG, "IN"); VERIFY_NON_NULL_VOID(data, TAG, "data"); VERIFY_NON_NULL_VOID(data->remoteEndpoint, TAG, "remoteEndpoint"); CAResult_t res = CA_STATUS_FAILED; CASendDataType_t type = data->type; if (SEND_TYPE_UNICAST == type) { coap_pdu_t *pdu = NULL; if (NULL != data->requestInfo) { OIC_LOG(DEBUG, TAG, "reqInfo avlbl"); pdu = (coap_pdu_t *)CAGeneratePDU(data->requestInfo->method, &data->requestInfo->info); } else if (NULL != data->responseInfo) { OIC_LOG(DEBUG, TAG, "resInfo avlbl"); pdu = (coap_pdu_t *)CAGeneratePDU(data->responseInfo->result, &data->responseInfo->info); } else { OIC_LOG(DEBUG, TAG, "request info, response info is empty"); } // interface controller function call. if (NULL != pdu) { CALogPDUInfo(pdu); res = CASendUnicastData(data->remoteEndpoint, pdu->hdr, pdu->length); if (CA_STATUS_OK != res) { OIC_LOG_V(ERROR, TAG, "send failed:%d", res); coap_delete_pdu(pdu); return; } // for retransmission res = CARetransmissionSentData(&g_retransmissionContext, data->remoteEndpoint, pdu->hdr, pdu->length); if (CA_STATUS_OK != res) { OIC_LOG_V(INFO, TAG, "retransmissions will not be working: %d", res); coap_delete_pdu(pdu); return; } coap_delete_pdu(pdu); } } else if (SEND_TYPE_MULTICAST == type) { OIC_LOG(DEBUG, TAG, "both requestInfo & responseInfo is not available"); CAInfo_t *info = &data->requestInfo->info; info->options = data->options; info->numOptions = data->numOptions; coap_pdu_t *pdu = (coap_pdu_t *)CAGeneratePDU(CA_GET, info); if (NULL != pdu) { CALogPDUInfo(pdu); res = CASendMulticastData(data->remoteEndpoint, pdu->hdr, pdu->length); if(CA_STATUS_OK != res) { OIC_LOG_V(ERROR, TAG, "send failed:%d", res); coap_delete_pdu(pdu); return; } coap_delete_pdu(pdu); } } OIC_LOG(DEBUG, TAG, "OUT"); }
static CAResult_t CAProcessSendData(const CAData_t *data) { VERIFY_NON_NULL(data, TAG, "data"); VERIFY_NON_NULL(data->remoteEndpoint, TAG, "remoteEndpoint"); CAResult_t res = CA_STATUS_FAILED; CASendDataType_t type = data->type; coap_pdu_t *pdu = NULL; CAInfo_t *info = NULL; coap_list_t *options = NULL; coap_transport_type transport; if (SEND_TYPE_UNICAST == type) { OIC_LOG(DEBUG,TAG,"Unicast message"); #ifdef ROUTING_GATEWAY /* * When forwarding a packet, do not attempt retransmission as its the responsibility of * packet originator node */ bool skipRetransmission = false; #endif if (NULL != data->requestInfo) { OIC_LOG(DEBUG, TAG, "requestInfo is available.."); info = &data->requestInfo->info; #ifdef ROUTING_GATEWAY skipRetransmission = data->requestInfo->info.skipRetransmission; #endif pdu = CAGeneratePDU(data->requestInfo->method, info, data->remoteEndpoint, &options, &transport); } else if (NULL != data->responseInfo) { OIC_LOG(DEBUG, TAG, "responseInfo is available.."); info = &data->responseInfo->info; #ifdef ROUTING_GATEWAY skipRetransmission = data->responseInfo->info.skipRetransmission; #endif pdu = CAGeneratePDU(data->responseInfo->result, info, data->remoteEndpoint, &options, &transport); } else { OIC_LOG(DEBUG, TAG, "request info, response info is empty"); return CA_STATUS_INVALID_PARAM; } // interface controller function call. if (NULL != pdu) { #ifdef WITH_BWT if (CA_ADAPTER_GATT_BTLE != data->remoteEndpoint->adapter #ifdef TCP_ADAPTER && CA_ADAPTER_TCP != data->remoteEndpoint->adapter #endif ) { // Blockwise transfer if (NULL != info) { CAResult_t res = CAAddBlockOption(&pdu, info, data->remoteEndpoint, &options); if (CA_STATUS_OK != res) { OIC_LOG(INFO, TAG, "to write block option has failed"); CAErrorHandler(data->remoteEndpoint, pdu->hdr, pdu->length, res); coap_delete_list(options); coap_delete_pdu(pdu); return res; } } } #endif CALogPDUInfo(pdu, data->remoteEndpoint); res = CASendUnicastData(data->remoteEndpoint, pdu->hdr, pdu->length); if (CA_STATUS_OK != res) { OIC_LOG_V(ERROR, TAG, "send failed:%d", res); CAErrorHandler(data->remoteEndpoint, pdu->hdr, pdu->length, res); coap_delete_list(options); coap_delete_pdu(pdu); return res; } #ifdef TCP_ADAPTER if (CA_ADAPTER_TCP == data->remoteEndpoint->adapter) { OIC_LOG(INFO, TAG, "retransmission will be not worked"); } else #endif #ifdef ROUTING_GATEWAY if(!skipRetransmission) #endif { // for retransmission res = CARetransmissionSentData(&g_retransmissionContext, data->remoteEndpoint, pdu->hdr, pdu->length); if ((CA_STATUS_OK != res) && (CA_NOT_SUPPORTED != res)) { //when retransmission not supported this will return CA_NOT_SUPPORTED, ignore OIC_LOG_V(INFO, TAG, "retransmission is not enabled due to error, res : %d", res); coap_delete_list(options); coap_delete_pdu(pdu); return res; } } coap_delete_list(options); coap_delete_pdu(pdu); } else { OIC_LOG(ERROR,TAG,"Failed to generate unicast PDU"); CASendErrorInfo(data->remoteEndpoint, info, CA_SEND_FAILED); return CA_SEND_FAILED; } } else if (SEND_TYPE_MULTICAST == type) { OIC_LOG(DEBUG,TAG,"Multicast message"); if (NULL != data->requestInfo) { OIC_LOG(DEBUG, TAG, "requestInfo is available.."); info = &data->requestInfo->info; pdu = CAGeneratePDU(CA_GET, info, data->remoteEndpoint, &options, &transport); if (NULL != pdu) { #ifdef WITH_BWT if (CA_ADAPTER_GATT_BTLE != data->remoteEndpoint->adapter #ifdef TCP_ADAPTER && CA_ADAPTER_TCP != data->remoteEndpoint->adapter #endif ) { // Blockwise transfer CAResult_t res = CAAddBlockOption(&pdu, &data->requestInfo->info, data->remoteEndpoint, &options); if (CA_STATUS_OK != res) { OIC_LOG(DEBUG, TAG, "CAAddBlockOption has failed"); CAErrorHandler(data->remoteEndpoint, pdu->hdr, pdu->length, res); coap_delete_list(options); coap_delete_pdu(pdu); return res; } } #endif } else { OIC_LOG(ERROR,TAG,"Failed to generate multicast PDU"); CASendErrorInfo(data->remoteEndpoint, info, CA_SEND_FAILED); return CA_SEND_FAILED; } } else if (NULL != data->responseInfo) { OIC_LOG(DEBUG, TAG, "responseInfo is available.."); info = &data->responseInfo->info; pdu = CAGeneratePDU(data->responseInfo->result, info, data->remoteEndpoint, &options, &transport); if (NULL != pdu) { #ifdef WITH_BWT if (CA_ADAPTER_GATT_BTLE != data->remoteEndpoint->adapter #ifdef TCP_ADAPTER && CA_ADAPTER_TCP != data->remoteEndpoint->adapter #endif ) { // Blockwise transfer if (NULL != info) { CAResult_t res = CAAddBlockOption(&pdu, info, data->remoteEndpoint, &options); if (CA_STATUS_OK != res) { OIC_LOG(INFO, TAG, "to write block option has failed"); CAErrorHandler(data->remoteEndpoint, pdu->hdr, pdu->length, res); coap_delete_list(options); coap_delete_pdu(pdu); return res; } } } #endif } else { OIC_LOG(ERROR,TAG,"Failed to generate multicast PDU"); CASendErrorInfo(data->remoteEndpoint, info, CA_SEND_FAILED); return CA_SEND_FAILED; } } else { OIC_LOG(ERROR, TAG, "request or response info is empty"); return CA_SEND_FAILED; } CALogPDUInfo(pdu, data->remoteEndpoint); OIC_LOG(DEBUG, TAG, "pdu to send :"); OIC_LOG_BUFFER(DEBUG, TAG, (uint8_t*)pdu->hdr, pdu->length); res = CASendMulticastData(data->remoteEndpoint, pdu->hdr, pdu->length); if (CA_STATUS_OK != res) { OIC_LOG_V(ERROR, TAG, "send failed:%d", res); CAErrorHandler(data->remoteEndpoint, pdu->hdr, pdu->length, res); coap_delete_list(options); coap_delete_pdu(pdu); return res; } coap_delete_list(options); coap_delete_pdu(pdu); } return CA_STATUS_OK; }
static CAResult_t CAProcessSendData(const CAData_t *data) { OIC_LOG(DEBUG, TAG, "IN"); VERIFY_NON_NULL(data, TAG, "data"); VERIFY_NON_NULL(data->remoteEndpoint, TAG, "remoteEndpoint"); CAResult_t res = CA_STATUS_FAILED; CASendDataType_t type = data->type; coap_pdu_t *pdu = NULL; CAInfo_t *info = NULL; if (SEND_TYPE_UNICAST == type) { OIC_LOG(DEBUG,TAG,"Unicast message"); if (NULL != data->requestInfo) { OIC_LOG(DEBUG, TAG, "requestInfo is available.."); info = &data->requestInfo->info; pdu = CAGeneratePDU(data->requestInfo->method, info, data->remoteEndpoint); } else if (NULL != data->responseInfo) { OIC_LOG(DEBUG, TAG, "responseInfo is available.."); info = &data->responseInfo->info; pdu = CAGeneratePDU(data->responseInfo->result, info, data->remoteEndpoint); } else { OIC_LOG(DEBUG, TAG, "request info, response info is empty"); return CA_STATUS_INVALID_PARAM; } // interface controller function call. if (NULL != pdu) { #ifdef WITH_BWT if (CA_ADAPTER_GATT_BTLE != data->remoteEndpoint->adapter) { // Blockwise transfer if (NULL != info) { CAResult_t res = CAAddBlockOption(&pdu, *info, data->remoteEndpoint); if (CA_STATUS_OK != res) { OIC_LOG(INFO, TAG, "to write block option has failed"); CAErrorHandler(data->remoteEndpoint, pdu->hdr, pdu->length, res); coap_delete_pdu(pdu); return res; } } } #endif CALogPDUInfo(pdu); res = CASendUnicastData(data->remoteEndpoint, pdu->hdr, pdu->length); if (CA_STATUS_OK != res) { OIC_LOG_V(ERROR, TAG, "send failed:%d", res); CAErrorHandler(data->remoteEndpoint, pdu->hdr, pdu->length, res); coap_delete_pdu(pdu); return res; } // for retransmission res = CARetransmissionSentData(&g_retransmissionContext, data->remoteEndpoint, pdu->hdr, pdu->length); if ((CA_STATUS_OK != res) && (CA_NOT_SUPPORTED != res)) { //when retransmission not supported this will return CA_NOT_SUPPORTED, ignore OIC_LOG_V(INFO, TAG, "retransmission is not enabled due to error, res : %d", res); coap_delete_pdu(pdu); return res; } coap_delete_pdu(pdu); } else { OIC_LOG(ERROR,TAG,"Failed to generate unicast PDU"); CASendErrorInfo(data->remoteEndpoint, info, CA_SEND_FAILED); return CA_SEND_FAILED; } } else if (SEND_TYPE_MULTICAST == type) { OIC_LOG(DEBUG,TAG,"Multicast message"); if (NULL != data->requestInfo) { OIC_LOG(DEBUG, TAG, "requestInfo is available.."); info = &data->requestInfo->info; pdu = CAGeneratePDU(CA_GET, info, data->remoteEndpoint); if (NULL != pdu) { #ifdef WITH_BWT if (CA_ADAPTER_GATT_BTLE != data->remoteEndpoint->adapter) { // Blockwise transfer CAResult_t res = CAAddBlockOption(&pdu, data->requestInfo->info, data->remoteEndpoint); if (CA_STATUS_OK != res) { OIC_LOG(DEBUG, TAG, "CAAddBlockOption has failed"); CAErrorHandler(data->remoteEndpoint, pdu->hdr, pdu->length, res); coap_delete_pdu(pdu); return res; } } #endif CALogPDUInfo(pdu); res = CASendMulticastData(data->remoteEndpoint, pdu->hdr, pdu->length); if (CA_STATUS_OK != res) { OIC_LOG_V(ERROR, TAG, "send failed:%d", res); CAErrorHandler(data->remoteEndpoint, pdu->hdr, pdu->length, res); coap_delete_pdu(pdu); return res; } coap_delete_pdu(pdu); } else { OIC_LOG(ERROR,TAG,"Failed to generate multicast PDU"); CASendErrorInfo(data->remoteEndpoint, info, CA_SEND_FAILED); return CA_SEND_FAILED; } } else { OIC_LOG(ERROR, TAG, "request info is empty"); return CA_SEND_FAILED; } } OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; }