Added TFTP test code (currently just dumps file to console).
[people/pcmattman/gpxe.git] / src / include / gpxe / tftp.h
1 #ifndef _GPXE_TFTP_H
2 #define _GPXE_TFTP_H
3
4 /** @file
5  *
6  * TFTP protocol
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/udp.h>
12 #include <gpxe/async.h>
13 #include <gpxe/retry.h>
14
15 #define TFTP_PORT              69 /**< Default TFTP server port */
16 #define TFTP_DEFAULT_BLKSIZE  512 /**< Default TFTP data block size */
17 #define TFTP_MAX_BLKSIZE     1432
18
19 #define TFTP_RRQ                1 /**< Read request opcode */
20 #define TFTP_WRQ                2 /**< Write request opcode */
21 #define TFTP_DATA               3 /**< Data block opcode */
22 #define TFTP_ACK                4 /**< Data block acknowledgement opcode */
23 #define TFTP_ERROR              5 /**< Error opcode */
24 #define TFTP_OACK               6 /**< Options acknowledgement opcode */
25
26 #define TFTP_ERR_FILE_NOT_FOUND 1 /**< File not found */
27 #define TFTP_ERR_ACCESS_DENIED  2 /**< Access violation */
28 #define TFTP_ERR_DISK_FULL      3 /**< Disk full or allocation exceeded */
29 #define TFTP_ERR_ILLEGAL_OP     4 /**< Illegal TFTP operation */
30 #define TFTP_ERR_UNKNOWN_TID    5 /**< Unknown transfer ID */
31 #define TFTP_ERR_FILE_EXISTS    6 /**< File already exists */
32 #define TFTP_ERR_UNKNOWN_USER   7 /**< No such user */
33 #define TFTP_ERR_BAD_OPTS       8 /**< Option negotiation failed */
34
35 /** A TFTP read request (RRQ) packet */
36 struct tftp_rrq {
37         uint16_t opcode;
38         char data[0];
39 } __attribute__ (( packed ));
40
41 /** A TFTP data (DATA) packet */
42 struct tftp_data {
43         uint16_t opcode;
44         uint16_t block;
45         uint8_t data[0];
46 } __attribute__ (( packed ));
47  
48 /** A TFTP acknowledgement (ACK) packet */
49 struct tftp_ack {
50         uint16_t opcode;
51         uint16_t block;
52 } __attribute__ (( packed ));
53
54 /** A TFTP error (ERROR) packet */
55 struct tftp_error {
56         uint16_t opcode;
57         uint16_t errcode;
58         char errmsg[0];
59 } __attribute__ (( packed ));
60
61 /** A TFTP options acknowledgement (OACK) packet */
62 struct tftp_oack {
63         uint16_t opcode;
64         char data[0];
65 } __attribute__ (( packed ));
66
67 /** The common header of all TFTP packets */
68 struct tftp_common {
69         uint16_t opcode;
70 } __attribute__ (( packed ));
71
72 /** A union encapsulating all TFTP packet types */
73 union tftp_any {
74         struct tftp_common      common;
75         struct tftp_rrq         rrq;
76         struct tftp_data        data;
77         struct tftp_ack         ack;
78         struct tftp_error       error;
79         struct tftp_oack        oack;
80 };      
81
82 /**
83  * A TFTP session
84  *
85  * This data structure holds the state for an ongoing TFTP transfer.
86  */
87 struct tftp_session {
88         /** UDP connection */
89         struct udp_connection udp;
90         /** Filename */
91         const char *filename;
92
93         /**
94          * Callback function
95          *
96          * @v tftp              TFTP connection
97          * @v block             Block number
98          * @v data              Data
99          * @v len               Length of data
100          */
101         void ( * callback ) ( struct tftp_session *tftp, unsigned int block,
102                               void *data, size_t len );
103         /**
104          * Transfer ID
105          *
106          * This is the transfer ID allocated by the server, used as
107          * the server UDP port for all packets except the initial read
108          * request.
109          */
110         uint16_t tid;
111         /** Session state
112          *
113          * This is the block number to be used in the next ACK sent
114          * back to the server, i.e. the number of the last received
115          * data block.  The value zero indicates that the last
116          * received block was an OACK (i.e. that the next ACK will
117          * contain a block number of zero), and any value less than
118          * zero indicates that the connection has not yet been opened
119          * (i.e. that no blocks have yet been received).
120          */
121         int state;
122         /** Requested data block size
123          *
124          * This is the "blksize" option requested from the TFTP
125          * server.  It may or may not be honoured.
126          */
127         unsigned int request_blksize;
128         /** Data block size
129          *
130          * This is the "blksize" option negotiated with the TFTP
131          * server.  (If the TFTP server does not support TFTP options,
132          * this will default to 512).
133          */
134         unsigned int blksize;
135         /** File size
136          *
137          * This is the value returned in the "tsize" option from the
138          * TFTP server.  If the TFTP server does not support the
139          * "tsize" option, this value will be zero.
140          */
141         unsigned long tsize;
142         
143         /** Asynchronous operation for this session */
144         struct async_operation aop;
145         /** Retransmission timer */
146         struct retry_timer timer;
147 };
148
149 /* Function prototypes */
150
151 extern struct async_operation * tftp_get ( struct tftp_session *tftp );
152
153 #endif /* _GPXE_TFTP_H */