/***********************************************************
        Copyright 1996 by Carnegie Mellon University

                      All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of CMU not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.

CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/

/*
 * Bootstrap Protocol (BOOTP).  RFC951 and RFC1395.
 *
 * $Id: bootp.h,v 1.2 2007/01/03 19:55:56 root Exp $
 *
 *
 * This file specifies the "implementation-independent" BOOTP protocol
 * information which is common to both client and server.
 *
 */


#include "defs.h"

#define BP_CHADDR_LEN	 16
#define BP_SNAME_LEN	 64
#define BP_FILE_LEN	128
#define BP_VEND_LEN	 64
#define BP_MINPKTSZ	300	/* to check sizeof(struct bootp) */
#define BP_FLAGS_MBZ	0x7FFF

struct bootp {
    unsigned char    bp_op;			/* packet opcode type */
    unsigned char    bp_htype;			/* hardware addr type */
    unsigned char    bp_hlen;			/* hardware addr length */
    unsigned char    bp_hops;			/* gateway hops */
    unsigned int32   bp_xid;			/* transaction ID */
    unsigned short   bp_secs;			/* seconds since boot began */
    unsigned short   bp_flags;			/* RFC1532 broadcast, etc. */
    struct in_addr   bp_ciaddr;			/* client IP address */
    struct in_addr   bp_yiaddr;			/* 'your' IP address */
    struct in_addr   bp_siaddr;			/* server IP address */
    struct in_addr   bp_giaddr;			/* gateway IP address */
    unsigned char    bp_chaddr[BP_CHADDR_LEN];	/* client hardware address */
    char	     bp_sname[BP_SNAME_LEN];	/* server host name */
    char	     bp_file[BP_FILE_LEN];	/* boot file name */
    unsigned char    bp_vend[BP_VEND_LEN];	/* vendor-specific area */
    /* note that bp_vend can be longer, extending to end of packet. */
};

/*
 * UDP port numbers, server and client.
 */
#define	IPPORT_BOOTPS		67
#define	IPPORT_BOOTPC		68

#define BOOTREPLY		2
#define BOOTREQUEST		1

/*
 * Hardware types from Assigned Numbers RFC.
 */
#define HTYPE_ETHERNET		  1
#define HTYPE_EXP_ETHERNET	  2
#define HTYPE_AX25		  3
#define HTYPE_PRONET		  4
#define HTYPE_CHAOS		  5
#define HTYPE_IEEE802		  6
#define HTYPE_ARCNET		  7

/*
 * Vendor magic cookie (v_magic) for CMU
 */
#define VM_CMU		"CMU"

/*
 * Vendor magic cookie (v_magic) for RFC1048
 */
#define VM_RFC1048	{ 99, 130, 83, 99 }



/*
 * Tag values used to specify what information is being supplied in
 * the vendor (options) data area of the packet.
 */
