Protocols now load data into a buffer; they don't execute it.
[people/lynusvaz/gpxe.git] / src / include / tftp.h
1 #ifndef TFTP_H
2 #define TFTP_H
3
4 #include "in.h"
5 #include "buffer.h"
6 #include "nic.h"
7
8 #define TFTP_PORT       69
9 #define TFTP_DEFAULTSIZE_PACKET 512
10 #define TFTP_MAX_PACKET         1432 /* 512 */
11
12 #define TFTP_RRQ        1
13 #define TFTP_WRQ        2
14 #define TFTP_DATA       3
15 #define TFTP_ACK        4
16 #define TFTP_ERROR      5
17 #define TFTP_OACK       6
18
19 #define TFTP_CODE_EOF   1
20 #define TFTP_CODE_MORE  2
21 #define TFTP_CODE_ERROR 3
22 #define TFTP_CODE_BOOT  4
23 #define TFTP_CODE_CFG   5
24
25 struct tftp_t {
26         struct iphdr ip;
27         struct udphdr udp;
28         uint16_t opcode;
29         union {
30                 uint8_t rrq[TFTP_DEFAULTSIZE_PACKET];
31                 struct {
32                         uint16_t block;
33                         uint8_t  download[TFTP_MAX_PACKET];
34                 } data;
35                 struct {
36                         uint16_t block;
37                 } ack;
38                 struct {
39                         uint16_t errcode;
40                         uint8_t  errmsg[TFTP_DEFAULTSIZE_PACKET];
41                 } err;
42                 struct {
43                         uint8_t  data[TFTP_DEFAULTSIZE_PACKET+2];
44                 } oack;
45         } u;
46 } PACKED;
47
48 /* define a smaller tftp packet solely for making requests to conserve stack
49    512 bytes should be enough */
50 struct tftpreq_t {
51         struct iphdr ip;
52         struct udphdr udp;
53         uint16_t opcode;
54         union {
55                 uint8_t rrq[512];
56                 struct {
57                         uint16_t block;
58                 } ack;
59                 struct {
60                         uint16_t errcode;
61                         uint8_t  errmsg[512-2];
62                 } err;
63         } u;
64 } PACKED;
65
66 struct tftpreq_info_t {
67         struct sockaddr_in *server;
68         const char *name;
69         unsigned short blksize;
70 } PACKED;
71
72 struct tftpblk_info_t {
73         char *data;
74         unsigned int block;
75         unsigned int len;
76         int eof;
77 } PACKED;
78
79 #define TFTP_MIN_PACKET (sizeof(struct iphdr) + sizeof(struct udphdr) + 4)
80
81 /*
82  * Functions in tftp.c.  Needed for pxe_export.c
83  *
84  */
85 extern int tftp_block ( struct tftpreq_info_t *request,
86                         struct tftpblk_info_t *block );
87 extern int tftp ( char *url, struct sockaddr_in *server, char *file,
88                   struct buffer *buffer );
89
90 #endif  /* TFTP_H */