@@ -1242,7 +1242,7 @@ int nanocoap_server_prepare_separate(nanocoap_server_response_ctx_t *ctx,
12421242 ctx -> no_response = 0xff ;
12431243 return - EOVERFLOW ;
12441244 }
1245- ctx -> tkl = tkl ;
1245+ ctx -> req = * ( pkt -> hdr ) ;
12461246 memcpy (ctx -> token , coap_get_token (pkt ), tkl );
12471247 memcpy (& ctx -> remote , req -> remote , sizeof (ctx -> remote ));
12481248 assert (req -> local );
@@ -1270,17 +1270,16 @@ ssize_t nanocoap_server_build_separate(const nanocoap_server_response_ctx_t *ctx
12701270 if ((sizeof (coap_hdr_t ) + COAP_TOKEN_LENGTH_MAX + 1 ) > buf_len ) {
12711271 return - EOVERFLOW ;
12721272 }
1273-
1274- const uint8_t no_response_index = (code >> 5 ) - 1 ;
1275- /* If the handler code misbehaved here, we'd face UB otherwise */
1276- assert (no_response_index < 7 );
1277-
1278- const uint8_t mask = 1 << no_response_index ;
1279- if (ctx -> no_response & mask ) {
1280- return - ECANCELED ;
1273+ * ((coap_hdr_t * )buf ) = ctx -> req ;
1274+ ((coap_hdr_t * )buf )-> id = htons (msg_id );
1275+ memcpy (buf + sizeof (ctx -> req ), ctx -> token , coap_hdr_get_token_len (& ctx -> req ));
1276+ if (ctx -> no_response ) {
1277+ coap_opt_put_uint (buf , 0 , COAP_OPT_NO_RESPONSE , ctx -> no_response );
12811278 }
1282-
1283- return coap_build_hdr (buf , type , ctx -> token , ctx -> tkl , code , msg_id );
1279+ coap_pkt_t req = {
1280+ .hdr = buf ,
1281+ };
1282+ return coap_build_separate_reply (& req , type , code , buf , buf_len , 0 );
12841283}
12851284
12861285int nanocoap_server_sendv_separate (const nanocoap_server_response_ctx_t * ctx ,
@@ -1360,7 +1359,7 @@ int nanocoap_register_observer(const coap_request_ctx_t *req_ctx, coap_pkt_t *re
13601359 * subscription in either case */
13611360 DEBUG ("nanocoap: observe slot %" PRIuSIZE " reused\n" , i );
13621361 uint8_t tkl = coap_get_token_len (req_pkt );
1363- _observer_pool [i ].response .tkl = tkl ;
1362+ _observer_pool [i ].response .req = * ( req_pkt -> hdr ) ;
13641363 memcpy (_observer_pool [i ].response .token , coap_get_token (req_pkt ), tkl );
13651364 mutex_unlock (& _observer_pool_lock );
13661365 return 0 ;
@@ -1393,9 +1392,9 @@ void nanocoap_unregister_observer(const coap_request_ctx_t *req_ctx,
13931392 mutex_lock (& _observer_pool_lock );
13941393 for (size_t i = 0 ; i < CONFIG_NANOCOAP_MAX_OBSERVERS ; i ++ ) {
13951394 if ((_observer_pool [i ].resource == req_ctx -> resource )
1396- && (_observer_pool [i ].response .tkl == coap_get_token_len (req_pkt ))
1395+ && (coap_hdr_get_token_len ( & _observer_pool [i ].response .req ) == coap_get_token_len (req_pkt ))
13971396 && !memcmp (_observer_pool [i ].response .token , coap_get_token (req_pkt ),
1398- _observer_pool [i ].response .tkl )
1397+ coap_hdr_get_token_len ( & _observer_pool [i ].response .req ) )
13991398 && sock_udp_ep_equal (& _observer_pool [i ].response .remote , coap_request_ctx_get_remote_udp (req_ctx ))) {
14001399 DEBUG ("nanocoap: observer at index %" PRIuSIZE " unregistered\n" , i );
14011400 _observer_pool [i ].resource = NULL ;
0 commit comments