blob: 791dcbf6c8e45fdb912a3777a370b1f6e3801f93 [file] [log] [blame]
/*
* Copyright (c) 2020 InnBlue
*
* SPDX-License-Identifier: Apache-2.0
*/
/** @file tftp.h
*
* @brief Zephyr TFTP Implementation
*/
#ifndef ZEPHYR_INCLUDE_NET_TFTP_H_
#define ZEPHYR_INCLUDE_NET_TFTP_H_
#include <zephyr/kernel.h>
#include <zephyr/net/socket.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* RFC1350: the file is sent in fixed length blocks of 512 bytes.
* Each data packet contains one block of data, and must be acknowledged
* by an acknowledgment packet before the next packet can be sent.
* A data packet of less than 512 bytes signals termination of a transfer.
*/
#define TFTP_BLOCK_SIZE 512
/**
* RFC1350: For non-request TFTP message, the header contains 2-byte operation
* code plus 2-byte block number or error code.
*/
#define TFTP_HEADER_SIZE 4
/* Maximum amount of data that can be sent or received */
#define TFTPC_MAX_BUF_SIZE (TFTP_BLOCK_SIZE + TFTP_HEADER_SIZE)
/* TFTP Client Error codes. */
#define TFTPC_SUCCESS 0
#define TFTPC_DUPLICATE_DATA -1
#define TFTPC_BUFFER_OVERFLOW -2
#define TFTPC_UNKNOWN_FAILURE -3
#define TFTPC_REMOTE_ERROR -4
#define TFTPC_RETRIES_EXHAUSTED -5
/**
* @brief TFTP Asynchronous Events notified to the application from the module
* through the callback registered by the application.
*/
enum tftp_evt_type {
/** DATA event when data is received from remote server.
*
* @note DATA event structure contains payload data and size.
*/
TFTP_EVT_DATA,
/** ERROR event when error is received from remote server.
*
* @note ERROR event structure contains error code and message.
*/
TFTP_EVT_ERROR
};
/** @brief Parameters for data event. */
struct tftp_data_param {
uint8_t *data_ptr; /**< Pointer to binary data. */
uint32_t len; /**< Length of binary data. */
};
/** @brief Parameters for error event. */
struct tftp_error_param {
char *msg; /**< Error message. */
int code; /**< Error code. */
};
/**
* @brief Defines event parameters notified along with asynchronous events
* to the application.
*/
union tftp_evt_param {
/** Parameters accompanying TFTP_EVT_DATA event. */
struct tftp_data_param data;
/** Parameters accompanying TFTP_EVT_ERROR event. */
struct tftp_error_param error;
};
/** @brief Defines TFTP asynchronous event notified to the application. */
struct tftp_evt {
/** Identifies the event. */
enum tftp_evt_type type;
/** Contains parameters (if any) accompanying the event. */
union tftp_evt_param param;
};
/**
* @typedef tftp_callback_t
*
* @brief TFTP event notification callback registered by the application.
*
* @param[in] evt Event description along with result and associated
* parameters (if any).
*/
typedef void (*tftp_callback_t)(const struct tftp_evt *evt);
/**
* @brief TFTP client definition to maintain information relevant to the
* client.
*
* @note Application must initialize `server` and `callback` before calling
* GET or PUT API with the `tftpc` structure.
*/
struct tftpc {
/** Socket address pointing to the remote TFTP server */
struct sockaddr server;
/** Event notification callback. No notification if NULL */
tftp_callback_t callback;
/** Buffer for internal usage */
uint8_t tftp_buf[TFTPC_MAX_BUF_SIZE];
};
/* @brief This function gets data from a "file" on the remote server.
*
* @param client Client information of type @ref tftpc.
* @param remote_file Name of the remote file to get.
* @param mode TFTP Client "mode" setting.
*
* @return The size of data being received if the operation completed successfully.
* TFTPC_BUFFER_OVERFLOW if the file is larger than the user buffer.
* TFTPC_REMOTE_ERROR if the server failed to process our request.
* TFTPC_RETRIES_EXHAUSTED if the client timed out waiting for server.
* -EINVAL if `client` is NULL.
*
* @note This function blocks until the transfer is completed or network error happens. The
* integrity of the `client` structure must be ensured until the function returns.
*/
int tftp_get(struct tftpc *client,
const char *remote_file, const char *mode);
/* @brief This function puts data to a "file" on the remote server.
*
* @param client Client information of type @ref tftpc.
* @param remote_file Name of the remote file to put.
* @param mode TFTP Client "mode" setting.
* @param user_buf Data buffer containing the data to put.
* @param user_buf_size Length of the data to put.
*
* @return The size of data being sent if the operation completed successfully.
* TFTPC_REMOTE_ERROR if the server failed to process our request.
* TFTPC_RETRIES_EXHAUSTED if the client timed out waiting for server.
* -EINVAL if `client` or `user_buf` is NULL or if `user_buf_size` is zero.
*
* @note This function blocks until the transfer is completed or network error happens. The
* integrity of the `client` structure must be ensured until the function returns.
*/
int tftp_put(struct tftpc *client,
const char *remote_file, const char *mode,
const uint8_t *user_buf, uint32_t user_buf_size);
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_NET_TFTP_H_ */