static void CATimeoutCallback(const CAEndpoint_t *endpoint, const void *pdu, uint32_t size) { OIC_LOG(DEBUG, TAG, "IN"); VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint"); VERIFY_NON_NULL_VOID(pdu, TAG, "pdu"); CAEndpoint_t* ep = CACloneEndpoint(endpoint); if (!ep) { OIC_LOG(ERROR, TAG, "clone failed"); return; } CAResponseInfo_t* resInfo = (CAResponseInfo_t*)OICCalloc(1, sizeof(CAResponseInfo_t)); if (!resInfo) { OIC_LOG(ERROR, TAG, "calloc failed"); CAFreeEndpoint(ep); return; } resInfo->result = CA_RETRANSMIT_TIMEOUT; resInfo->info.type = CAGetMessageTypeFromPduBinaryData(pdu, size); resInfo->info.messageId = CAGetMessageIdFromPduBinaryData(pdu, size); CAResult_t res = CAGetTokenFromPDU((const coap_hdr_t *) pdu, &(resInfo->info)); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "fail to get Token from retransmission list"); CADestroyResponseInfoInternal(resInfo); CAFreeEndpoint(ep); return; } CAData_t *cadata = (CAData_t *) OICCalloc(1, sizeof(CAData_t)); if (NULL == cadata) { OIC_LOG(ERROR, TAG, "memory allocation failed !"); CAFreeEndpoint(ep); CADestroyResponseInfoInternal(resInfo); return; } cadata->type = SEND_TYPE_UNICAST; cadata->remoteEndpoint = ep; cadata->requestInfo = NULL; cadata->responseInfo = resInfo; #ifdef SINGLE_THREAD CAProcessReceivedData(cadata); #else CAQueueingThreadAddData(&g_receiveThread, cadata, sizeof(CAData_t)); #endif OIC_LOG(DEBUG, TAG, "OUT"); }
static void CAReceivedPacketCallback(const CASecureEndpoint_t *sep, const void *data, uint32_t dataLen) { VERIFY_NON_NULL_VOID(sep, TAG, "remoteEndpoint"); VERIFY_NON_NULL_VOID(data, TAG, "data"); OIC_LOG(DEBUG, TAG, "received pdu data :"); OIC_LOG_BUFFER(DEBUG, TAG, data, dataLen); uint32_t code = CA_NOT_FOUND; CAData_t *cadata = NULL; coap_pdu_t *pdu = (coap_pdu_t *) CAParsePDU((const char *) data, dataLen, &code, &(sep->endpoint)); if (NULL == pdu) { OIC_LOG(ERROR, TAG, "Parse PDU failed"); return; } OIC_LOG_V(DEBUG, TAG, "code = %d", code); if (CA_GET == code || CA_POST == code || CA_PUT == code || CA_DELETE == code) { cadata = CAGenerateHandlerData(&(sep->endpoint), &(sep->identity), pdu, CA_REQUEST_DATA); if (!cadata) { OIC_LOG(ERROR, TAG, "CAReceivedPacketCallback, CAGenerateHandlerData failed!"); coap_delete_pdu(pdu); return; } } else { cadata = CAGenerateHandlerData(&(sep->endpoint), &(sep->identity), pdu, CA_RESPONSE_DATA); if (!cadata) { OIC_LOG(ERROR, TAG, "CAReceivedPacketCallback, CAGenerateHandlerData failed!"); coap_delete_pdu(pdu); return; } #ifdef TCP_ADAPTER if (CA_ADAPTER_TCP == sep->endpoint.adapter) { OIC_LOG(INFO, TAG, "retransmission is not supported"); } else #endif { // for retransmission void *retransmissionPdu = NULL; CARetransmissionReceivedData(&g_retransmissionContext, cadata->remoteEndpoint, pdu->hdr, pdu->length, &retransmissionPdu); // get token from saved data in retransmission list if (retransmissionPdu && CA_EMPTY == code) { if (cadata->responseInfo) { CAInfo_t *info = &cadata->responseInfo->info; CAResult_t res = CAGetTokenFromPDU((const coap_hdr_t *)retransmissionPdu, info, &(sep->endpoint)); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "fail to get Token from retransmission list"); OICFree(info->token); info->tokenLength = 0; } } } OICFree(retransmissionPdu); } } cadata->type = SEND_TYPE_UNICAST; #ifdef SINGLE_THREAD CAProcessReceivedData(cadata); #else #ifdef WITH_BWT if (CA_ADAPTER_GATT_BTLE != sep->endpoint.adapter #ifdef TCP_ADAPTER && CA_ADAPTER_TCP != sep->endpoint.adapter #endif ) { CAResult_t res = CAReceiveBlockWiseData(pdu, &(sep->endpoint), cadata, dataLen); if (CA_NOT_SUPPORTED == res || CA_REQUEST_TIMEOUT == res) { OIC_LOG(ERROR, TAG, "this message does not have block option"); CAQueueingThreadAddData(&g_receiveThread, cadata, sizeof(CAData_t)); } else { CADestroyData(cadata, sizeof(CAData_t)); } } else #endif { CAQueueingThreadAddData(&g_receiveThread, cadata, sizeof(CAData_t)); } #endif coap_delete_pdu(pdu); }
static void CAReceivedPacketCallback(CAEndpoint_t *endpoint, void *data, uint32_t dataLen) { OIC_LOG(DEBUG, TAG, "IN"); VERIFY_NON_NULL_VOID(data, TAG, "data"); uint32_t code = CA_NOT_FOUND; coap_pdu_t *pdu = (coap_pdu_t *) CAParsePDU((const char *) data, dataLen, &code); OICFree(data); if (NULL == pdu) { OIC_LOG(ERROR, TAG, "Parse PDU failed"); return; } char uri[CA_MAX_URI_LENGTH] = { }; if (CA_GET == code || CA_POST == code || CA_PUT == code || CA_DELETE == code) { CARequestInfo_t *ReqInfo = (CARequestInfo_t *) OICCalloc(1, sizeof(CARequestInfo_t)); if (NULL == ReqInfo) { OIC_LOG(ERROR, TAG, "CAReceivedPacketCallback, Memory allocation failed!"); coap_delete_pdu(pdu); return; } CAResult_t res = CAGetRequestInfoFromPDU(pdu, ReqInfo); if (CA_STATUS_OK != res) { OIC_LOG_V(ERROR, TAG, "CAGetRequestInfoFromPDU failed : %d", res); OICFree(ReqInfo); coap_delete_pdu(pdu); return; } if (NULL != ReqInfo->info.options) { for (uint32_t i = 0; i < ReqInfo->info.numOptions; i++) { OIC_LOG_V(DEBUG, TAG, "optionID: %d", ReqInfo->info.options[i].optionID); OIC_LOG_V(DEBUG, TAG, "list: %s", ReqInfo->info.options[i].optionData); } } if (NULL != ReqInfo->info.payload) { OIC_LOG_V(DEBUG, TAG, "Request- payload: %s", ReqInfo->info.payload); } OIC_LOG_V(DEBUG, TAG, "code: %d", ReqInfo->method); OIC_LOG(DEBUG, TAG, "token:"); OIC_LOG_BUFFER(DEBUG, TAG, (const uint8_t *) ReqInfo->info.token, CA_MAX_TOKEN_LEN); if (g_requestHandler) { g_requestHandler(endpoint, ReqInfo); } CADestroyRequestInfoInternal(ReqInfo); } else { CAResponseInfo_t *ResInfo = (CAResponseInfo_t *) OICCalloc(1, sizeof(CAResponseInfo_t)); if (NULL == ResInfo) { OIC_LOG(ERROR, TAG, "CAReceivedPacketCallback, Memory allocation failed!"); coap_delete_pdu(pdu); return; } CAResult_t res = CAGetResponseInfoFromPDU(pdu, ResInfo); if (CA_STATUS_OK != res) { OIC_LOG_V(ERROR, TAG, "CAGetResponseInfoFromPDU failed : %d", res); OICFree(ResInfo); coap_delete_pdu(pdu); return; } if (NULL != ResInfo->info.options) { for (uint32_t i = 0; i < ResInfo->info.numOptions; i++) { OIC_LOG_V(DEBUG, TAG, "optionID: %d", ResInfo->info.options[i].optionID); OIC_LOG_V(DEBUG, TAG, "list: %s", ResInfo->info.options[i].optionData); } } if (NULL != ResInfo->info.payload) { OIC_LOG_V(DEBUG, TAG, "payload: %s", ResInfo->info.payload); } OIC_LOG_V(DEBUG, TAG, "code: %d", ResInfo->result); // for retransmission void *retransmissionPdu = NULL; CARetransmissionReceivedData(&g_retransmissionContext, endpoint, pdu->hdr, pdu->length, &retransmissionPdu); // get token from saved data in retransmission list if (retransmissionPdu && CA_EMPTY == code) { CAResult_t res = CAGetTokenFromPDU((const coap_hdr_t *)retransmissionPdu, &(ResInfo->info)); if(CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "fail to get Token from retransmission list"); OICFree(ResInfo->info.token); } } OICFree(retransmissionPdu); if (NULL != ResInfo) { if (g_responseHandler) { g_responseHandler(endpoint, ResInfo); } CADestroyResponseInfoInternal(ResInfo); } } if (pdu) { coap_delete_pdu(pdu); } OIC_LOG(DEBUG, TAG, "OUT"); }