/* RFC 1048 */
#define BOOTP_NUM_TAGS 256
#define TAG_END			((unsigned char) 255)
#define TAG_PAD			((unsigned char)   0)
#define TAG_SUBNET_MASK		((unsigned char)   1)
#define TAG_TIME_OFFSET		((unsigned char)   2)
#define TAG_GATEWAY		((unsigned char)   3)
#define TAG_TIME_SERVER		((unsigned char)   4)
#define TAG_NAME_SERVER		((unsigned char)   5)
#define TAG_DOMAIN_SERVER	((unsigned char)   6)
#define TAG_LOG_SERVER		((unsigned char)   7)
#define TAG_COOKIE_SERVER	((unsigned char)   8)
#define TAG_LPR_SERVER		((unsigned char)   9)
#define TAG_IMPRESS_SERVER	((unsigned char)  10)
#define TAG_RLP_SERVER		((unsigned char)  11)
#define TAG_HOST_NAME		((unsigned char)  12)
#define TAG_BOOT_SIZE		((unsigned char)  13)
/* RFC 1395 */
#define TAG_DUMP_FILE		((unsigned char)  14)
#define TAG_DOMAIN_NAME		((unsigned char)  15)
#define TAG_SWAP_SERVER		((unsigned char)  16)
#define TAG_ROOT_PATH		((unsigned char)  17)
/* RFC 1497 */
#define TAG_EXTEN_FILE		((unsigned char)  18)
#define TAG_IP_FORWARDING	((unsigned char)  19)
#define TAG_IP_SOURCE_ROUTING	((unsigned char)  20)
#define TAG_IP_TTL			((unsigned char)  23)
#define TAG_ALL_SUBNETS_ARE_LOCAL			((unsigned char)  27)
#define TAG_BROADCAST_ADDR	((unsigned char)  28)
#define TAG_PERFORM_MASK_DISCOVERY	((unsigned char)  29)
#define TAG_MASK_SUPPLIER	((unsigned char)  30)
#define TAG_PERFORM_ROUTER_DISCOVERY ((unsigned char)  31)
#define TAG_ROUTER_SOLICITATION_ADDR ((unsigned char)  32)
#define TAG_STATIC_ROUTE ((unsigned char)  33)
#define TAG_TRAILER_ENCAPSULATION ((unsigned char)  34)
#define TAG_ETHERNET_ENCAPSULATION ((unsigned char)  36)
#define TAG_TCP_TTL			 ((unsigned char)  37)
#define TAG_TCP_KEEPALIVE_GARBAGE	 ((unsigned char)  39)
#define TAG_NIS_DOMAIN		((unsigned char)  40)
#define TAG_NIS_SERVER		((unsigned char)  41)
#define TAG_NTP_SERVER		((unsigned char)  42)
#define TAG_VENDOR			((unsigned char)  43)
#define TAG_NBNS_SERVER		((unsigned char)  44)
#define TAG_NBDD_SERVER		((unsigned char)  45)
#define TAG_NODE_TYPE		((unsigned char)  46)
#define TAG_NB_SCOPE		((unsigned char)  47)
#define TAG_XWINDOWS_FONT_SERVER		((unsigned char)  48)
#define TAG_XWINDOWS_DISPLAY_MANAGER	((unsigned char)  49)
/* DHCP maximum message size. */
#define TAG_DHCP_IP         ((unsigned char)  50)
#define TAG_DHCP_IPLEASE    ((unsigned char)  51)
#define TAG_DHCP_OVL        ((unsigned char)  52)
#define TAG_DHCP_MSG        ((unsigned char)  53)
#define TAG_DHCP_SERVERID   ((unsigned char)  54)
#define TAG_DHCP_REQ        ((unsigned char)  55)
#define TAG_MESSAGE        ((unsigned char)  56)
#define TAG_MAX_MSGSZ       ((unsigned char)  57)
#define TAG_DHCP_RENEW    ((unsigned char)  58)
#define TAG_DHCP_REBIND   ((unsigned char)  59)
#define TAG_DHCP_CLIID      ((unsigned char)  61)
#define TAG_NISPLUS_DOMAIN      ((unsigned char)  64)
#define TAG_NISPLUS_SERVER      ((unsigned char)  65)
#define TAG_DHCP_BOOTSRV     ((unsigned char)  66)
#define TAG_DHCP_BOOTFILE     ((unsigned char)  67)
#define TAG_SMTP_SERVER     ((unsigned char)  69)
#define TAG_POP3_SERVER     ((unsigned char)  70)
#define TAG_NNTP_SERVER     ((unsigned char)  71)
#define TAG_WWW_SERVER     ((unsigned char)  72)
#define TAG_FINGER_SERVER     ((unsigned char)  73)
#define TAG_IRC_SERVER     ((unsigned char)  74)
#define TAG_DHCP_USERCLASS	((unsigned char)  77)
#define TAG_RAPID_COMMIT	((unsigned char)  80)
#define TAG_CLIENT_FQDN		((unsigned char) 81)

/* XXX - Add new tags here */


/*
 * "vendor" data permitted for CMU bootp clients.
 */

struct cmu_vend {
	char		v_magic[4];	/* magic number */
	unsigned int32	v_flags;	/* flags/opcodes, etc. */
	struct in_addr 	v_smask;	/* Subnet mask */
	struct in_addr 	v_dgate;	/* Default gateway */
	struct in_addr	v_dns1, v_dns2; /* Domain name servers */
	struct in_addr	v_ins1, v_ins2; /* IEN-116 name servers */
	struct in_addr	v_ts1, v_ts2;	/* Time servers */
	int32		v_unused[6];	/* currently unused */
};
extern int debug;

/* v_flags values */
#define VF_SMASK	1	/* Subnet mask field contains valid data */

/* constants associated with fields in the Client FQDN Tag */
#define TAGOPTS_CLIENT_FQDN_FLAG_S  0x1
#define TAGOPTS_CLIENT_FQDN_FLAG_O  0x2
#define TAGOPTS_CLIENT_FQDN_FLAG_E  0x4
