#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 */