diff --git a/examples/suit_update/coap_handler.c b/examples/suit_update/coap_handler.c index 0c15aac7a4..b1cd2c158d 100644 --- a/examples/suit_update/coap_handler.c +++ b/examples/suit_update/coap_handler.c @@ -1,19 +1,23 @@ /* * Copyright (C) 2019 Kaspar Schleiser + * 2019 Freie Universität Berlin + * 2019 Inria * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level * directory for more details. */ -#include -#include -#include - +#include "log.h" +#include "suit.h" #include "net/nanocoap.h" #include "suit/transport/coap.h" #include "kernel_defines.h" +#ifdef MODULE_RIOTBOOT_SLOT +#include "riotboot/slot.h" +#endif + static ssize_t _riot_board_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, coap_request_ctx_t *context) { @@ -22,8 +26,71 @@ static ssize_t _riot_board_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, COAP_FORMAT_TEXT, (uint8_t*)RIOT_BOARD, strlen(RIOT_BOARD)); } +static ssize_t _version_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, + coap_request_ctx_t *context) +{ + (void)context; + return coap_reply_simple(pkt, COAP_CODE_205, buf, len, + COAP_FORMAT_TEXT, (uint8_t *)"NONE", 4); +} + +static ssize_t _trigger_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, + coap_request_ctx_t *context) +{ + (void)context; + unsigned code; + size_t payload_len = pkt->payload_len; + if (payload_len) { + if (payload_len >= CONFIG_SOCK_URLPATH_MAXLEN) { + code = COAP_CODE_REQUEST_ENTITY_TOO_LARGE; + } + else { + code = COAP_CODE_CREATED; + LOG_INFO("suit: received URL: \"%s\"\n", (char *)pkt->payload); + suit_worker_trigger((char *)pkt->payload, strlen((char *)pkt->payload)); + } + } + else { + code = COAP_CODE_REQUEST_ENTITY_INCOMPLETE; + } + + return coap_reply_simple(pkt, code, buf, len, + COAP_FORMAT_NONE, NULL, 0); +} + +#ifdef MODULE_RIOTBOOT_SLOT +static ssize_t _slot_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, + coap_request_ctx_t *context) +{ + /* context is passed either as NULL or 0x1 for /active or /inactive */ + char c = '0'; + + if (coap_request_ctx_get_context(context)) { + c += riotboot_slot_other(); + } + else { + c += riotboot_slot_current(); + } + + return coap_reply_simple(pkt, COAP_CODE_205, buf, len, + COAP_FORMAT_TEXT, (uint8_t *)&c, 1); +} +#endif + +#ifdef MODULE_RIOTBOOT_SLOT +NANOCOAP_RESOURCE(slot_active) { + .path = "/suit/slot/active", .methods = COAP_METHOD_GET, .handler = _slot_handler, +}; +NANOCOAP_RESOURCE(slot_inactive) { + .path = "/suit/slot/inactive", .methods = COAP_METHOD_GET, .handler = _slot_handler, .context = (void *)0x1, +}; +#endif +NANOCOAP_RESOURCE(trigger) { + .path = "/suit/trigger", .methods = COAP_METHOD_PUT | COAP_METHOD_POST, .handler = _trigger_handler, +}; +NANOCOAP_RESOURCE(version) { + .path = "/suit/version", .methods = COAP_METHOD_GET, .handler = _version_handler, +}; NANOCOAP_RESOURCE(board) { .path = "/riot/board", .methods = COAP_GET, .handler = _riot_board_handler, }; - -NANOCOAP_RESOURCE(suit) SUIT_COAP_SUBTREE; diff --git a/sys/include/suit/transport/coap.h b/sys/include/suit/transport/coap.h index 747a53dc0c..3c841918cf 100644 --- a/sys/include/suit/transport/coap.h +++ b/sys/include/suit/transport/coap.h @@ -32,22 +32,6 @@ extern "C" { #endif -/** - * @brief SUIT CoAP endpoint entry. - * - * In order to use, include this header, then add SUIT_COAP_SUBTREE to the nanocoap endpoint array. - * Mind the alphanumerical sorting! - * - * See examples/suit_update for an example. - */ -#define SUIT_COAP_SUBTREE \ - { \ - .path="/suit/", \ - .methods=COAP_MATCH_SUBTREE | COAP_METHOD_GET | COAP_METHOD_POST | COAP_METHOD_PUT, \ - .handler=coap_subtree_handler, \ - .context=(void*)&coap_resource_subtree_suit \ - } - /* * Dear Reviewer, * @@ -63,11 +47,6 @@ extern "C" { */ #ifndef DOXYGEN -/** - * @brief Reference to the coap resource subtree - */ -extern const coap_resource_subtree_t coap_resource_subtree_suit; - /** * @brief Coap block-wise-transfer size used for SUIT */ diff --git a/sys/suit/transport/coap.c b/sys/suit/transport/coap.c deleted file mode 100644 index 81d3bb8dc0..0000000000 --- a/sys/suit/transport/coap.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2019 Freie Universität Berlin - * 2019 Inria - * 2019 Kaspar Schleiser - * - * This file is subject to the terms and conditions of the GNU Lesser - * General Public License v2.1. See the file LICENSE in the top level - * directory for more details. - */ - -/** - * @ingroup sys_suit - * @{ - * - * @file - * @brief SUIT coap - * - * @author Koen Zandberg - * @author Kaspar Schleiser - * @author Francisco Molina - * @author Alexandre Abadie - * @} - */ - -#include "log.h" -#include "suit.h" -#include "net/nanocoap.h" -#include "suit/transport/coap.h" -#include "kernel_defines.h" - -#ifdef MODULE_RIOTBOOT_SLOT -#include "riotboot/slot.h" -#endif - -static ssize_t _version_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, - coap_request_ctx_t *context) -{ - (void)context; - return coap_reply_simple(pkt, COAP_CODE_205, buf, len, - COAP_FORMAT_TEXT, (uint8_t *)"NONE", 4); -} - -static ssize_t _trigger_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, - coap_request_ctx_t *context) -{ - (void)context; - unsigned code; - size_t payload_len = pkt->payload_len; - if (payload_len) { - if (payload_len >= CONFIG_SOCK_URLPATH_MAXLEN) { - code = COAP_CODE_REQUEST_ENTITY_TOO_LARGE; - } - else { - code = COAP_CODE_CREATED; - LOG_INFO("suit: received URL: \"%s\"\n", (char *)pkt->payload); - suit_worker_trigger((char *)pkt->payload, payload_len); - } - } - else { - code = COAP_CODE_REQUEST_ENTITY_INCOMPLETE; - } - - return coap_reply_simple(pkt, code, buf, len, - COAP_FORMAT_NONE, NULL, 0); -} - -#ifdef MODULE_RIOTBOOT_SLOT -static ssize_t _slot_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, - coap_request_ctx_t *context) -{ - /* context is passed either as NULL or 0x1 for /active or /inactive */ - char c = '0'; - - if (coap_request_ctx_get_context(context)) { - c += riotboot_slot_other(); - } - else { - c += riotboot_slot_current(); - } - - return coap_reply_simple(pkt, COAP_CODE_205, buf, len, - COAP_FORMAT_TEXT, (uint8_t *)&c, 1); -} -#endif - -static const coap_resource_t _subtree[] = { -#ifdef MODULE_RIOTBOOT_SLOT - { "/suit/slot/active", COAP_METHOD_GET, _slot_handler, NULL }, - { "/suit/slot/inactive", COAP_METHOD_GET, _slot_handler, (void *)0x1 }, -#endif - { "/suit/trigger", COAP_METHOD_PUT | COAP_METHOD_POST, _trigger_handler, NULL }, - { "/suit/version", COAP_METHOD_GET, _version_handler, NULL }, -}; - -const coap_resource_subtree_t coap_resource_subtree_suit = -{ - .resources = &_subtree[0], - .resources_numof = ARRAY_SIZE(_subtree) -};