/*
 * 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.h>
#include <net/socket.h>

#ifdef __cplusplus
extern "C" {
#endif

struct tftpc {
	uint8_t   *user_buf;
	uint32_t  user_buf_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 This function gets "file" from the remote server.
 *
 * If the file is successfully received its size will be returned in
 * `client->user_buf_size` parameter.
 *
 * @param server      Control Block that represents the remote server.
 * @param client      Client Buffer Information.
 * @param remote_file Name of the remote file to get.
 * @param mode        TFTP Client "mode" setting
 *
 * @return TFTPC_SUCCESS 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.
 */
int tftp_get(struct sockaddr *server, struct tftpc *client,
	     const char *remote_file, const char *mode);

#endif /* ZEPHYR_INCLUDE_NET_TFTP_H_ */