From 651a0cb2691915c40960681fb9a076ffc07baff7 Mon Sep 17 00:00:00 2001 From: Ravi kumar Veeramally Date: Tue, 18 Apr 2017 11:31:07 +0300 Subject: [PATCH] net: zoap: Prepare and send error response separately If error occurs while preparing response to .well-known/core request, do not send partly filled payload by simply changing code part only. It's better to unref the partly filled reponse and prepare a new error response and send. Change-Id: I28013a4e331cfc6f01de873e80af48f765e49494 Signed-off-by: Ravi kumar Veeramally --- subsys/net/lib/zoap/zoap_link_format.c | 54 ++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/subsys/net/lib/zoap/zoap_link_format.c b/subsys/net/lib/zoap/zoap_link_format.c index c29741a1616..60ffaf88750 100644 --- a/subsys/net/lib/zoap/zoap_link_format.c +++ b/subsys/net/lib/zoap/zoap_link_format.c @@ -217,6 +217,54 @@ static bool match_queries_resource(const struct zoap_resource *resource, return match_attributes(attributes, query); } +static int send_error_response(struct zoap_resource *resource, + struct zoap_packet *request, + const struct sockaddr *from) +{ + struct net_context *context; + struct zoap_packet response; + struct net_buf *buf, *frag; + uint16_t id; + int r; + + id = zoap_header_get_id(request); + + context = net_nbuf_context(request->buf); + + buf = net_nbuf_get_tx(context, K_FOREVER); + if (!buf) { + return -ENOMEM; + } + + frag = net_nbuf_get_data(context, K_FOREVER); + if (!frag) { + net_nbuf_unref(buf); + return -ENOMEM; + } + + net_buf_frag_add(buf, frag); + + r = zoap_packet_init(&response, buf); + if (r < 0) { + net_nbuf_unref(buf); + return r; + } + + /* FIXME: Could be that zoap_packet_init() sets some defaults */ + zoap_header_set_version(&response, 1); + zoap_header_set_type(&response, ZOAP_TYPE_ACK); + zoap_header_set_code(&response, ZOAP_RESPONSE_CODE_BAD_REQUEST); + zoap_header_set_id(&response, id); + + r = net_context_sendto(buf, from, sizeof(struct sockaddr_in6), + NULL, 0, NULL, NULL); + if (r < 0) { + net_nbuf_unref(buf); + } + + return r; +} + int _zoap_well_known_core_get(struct zoap_resource *resource, struct zoap_packet *request, const struct sockaddr *from) @@ -318,10 +366,8 @@ int _zoap_well_known_core_get(struct zoap_resource *resource, done: if (r < 0) { - /* FIXME: If error occurs after appending some payload, better - * remove payload and send only BAD_REQUEST response. - */ - zoap_header_set_code(&response, ZOAP_RESPONSE_CODE_BAD_REQUEST); + net_nbuf_unref(buf); + return send_error_response(resource, request, from); } r = net_context_sendto(buf, from, sizeof(struct sockaddr_in6),