blob: dec4a3c0bc0339c951f80d272a512cfba68e88cd [file] [log] [blame] [raw]
#ifndef _TFTP_H
#define _TFTP_H
#include "if_ether.h"
#include "ip.h"
#include "udp.h"
#ifndef MAX_TFTP_RETRIES
#define MAX_TFTP_RETRIES 20
#endif
/* These settings have sense only if compiled with -DCONGESTED */
/* total retransmission timeout in ticks */
#define TFTP_TIMEOUT (30*TICKS_PER_SEC)
/* packet retransmission timeout in ticks */
#define TFTP_REXMT (3*TICKS_PER_SEC)
#define TFTP_PORT 69
#define TFTP_DEFAULTSIZE_PACKET 512
#define TFTP_MAX_PACKET 1432 /* 512 */
#define TFTP_RRQ 1
#define TFTP_WRQ 2
#define TFTP_DATA 3
#define TFTP_ACK 4
#define TFTP_ERROR 5
#define TFTP_OACK 6
#define TFTP_CODE_EOF 1
#define TFTP_CODE_MORE 2
#define TFTP_CODE_ERROR 3
#define TFTP_CODE_BOOT 4
#define TFTP_CODE_CFG 5
struct tftp_t {
struct iphdr ip;
struct udphdr udp;
uint16_t opcode;
union {
uint8_t rrq[TFTP_DEFAULTSIZE_PACKET];
struct {
uint16_t block;
uint8_t download[TFTP_MAX_PACKET];
} data;
struct {
uint16_t block;
} ack;
struct {
uint16_t errcode;
uint8_t errmsg[TFTP_DEFAULTSIZE_PACKET];
} err;
struct {
uint8_t data[TFTP_DEFAULTSIZE_PACKET+2];
} oack;
} u;
};
/* define a smaller tftp packet solely for making requests to conserve stack
512 bytes should be enough */
struct tftpreq_t {
struct iphdr ip;
struct udphdr udp;
uint16_t opcode;
union {
uint8_t rrq[512];
struct {
uint16_t block;
} ack;
struct {
uint16_t errcode;
uint8_t errmsg[512-2];
} err;
} u;
};
#define TFTP_MIN_PACKET (sizeof(struct iphdr) + sizeof(struct udphdr) + 4)
typedef int (*read_actor_t)(unsigned char *, unsigned int, unsigned int, int);
int tftp_file_read(const char *name, read_actor_t);
#endif /* _TFTP_H */