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

#include "osdep.h"
#include "byteswap.h"
#include "in.h"
#include "ip.h"
#include "udp.h"
#include "if_ether.h"
#include "latch.h"
#include "io.h"
#include "nic.h"
#include <shared.h>

#define K_ESC           '\033'
#define K_EOF           '\04'  /* Ctrl-D */
#define K_INTR          '\03'  /* Ctrl-C */

#ifndef MAX_RPC_RETRIES
#define MAX_RPC_RETRIES         20
#endif


/* Inter-packet retry in ticks */
#ifndef TIMEOUT
#define TIMEOUT                 (10*TICKS_PER_SEC)
#endif

#ifndef NULL
#define NULL    ((void *)0)
#endif


#define ARP_CLIENT      0
#define ARP_SERVER      1
#define ARP_GATEWAY     2
#define MAX_ARP         ARP_GATEWAY+1

#define IGMP_SERVER     0
#define MAX_IGMP        IGMP_SERVER+1

#define RARP_REQUEST    3
#define RARP_REPLY      4


#define MULTICAST_MASK    0xF0000000
#define MULTICAST_NETWORK 0xE0000000

struct arptable_t {
        in_addr ipaddr;
        uint8_t node[6];
};

struct igmptable_t {
        in_addr group;
        unsigned long time;
};

#define KERNEL_BUF      (BOOTP_DATA_ADDR->bootp_reply.bp_file)

#define FLOPPY_BOOT_LOCATION    0x7c00
/* Must match offsets in loader.S */
#define ROM_SEGMENT             0x1fa
#define ROM_LENGTH              0x1fc

#define ROM_INFO_LOCATION       (FLOPPY_BOOT_LOCATION+ROM_SEGMENT)
/* at end of floppy boot block */



/* Define a type for passing info to a loaded program */
struct ebinfo {
        uint8_t  major, minor;  /* Version */
        uint16_t flags;         /* Bit flags */
};

/***************************************************************************
External prototypes
***************************************************************************/
extern void rx_qdrain P((void));
extern int tftp P((const char *name, int (*)(unsigned char *, unsigned int, unsigned int, int)));
extern int ip_transmit P((int len, const void *buf));
extern void build_ip_hdr P((unsigned long destip, int ttl, int protocol, 
        int option_len, int len, const void *buf));
extern void build_udp_hdr P((unsigned long destip, 
        unsigned int srcsock, unsigned int destsock, int ttl,
        int len, const void *buf));
extern int udp_transmit P((unsigned long destip, unsigned int srcsock,
        unsigned int destsock, int len, const void *buf));
typedef int (*reply_t)(int ival, void *ptr, unsigned short ptype, struct iphdr *ip, struct udphdr *udp);
extern int await_reply P((reply_t reply,        int ival, void *ptr, long timeout));
extern int decode_rfc1533 P((unsigned char *, unsigned int, unsigned int, int));
extern void join_group(int slot, unsigned long group);
extern void leave_group(int slot);
#define RAND_MAX 2147483647L
extern uint16_t ipchksum P((const void *ip, unsigned long len));
extern uint16_t add_ipchksums P((unsigned long offset, uint16_t sum, uint16_t new));
extern int32_t random P((void));
extern long rfc2131_sleep_interval P((long base, int exp));
extern long rfc1112_sleep_interval P((long base, int exp));
#ifndef DOWNLOAD_PROTO_TFTP
#define tftp(fname, load_block) 0
#endif
extern void cleanup P((void));

/* misc.c */
extern void twiddle P((void));
extern void sleep P((int secs));
extern void interruptible_sleep P((int secs));
extern void poll_interruptions P((void));
extern int strcasecmp P((const char *a, const char *b));
extern char *substr P((const char *a, const char *b));
extern unsigned long strtoul P((const char *p, const char **, int base));
extern void printf P((const char *, ...));
extern int sprintf P((char *, const char *, ...));
extern int inet_aton P((char *p, in_addr *i));
extern void putchar P((int));
extern int getchar P((void));
extern int iskey P((void));

extern void grub_printf(const char *, ...);
extern char config_file[128];
extern void etherboot_printf(const char *,  ...);
extern int etherboot_sprintf(char *, const char *, ...);
extern int getdec(char **s);
extern void cleanup_net(void);
extern void print_network_configuration (void);
extern int ifconfig (char *, char *, char *, char *);
extern struct arptable_t arptable[MAX_ARP];

#undef printf
#undef sprintf
#define printf etherboot_printf
#define sprintf etherboot_sprintf

#ifdef DEBUG
#define EnterFunction(func) printf("Enter: " func "\n");
#define LeaveFunction(func) printf("Leave: " func "\n");
#else
#define EnterFunction(func)
#define LeaveFunction(func)
#endif

/*
 * Some codes from etherboot use a level in DEBUG. Define it to be
 * zero means no debug info output, that will make them silence in
 * compiling. Up it as you want.
 */
#ifndef DEBUG
#  define DEBUG 0
#endif

/*#define RPC_DEBUG*/

extern char *hostname;

extern int hostnamelen;
/* Whether network is ready */
extern int network_ready;

/* User aborted in await_reply if not zero */
extern int user_abort;

extern int rarp(void);
extern int grub_eth_probe(void);
extern int bootp(void);

extern int dhcp(void);

extern struct nic nic;
#endif /* GRUB_H */