This is an automated email from the ASF dual-hosted git repository. sjanc pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-core.git
commit 5e8499299508d9a45757f302f5c0a187fe46fd04 Author: Szymon Janc <[email protected]> AuthorDate: Tue Oct 6 19:21:00 2026 +0200 mgmt/mcumgr: Remove mgmt_streamer abstraction mgmt_streamer was a set of callbacks that allowed mcumgr to be used with different buffer types on different OSes. On Mynewt both SMP and OMP always use os_mbuf so this indirection is no longer needed. SMP now operates on os_mbuf directly (helpers are moved from core SMP transport glue to mcumgr SMP) and OMP initializes CBOR mbuf reader directly. smp_streamer and omp_streamer hold pointers to CBOR mbuf reader/writer instead of generic mgmt_streamer and mgmt_ctxt_init() takes reader and writer as parameters. Unused OMP streamer callbacks are removed from oicmgr. Those were never called, but omgr_alloc_rsp() was leaking allocated mbuf. No functional changes. Assisted-by: Claude:claude-opus-5-5 --- mgmt/mcumgr/mgmt/include/mgmt/mgmt.h | 201 +-------------------------- mgmt/mcumgr/mgmt/src/mgmt.c | 51 +------ mgmt/mcumgr/omp/include/omp/omp.h | 7 +- mgmt/mcumgr/omp/src/omp.c | 20 ++- mgmt/mcumgr/smp/include/smp/smp.h | 19 ++- mgmt/mcumgr/smp/src/smp.c | 113 +++++++++++---- mgmt/oicmgr/include/oicmgr/oicmgr.h | 1 - mgmt/oicmgr/src/oicmgr.c | 152 +------------------- mgmt/smp/include/mynewt_smp/smp.h | 1 - mgmt/smp/src/smp.c | 147 +------------------- mgmt/smp/transport/smp_shell/src/smp_shell.c | 11 +- 11 files changed, 133 insertions(+), 590 deletions(-) diff --git a/mgmt/mcumgr/mgmt/include/mgmt/mgmt.h b/mgmt/mcumgr/mgmt/include/mgmt/mgmt.h index b0fc2dd33..bf43453ed 100644 --- a/mgmt/mcumgr/mgmt/include/mgmt/mgmt.h +++ b/mgmt/mcumgr/mgmt/include/mgmt/mgmt.h @@ -120,114 +120,6 @@ struct mgmt_evt_op_cmd_done_arg { */ typedef void mgmt_on_evt_cb(uint8_t opcode, uint16_t group, uint8_t id, void *arg); -/** @typedef mgmt_alloc_rsp_fn - * @brief Allocates a buffer suitable for holding a response. - * - * If a source buf is provided, its user data is copied into the new buffer. - * - * @param src_buf An optional source buffer to copy user data - * from. - * @param arg Optional streamer argument. - * - * @return Newly-allocated buffer on success - * NULL on failure. - */ -typedef void *mgmt_alloc_rsp_fn(const void *src_buf, void *arg); - -/** @typedef mgmt_trim_front_fn - * @brief Trims data from the front of a buffer. - * - * If the amount to trim exceeds the size of the buffer, the buffer is - * truncated to a length of 0. - * - * @param buf The buffer to trim. - * @param len The number of bytes to remove. - * @param arg Optional streamer argument. - */ -typedef void mgmt_trim_front_fn(void *buf, size_t len, void *arg); - -/** @typedef mgmt_reset_buf_fn - * @brief Resets a buffer to a length of 0. - * - * The buffer's user data remains, but its payload is cleared. - * - * @param buf The buffer to reset. - * @param arg Optional streamer argument. - */ -typedef void mgmt_reset_buf_fn(void *buf, void *arg); - -/** @typedef mgmt_write_at_fn - * @brief Writes data to a CBOR encoder. - * - * Any existing data at the specified offset is overwritten by the new data. - * Any new data that extends past the buffer's current length is appended. - * - * @param writer The encoder to write to. - * @param offset The byte offset to write to, - * @param data The data to write. - * @param len The number of bytes to write. - * @param arg Optional streamer argument. - * - * @return 0 on success, MGMT_ERR_[...] code on failure. - */ -typedef int mgmt_write_at_fn(struct cbor_encoder_writer *writer, size_t offset, - const void *data, size_t len, void *arg); - -/** @typedef mgmt_init_reader_fn - * @brief Initializes a CBOR reader with the specified buffer. - * - * @param reader The reader to initialize. - * @param buf The buffer to configure the reader with. - * @param arg Optional streamer argument. - * - * @return 0 on success, MGMT_ERR_[...] code on failure. - */ -typedef int mgmt_init_reader_fn(struct cbor_decoder_reader *reader, void *buf, - void *arg); - -/** @typedef mgmt_init_writer_fn - * @brief Initializes a CBOR writer with the specified buffer. - * - * @param writer The writer to initialize. - * @param buf The buffer to configure the writer with. - * @param arg Optional streamer argument. - * - * @return 0 on success, MGMT_ERR_[...] code on failure. - */ -typedef int mgmt_init_writer_fn(struct cbor_encoder_writer *writer, void *buf, - void *arg); - -/** @typedef mgmt_init_writer_fn - * @brief Frees the specified buffer. - * - * @param buf The buffer to free. - * @param arg Optional streamer argument. - */ -typedef void mgmt_free_buf_fn(void *buf, void *arg); - -/** - * @brief Configuration for constructing a mgmt_streamer object. - */ -struct mgmt_streamer_cfg { - mgmt_alloc_rsp_fn *alloc_rsp; - mgmt_trim_front_fn *trim_front; - mgmt_reset_buf_fn *reset_buf; - mgmt_write_at_fn *write_at; - mgmt_init_reader_fn *init_reader; - mgmt_init_writer_fn *init_writer; - mgmt_free_buf_fn *free_buf; -}; - -/** - * @brief Decodes requests and encodes responses for any mcumgr protocol. - */ -struct mgmt_streamer { - const struct mgmt_streamer_cfg *cfg; - void *cb_arg; - struct cbor_decoder_reader *reader; - struct cbor_encoder_writer *writer; -}; - /** * @brief Context required by command handlers for parsing requests and writing * responses. @@ -273,89 +165,6 @@ struct mgmt_group { uint16_t mg_group_id; }; -/** - * @brief Uses the specified streamer to allocates a response buffer. - * - * If a source buf is provided, its user data is copied into the new buffer. - * - * @param streamer The streamer providing the callback. - * @param src_buf An optional source buffer to copy user data - * from. - * - * @return Newly-allocated buffer on success - * NULL on failure. - */ -void *mgmt_streamer_alloc_rsp(struct mgmt_streamer *streamer, const void *src_buf); - -/** - * @brief Uses the specified streamer to trim data from the front of a buffer. - * - * If the amount to trim exceeds the size of the buffer, the buffer is - * truncated to a length of 0. - * - * @param streamer The streamer providing the callback. - * @param buf The buffer to trim. - * @param len The number of bytes to remove. - */ -void mgmt_streamer_trim_front(struct mgmt_streamer *streamer, void *buf, size_t len); - -/** - * @brief Uses the specified streamer to reset a buffer to a length of 0. - * - * The buffer's user data remains, but its payload is cleared. - * - * @param streamer The streamer providing the callback. - * @param buf The buffer to reset. - */ -void mgmt_streamer_reset_buf(struct mgmt_streamer *streamer, void *buf); - -/** - * @brief Uses the specified streamer to write data to a CBOR encoder. - * - * Any existing data at the specified offset is overwritten by the new data. - * Any new data that extends past the buffer's current length is appended. - * - * @param streamer The streamer providing the callback. - * @param writer The encoder to write to. - * @param offset The byte offset to write to, - * @param data The data to write. - * @param len The number of bytes to write. - * - * @return 0 on success, MGMT_ERR_[...] code on failure. - */ -int mgmt_streamer_write_at(struct mgmt_streamer *streamer, size_t offset, - const void *data, int len); - -/** - * @brief Uses the specified streamer to initialize a CBOR reader. - * - * @param streamer The streamer providing the callback. - * @param reader The reader to initialize. - * @param buf The buffer to configure the reader with. - * - * @return 0 on success, MGMT_ERR_[...] code on failure. - */ -int mgmt_streamer_init_reader(struct mgmt_streamer *streamer, void *buf); - -/** - * @brief Uses the specified streamer to initializes a CBOR writer. - * - * @param streamer The streamer providing the callback. - * @param writer The writer to initialize. - * @param buf The buffer to configure the writer with. - * - * @return 0 on success, MGMT_ERR_[...] code on failure. - */ -int mgmt_streamer_init_writer(struct mgmt_streamer *streamer, void *buf); - -/** - * @brief Uses the specified streamer to free a buffer. - * - * @param streamer The streamer providing the callback. - * @param buf The buffer to free. - */ -void mgmt_streamer_free_buf(struct mgmt_streamer *streamer, void *buf); - /** * @brief Registers a full command group. * @@ -392,15 +201,17 @@ const struct mgmt_handler *mgmt_find_handler(uint16_t group_id, uint16_t command int mgmt_write_rsp_status(struct mgmt_ctxt *ctxt, int status); /** - * @brief Initializes a management context object with the specified streamer. + * @brief Initializes a management context object with the specified reader + * and writer. * * @param ctxt The context object to initialize. - * @param streamer The streamer that will be used with the - * context. + * @param reader The CBOR reader for request payload. + * @param writer The CBOR writer for response payload. * * @return 0 on success, MGMT_ERR_[...] code on failure. */ -int mgmt_ctxt_init(struct mgmt_ctxt *ctxt, struct mgmt_streamer *streamer); +int mgmt_ctxt_init(struct mgmt_ctxt *ctxt, struct cbor_decoder_reader *reader, + struct cbor_encoder_writer *writer); /** * @brief Converts a CBOR status code to a MGMT_ERR_[...] code. diff --git a/mgmt/mcumgr/mgmt/src/mgmt.c b/mgmt/mcumgr/mgmt/src/mgmt.c index 18d2aa558..9ef93a245 100644 --- a/mgmt/mcumgr/mgmt/src/mgmt.c +++ b/mgmt/mcumgr/mgmt/src/mgmt.c @@ -27,50 +27,6 @@ static mgmt_on_evt_cb *evt_cb; static struct mgmt_group *mgmt_group_list; static struct mgmt_group *mgmt_group_list_end; -void * -mgmt_streamer_alloc_rsp(struct mgmt_streamer *streamer, const void *req) -{ - return streamer->cfg->alloc_rsp(req, streamer->cb_arg); -} - -void -mgmt_streamer_trim_front(struct mgmt_streamer *streamer, void *buf, size_t len) -{ - streamer->cfg->trim_front(buf, len, streamer->cb_arg); -} - -void -mgmt_streamer_reset_buf(struct mgmt_streamer *streamer, void *buf) -{ - streamer->cfg->reset_buf(buf, streamer->cb_arg); -} - -int -mgmt_streamer_write_at(struct mgmt_streamer *streamer, size_t offset, - const void *data, int len) -{ - return streamer->cfg->write_at(streamer->writer, offset, data, len, - streamer->cb_arg); -} - -int -mgmt_streamer_init_reader(struct mgmt_streamer *streamer, void *buf) -{ - return streamer->cfg->init_reader(streamer->reader, buf, streamer->cb_arg); -} - -int -mgmt_streamer_init_writer(struct mgmt_streamer *streamer, void *buf) -{ - return streamer->cfg->init_writer(streamer->writer, buf, streamer->cb_arg); -} - -void -mgmt_streamer_free_buf(struct mgmt_streamer *streamer, void *buf) -{ - streamer->cfg->free_buf(buf, streamer->cb_arg); -} - void mgmt_unregister_group(struct mgmt_group *group) { @@ -187,16 +143,17 @@ mgmt_err_from_cbor(int cbor_status) } int -mgmt_ctxt_init(struct mgmt_ctxt *ctxt, struct mgmt_streamer *streamer) +mgmt_ctxt_init(struct mgmt_ctxt *ctxt, struct cbor_decoder_reader *reader, + struct cbor_encoder_writer *writer) { int rc; - rc = cbor_parser_init(streamer->reader, 0, &ctxt->parser, &ctxt->it); + rc = cbor_parser_init(reader, 0, &ctxt->parser, &ctxt->it); if (rc != CborNoError) { return mgmt_err_from_cbor(rc); } - cbor_encoder_init(&ctxt->encoder, streamer->writer, 0); + cbor_encoder_init(&ctxt->encoder, writer, 0); return 0; } diff --git a/mgmt/mcumgr/omp/include/omp/omp.h b/mgmt/mcumgr/omp/include/omp/omp.h index 043ee8846..c290a4c21 100644 --- a/mgmt/mcumgr/omp/include/omp/omp.h +++ b/mgmt/mcumgr/omp/include/omp/omp.h @@ -38,6 +38,7 @@ #ifndef H_OMP_ #define H_OMP_ +#include "tinycbor/cbor_mbuf_reader.h" #include "mgmt/mgmt.h" #ifdef __cplusplus @@ -62,7 +63,10 @@ typedef void omp_tx_rsp_fn(struct omp_streamer *stmr, int retval, void *arg); * underlying OIC implementation. */ struct omp_streamer { - struct mgmt_streamer mgmt_stmr; + /** CBOR reader used for decoding requests. */ + struct cbor_mbuf_reader *reader; + /** Offset of request payload in request buffer. */ + uint16_t req_off; struct CborEncoder *rsp_encoder; omp_tx_rsp_fn *tx_rsp_cb; }; @@ -72,7 +76,6 @@ struct omp_streamer { */ struct omp_state { struct omp_streamer omp_stmr; - struct mgmt_ctxt *m_ctxt; void *request; }; diff --git a/mgmt/mcumgr/omp/src/omp.c b/mgmt/mcumgr/omp/src/omp.c index 6ff42e33e..e0bc33c6f 100644 --- a/mgmt/mcumgr/omp/src/omp.c +++ b/mgmt/mcumgr/omp/src/omp.c @@ -156,6 +156,13 @@ omp_process_mgmt_hdr(struct mgmt_hdr *req_hdr, struct mgmt_hdr *rsp_hdr, return mgmt_err_from_cbor(rc); } +static void +omp_init_reader(struct omp_streamer *streamer, struct os_mbuf *m, struct mgmt_ctxt *ctxt) +{ + cbor_mbuf_reader_init(streamer->reader, m, streamer->req_off); + cbor_parser_init(&streamer->reader->r, 0, &ctxt->parser, &ctxt->it); +} + int omp_process_request_packet(struct omp_state *omgr_st, void *req_buf) { @@ -169,15 +176,10 @@ omp_process_request_packet(struct omp_state *omgr_st, void *req_buf) assert(req_buf); streamer = &omgr_st->omp_stmr; - omgr_st->m_ctxt = &ctxt; req_m = (struct os_mbuf *)req_buf; - rc = mgmt_streamer_init_reader(&streamer->mgmt_stmr, req_m); - if (rc != 0) { - rc = MGMT_ERR_EINVAL; - return rc; - } + omp_init_reader(streamer, req_m, &ctxt); rc = omp_read_hdr(&ctxt.it, &req_hdr); if (rc != 0) { @@ -187,11 +189,7 @@ omp_process_request_packet(struct omp_state *omgr_st, void *req_buf) memcpy(&rsp_hdr, &req_hdr, sizeof(struct mgmt_hdr)); - rc = mgmt_streamer_init_reader(&streamer->mgmt_stmr, req_m); - if (rc != 0) { - rc = MGMT_ERR_EINVAL; - return rc; - } + omp_init_reader(streamer, req_m, &ctxt); rc = cbor_encoder_create_map(streamer->rsp_encoder, &ctxt.encoder, CborIndefiniteLength); diff --git a/mgmt/mcumgr/smp/include/smp/smp.h b/mgmt/mcumgr/smp/include/smp/smp.h index 7afa7adbb..5a285aacf 100644 --- a/mgmt/mcumgr/smp/include/smp/smp.h +++ b/mgmt/mcumgr/smp/include/smp/smp.h @@ -38,6 +38,9 @@ #ifndef H_SMP_ #define H_SMP_ +#include "os/os_mbuf.h" +#include "tinycbor/cbor_mbuf_reader.h" +#include "tinycbor/cbor_mbuf_writer.h" #include "mgmt/mgmt.h" #ifdef __cplusplus @@ -51,18 +54,23 @@ struct mgmt_hdr; * @brief Transmits an SMP response packet. * * @param ss The streamer to transmit via. - * @param buf Buffer containing the response packet. + * @param rsp Buffer containing the response packet. * @param arg Optional streamer argument. * * @return 0 on success, MGMT_ERR_[...] code on failure. */ -typedef int smp_tx_rsp_fn(struct smp_streamer *ss, void *buf, void *arg); +typedef int smp_tx_rsp_fn(struct smp_streamer *ss, struct os_mbuf *rsp, void *arg); /** * @brief Decodes, encodes, and transmits SMP packets. */ struct smp_streamer { - struct mgmt_streamer mgmt_stmr; + /** CBOR reader used for decoding requests. */ + struct cbor_mbuf_reader *reader; + /** CBOR writer used for encoding responses. */ + struct cbor_mbuf_writer *writer; + /** Optional argument passed to tx_rsp_cb. */ + void *cb_arg; smp_tx_rsp_fn *tx_rsp_cb; }; @@ -76,13 +84,12 @@ struct smp_streamer { * processing of the packet is aborted. This function consumes the supplied * request buffer regardless of the outcome. * - * @param streamer The streamer providing the required SMP - * callbacks. + * @param streamer The streamer used for processing request. * @param req The request packet to process. * * @return 0 on success, MGMT_ERR_[...] code on failure. */ -int smp_process_request_packet(struct smp_streamer *streamer, void *req); +int smp_process_request_packet(struct smp_streamer *streamer, struct os_mbuf *req); #ifdef __cplusplus } diff --git a/mgmt/mcumgr/smp/src/smp.c b/mgmt/mcumgr/smp/src/smp.c index 0af163c5a..76eb976cd 100644 --- a/mgmt/mcumgr/smp/src/smp.c +++ b/mgmt/mcumgr/smp/src/smp.c @@ -66,12 +66,77 @@ smp_init_rsp_hdr(const struct mgmt_hdr *req_hdr, struct mgmt_hdr *rsp_hdr) }; } +static struct os_mbuf * +smp_alloc_rsp(struct os_mbuf *req) +{ + struct os_mbuf *rsp; + + if (!req) { + return NULL; + } + + rsp = os_msys_get_pkthdr(0, OS_MBUF_USRHDR_LEN(req)); + if (!rsp) { + return NULL; + } + + memcpy(OS_MBUF_USRHDR(rsp), OS_MBUF_USRHDR(req), OS_MBUF_USRHDR_LEN(req)); + + return rsp; +} + +static void +smp_reset_buf(struct os_mbuf *m) +{ + if (!m) { + return; + } + + /* We need to trim from the back because the head + * contains useful information which we do not want + * to get rid of + */ + os_mbuf_adj(m, -1 * OS_MBUF_PKTLEN(m)); +} + +static void +smp_free_buf(struct os_mbuf *m) +{ + if (!m) { + return; + } + + os_mbuf_free_chain(m); +} + +static int +smp_write_at(struct cbor_mbuf_writer *cmw, size_t offset, const void *data, size_t len) +{ + struct os_mbuf *m; + int rc; + + m = cmw->m; + + if (offset > OS_MBUF_PKTLEN(m)) { + return MGMT_ERR_EINVAL; + } + + rc = os_mbuf_copyinto(m, offset, data, len); + if (rc) { + return MGMT_ERR_ENOMEM; + } + + cmw->enc.bytes_written = OS_MBUF_PKTLEN(m); + + return 0; +} + static int smp_read_hdr(struct smp_streamer *streamer, struct mgmt_hdr *dst_hdr) { struct cbor_decoder_reader *reader; - reader = streamer->mgmt_stmr.reader; + reader = &streamer->reader->r; if (reader->message_size < sizeof *dst_hdr) { return MGMT_ERR_EINVAL; @@ -86,7 +151,7 @@ smp_write_hdr(struct smp_streamer *streamer, const struct mgmt_hdr *src_hdr) { int rc; - rc = mgmt_streamer_write_at(&streamer->mgmt_stmr, 0, src_hdr, sizeof *src_hdr); + rc = smp_write_at(streamer->writer, 0, src_hdr, sizeof *src_hdr); return mgmt_err_from_cbor(rc); } @@ -99,7 +164,7 @@ smp_build_err_rsp(struct smp_streamer *streamer, struct mgmt_hdr rsp_hdr; int rc; - rc = mgmt_ctxt_init(&cbuf, &streamer->mgmt_stmr); + rc = mgmt_ctxt_init(&cbuf, &streamer->reader->r, &streamer->writer->enc); if (rc != 0) { return rc; } @@ -224,7 +289,7 @@ smp_handle_single_req(struct smp_streamer *streamer, struct mgmt_hdr rsp_hdr; int rc; - rc = mgmt_ctxt_init(&cbuf, &streamer->mgmt_stmr); + rc = mgmt_ctxt_init(&cbuf, &streamer->reader->r, &streamer->writer->enc); if (rc != 0) { return rc; } @@ -270,7 +335,7 @@ smp_handle_single_req(struct smp_streamer *streamer, */ static void smp_on_err(struct smp_streamer *streamer, const struct mgmt_hdr *req_hdr, - void *req, void *rsp, int status) + struct os_mbuf *req, struct os_mbuf *rsp, int status) { int rc; @@ -283,19 +348,19 @@ smp_on_err(struct smp_streamer *streamer, const struct mgmt_hdr *req_hdr, } /* Clear the partial response from the buffer, if any. */ - mgmt_streamer_reset_buf(&streamer->mgmt_stmr, rsp); - mgmt_streamer_init_writer(&streamer->mgmt_stmr, rsp); + smp_reset_buf(rsp); + cbor_mbuf_writer_init(streamer->writer, rsp); /* Build and transmit the error response. */ rc = smp_build_err_rsp(streamer, req_hdr, status); if (rc == 0) { - streamer->tx_rsp_cb(streamer, rsp, streamer->mgmt_stmr.cb_arg); + streamer->tx_rsp_cb(streamer, rsp, streamer->cb_arg); rsp = NULL; } /* Free any extra buffers. */ - mgmt_streamer_free_buf(&streamer->mgmt_stmr, req); - mgmt_streamer_free_buf(&streamer->mgmt_stmr, rsp); + smp_free_buf(req); + smp_free_buf(rsp); } /** @@ -312,11 +377,11 @@ smp_on_err(struct smp_streamer *streamer, const struct mgmt_hdr *req_hdr, * @return 0 on success, MGMT_ERR_[...] code on failure. */ int -smp_process_request_packet(struct smp_streamer *streamer, void *req) +smp_process_request_packet(struct smp_streamer *streamer, struct os_mbuf *req) { struct mgmt_hdr req_hdr; struct mgmt_evt_op_cmd_done_arg cmd_done_arg; - void *rsp; + struct os_mbuf *rsp; bool valid_hdr, handler_found; int rc; @@ -326,11 +391,7 @@ smp_process_request_packet(struct smp_streamer *streamer, void *req) while (1) { handler_found = false; - rc = mgmt_streamer_init_reader(&streamer->mgmt_stmr, req); - if (rc != 0) { - valid_hdr = false; - break; - } + cbor_mbuf_reader_init(streamer->reader, req, 0); /* Read the management header and strip it from the request. */ rc = smp_read_hdr(streamer, &req_hdr); @@ -339,18 +400,15 @@ smp_process_request_packet(struct smp_streamer *streamer, void *req) break; } mgmt_ntoh_hdr(&req_hdr); - mgmt_streamer_trim_front(&streamer->mgmt_stmr, req, MGMT_HDR_SIZE); + os_mbuf_adj(req, MGMT_HDR_SIZE); - rsp = mgmt_streamer_alloc_rsp(&streamer->mgmt_stmr, req); + rsp = smp_alloc_rsp(req); if (rsp == NULL) { rc = MGMT_ERR_ENOMEM; break; } - rc = mgmt_streamer_init_writer(&streamer->mgmt_stmr, rsp); - if (rc != 0) { - break; - } + cbor_mbuf_writer_init(streamer->writer, rsp); /* Process the request payload and build the response. */ rc = smp_handle_single_req(streamer, &req_hdr, &handler_found); @@ -359,15 +417,14 @@ smp_process_request_packet(struct smp_streamer *streamer, void *req) } /* Send the response. */ - rc = streamer->tx_rsp_cb(streamer, rsp, streamer->mgmt_stmr.cb_arg); + rc = streamer->tx_rsp_cb(streamer, rsp, streamer->cb_arg); rsp = NULL; if (rc != 0) { break; } /* Trim processed request to free up space for subsequent responses. */ - mgmt_streamer_trim_front(&streamer->mgmt_stmr, req, - smp_align4(req_hdr.nh_len)); + os_mbuf_adj(req, smp_align4(req_hdr.nh_len)); cmd_done_arg.err = MGMT_ERR_EOK; mgmt_evt(MGMT_EVT_OP_CMD_DONE, req_hdr.nh_group, req_hdr.nh_id, &cmd_done_arg); @@ -385,7 +442,7 @@ smp_process_request_packet(struct smp_streamer *streamer, void *req) return rc; } - mgmt_streamer_free_buf(&streamer->mgmt_stmr, req); - mgmt_streamer_free_buf(&streamer->mgmt_stmr, rsp); + smp_free_buf(req); + smp_free_buf(rsp); return 0; } diff --git a/mgmt/oicmgr/include/oicmgr/oicmgr.h b/mgmt/oicmgr/include/oicmgr/oicmgr.h index 3317e8fcf..3b4779559 100644 --- a/mgmt/oicmgr/include/oicmgr/oicmgr.h +++ b/mgmt/oicmgr/include/oicmgr/oicmgr.h @@ -27,7 +27,6 @@ extern "C" { #endif -extern const struct mgmt_streamer_cfg g_omp_cbor_cfg; /** * Process an oicmgr request. On completion, an oicmgr response is sent back diff --git a/mgmt/oicmgr/src/oicmgr.c b/mgmt/oicmgr/src/oicmgr.c index d037757dc..801d095f2 100644 --- a/mgmt/oicmgr/src/oicmgr.c +++ b/mgmt/oicmgr/src/oicmgr.c @@ -34,149 +34,6 @@ static struct omp_state omgr_state; -static mgmt_alloc_rsp_fn omgr_alloc_rsp; -static mgmt_trim_front_fn omgr_trim_front; -static mgmt_reset_buf_fn omgr_reset_buf; -static mgmt_write_at_fn omgr_write_at; -static mgmt_init_reader_fn omgr_init_reader; -static mgmt_init_writer_fn omgr_init_writer; -static mgmt_free_buf_fn omgr_free_buf; - -const struct mgmt_streamer_cfg g_omgr_cbor_cfg = { - .alloc_rsp = omgr_alloc_rsp, - .trim_front = omgr_trim_front, - .reset_buf = omgr_reset_buf, - .write_at = omgr_write_at, - .init_reader = omgr_init_reader, - .init_writer = omgr_init_writer, - .free_buf = omgr_free_buf, -}; - -static void* -omgr_alloc_rsp(const void *src_buf, void *req) -{ - struct os_mbuf *m; - struct os_mbuf *rsp; - - if (!req) { - return NULL; - } - - m = (struct os_mbuf *)req; - - rsp = os_msys_get_pkthdr(0, OS_MBUF_USRHDR_LEN(m)); - if (!rsp) { - return NULL; - } - - memcpy(OS_MBUF_USRHDR(rsp), OS_MBUF_USRHDR(m), OS_MBUF_USRHDR_LEN(m)); - - return req; -} - -static void -omgr_trim_front(void *m, size_t len, void *arg) -{ - os_mbuf_adj(m, len); -} - -static void -omgr_reset_buf(void *m, void *arg) -{ - if (!m) { - return; - } - - /* We need to trim from the back because the head - * contains useful information which we do not want - * to get rid of - */ - os_mbuf_adj(m, -1 * OS_MBUF_PKTLEN((struct os_mbuf *)m)); -} - -static int -omgr_write_at(struct cbor_encoder_writer *writer, size_t offset, - const void *data, size_t len, void *arg) -{ - struct cbor_mbuf_writer *cmw; - struct os_mbuf *m; - int rc; - - if (!writer) { - return MGMT_ERR_EINVAL; - } - - cmw = (struct cbor_mbuf_writer *)writer; - m = cmw->m; - - if (offset > OS_MBUF_PKTLEN(m)) { - return MGMT_ERR_EINVAL; - } - - rc = os_mbuf_copyinto(m, offset, data, len); - if (rc) { - return MGMT_ERR_ENOMEM; - } - - writer->bytes_written = OS_MBUF_PKTLEN(m); - - return 0; -} - -static void -omgr_free_buf(void *m, void *arg) -{ - if (!m) { - return; - } - - os_mbuf_free_chain(m); -} - -/* - * Inits a reader the mgmt_ctxt's parser. - **/ -static int -omgr_init_reader(struct cbor_decoder_reader *reader, void *m, void *off) -{ - struct cbor_mbuf_reader *cmr; - uint16_t *data_off; - - if (!reader) { - return MGMT_ERR_EINVAL; - } - - cmr = (struct cbor_mbuf_reader *) reader; - data_off = (uint16_t *) off; - cbor_mbuf_reader_init(cmr, m, *data_off); - cbor_parser_init(reader, - 0, - &omgr_state.m_ctxt->parser, - &omgr_state.m_ctxt->it); - - return 0; -} - -/* - * Inits a writer, unused - **/ -static int -omgr_init_writer(struct cbor_encoder_writer *writer, - void *m, - void *unused) -{ - struct cbor_mbuf_writer *cmw; - - if (!writer) { - return MGMT_ERR_EINVAL; - } - - cmw = (struct cbor_mbuf_writer *) writer; - cbor_mbuf_writer_init(cmw, m); - - return 0; -} - static void oic_tx_rsp(struct omp_streamer *stmr, int retval, void *unused) { @@ -190,7 +47,6 @@ void omgr_process_request(oc_request_t *req, oc_interface_mask_t mask) { struct cbor_mbuf_reader reader; - struct cbor_mbuf_writer writer; struct os_mbuf *m_req; uint16_t req_data_off; int rc = 0; @@ -203,12 +59,8 @@ omgr_process_request(oc_request_t *req, oc_interface_mask_t mask) coap_get_payload(req->packet, &m_req, &req_data_off); omgr_state = (struct omp_state) { .omp_stmr = { - .mgmt_stmr = { - .cfg = &g_omgr_cbor_cfg, - .reader = &reader.r, - .writer = &writer.enc, - .cb_arg = &req_data_off, - }, + .reader = &reader, + .req_off = req_data_off, .rsp_encoder = &g_encoder, .tx_rsp_cb = oic_tx_rsp, }, diff --git a/mgmt/smp/include/mynewt_smp/smp.h b/mgmt/smp/include/mynewt_smp/smp.h index 215c521ad..e07a9bbc1 100644 --- a/mgmt/smp/include/mynewt_smp/smp.h +++ b/mgmt/smp/include/mynewt_smp/smp.h @@ -35,7 +35,6 @@ extern "C" { #endif struct smp_transport; -extern const struct mgmt_streamer_cfg g_smp_cbor_cfg; smp_tx_rsp_fn smp_tx_rsp; /** diff --git a/mgmt/smp/src/smp.c b/mgmt/smp/src/smp.c index 763bd2b91..76e474ffd 100644 --- a/mgmt/smp/src/smp.c +++ b/mgmt/smp/src/smp.c @@ -31,24 +31,6 @@ /* Shared queue that SMP uses for work items. */ struct os_eventq *g_smp_evq; -static mgmt_alloc_rsp_fn smp_alloc_rsp; -static mgmt_trim_front_fn smp_trim_front; -static mgmt_reset_buf_fn smp_reset_buf; -static mgmt_write_at_fn smp_write_at; -static mgmt_init_reader_fn smp_init_reader; -static mgmt_init_writer_fn smp_init_writer; -static mgmt_free_buf_fn smp_free_buf; - -const struct mgmt_streamer_cfg g_smp_cbor_cfg = { - .alloc_rsp = smp_alloc_rsp, - .trim_front = smp_trim_front, - .reset_buf = smp_reset_buf, - .write_at = smp_write_at, - .init_reader = smp_init_reader, - .init_writer = smp_init_writer, - .free_buf = smp_free_buf, -}; - void mgmt_evq_set(struct os_eventq *evq) { @@ -61,122 +43,6 @@ mgmt_evq_get(void) return g_smp_evq; } -static void * -smp_alloc_rsp(const void *req, void *arg) -{ - struct os_mbuf *m; - struct os_mbuf *rsp; - - if (!req) { - return NULL; - } - - m = (struct os_mbuf *)req; - - rsp = os_msys_get_pkthdr(0, OS_MBUF_USRHDR_LEN(m)); - if (!rsp) { - return NULL; - } - - memcpy(OS_MBUF_USRHDR(rsp), OS_MBUF_USRHDR(m), OS_MBUF_USRHDR_LEN(m)); - - return rsp; -} - -static void -smp_trim_front(void *m, size_t len, void *arg) -{ - os_mbuf_adj(m, len); -} - -static void -smp_reset_buf(void *m, void *arg) -{ - if (!m) { - return; - } - - /* We need to trim from the back because the head - * contains useful information which we do not want - * to get rid of - */ - os_mbuf_adj(m, -1 * OS_MBUF_PKTLEN((struct os_mbuf *)m)); -} - -static int -smp_write_at(struct cbor_encoder_writer *writer, size_t offset, - const void *data, size_t len, void *arg) -{ - struct cbor_mbuf_writer *cmw; - struct os_mbuf *m; - int rc; - - if (!writer) { - return MGMT_ERR_EINVAL; - } - - cmw = (struct cbor_mbuf_writer *)writer; - m = cmw->m; - - if (offset > OS_MBUF_PKTLEN(m)) { - return MGMT_ERR_EINVAL; - } - - rc = os_mbuf_copyinto(m, offset, data, len); - if (rc) { - return MGMT_ERR_ENOMEM; - } - - writer->bytes_written = OS_MBUF_PKTLEN(m); - - return 0; -} - -static void -smp_free_buf(void *m, void *arg) -{ - if (!m) { - return; - } - - os_mbuf_free_chain(m); -} - -static int -smp_init_reader(struct cbor_decoder_reader *reader, void *m, - void *arg) -{ - struct cbor_mbuf_reader *cmr; - - if (!reader) { - return MGMT_ERR_EINVAL; - } - - cmr = (struct cbor_mbuf_reader *)reader; - cbor_mbuf_reader_init(cmr, m, 0); - - return 0; -} - -static int -smp_init_writer(struct cbor_encoder_writer *writer, void *m, - void *arg) -{ - struct cbor_mbuf_writer *cmw; - - if (!writer) { - return MGMT_ERR_EINVAL; - } - - cmw = (struct cbor_mbuf_writer *)writer; - cbor_mbuf_writer_init(cmw, m); - - return 0; -} - -/** - * Allocates an mbuf to costain an outgoing response fragment. - */ static struct os_mbuf * smp_rsp_frag_alloc(uint16_t frag_size, void *arg) { @@ -199,7 +65,7 @@ smp_rsp_frag_alloc(uint16_t frag_size, void *arg) } int -smp_tx_rsp(struct smp_streamer *ns, void *rsp, void *arg) +smp_tx_rsp(struct smp_streamer *ns, struct os_mbuf *rsp, void *arg) { struct smp_transport *st; struct os_mbuf *frag; @@ -246,13 +112,10 @@ smp_process_packet(struct smp_transport *st) return MGMT_ERR_EINVAL; } - st->st_streamer = (struct smp_streamer) { - .mgmt_stmr = { - .cfg = &g_smp_cbor_cfg, - .reader = &reader.r, - .writer = &writer.enc, - .cb_arg = st, - }, + st->st_streamer = (struct smp_streamer){ + .reader = &reader, + .writer = &writer, + .cb_arg = st, .tx_rsp_cb = smp_tx_rsp, }; diff --git a/mgmt/smp/transport/smp_shell/src/smp_shell.c b/mgmt/smp/transport/smp_shell/src/smp_shell.c index afdf56843..2258d8c7e 100644 --- a/mgmt/smp/transport/smp_shell/src/smp_shell.c +++ b/mgmt/smp/transport/smp_shell/src/smp_shell.c @@ -57,13 +57,10 @@ smp_shell_in(struct os_mbuf *m, void *arg) struct cbor_mbuf_reader cmr; struct cbor_mbuf_writer cmw; - g_smp_shell_transport.st_streamer = (struct smp_streamer) { - .mgmt_stmr = { - .cfg = &g_smp_cbor_cfg, - .reader = &cmr.r, - .writer = &cmw.enc, - .cb_arg = &g_smp_shell_transport, - }, + g_smp_shell_transport.st_streamer = (struct smp_streamer){ + .reader = &cmr, + .writer = &cmw, + .cb_arg = &g_smp_shell_transport, .tx_rsp_cb = smp_tx_rsp, };
