/* * Copyright Runtime.io 2018. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_MGMT_SMP_H_ #define ZEPHYR_INCLUDE_MGMT_SMP_H_ #include #ifdef __cplusplus extern "C" { #endif struct zephyr_smp_transport; struct net_buf; /** @typedef zephyr_smp_transport_out_fn * @brief SMP transmit function for Zephyr. * * The supplied net_buf is always consumed, regardless of return code. * * @param zst The transport to send via. * @param nb The net_buf to transmit. * * @return 0 on success, MGMT_ERR_[...] code on failure. */ typedef int zephyr_smp_transport_out_fn(struct zephyr_smp_transport *zst, struct net_buf *nb); /** @typedef zephyr_smp_transport_get_mtu_fn * @brief SMP MTU query function for Zephyr. * * The supplied net_buf should contain a request received from the peer whose * MTU is being queried. This function takes a net_buf parameter because some * transports store connection-specific information in the net_buf user header * (e.g., the BLE transport stores the peer address). * * @param nb Contains a request from the relevant peer. * * @return The transport's MTU; * 0 if transmission is currently not possible. */ typedef uint16_t zephyr_smp_transport_get_mtu_fn(const struct net_buf *nb); /** @typedef zephyr_smp_transport_ud_copy_fn * @brief SMP copy buffer user_data function for Zephyr. * * The supplied src net_buf should contain a user_data that cannot be copied * using regular memcpy function (e.g., the BLE transport net_buf user_data * stores the connection reference that has to be incremented when is going * to be used by another buffer). * * @param dst Source buffer user_data pointer. * @param src Destination buffer user_data pointer. * * @return 0 on success, MGMT_ERR_[...] code on failure. */ typedef int zephyr_smp_transport_ud_copy_fn(struct net_buf *dst, const struct net_buf *src); /** @typedef zephyr_smp_transport_ud_free_fn * @brief SMP free buffer user_data function for Zephyr. * * This function frees net_buf user data, because some transports store * connection-specific information in the net_buf user data (e.g., the BLE * transport stores the connection reference that has to be decreased). * * @param ud Contains a user_data pointer to be freed. */ typedef void zephyr_smp_transport_ud_free_fn(void *ud); /** * @brief Provides Zephyr-specific functionality for sending SMP responses. */ struct zephyr_smp_transport { /* Must be the first member. */ struct k_work zst_work; /* FIFO containing incoming requests to be processed. */ struct k_fifo zst_fifo; zephyr_smp_transport_out_fn *zst_output; zephyr_smp_transport_get_mtu_fn *zst_get_mtu; zephyr_smp_transport_ud_copy_fn *zst_ud_copy; zephyr_smp_transport_ud_free_fn *zst_ud_free; }; /** * @brief Initializes a Zephyr SMP transport object. * * @param zst The transport to construct. * @param output_func The transport's send function. * @param get_mtu_func The transport's get-MTU function. * @param ud_copy_func The transport buffer user_data copy function. * @param ud_free_func The transport buffer user_data free function. * * @return 0 on success, MGMT_ERR_[...] code on failure. */ void zephyr_smp_transport_init(struct zephyr_smp_transport *zst, zephyr_smp_transport_out_fn *output_func, zephyr_smp_transport_get_mtu_fn *get_mtu_func, zephyr_smp_transport_ud_copy_fn *ud_copy_func, zephyr_smp_transport_ud_free_fn *ud_free_func); /** * @brief Enqueues an incoming SMP request packet for processing. * * This function always consumes the supplied net_buf. * * @param zst The transport to use to send the corresponding * response(s). * @param nb The request packet to process. */ void zephyr_smp_rx_req(struct zephyr_smp_transport *zst, struct net_buf *nb); #ifdef __cplusplus } #endif #endif