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