Line data Source code
1 1 : /*
2 : * Copyright (c) 2020 InnBlue
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /** @file tftp.h
8 : *
9 : * @brief TFTP Client Implementation
10 : *
11 : * @defgroup tftp_client TFTP Client library
12 : * @since 2.3
13 : * @version 0.1.0
14 : * @ingroup networking
15 : * @{
16 : */
17 :
18 : #ifndef ZEPHYR_INCLUDE_NET_TFTP_H_
19 : #define ZEPHYR_INCLUDE_NET_TFTP_H_
20 :
21 : #include <zephyr/kernel.h>
22 : #include <zephyr/net/socket.h>
23 :
24 : #ifdef __cplusplus
25 : extern "C" {
26 : #endif
27 :
28 : /**
29 : * RFC1350: the file is sent in fixed length blocks of 512 bytes.
30 : * Each data packet contains one block of data, and must be acknowledged
31 : * by an acknowledgment packet before the next packet can be sent.
32 : * A data packet of less than 512 bytes signals termination of a transfer.
33 : */
34 1 : #define TFTP_BLOCK_SIZE 512
35 :
36 : /**
37 : * RFC1350: For non-request TFTP message, the header contains 2-byte operation
38 : * code plus 2-byte block number or error code.
39 : */
40 1 : #define TFTP_HEADER_SIZE 4
41 :
42 : /** Maximum amount of data that can be sent or received */
43 1 : #define TFTPC_MAX_BUF_SIZE (TFTP_BLOCK_SIZE + TFTP_HEADER_SIZE)
44 :
45 : /**
46 : * @name TFTP client error codes.
47 : * @{
48 : */
49 1 : #define TFTPC_SUCCESS 0 /**< Success. */
50 1 : #define TFTPC_DUPLICATE_DATA -1 /**< Duplicate data received. */
51 1 : #define TFTPC_BUFFER_OVERFLOW -2 /**< User buffer is too small. */
52 1 : #define TFTPC_UNKNOWN_FAILURE -3 /**< Unknown failure. */
53 1 : #define TFTPC_REMOTE_ERROR -4 /**< Remote server error. */
54 1 : #define TFTPC_RETRIES_EXHAUSTED -5 /**< Retries exhausted. */
55 : /**
56 : * @}
57 : */
58 :
59 : /**
60 : * @brief TFTP Asynchronous Events notified to the application from the module
61 : * through the callback registered by the application.
62 : */
63 1 : enum tftp_evt_type {
64 : /**
65 : * DATA event when data is received from remote server.
66 : *
67 : * @note DATA event structure contains payload data and size.
68 : */
69 : TFTP_EVT_DATA,
70 :
71 : /**
72 : * ERROR event when error is received from remote server.
73 : *
74 : * @note ERROR event structure contains error code and message.
75 : */
76 : TFTP_EVT_ERROR
77 : };
78 :
79 : /** @brief Parameters for data event. */
80 1 : struct tftp_data_param {
81 1 : uint8_t *data_ptr; /**< Pointer to binary data. */
82 1 : uint32_t len; /**< Length of binary data. */
83 : };
84 :
85 : /** @brief Parameters for error event. */
86 1 : struct tftp_error_param {
87 1 : char *msg; /**< Error message. */
88 1 : int code; /**< Error code. */
89 : };
90 :
91 : /**
92 : * @brief Defines event parameters notified along with asynchronous events
93 : * to the application.
94 : */
95 1 : union tftp_evt_param {
96 : /** Parameters accompanying TFTP_EVT_DATA event. */
97 1 : struct tftp_data_param data;
98 :
99 : /** Parameters accompanying TFTP_EVT_ERROR event. */
100 1 : struct tftp_error_param error;
101 : };
102 :
103 : /** @brief Defines TFTP asynchronous event notified to the application. */
104 1 : struct tftp_evt {
105 : /** Identifies the event. */
106 1 : enum tftp_evt_type type;
107 :
108 : /** Contains parameters (if any) accompanying the event. */
109 1 : union tftp_evt_param param;
110 : };
111 :
112 : /**
113 : * @typedef tftp_callback_t
114 : *
115 : * @brief TFTP event notification callback registered by the application.
116 : *
117 : * @param[in] evt Event description along with result and associated
118 : * parameters (if any).
119 : */
120 1 : typedef void (*tftp_callback_t)(const struct tftp_evt *evt);
121 :
122 : /**
123 : * @brief TFTP client definition to maintain information relevant to the
124 : * client.
125 : *
126 : * @note Application must initialize `server` and `callback` before calling
127 : * GET or PUT API with the `tftpc` structure.
128 : */
129 1 : struct tftpc {
130 : /** Socket address pointing to the remote TFTP server */
131 1 : struct sockaddr server;
132 :
133 : /** Event notification callback. No notification if NULL */
134 1 : tftp_callback_t callback;
135 :
136 : /** Buffer for internal usage */
137 1 : uint8_t tftp_buf[TFTPC_MAX_BUF_SIZE];
138 : };
139 :
140 : /**
141 : * @brief This function gets data from a "file" on the remote server.
142 : *
143 : * @param client Client information of type @ref tftpc.
144 : * @param remote_file Name of the remote file to get.
145 : * @param mode TFTP Client "mode" setting.
146 : *
147 : * @retval The size of data being received if the operation completed successfully.
148 : * @retval TFTPC_BUFFER_OVERFLOW if the file is larger than the user buffer.
149 : * @retval TFTPC_REMOTE_ERROR if the server failed to process our request.
150 : * @retval TFTPC_RETRIES_EXHAUSTED if the client timed out waiting for server.
151 : * @retval -EINVAL if `client` is NULL.
152 : *
153 : * @note This function blocks until the transfer is completed or network error happens. The
154 : * integrity of the `client` structure must be ensured until the function returns.
155 : */
156 1 : int tftp_get(struct tftpc *client,
157 : const char *remote_file, const char *mode);
158 :
159 : /**
160 : * @brief This function puts data to a "file" on the remote server.
161 : *
162 : * @param client Client information of type @ref tftpc.
163 : * @param remote_file Name of the remote file to put.
164 : * @param mode TFTP Client "mode" setting.
165 : * @param user_buf Data buffer containing the data to put.
166 : * @param user_buf_size Length of the data to put.
167 : *
168 : * @retval The size of data being sent if the operation completed successfully.
169 : * @retval TFTPC_REMOTE_ERROR if the server failed to process our request.
170 : * @retval TFTPC_RETRIES_EXHAUSTED if the client timed out waiting for server.
171 : * @retval -EINVAL if `client` or `user_buf` is NULL or if `user_buf_size` is zero.
172 : *
173 : * @note This function blocks until the transfer is completed or network error happens. The
174 : * integrity of the `client` structure must be ensured until the function returns.
175 : */
176 1 : int tftp_put(struct tftpc *client,
177 : const char *remote_file, const char *mode,
178 : const uint8_t *user_buf, uint32_t user_buf_size);
179 :
180 : #ifdef __cplusplus
181 : }
182 : #endif
183 :
184 : #endif /* ZEPHYR_INCLUDE_NET_TFTP_H_ */
185 :
186 : /** @} */
|