root/usr/src/grub/grub-0.97/netboot/tftp.h
#ifndef _TFTP_H
#define _TFTP_H

#include "if_ether.h"
#include "ip.h"
#include "udp.h"

#ifndef MAX_TFTP_RETRIES
#define MAX_TFTP_RETRIES        20
#endif

/* These settings have sense only if compiled with -DCONGESTED */
/* total retransmission timeout in ticks */
#define TFTP_TIMEOUT            (30*TICKS_PER_SEC)
/* packet retransmission timeout in ticks */
#define TFTP_REXMT              (3*TICKS_PER_SEC)

#define TFTP_PORT       69
#define TFTP_DEFAULTSIZE_PACKET 512
#define TFTP_MAX_PACKET         1432 /* 512 */

#define TFTP_RRQ        1
#define TFTP_WRQ        2
#define TFTP_DATA       3
#define TFTP_ACK        4
#define TFTP_ERROR      5
#define TFTP_OACK       6

#define TFTP_CODE_EOF   1
#define TFTP_CODE_MORE  2
#define TFTP_CODE_ERROR 3
#define TFTP_CODE_BOOT  4
#define TFTP_CODE_CFG   5

struct tftp_t {
        struct iphdr ip;
        struct udphdr udp;
        uint16_t opcode;
        union {
                uint8_t rrq[TFTP_DEFAULTSIZE_PACKET];
                struct {
                        uint16_t block;
                        uint8_t  download[TFTP_MAX_PACKET];
                } data;
                struct {
                        uint16_t block;
                } ack;
                struct {
                        uint16_t errcode;
                        uint8_t  errmsg[TFTP_DEFAULTSIZE_PACKET];
                } err;
                struct {
                        uint8_t  data[TFTP_DEFAULTSIZE_PACKET+2];
                } oack;
        } u;
};

/* define a smaller tftp packet solely for making requests to conserve stack
   512 bytes should be enough */
struct tftpreq_t {
        struct iphdr ip;
        struct udphdr udp;
        uint16_t opcode;
        union {
                uint8_t rrq[512];
                struct {
                        uint16_t block;
                } ack;
                struct {
                        uint16_t errcode;
                        uint8_t  errmsg[512-2];
                } err;
        } u;
};

#define TFTP_MIN_PACKET (sizeof(struct iphdr) + sizeof(struct udphdr) + 4)

typedef int (*read_actor_t)(unsigned char *, unsigned int, unsigned int, int);

int tftp_file_read(const char *name, read_actor_t);

#endif  /* _TFTP_H */