X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Frouting%2Fsrc%2Froutingutility.c;h=cabd07c1e45ac618e7486281b1158bd778303c5a;hb=d0262ace78f3999552da43061479c33182ed4f1e;hp=3ed1e600e0d6a2368e0b1559cc3cbab544b9f6ca;hpb=cf70ee572219c0ad19f1cd00f02b41ba3377561f;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/routing/src/routingutility.c b/resource/csdk/routing/src/routingutility.c index 3ed1e60..cabd07c 100644 --- a/resource/csdk/routing/src/routingutility.c +++ b/resource/csdk/routing/src/routingutility.c @@ -36,13 +36,37 @@ #define RM_TAG "OIC_RM_RAP" /** + * Default routing option data length is 1 byte with any of the following values. + * 00 - source and destination address is not present. + * 01 - source and destination address is present with message type as ACK. + * 10 - source and destination address is present with message type as RESET. + * 11 - source and destination address is present with message type as NORMAL. + */ +#define DEFAULT_ROUTE_OPTION_LEN 1 + +/** * Minimum routing option data length is - * length of src address(1byte) + length of destination address(1byte) + - * Seq Num(2bytes) + Msg Type(1 bytes) + * Msg Type(1 bytes) + length of src address(1byte) + length of destination address(1byte) + + * Seq Num(2bytes) */ #define MIN_ROUTE_OPTION_LEN 5 /** + * Acknowledge message type is denoted as 01000000 + */ +#define ACK_MESSAGE_TYPE (1 << 6) + +/** + * Reset message type is denoted as 10000000 + */ +#define RST_MESSAGE_TYPE (1 << 7) + +/** + * Normal message type is denoted as 11000000 + */ +#define NORMAL_MESSAGE_TYPE (3 << 6) + +/** * Stack mode. */ static OCMode g_rmStackMode = OC_CLIENT; @@ -219,11 +243,11 @@ OCStackResult RMUpdateInfo(CAHeaderOption_t **options, uint8_t *numOptions, } // Update Endpoint with source address from RM header option. - if (0 != (*options + routeIndex)->optionLength) + if (DEFAULT_ROUTE_OPTION_LEN < (*options + routeIndex)->optionLength ) { uint8_t dLen = 0; - uint16_t count = sizeof(dLen); - memcpy(&dLen, (*options + routeIndex)->optionData, sizeof(dLen)); + uint16_t count = sizeof(dLen) + DEFAULT_ROUTE_OPTION_LEN; + memcpy(&dLen, (*options + routeIndex)->optionData + DEFAULT_ROUTE_OPTION_LEN, sizeof(dLen)); count += dLen; uint8_t sLen = 0; memcpy(&sLen, (*options + routeIndex)->optionData + count, sizeof(sLen)); @@ -294,50 +318,99 @@ OCStackResult RMCreateRouteOption(const RMRouteOption_t *optValue, CAHeaderOptio (optValue->srcEp ? ENDPOINT_ID_LENGTH:0); OIC_LOG_V(DEBUG, RM_TAG, "createoption dlen %u slen [%u]", dLen, sLen); - unsigned int totalLength = MIN_ROUTE_OPTION_LEN + dLen + sLen; - void *tempData = OICCalloc(totalLength, sizeof(char)); - if (NULL == tempData) + + unsigned int totalLength = 0; + void *tempData = NULL; + if (0 == dLen && 0 == sLen) { - OIC_LOG(ERROR, RM_TAG, "Calloc failed"); - return OC_STACK_NO_MEMORY; + OIC_LOG(DEBUG, RM_TAG, "Source and destination is not present"); + totalLength = DEFAULT_ROUTE_OPTION_LEN; + tempData = OICCalloc(totalLength, sizeof(char)); + if (NULL == tempData) + { + OIC_LOG(ERROR, RM_TAG, "Calloc failed"); + return OC_STACK_NO_MEMORY; + } + + if (ACK == optValue->msgType) + { + OIC_LOG(DEBUG, RM_TAG, "OptValue ACK Message Type"); + memset(tempData, ACK_MESSAGE_TYPE, DEFAULT_ROUTE_OPTION_LEN); + } + else if (RST == optValue->msgType) + { + OIC_LOG(DEBUG, RM_TAG, "OptValue RST Message Type"); + memset(tempData, RST_MESSAGE_TYPE, DEFAULT_ROUTE_OPTION_LEN); + } + else + { + OIC_LOG(DEBUG, RM_TAG, "OptValue NOR Message Type"); + memset(tempData, NORMAL_MESSAGE_TYPE, DEFAULT_ROUTE_OPTION_LEN); + } } - memcpy(tempData, &dLen, sizeof(dLen)); - unsigned int count = sizeof(dLen); - if (0 < dLen) + else { - if (optValue->destGw) + totalLength = MIN_ROUTE_OPTION_LEN + dLen + sLen; + tempData = OICCalloc(totalLength, sizeof(char)); + if (NULL == tempData) { - memcpy(tempData + count, &(optValue->destGw), GATEWAY_ID_LENGTH); - count += GATEWAY_ID_LENGTH; + OIC_LOG(ERROR, RM_TAG, "Calloc failed"); + return OC_STACK_NO_MEMORY; } - if (optValue->destEp) + if (ACK == optValue->msgType) { - memcpy(tempData + count, &(optValue->destEp), ENDPOINT_ID_LENGTH); - count += ENDPOINT_ID_LENGTH; + OIC_LOG(DEBUG, RM_TAG, "OptValue ACK Message Type"); + memset(tempData, ACK_MESSAGE_TYPE, DEFAULT_ROUTE_OPTION_LEN); + } + else if (RST == optValue->msgType) + { + OIC_LOG(DEBUG, RM_TAG, "OptValue RST Message Type"); + memset(tempData, RST_MESSAGE_TYPE, DEFAULT_ROUTE_OPTION_LEN); + } + else + { + OIC_LOG(DEBUG, RM_TAG, "OptValue NOR Message Type"); + memset(tempData, NORMAL_MESSAGE_TYPE, DEFAULT_ROUTE_OPTION_LEN); } - } - memcpy(tempData + count, &sLen, sizeof(sLen)); - count += sizeof(sLen); - if (0 < sLen) - { - if (optValue->srcGw) + memcpy(tempData + DEFAULT_ROUTE_OPTION_LEN, &dLen, sizeof(dLen)); + unsigned int count = sizeof(dLen) + DEFAULT_ROUTE_OPTION_LEN; + if (0 < dLen) { - memcpy(tempData + count, &(optValue->srcGw), GATEWAY_ID_LENGTH); - count += GATEWAY_ID_LENGTH; + if (optValue->destGw) + { + memcpy(tempData + count, &(optValue->destGw), GATEWAY_ID_LENGTH); + count += GATEWAY_ID_LENGTH; + } + + if (optValue->destEp) + { + memcpy(tempData + count, &(optValue->destEp), ENDPOINT_ID_LENGTH); + count += ENDPOINT_ID_LENGTH; + } } - if (optValue->srcEp) + memcpy(tempData + count, &sLen, sizeof(sLen)); + count += sizeof(sLen); + if (0 < sLen) { - memcpy(tempData + count, &(optValue->srcEp), ENDPOINT_ID_LENGTH); - count += ENDPOINT_ID_LENGTH; + if (optValue->srcGw) + { + memcpy(tempData + count, &(optValue->srcGw), GATEWAY_ID_LENGTH); + count += GATEWAY_ID_LENGTH; + } + + if (optValue->srcEp) + { + memcpy(tempData + count, &(optValue->srcEp), ENDPOINT_ID_LENGTH); + count += ENDPOINT_ID_LENGTH; + } } + + memcpy(tempData + count, &optValue->mSeqNum, sizeof(optValue->mSeqNum)); } - memcpy(tempData + count, &optValue->mSeqNum, sizeof(optValue->mSeqNum)); - count += sizeof(optValue->mSeqNum); - memcpy(tempData + count, &optValue->msgType, sizeof(optValue->msgType)); memcpy(options->optionData, tempData, totalLength); options->optionID = RM_OPTION_MESSAGE_SWITCHING; @@ -361,38 +434,64 @@ OCStackResult RMParseRouteOption(const CAHeaderOption_t *options, RMRouteOption_ return OC_STACK_ERROR; } - uint8_t dLen = 0 ; - uint16_t count = sizeof(dLen); - memcpy(&dLen, options->optionData, sizeof(dLen)); - if (0 < dLen) - { - memcpy(&(optValue->destGw), options->optionData + count, GATEWAY_ID_LENGTH); - count += GATEWAY_ID_LENGTH; + OIC_LOG_V(DEBUG, RM_TAG, "Option Length is %d", options->optionLength); + uint8_t mType = 0; + memcpy(&mType, options->optionData, sizeof(mType)); - if (GATEWAY_ID_LENGTH < dLen) - { - memcpy(&(optValue->destEp), options->optionData + count, ENDPOINT_ID_LENGTH); - count += ENDPOINT_ID_LENGTH; - } + if (ACK_MESSAGE_TYPE == mType) + { + OIC_LOG(INFO, RM_TAG, "ACK_MESSAGE_TYPE"); + optValue->msgType = ACK; + } + else if (RST_MESSAGE_TYPE == mType) + { + OIC_LOG(INFO, RM_TAG, "RST_MESSAGE_TYPE"); + optValue->msgType = RST; + } + else if (NORMAL_MESSAGE_TYPE == mType) + { + OIC_LOG(INFO, RM_TAG, "NOR_MESSAGE_TYPE"); + optValue->msgType = NOR; } - uint8_t sLen = 0; - memcpy(&sLen, options->optionData + count, sizeof(sLen)); - count += sizeof(sLen); - if (0 < sLen) + if (DEFAULT_ROUTE_OPTION_LEN == options->optionLength) { - memcpy(&(optValue->srcGw), options->optionData + count, GATEWAY_ID_LENGTH); - count += GATEWAY_ID_LENGTH; + OIC_LOG(INFO, RM_TAG, "No source and destination are present"); + } + else + { + uint8_t dLen = 0 ; + uint16_t count = DEFAULT_ROUTE_OPTION_LEN; + memcpy(&dLen, options->optionData + count, sizeof(dLen)); + count += sizeof(dLen); + if (0 < dLen) + { + memcpy(&(optValue->destGw), options->optionData + count, GATEWAY_ID_LENGTH); + count += GATEWAY_ID_LENGTH; + + if (GATEWAY_ID_LENGTH < dLen) + { + memcpy(&(optValue->destEp), options->optionData + count, ENDPOINT_ID_LENGTH); + count += ENDPOINT_ID_LENGTH; + } + } - if (GATEWAY_ID_LENGTH < sLen) + uint8_t sLen = 0; + memcpy(&sLen, options->optionData + count, sizeof(sLen)); + count += sizeof(sLen); + if (0 < sLen) { - memcpy(&(optValue->srcEp), options->optionData + count, ENDPOINT_ID_LENGTH); - count += ENDPOINT_ID_LENGTH; + memcpy(&(optValue->srcGw), options->optionData + count, GATEWAY_ID_LENGTH); + count += GATEWAY_ID_LENGTH; + + if (GATEWAY_ID_LENGTH < sLen) + { + memcpy(&(optValue->srcEp), options->optionData + count, ENDPOINT_ID_LENGTH); + count += ENDPOINT_ID_LENGTH; + } } + memcpy(&optValue->mSeqNum, options->optionData + count, sizeof(optValue->mSeqNum)); } - memcpy(&optValue->mSeqNum, options->optionData + count, sizeof(optValue->mSeqNum)); - count += sizeof(optValue->mSeqNum); - memcpy(&optValue->msgType, options->optionData + count, sizeof(optValue->msgType)); OIC_LOG_V(INFO, RM_TAG, "Option hopcount is %d", optValue->mSeqNum); OIC_LOG_V(INFO, RM_TAG, "Option Sender Addr is [%u][%u]", optValue->srcGw, optValue->srcEp);