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