123 lines
4.1 KiB
C
123 lines
4.1 KiB
C
/*
|
|
* 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 <kernel.h>
|
|
|
|
#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 mst 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 nb 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
|