+ if (NULL != retData->endpoint && retData->messageId == messageId
+ && (retData->endpoint->adapter == endpoint->adapter))
+ {
+ // get pdu data for getting token when CA_EMPTY(RST/ACK) is received from remote device
+ // if retransmission was finish..token will be unavailable.
+ if (CA_EMPTY == CAGetCodeFromPduBinaryData(pdu, size))
+ {
+ OIC_LOG(DEBUG, TAG, "code is CA_EMPTY");
+
+ if (NULL == retData->pdu)
+ {
+ OIC_LOG(ERROR, TAG, "retData->pdu is null");
+ OICFree(retData);
+ // mutex unlock
+ oc_mutex_unlock(context->threadMutex);
+
+ return CA_STATUS_FAILED;
+ }
+
+ // copy PDU data
+ (*retransmissionPdu) = (void *) OICCalloc(1, retData->size);
+ if ((*retransmissionPdu) == NULL)
+ {
+ OICFree(retData);
+ OIC_LOG(ERROR, TAG, "memory error");
+
+ // mutex unlock
+ oc_mutex_unlock(context->threadMutex);
+
+ return CA_MEMORY_ALLOC_FAILED;
+ }
+ memcpy((*retransmissionPdu), retData->pdu, retData->size);
+ }
+
+ // #2. remove data from list
+ CARetransmissionData_t *removedData = u_arraylist_remove(context->dataList, i);
+ if (NULL == removedData)
+ {
+ OIC_LOG(ERROR, TAG, "Removed data is NULL");
+
+ // mutex unlock
+ oc_mutex_unlock(context->threadMutex);
+
+ return CA_STATUS_FAILED;
+ }
+
+ OIC_LOG_V(DEBUG, TAG, "remove RTCON data!!, msgid=%d", messageId);
+
+ CAFreeEndpoint(removedData->endpoint);
+ OICFree(removedData->pdu);
+ OICFree(removedData);
+