Skip to content

Commit a574b7b

Browse files
committed
sys/net/application_layer/nanocoap: use coap_build_separate_reply
1 parent 6496c4e commit a574b7b

File tree

2 files changed

+14
-15
lines changed

2 files changed

+14
-15
lines changed

sys/include/net/nanocoap_sock.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,8 @@ typedef struct {
248248
typedef struct {
249249
sock_udp_ep_t remote; /**< remote to send response to */
250250
sock_udp_ep_t local; /**< local from which to send response */
251+
coap_hdr_t req; /**< CoAP request header */
251252
uint8_t token[COAP_TOKEN_LENGTH_MAX]; /**< request token */
252-
uint8_t tkl; /**< request token length */
253253
uint8_t no_response; /**< no-response bitmap */
254254
} nanocoap_server_response_ctx_t;
255255

sys/net/application_layer/nanocoap/sock.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

12861285
int 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

Comments
 (0)