aboutsummaryrefslogtreecommitdiffstats
path: root/gpxe/src/include/gpxe/tftp.h
blob: c57bb254c8109b1cd8b5c928ca5e0ee0d97e43c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#ifndef	_GPXE_TFTP_H
#define	_GPXE_TFTP_H

/** @file
 *
 * TFTP protocol
 *
 */

FILE_LICENCE ( GPL2_OR_LATER );

#include <stdint.h>

#define TFTP_PORT	       69 /**< Default TFTP server port */
#define	TFTP_DEFAULT_BLKSIZE  512 /**< Default TFTP data block size */
#define	TFTP_MAX_BLKSIZE     1432

#define TFTP_RRQ		1 /**< Read request opcode */
#define TFTP_WRQ		2 /**< Write request opcode */
#define TFTP_DATA		3 /**< Data block opcode */
#define TFTP_ACK		4 /**< Data block acknowledgement opcode */
#define TFTP_ERROR		5 /**< Error opcode */
#define TFTP_OACK		6 /**< Options acknowledgement opcode */

#define TFTP_ERR_FILE_NOT_FOUND	1 /**< File not found */
#define TFTP_ERR_ACCESS_DENIED	2 /**< Access violation */
#define TFTP_ERR_DISK_FULL	3 /**< Disk full or allocation exceeded */
#define TFTP_ERR_ILLEGAL_OP	4 /**< Illegal TFTP operation */
#define TFTP_ERR_UNKNOWN_TID	5 /**< Unknown transfer ID */
#define TFTP_ERR_FILE_EXISTS	6 /**< File already exists */
#define TFTP_ERR_UNKNOWN_USER	7 /**< No such user */
#define TFTP_ERR_BAD_OPTS	8 /**< Option negotiation failed */

#define MTFTP_PORT	     1759 /**< Default MTFTP server port */

/** A TFTP read request (RRQ) packet */
struct tftp_rrq {
	uint16_t opcode;
	char data[0];
} __attribute__ (( packed ));

/** A TFTP data (DATA) packet */
struct tftp_data {
	uint16_t opcode;
	uint16_t block;
	uint8_t data[0];
} __attribute__ (( packed ));
 
/** A TFTP acknowledgement (ACK) packet */
struct tftp_ack {
	uint16_t opcode;
	uint16_t block;
} __attribute__ (( packed ));

/** A TFTP error (ERROR) packet */
struct tftp_error {
	uint16_t opcode;
	uint16_t errcode;
	char errmsg[0];
} __attribute__ (( packed ));

/** A TFTP options acknowledgement (OACK) packet */
struct tftp_oack {
	uint16_t opcode;
	char data[0];
} __attribute__ (( packed ));

/** The common header of all TFTP packets */
struct tftp_common {
	uint16_t opcode;
} __attribute__ (( packed ));

/** A union encapsulating all TFTP packet types */
union tftp_any {
	struct tftp_common	common;
	struct tftp_rrq		rrq;
	struct tftp_data	data;
	struct tftp_ack		ack;
	struct tftp_error	error;
	struct tftp_oack	oack;
};

extern void tftp_set_request_blksize ( unsigned int blksize );

#endif /* _GPXE_TFTP_H */