@@ -105,6 +105,10 @@ static bool exchange_lifetime_exceeded(struct coap_client_internal_request *inte
105105 return true;
106106 }
107107
108+ if (internal_req -> pending .t0 == 0 ) {
109+ return true;
110+ }
111+
108112 time_since_t0 = k_uptime_get () - internal_req -> pending .t0 ;
109113 exchange_lifetime =
110114 (internal_req -> pending .params .ack_timeout * COAP_EXCHANGE_LIFETIME_FACTOR );
@@ -364,7 +368,7 @@ int coap_client_req(struct coap_client *client, int sock, const struct sockaddr
364368 /* Don't allow changing to a different socket if there is already request ongoing. */
365369 if (client -> fd != sock && has_ongoing_request (client )) {
366370 ret = - EALREADY ;
367- goto out ;
371+ goto release ;
368372 }
369373
370374 /* Don't allow changing to a different address if there is already request ongoing. */
@@ -373,7 +377,7 @@ int coap_client_req(struct coap_client *client, int sock, const struct sockaddr
373377 if (has_ongoing_request (client )) {
374378 LOG_WRN ("Can't change to a different socket, request ongoing." );
375379 ret = - EALREADY ;
376- goto out ;
380+ goto release ;
377381 }
378382
379383 memcpy (& client -> address , addr , sizeof (* addr ));
@@ -384,7 +388,7 @@ int coap_client_req(struct coap_client *client, int sock, const struct sockaddr
384388 if (has_ongoing_request (client )) {
385389 LOG_WRN ("Can't change to a different socket, request ongoing." );
386390 ret = - EALREADY ;
387- goto out ;
391+ goto release ;
388392 }
389393
390394 memset (& client -> address , 0 , sizeof (client -> address ));
@@ -397,44 +401,52 @@ int coap_client_req(struct coap_client *client, int sock, const struct sockaddr
397401 ret = coap_client_init_request (client , req , internal_req , false);
398402 if (ret < 0 ) {
399403 LOG_ERR ("Failed to initialize coap request" );
400- goto out ;
404+ goto release ;
401405 }
402406
403407 if (client -> send_echo ) {
404408 ret = coap_packet_append_option (& internal_req -> request , COAP_OPTION_ECHO ,
405409 client -> echo_option .value , client -> echo_option .len );
406410 if (ret < 0 ) {
407411 LOG_ERR ("Failed to append echo option" );
408- goto out ;
412+ goto release ;
409413 }
410414 client -> send_echo = false;
411415 }
412416
413417 ret = coap_client_schedule_poll (client , sock , req , internal_req );
414418 if (ret < 0 ) {
415419 LOG_ERR ("Failed to schedule polling" );
416- goto out ;
420+ goto release ;
417421 }
418422
419- /* only TYPE_CON messages need pending tracking */
420- if (coap_header_get_type (& internal_req -> request ) == COAP_TYPE_CON ) {
421- ret = coap_pending_init (& internal_req -> pending , & internal_req -> request ,
422- & client -> address , params );
423+ ret = coap_pending_init (& internal_req -> pending , & internal_req -> request ,
424+ & client -> address , params );
423425
424- if (ret < 0 ) {
425- LOG_ERR ("Failed to initialize pending struct" );
426- goto out ;
427- }
426+ if (ret < 0 ) {
427+ LOG_ERR ("Failed to initialize pending struct" );
428+ goto release ;
429+ }
428430
429- coap_pending_cycle (& internal_req -> pending );
430- internal_req -> is_observe = coap_request_is_observe (& internal_req -> request );
431- LOG_DBG ("Request is_observe %d" , internal_req -> is_observe );
431+ /* Non-Confirmable messages are not retried, but we still track the lifetime as
432+ * replies are acceptable.
433+ */
434+ if (coap_header_get_type (& internal_req -> request ) == COAP_TYPE_NON_CON ) {
435+ internal_req -> pending .retries = 0 ;
432436 }
437+ coap_pending_cycle (& internal_req -> pending );
438+ internal_req -> is_observe = coap_request_is_observe (& internal_req -> request );
439+ LOG_DBG ("Request is_observe %d" , internal_req -> is_observe );
433440
434441 ret = send_request (sock , internal_req -> request .data , internal_req -> request .offset , 0 ,
435442 & client -> address , client -> socklen );
436443 if (ret < 0 ) {
437- LOG_ERR ("Transmission failed: %d" , errno );
444+ ret = - errno ;
445+ }
446+
447+ release :
448+ if (ret < 0 ) {
449+ LOG_ERR ("Failed to send request: %d" , ret );
438450 reset_internal_request (internal_req );
439451 } else {
440452 /* Do not return the number of bytes sent */
@@ -521,6 +533,11 @@ static void coap_client_resend_handler(struct coap_client *client)
521533
522534 for (int i = 0 ; i < CONFIG_COAP_CLIENT_MAX_REQUESTS ; i ++ ) {
523535 if (timeout_expired (& client -> requests [i ])) {
536+ if (!client -> requests [i ].coap_request .confirmable ) {
537+ release_internal_request (& client -> requests [i ]);
538+ continue ;
539+ }
540+
524541 ret = resend_request (client , & client -> requests [i ]);
525542 if (ret < 0 ) {
526543 report_callback_error (& client -> requests [i ], ret );
0 commit comments