155 lines
2.8 KiB
C
155 lines
2.8 KiB
C
/*
|
|
* File: tftp.h
|
|
* Purpose: Data definitions for TFTP
|
|
*
|
|
* Notes:
|
|
*/
|
|
|
|
#ifndef _TFTP_H_
|
|
#define _TFTP_H_
|
|
|
|
/********************************************************************/
|
|
|
|
#define TFTP_RRQ (1)
|
|
#define TFTP_WRQ (2)
|
|
#define TFTP_DATA (3)
|
|
#define TFTP_ACK (4)
|
|
#define TFTP_ERROR (5)
|
|
|
|
#define TFTP_ERR_FNF 1
|
|
#define TFTP_ERR_AV 2
|
|
#define TFTP_ERR_DF 3
|
|
#define TFTP_ERR_ILL 4
|
|
#define TFTP_ERR_TID 5
|
|
#define TFTP_FE 6
|
|
#define TFTP_NSU 7
|
|
#define TFTP_ERR_UD 0
|
|
|
|
#define OCTET "octet"
|
|
#define NETASCII "netascii"
|
|
|
|
/* Protocol Header information */
|
|
#define TFTP_HDR_OFFSET (ETH_HDR_LEN + IP_HDR_SIZE + UDP_HDR_SIZE)
|
|
|
|
/* Timeout in seconds */
|
|
#define TFTP_TIMEOUT 2
|
|
|
|
/* Maximum TFTP Packet Size (payload only - no header) */
|
|
#define TFTP_PKTSIZE 512
|
|
|
|
/* Number of TFTP Data Buffers */
|
|
#define NUM_TFTPBD 6
|
|
|
|
|
|
/* Data Buffer Pointer Structure */
|
|
typedef struct
|
|
{
|
|
uint8_t data[TFTP_PKTSIZE];
|
|
uint16_t bytes;
|
|
} DATA_BUF;
|
|
|
|
/* TFTP RRQ/WRQ Packet */
|
|
typedef struct
|
|
{
|
|
uint16_t opcode;
|
|
char filename_mode[TFTP_PKTSIZE - 2];
|
|
} RWRQ;
|
|
|
|
/* TFTP DATA Packet */
|
|
typedef struct
|
|
{
|
|
uint16_t opcode;
|
|
uint16_t blocknum;
|
|
uint8_t data[TFTP_PKTSIZE - 4];
|
|
} DATA;
|
|
|
|
/* TFTP Acknowledge Packet */
|
|
typedef struct
|
|
{
|
|
uint16_t opcode;
|
|
uint16_t blocknum;
|
|
} ACK;
|
|
|
|
/* TFTP Error Packet */
|
|
typedef struct
|
|
{
|
|
uint16_t opcode;
|
|
uint16_t code;
|
|
char msg[TFTP_PKTSIZE - 4];
|
|
} ERROR;
|
|
|
|
/* TFTP Generic Packet */
|
|
typedef struct
|
|
{
|
|
uint16_t opcode;
|
|
} GEN;
|
|
|
|
union TFTPpacket
|
|
{
|
|
RWRQ rwrq;
|
|
DATA data;
|
|
ACK ack;
|
|
ERROR error;
|
|
GEN generic;
|
|
};
|
|
|
|
/* TFTP Connection Status */
|
|
typedef struct
|
|
{
|
|
/* Pointer to next character in buffer ring */
|
|
uint8_t *next_char;
|
|
|
|
/* Direction of current connection, read or write */
|
|
uint8_t dir;
|
|
|
|
/* Connection established flag */
|
|
uint8_t open;
|
|
|
|
/* Pointer to our Network InterFace */
|
|
NIF *nif;
|
|
|
|
/* File being transferred */
|
|
char *file;
|
|
|
|
/* Server IP address */
|
|
IP_ADDR server_ip;
|
|
|
|
/* Queue to hold the TFTP packets */
|
|
QUEUE queue;
|
|
|
|
/* Bytes received counter */
|
|
uint32_t bytes_recv;
|
|
|
|
/* Bytes sent counter */
|
|
uint32_t bytes_sent;
|
|
|
|
/* Bytes remaining in current Rx buffer */
|
|
uint32_t rem_bytes;
|
|
|
|
/* Server UDP port */
|
|
uint16_t server_port;
|
|
|
|
/* My UDP port */
|
|
uint16_t my_port;
|
|
|
|
/* Expected TFTP block number */
|
|
uint16_t exp_blocknum;
|
|
|
|
/* Keep track of the last packet acknowledged */
|
|
uint16_t last_ack;
|
|
|
|
/* Error Flag */
|
|
uint8_t error;
|
|
|
|
} TFTP_Connection;
|
|
|
|
|
|
extern void tftp_handler(NIF *, NBUF *) ;
|
|
extern int tftp_write (NIF *, char *, IP_ADDR_P, uint32_t, uint32_t);
|
|
extern int tftp_read(NIF *, char *, IP_ADDR_P);
|
|
extern void tftp_end(int);
|
|
extern int tftp_in_char(void);
|
|
|
|
|
|
#endif /* _TFTP_H_ */
|