From 2a6a0c09eed171bc0fe37c97b6c48f2b0858f47d Mon Sep 17 00:00:00 2001 From: Shilpa Sodani Date: Thu, 26 Feb 2015 15:10:38 -0800 Subject: [PATCH] Fix Presence issue of not working on Ethernet Change connectivityType of Presence resource to OC_ALL Send presence notification on all the n/w interface Fix IOT-351 & IOT-270 Fixed the if-statement for freeing header options Change-Id: I553434b77885a466a63fba0968edf400abacb53f Signed-off-by: Shilpa Sodani Reviewed-on: https://gerrit.iotivity.org/gerrit/415 Tested-by: jenkins-iotivity Reviewed-by: Sudarshan Prasad Reviewed-by: Sashi Penta --- resource/csdk/stack/src/ocserverrequest.c | 33 ++++++++++++++++++++++++++++++- resource/csdk/stack/src/ocstack.c | 4 +++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/resource/csdk/stack/src/ocserverrequest.c b/resource/csdk/stack/src/ocserverrequest.c index 1d82d2e..2c85307 100644 --- a/resource/csdk/stack/src/ocserverrequest.c +++ b/resource/csdk/stack/src/ocserverrequest.c @@ -403,15 +403,46 @@ OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse) strcat(payload, (const char *)OC_JSON_SUFFIX); responseInfo.info.payload = (CAPayload_t)payload; + #ifdef WITH_PRESENCE + //TODO: Add other connectivity types to CAConnTypes[] when enabled + CAConnectivityType_t CAConnTypes[] = {CA_ETHERNET, CA_WIFI}; + const char * connTypes[] = {"ethernet", "wifi"}; + int size = sizeof(CAConnTypes)/ sizeof(CAConnectivityType_t); + CAConnectivityType_t connType = responseEndpoint.connectivityType; + CAResult_t caResult = CA_STATUS_FAILED; + result = OC_STACK_OK; + + //Sending response on all n/w interfaces + for(int i = 0; i < size; i++ ) + { + responseEndpoint.connectivityType = connType & CAConnTypes[i]; + if(responseEndpoint.connectivityType) + { + //The result is set to OC_STACK_OK only if CASendResponse succeeds in sending the + //response on all the n/w interfaces else it is set to OC_STACK_ERROR + caResult = CASendResponse(&responseEndpoint, &responseInfo); + if(caResult != CA_STATUS_OK) + { + OC_LOG_V(ERROR, TAG, "CASendResponse failed on %s", connTypes[i]); + result = OC_STACK_ERROR; + } + else + { + OC_LOG_V(INFO, TAG, "CASendResponse succeeded on %s", connTypes[i]); + } + } + } + #else CAResult_t caResult = CASendResponse(&responseEndpoint, &responseInfo); if(caResult != CA_STATUS_OK) { - OC_LOG(ERROR, TAG, PCF("CASendResponse error")); + OC_LOG(ERROR, TAG, PCF("CASendResponse failed")); } else { result = OC_STACK_OK; } + #endif OCFree(payload); //Delete the request diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index 4695b77..fdb4d42 100644 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -1871,9 +1871,11 @@ OCStackResult OCStartPresence(const uint32_t ttl) return OC_STACK_ERROR; } + CAConnectivityType_t connType; + OCToCAConnectivityType(OC_ALL, &connType ); AddObserver(OC_PRESENCE_URI, NULL, 0, &caToken, (OCResource *)presenceResource.handle, OC_LOW_QOS, - &addressInfo, CA_WIFI); + &addressInfo, connType); } // Each time OCStartPresence is called -- 2.7.4