diff --git a/include/coap2/subscribe.h b/include/coap2/subscribe.h index 6b661973..ed635a61 100644 --- a/include/coap2/subscribe.h +++ b/include/coap2/subscribe.h @@ -63,6 +63,7 @@ typedef struct coap_subscription_t { * sent (in that case, the resource's partially * dirty flag is set too) */ unsigned int has_block2:1; /**< GET request had Block2 definition */ + uint16_t tid; /**< transaction id, if any, in regular host byte order */ coap_block_t block2; /**< GET request Block2 definition */ size_t token_length; /**< actual length of token */ unsigned char token[8]; /**< token used for subscription */ diff --git a/src/net.c b/src/net.c index ef0c9bdc..2cd52149 100644 --- a/src/net.c +++ b/src/net.c @@ -2224,6 +2224,20 @@ coap_dispatch(coap_context_t *context, coap_session_t *session, if(sent->pdu->type==COAP_MESSAGE_CON && context->nack_handler) context->nack_handler(context, sent->session, sent->pdu, COAP_NACK_RST, sent->id); } + else { + /* Need to check is there is a subscription active and delete it */ + RESOURCES_ITER(context->resources, r) { + coap_subscription_t *obs, *tmp; + LL_FOREACH_SAFE(r->subscribers, obs, tmp) { + if (obs->tid == pdu->tid && obs->session == session) { + coap_binary_t token = { 0, NULL }; + COAP_SET_STR(&token, obs->token_length, obs->token); + coap_delete_observer(r, session, &token); + goto cleanup; + } + } + } + } goto cleanup; case COAP_MESSAGE_NON: /* check for unknown critical options */ diff --git a/src/resource.c b/src/resource.c index 1d8c6a2e..8f143901 100644 --- a/src/resource.c +++ b/src/resource.c @@ -794,7 +794,7 @@ coap_notify_observers(coap_context_t *context, coap_resource_t *r) { token.length = obs->token_length; token.s = obs->token; - response->tid = coap_new_message_id(obs->session); + obs->tid = response->tid = coap_new_message_id(obs->session); if ((r->flags & COAP_RESOURCE_FLAGS_NOTIFY_CON) == 0 && obs->non_cnt < COAP_OBS_MAX_NON) { response->type = COAP_MESSAGE_NON;