From c1aa211dc757bc46e07f27e5ff527e037eafc03d Mon Sep 17 00:00:00 2001 From: Matthias Kovatsch Date: Wed, 1 Feb 2012 03:58:35 +0100 Subject: [PATCH] Added RST-MID matching for observing. --- apps/er-coap-07/er-coap-07-engine.c | 4 ++-- apps/er-coap-07/er-coap-07-observing.c | 24 ++++++++++++++++++++++++ apps/er-coap-07/er-coap-07-observing.h | 2 ++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/apps/er-coap-07/er-coap-07-engine.c b/apps/er-coap-07/er-coap-07-engine.c index f0545d61e..326d811a9 100644 --- a/apps/er-coap-07/er-coap-07-engine.c +++ b/apps/er-coap-07/er-coap-07-engine.c @@ -225,8 +225,8 @@ handle_incoming_data(void) /* Cancel possible subscriptions. */ if (IS_OPTION(message, COAP_OPTION_TOKEN)) { - /* RST must be empty, so it is a full client reset. */ - coap_remove_observer_by_client(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport); + /* Erbium stores last MID for each observer. */ + coap_remove_observer_by_mid(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, message->mid); } } diff --git a/apps/er-coap-07/er-coap-07-observing.c b/apps/er-coap-07/er-coap-07-observing.c index 5324a3a00..d9852f4e0 100644 --- a/apps/er-coap-07/er-coap-07-observing.c +++ b/apps/er-coap-07/er-coap-07-observing.c @@ -69,6 +69,7 @@ coap_add_observer(uip_ipaddr_t *addr, uint16_t port, const uint8_t *token, size_ o->port = port; o->token_len = token_len; memcpy(o->token, token, token_len); + o->last_mid = 0; stimer_set(&o->refresh_timer, COAP_OBSERVING_REFRESH_INTERVAL); @@ -107,6 +108,7 @@ coap_remove_observer_by_client(uip_ipaddr_t *addr, uint16_t port) } return removed; } + int coap_remove_observer_by_token(uip_ipaddr_t *addr, uint16_t port, uint8_t *token, size_t token_len) { @@ -124,6 +126,7 @@ coap_remove_observer_by_token(uip_ipaddr_t *addr, uint16_t port, uint8_t *token, } return removed; } + int coap_remove_observer_by_url(uip_ipaddr_t *addr, uint16_t port, const char *url) { @@ -141,6 +144,24 @@ coap_remove_observer_by_url(uip_ipaddr_t *addr, uint16_t port, const char *url) } return removed; } + +int +coap_remove_observer_by_mid(uip_ipaddr_t *addr, uint16_t port, uint16_t mid) +{ + int removed = 0; + coap_observer_t* obs = NULL; + + for (obs = (coap_observer_t*)list_head(observers_list); obs; obs = obs->next) + { + PRINTF("Remove check URL %p\n", url); + if (uip_ipaddr_cmp(&obs->addr, addr) && obs->port==port && obs->last_mid==mid) + { + coap_remove_observer(obs); + removed++; + } + } + return removed; +} /*-----------------------------------------------------------------------------------*/ void coap_notify_observers(const char *url, int type, uint32_t observe, uint8_t *payload, size_t payload_len) @@ -177,6 +198,9 @@ coap_notify_observers(const char *url, int type, uint32_t observe, uint8_t *payl PRINTF(":%u\n", obs->port); PRINTF(" %.*s\n", payload_len, payload); + /* Update last MID for RST matching. */ + obs->last_mid = transaction->mid; + coap_send_transaction(transaction); } } diff --git a/apps/er-coap-07/er-coap-07-observing.h b/apps/er-coap-07/er-coap-07-observing.h index d30acbebc..7b09ba83e 100644 --- a/apps/er-coap-07/er-coap-07-observing.h +++ b/apps/er-coap-07/er-coap-07-observing.h @@ -61,6 +61,7 @@ typedef struct coap_observer { uint16_t port; uint8_t token_len; uint8_t token[COAP_TOKEN_LEN]; + uint16_t last_mid; struct stimer refresh_timer; } coap_observer_t; @@ -72,6 +73,7 @@ void coap_remove_observer(coap_observer_t *o); int coap_remove_observer_by_client(uip_ipaddr_t *addr, uint16_t port); int coap_remove_observer_by_token(uip_ipaddr_t *addr, uint16_t port, uint8_t *token, size_t token_len); int coap_remove_observer_by_url(uip_ipaddr_t *addr, uint16_t port, const char *url); +int coap_remove_observer_by_mid(uip_ipaddr_t *addr, uint16_t port, uint16_t mid); void coap_notify_observers(const char *url, int type, uint32_t observe, uint8_t *payload, size_t payload_len);