Added features that will be required for PXE UDP support.
[gpxe.git] / src / include / tftp.h
1 #ifndef TFTP_H
2 #define TFTP_H
3
4 /** @file */
5
6 #include <gpxe/in.h>
7 #include "buffer.h"
8 #include "nic.h"
9 #include "ip.h"
10 #include "udp.h"
11
12 #define TFTP_PORT       69              /**< Default TFTP server port */
13 #define TFTP_DEFAULT_BLKSIZE    512
14 #define TFTP_MAX_BLKSIZE                1432 /* 512 */
15
16 #define TFTP_RRQ        1
17 #define TFTP_WRQ        2
18 #define TFTP_DATA       3
19 #define TFTP_ACK        4
20 #define TFTP_ERROR      5
21 #define TFTP_OACK       6
22
23 #define TFTP_ERR_FILE_NOT_FOUND 1 /**< File not found */
24 #define TFTP_ERR_ACCESS_DENIED  2 /**< Access violation */
25 #define TFTP_ERR_DISK_FULL      3 /**< Disk full or allocation exceeded */
26 #define TFTP_ERR_ILLEGAL_OP     4 /**< Illegal TFTP operation */
27 #define TFTP_ERR_UNKNOWN_TID    5 /**< Unknown transfer ID */
28 #define TFTP_ERR_FILE_EXISTS    6 /**< File already exists */
29 #define TFTP_ERR_UNKNOWN_USER   7 /**< No such user */
30 #define TFTP_ERR_BAD_OPTS       8 /**< Option negotiation failed */
31
32 /** A TFTP request (RRQ) packet */
33 struct tftp_rrq {
34         struct iphdr ip;
35         struct udphdr udp;
36         uint16_t opcode;
37         char data[TFTP_DEFAULT_BLKSIZE];
38 } PACKED;
39
40 /** A TFTP data (DATA) packet */
41 struct tftp_data {
42         struct iphdr ip;
43         struct udphdr udp;
44         uint16_t opcode;
45         uint16_t block;
46         uint8_t data[TFTP_MAX_BLKSIZE];
47 } PACKED;
48  
49 /** A TFTP acknowledgement (ACK) packet */
50 struct tftp_ack {
51         struct iphdr ip;
52         struct udphdr udp;
53         uint16_t opcode;
54         uint16_t block;
55 } PACKED;
56
57 /** A TFTP error (ERROR) packet */
58 struct tftp_error {
59         struct iphdr ip;
60         struct udphdr udp;
61         uint16_t opcode;
62         uint16_t errcode;
63         char errmsg[TFTP_DEFAULT_BLKSIZE];
64 } PACKED;
65
66 /** A TFTP options acknowledgement (OACK) packet */
67 struct tftp_oack {
68         struct iphdr ip;
69         struct udphdr udp;
70         uint16_t opcode;
71         uint8_t data[TFTP_DEFAULT_BLKSIZE];
72 } PACKED;
73
74 /** The common header of all TFTP packets */
75 struct tftp_common {
76         struct iphdr ip;
77         struct udphdr udp;
78         uint16_t opcode;
79 } PACKED;
80
81 /** A union encapsulating all TFTP packet types */
82 union tftp_any {
83         struct tftp_common      common;
84         struct tftp_rrq         rrq;
85         struct tftp_data        data;
86         struct tftp_ack         ack;
87         struct tftp_error       error;
88         struct tftp_oack        oack;
89 };      
90
91 /**
92  * TFTP state
93  *
94  * This data structure holds the state for an ongoing TFTP transfer.
95  */
96 struct tftp_state {
97         /** TFTP server address
98          *
99          * This is the IP address and UDP port from which data packets
100          * will be sent, and to which ACK packets should be sent.
101          */
102         struct sockaddr_in server;
103         /** TFTP client port
104          *
105          * This is the UDP port from which the open request will be
106          * sent, and to which any unicast data packets will be sent.
107          */
108         uint16_t lport;
109         /** TFTP multicast address
110          *
111          * This is the IP address and UDP port to which multicast data
112          * packets, if any, will be sent.
113          */
114         struct sockaddr_in multicast;
115         /** Master client
116          *
117          * This will be true if the client is the master client for a
118          * multicast protocol (i.e. MTFTP or TFTM).  (It will always
119          * be true for a non-multicast protocol, i.e. plain old TFTP).
120          */
121         int master;
122         /** Data block size
123          *
124          * This is the "blksize" option negotiated with the TFTP
125          * server.  (If the TFTP server does not support TFTP options,
126          * this will default to 512).
127          */
128         unsigned int blksize;
129         /** File size
130          *
131          * This is the value returned in the "tsize" option from the
132          * TFTP server.  If the TFTP server does not support the
133          * "tsize" option, this value will be zero.
134          */
135         off_t tsize;
136         /** Last received block
137          *
138          * The block number of the most recent block received from the
139          * TFTP server.  Note that the first data block is block 1; a
140          * value of 0 indicates that no data blocks have yet been
141          * received.
142          *
143          * For multicast TFTP protocols, where the blocks may not be
144          * received in strict order, the meaning of this field changes
145          * slightly, to "first missing block minus one".  For example,
146          * suppose that we have received blocks 1, 2, 4 and 5; this
147          * field would then have the value 2, since the first missing
148          * block is block 3.  If the blocks do arrive in strict order,
149          * this definition is exactly equivalent to "most recently
150          * received block".
151          */
152         unsigned int block;
153 };
154
155
156
157 struct tftpreq_info_t {
158         struct sockaddr_in *server;
159         const char *name;
160         unsigned short blksize;
161 } PACKED;
162
163 struct tftpblk_info_t {
164         char *data;
165         unsigned int block;
166         unsigned int len;
167         int eof;
168 } PACKED;
169
170 #define TFTP_MIN_PACKET (sizeof(struct iphdr) + sizeof(struct udphdr) + 4)
171
172 #endif  /* TFTP_H */