1 #ifndef _TFTP_H 2 #define _TFTP_H 3 4 #include "if_ether.h" 5 #include "ip.h" 6 #include "udp.h" 7 8 #ifndef MAX_TFTP_RETRIES 9 #define MAX_TFTP_RETRIES 20 10 #endif 11 12 /* These settings have sense only if compiled with -DCONGESTED */ 13 /* total retransmission timeout in ticks */ 14 #define TFTP_TIMEOUT (30*TICKS_PER_SEC) 15 /* packet retransmission timeout in ticks */ 16 #define TFTP_REXMT (3*TICKS_PER_SEC) 17 18 #define TFTP_PORT 69 19 #define TFTP_DEFAULTSIZE_PACKET 512 20 #define TFTP_MAX_PACKET 1432 /* 512 */ 21 22 #define TFTP_RRQ 1 23 #define TFTP_WRQ 2 24 #define TFTP_DATA 3 25 #define TFTP_ACK 4 26 #define TFTP_ERROR 5 27 #define TFTP_OACK 6 28 29 #define TFTP_CODE_EOF 1 30 #define TFTP_CODE_MORE 2 31 #define TFTP_CODE_ERROR 3 32 #define TFTP_CODE_BOOT 4 33 #define TFTP_CODE_CFG 5 34 35 struct tftp_t { 36 struct iphdr ip; 37 struct udphdr udp; 38 uint16_t opcode; 39 union { 40 uint8_t rrq[TFTP_DEFAULTSIZE_PACKET]; 41 struct { 42 uint16_t block; 43 uint8_t download[TFTP_MAX_PACKET]; 44 } data; 45 struct { 46 uint16_t block; 47 } ack; 48 struct { 49 uint16_t errcode; 50 uint8_t errmsg[TFTP_DEFAULTSIZE_PACKET]; 51 } err; 52 struct { 53 uint8_t data[TFTP_DEFAULTSIZE_PACKET+2]; 54 } oack; 55 } u; 56 }; 57 58 /* define a smaller tftp packet solely for making requests to conserve stack 59 512 bytes should be enough */ 60 struct tftpreq_t { 61 struct iphdr ip; 62 struct udphdr udp; 63 uint16_t opcode; 64 union { 65 uint8_t rrq[512]; 66 struct { 67 uint16_t block; 68 } ack; 69 struct { 70 uint16_t errcode; 71 uint8_t errmsg[512-2]; 72 } err; 73 } u; 74 }; 75 76 #define TFTP_MIN_PACKET (sizeof(struct iphdr) + sizeof(struct udphdr) + 4) 77 78 typedef int (*read_actor_t)(unsigned char *, unsigned int, unsigned int, int); 79 80 int tftp_file_read(const char *name, read_actor_t); 81 82 #endif /* _TFTP_H */ 83