@@ -949,12 +949,6 @@ static int large_create_post(struct coap_resource *resource,
949
949
return r ;
950
950
}
951
951
952
- static int send_notification_packet (const struct sockaddr * addr ,
953
- socklen_t addr_len ,
954
- uint16_t age , uint16_t id ,
955
- const uint8_t * token , uint8_t tkl ,
956
- bool is_response );
957
-
958
952
static void schedule_next_retransmission (void )
959
953
{
960
954
struct coap_pending * pending ;
@@ -975,6 +969,8 @@ static void schedule_next_retransmission(void)
975
969
k_work_reschedule (& retransmit_work , K_MSEC (remaining ));
976
970
}
977
971
972
+ static void remove_observer (struct sockaddr * addr );
973
+
978
974
static void retransmit_request (struct k_work * work )
979
975
{
980
976
struct coap_pending * pending ;
@@ -986,6 +982,7 @@ static void retransmit_request(struct k_work *work)
986
982
}
987
983
988
984
if (!coap_pending_cycle (pending )) {
985
+ remove_observer (& pending -> addr );
989
986
k_free (pending -> data );
990
987
coap_pending_clear (pending );
991
988
} else {
@@ -1142,6 +1139,7 @@ static int obs_get(struct coap_resource *resource,
1142
1139
1143
1140
observer = coap_observer_next_unused (observers , NUM_OBSERVERS );
1144
1141
if (!observer ) {
1142
+ LOG_ERR ("Not enough observer slots." );
1145
1143
return - ENOMEM ;
1146
1144
}
1147
1145
@@ -1318,7 +1316,7 @@ static struct coap_resource resources[] = {
1318
1316
{ },
1319
1317
};
1320
1318
1321
- static struct coap_resource * find_resouce_by_observer (
1319
+ static struct coap_resource * find_resource_by_observer (
1322
1320
struct coap_resource * resources , struct coap_observer * o )
1323
1321
{
1324
1322
struct coap_resource * r ;
@@ -1336,6 +1334,28 @@ static struct coap_resource *find_resouce_by_observer(
1336
1334
return NULL ;
1337
1335
}
1338
1336
1337
+ static void remove_observer (struct sockaddr * addr )
1338
+ {
1339
+ struct coap_resource * r ;
1340
+ struct coap_observer * o ;
1341
+
1342
+ o = coap_find_observer_by_addr (observers , NUM_OBSERVERS , addr );
1343
+ if (!o ) {
1344
+ return ;
1345
+ }
1346
+
1347
+ r = find_resource_by_observer (resources , o );
1348
+ if (!r ) {
1349
+ LOG_ERR ("Observer found but Resource not found\n" );
1350
+ return ;
1351
+ }
1352
+
1353
+ LOG_INF ("Removing observer %p" , o );
1354
+
1355
+ coap_remove_observer (r , o );
1356
+ memset (o , 0 , sizeof (struct coap_observer ));
1357
+ }
1358
+
1339
1359
static void process_coap_request (uint8_t * data , uint16_t data_len ,
1340
1360
struct sockaddr * client_addr ,
1341
1361
socklen_t client_addr_len )
@@ -1371,28 +1391,10 @@ static void process_coap_request(uint8_t *data, uint16_t data_len,
1371
1391
not_found :
1372
1392
1373
1393
if (type == COAP_TYPE_RESET ) {
1374
- struct coap_resource * r ;
1375
- struct coap_observer * o ;
1376
-
1377
- o = coap_find_observer_by_addr (observers , NUM_OBSERVERS ,
1378
- client_addr );
1379
- if (!o ) {
1380
- LOG_ERR ("Observer not found\n" );
1381
- goto end ;
1382
- }
1383
-
1384
- r = find_resouce_by_observer (resources , o );
1385
- if (!r ) {
1386
- LOG_ERR ("Observer found but Resource not found\n" );
1387
- goto end ;
1388
- }
1389
-
1390
- coap_remove_observer (r , o );
1391
-
1394
+ remove_observer (client_addr );
1392
1395
return ;
1393
1396
}
1394
1397
1395
- end :
1396
1398
r = coap_handle_request (& request , resources , options , opt_num ,
1397
1399
client_addr , client_addr_len );
1398
1400
if (r < 0 ) {
0 commit comments