You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.9 KiB
139 lines
4.9 KiB
/* |
|
* Copyright Runtime.io 2018. All rights reserved. |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
/** |
|
* @file |
|
* @brief Utility functions used by the UART and shell mcumgr transports. |
|
* |
|
* Mcumgr packets sent over serial are fragmented into frames of 128 bytes or |
|
* fewer. |
|
* |
|
* The initial frame in a packet has the following format: |
|
* offset 0: 0x06 0x09 |
|
* === Begin base64 encoding === |
|
* offset 2: {16-bit packet-length} |
|
* offset ?: {body} |
|
* offset ?: {crc16} (if final frame) |
|
* === End base64 encoding === |
|
* offset ?: 0x0a (newline) |
|
* |
|
* All subsequent frames have the following format: |
|
* offset 0: 0x04 0x14 |
|
* === Begin base64 encoding === |
|
* offset 2: {body} |
|
* offset ?: {crc16} (if final frame) |
|
* === End base64 encoding === |
|
* offset ?: 0x0a (newline) |
|
* |
|
* All integers are represented in big-endian. The packet fields are described |
|
* below: |
|
* |
|
* | Field | Description | |
|
* | -------------- | ------------------------------------------------------- | |
|
* | 0x06 0x09 | Byte pair indicating the start of a packet. | |
|
* | 0x04 0x14 | Byte pair indicating the start of a continuation frame. | |
|
* | Packet length | The combined total length of the *unencoded* body plus | |
|
* | | the final CRC (2 bytes). Length is in Big-Endian format.| |
|
* | Body | The actual SMP data (i.e., 8-byte header and CBOR | |
|
* | | key-value map). | |
|
* | CRC16 | A CRC16 of the *unencoded* body of the entire packet. | |
|
* | | This field is only present in the final frame of a | |
|
* | | packet. | |
|
* | Newline | A 0x0a byte; terminates a frame. | |
|
* |
|
* The packet is fully received when {packet-length} bytes of body has been |
|
* received. |
|
* |
|
* ## CRC details |
|
* |
|
* The CRC16 should be calculated with the following parameters: |
|
* |
|
* | Field | Value | |
|
* | ------------- | ------------- | |
|
* | Polynomial | 0x1021 | |
|
* | Initial Value | 0 | |
|
*/ |
|
|
|
#ifndef ZEPHYR_INCLUDE_MGMT_SERIAL_H_ |
|
#define ZEPHYR_INCLUDE_MGMT_SERIAL_H_ |
|
|
|
#include <zephyr/types.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
#define MCUMGR_SERIAL_HDR_PKT 0x0609 |
|
#define MCUMGR_SERIAL_HDR_FRAG 0x0414 |
|
#define MCUMGR_SERIAL_MAX_FRAME 128 |
|
|
|
#define MCUMGR_SERIAL_HDR_PKT_1 (MCUMGR_SERIAL_HDR_PKT >> 8) |
|
#define MCUMGR_SERIAL_HDR_PKT_2 (MCUMGR_SERIAL_HDR_PKT & 0xff) |
|
#define MCUMGR_SERIAL_HDR_FRAG_1 (MCUMGR_SERIAL_HDR_FRAG >> 8) |
|
#define MCUMGR_SERIAL_HDR_FRAG_2 (MCUMGR_SERIAL_HDR_FRAG & 0xff) |
|
|
|
/** |
|
* @brief Maintains state for an incoming mcumgr request packet. |
|
*/ |
|
struct mcumgr_serial_rx_ctxt { |
|
/* Contains the partially- or fully-received mcumgr request. Data |
|
* stored in this buffer has already been base64-decoded. |
|
*/ |
|
struct net_buf *nb; |
|
|
|
/* Length of full packet, as read from header. */ |
|
uint16_t pkt_len; |
|
}; |
|
|
|
/** @typedef mcumgr_serial_tx_cb |
|
* @brief Transmits a chunk of raw response data. |
|
* |
|
* @param data The data to transmit. |
|
* @param len The number of bytes to transmit. |
|
* |
|
* @return 0 on success; negative error code on failure. |
|
*/ |
|
typedef int (*mcumgr_serial_tx_cb)(const void *data, int len); |
|
|
|
/** |
|
* @brief Processes an mcumgr request fragment received over a serial |
|
* transport. |
|
* |
|
* Processes an mcumgr request fragment received over a serial transport. If |
|
* the fragment is the end of a valid mcumgr request, this function returns a |
|
* net_buf containing the decoded request. It is the caller's responsibility |
|
* to free the net_buf after it has been processed. |
|
* |
|
* @param rx_ctxt The receive context associated with the serial |
|
* transport being used. |
|
* @param frag The incoming fragment to process. |
|
* @param frag_len The length of the fragment, in bytes. |
|
* |
|
* @return A net_buf containing the decoded request if a |
|
* complete and valid request has been |
|
* received. |
|
* NULL if the packet is incomplete or invalid. |
|
*/ |
|
struct net_buf *mcumgr_serial_process_frag( |
|
struct mcumgr_serial_rx_ctxt *rx_ctxt, |
|
const uint8_t *frag, int frag_len); |
|
|
|
/** |
|
* @brief Encodes and transmits an mcumgr packet over serial. |
|
* |
|
* @param data The mcumgr packet data to send. |
|
* @param len The length of the unencoded mcumgr packet. |
|
* @param cb A callback used to transmit raw bytes. |
|
* |
|
* @return 0 on success; negative error code on failure. |
|
*/ |
|
int mcumgr_serial_tx_pkt(const uint8_t *data, int len, mcumgr_serial_tx_cb cb); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif
|
|
|