david/ipxe
Archived
1
0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/include/gpxe/tftp.h
Michael Brown 4e20d73bb5 Gave asynchronous operations approximate POSIX signal semantics. This
will enable us to cascade async operations, which is necessary in order to
properly support DNS.  (For example, an HTTP request may have to redirect
to a new location and will have to perform a new DNS lookup, so we can't
just rely on doing the name lookup at the time of parsing the initial
URL).

Anything other than HTTP is probably broken right now; I'll fix the others
up asap.
2007-01-15 08:49:10 +00:00

148 lines
3.8 KiB
C

#ifndef _GPXE_TFTP_H
#define _GPXE_TFTP_H
/** @file
*
* TFTP protocol
*
*/
#include <stdint.h>
#include <gpxe/udp.h>
#include <gpxe/async.h>
#include <gpxe/retry.h>
#include <gpxe/buffer.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 */
/** 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;
};
/**
* A TFTP session
*
* This data structure holds the state for an ongoing TFTP transfer.
*/
struct tftp_session {
/** UDP connection */
struct udp_connection udp;
/** Filename */
const char *filename;
/** Data buffer to fill */
struct buffer *buffer;
/** Requested data block size
*
* This is the "blksize" option requested from the TFTP
* server. It may or may not be honoured.
*/
unsigned int request_blksize;
/** Data block size
*
* This is the "blksize" option negotiated with the TFTP
* server. (If the TFTP server does not support TFTP options,
* this will default to 512).
*/
unsigned int blksize;
/** File size
*
* This is the value returned in the "tsize" option from the
* TFTP server. If the TFTP server does not support the
* "tsize" option, this value will be zero.
*/
unsigned long tsize;
/**
* Transfer ID
*
* This is the transfer ID allocated by the server, used as
* the server UDP port for all packets except the initial read
* request.
*/
uint16_t tid;
/** Session state
*
* This is the block number to be used in the next ACK sent
* back to the server, i.e. the number of the last received
* data block. The value zero indicates that the last
* received block was an OACK (i.e. that the next ACK will
* contain a block number of zero), and any value less than
* zero indicates that the connection has not yet been opened
* (i.e. that no blocks have yet been received).
*/
int state;
/** Asynchronous operation for this session */
struct async async;
/** Retransmission timer */
struct retry_timer timer;
};
/* Function prototypes */
extern struct async_operation * tftp_get ( struct tftp_session *tftp );
#endif /* _GPXE_TFTP_H */