diff --git a/sys/include/suit/coap.h b/sys/include/suit/coap.h index e04cdea08d..4c1ebbe929 100644 --- a/sys/include/suit/coap.h +++ b/sys/include/suit/coap.h @@ -19,6 +19,8 @@ * * @brief SUIT CoAP helper API * @author Kaspar Schleiser + * @author Francisco Molina + * @author Alexandre Abadie * */ @@ -141,6 +143,14 @@ int suit_coap_get_blockwise_url(const char *url, coap_blksize_t blksize, coap_blockwise_cb_t callback, void *arg); +/** + * @brief Trigger a SUIT udate + * + * @param[in] url url pointer containing the full coap url to the manifest + * @param[in] len length of the url + */ +void suit_coap_trigger(const uint8_t *url, size_t len); + #endif /* DOXYGEN */ #ifdef __cplusplus diff --git a/sys/shell/commands/Makefile b/sys/shell/commands/Makefile index 6c03471bab..3f4cabc26b 100644 --- a/sys/shell/commands/Makefile +++ b/sys/shell/commands/Makefile @@ -99,4 +99,8 @@ ifneq (,$(filter test_utils_interactive_sync,$(USEMODULE))) SRC += sc_interactive_sync.c endif +ifneq (,$(filter suit_coap,$(USEMODULE))) + SRC += sc_suit.c +endif + include $(RIOTBASE)/Makefile.base diff --git a/sys/shell/commands/sc_suit.c b/sys/shell/commands/sc_suit.c new file mode 100644 index 0000000000..29ae844e03 --- /dev/null +++ b/sys/shell/commands/sc_suit.c @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2019 Alexandre Abadie + * + * 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_shell_commands + * @{ + * + * @file + * @brief Trigger a firmware update from the shell + * + * @author Alexandre Abadie + * + * @} + */ + +#include +#include +#include + +#include "suit/coap.h" + + +int _suit_handler(int argc, char **argv) +{ + if (argc != 2) { + printf("Usage: %s \n", argv[0]); + return 1; + } + + suit_coap_trigger((uint8_t *)argv[1], strlen(argv[1])); + + return 0; +} diff --git a/sys/shell/commands/shell_commands.c b/sys/shell/commands/shell_commands.c index e111ce9bb1..38717d3eae 100644 --- a/sys/shell/commands/shell_commands.c +++ b/sys/shell/commands/shell_commands.c @@ -168,6 +168,10 @@ extern int _test_start(int argc, char **argv); extern int _test_ready(int argc, char **argv); #endif +#ifdef MODULE_SUIT_COAP +extern int _suit_handler(int argc, char **argv); +#endif + const shell_command_t _shell_command_list[] = { {"reboot", "Reboot the node", _reboot_handler}, #ifdef MODULE_CONFIG @@ -276,6 +280,9 @@ const shell_command_t _shell_command_list[] = { #ifdef MODULE_TEST_UTILS_INTERACTIVE_SYNC { "r", "Test sync, Ready query", _test_ready }, { "s", "Test sync, Start test trigger", _test_start }, +#endif +#ifdef MODULE_SUIT_COAP + { "suit", "Trigger a SUIT firmware update", _suit_handler }, #endif {NULL, NULL, NULL} }; diff --git a/sys/suit/coap.c b/sys/suit/coap.c index e62771f1e1..53e1006b43 100644 --- a/sys/suit/coap.c +++ b/sys/suit/coap.c @@ -17,6 +17,8 @@ * * @author Koen Zandberg * @author Kaspar Schleiser + * @author Francisco Molina + * @author Alexandre Abadie * @} */ @@ -480,13 +482,9 @@ static ssize_t _trigger_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, code = COAP_CODE_REQUEST_ENTITY_TOO_LARGE; } else { - memcpy(_url, pkt->payload, payload_len); - _url[payload_len] = '\0'; - code = COAP_CODE_CREATED; - LOG_INFO("suit: received URL: \"%s\"\n", _url); - msg_t m = { .content.value = SUIT_MSG_TRIGGER }; - msg_send(&m, _suit_coap_pid); + LOG_INFO("suit: received URL: \"%s\"\n", (char*)pkt->payload); + suit_coap_trigger(pkt->payload, payload_len); } } else { @@ -497,6 +495,14 @@ static ssize_t _trigger_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, COAP_FORMAT_NONE, NULL, 0); } +void suit_coap_trigger(const uint8_t *url, size_t len) +{ + memcpy(_url, url, len); + _url[len] = '\0'; + msg_t m = { .content.value = SUIT_MSG_TRIGGER }; + msg_send(&m, _suit_coap_pid); +} + static const coap_resource_t _subtree[] = { #ifdef MODULE_RIOTBOOT_SLOT { "/suit/slot/active", COAP_METHOD_GET, _slot_handler, NULL },