From 560ee3bac9eaa1a79a1449988a5fcdee6f655558 Mon Sep 17 00:00:00 2001 From: Alexandre Abadie Date: Fri, 11 Oct 2019 22:59:09 +0200 Subject: [PATCH 1/2] suit: add helper function for triggering updates --- sys/include/suit/coap.h | 15 +++++++++++++++ sys/suit/coap.c | 18 ++++++++++++------ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/sys/include/suit/coap.h b/sys/include/suit/coap.h index e04cdea08d..f909a61eb5 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,19 @@ int suit_coap_get_blockwise_url(const char *url, coap_blksize_t blksize, coap_blockwise_cb_t callback, void *arg); +/** + * @brief Set the url used to fetch the SUIT manifest + * + * @param[in] url url pointer containing the full coap url to the manifest + * @param[in] len length of the url + */ +void suit_coap_set_url(const uint8_t *url, size_t len); + +/** + * @brief Trigger a SUIT udate + */ +void suit_coap_trigger(void); + #endif /* DOXYGEN */ #ifdef __cplusplus 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 }, From 2ff3d4cd8d92537b562a43e1301975556b216c25 Mon Sep 17 00:00:00 2001 From: Alexandre Abadie Date: Fri, 11 Oct 2019 22:59:48 +0200 Subject: [PATCH 2/2] sys/shell: add suit shell command This command allows for triggering an update from the device itself --- sys/include/suit/coap.h | 9 ++----- sys/shell/commands/Makefile | 4 +++ sys/shell/commands/sc_suit.c | 38 +++++++++++++++++++++++++++++ sys/shell/commands/shell_commands.c | 7 ++++++ 4 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 sys/shell/commands/sc_suit.c diff --git a/sys/include/suit/coap.h b/sys/include/suit/coap.h index f909a61eb5..4c1ebbe929 100644 --- a/sys/include/suit/coap.h +++ b/sys/include/suit/coap.h @@ -144,17 +144,12 @@ int suit_coap_get_blockwise_url(const char *url, coap_blockwise_cb_t callback, void *arg); /** - * @brief Set the url used to fetch the SUIT manifest + * @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_set_url(const uint8_t *url, size_t len); - -/** - * @brief Trigger a SUIT udate - */ -void suit_coap_trigger(void); +void suit_coap_trigger(const uint8_t *url, size_t len); #endif /* DOXYGEN */ 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} };