xref: /onnv-gate/usr/src/grub/grub-0.97/netboot/tftp.h (revision 8044:b3af80bbf173)
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