/* * 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) };