1228753Smm/************************************************************************
2228753Smm          Copyright 1988, 1991 by Carnegie Mellon University
3228753Smm
4228753Smm                          All Rights Reserved
5228753Smm
6228753SmmPermission to use, copy, modify, and distribute this software and its
7228753Smmdocumentation for any purpose and without fee is hereby granted, provided
8228753Smmthat the above copyright notice appear in all copies and that both that
9228753Smmcopyright notice and this permission notice appear in supporting
10228753Smmdocumentation, and that the name of Carnegie Mellon University not be used
11228753Smmin advertising or publicity pertaining to distribution of the software
12228753Smmwithout specific, written prior permission.
13228753Smm
14228753SmmCARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
15228753SmmSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
16228753SmmIN NO EVENT SHALL CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
17228753SmmDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
18228753SmmPROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
19228753SmmACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20228753SmmSOFTWARE.
21228753Smm************************************************************************/
22228753Smm
23228753Smm/*
24228753Smm * Bootstrap Protocol (BOOTP).  RFC951 and RFC1395.
25228753Smm *
26228763Smm * $FreeBSD$
27228753Smm *
28228753Smm *
29228753Smm * This file specifies the "implementation-independent" BOOTP protocol
30228753Smm * information which is common to both client and server.
31228753Smm *
32228753Smm */
33228753Smm
34228753Smm#include "bptypes.h"	/* for int32, u_int32 */
35232153Smm
36228753Smm#define BP_CHADDR_LEN	 16
37228753Smm#define BP_SNAME_LEN	 64
38228753Smm#define BP_FILE_LEN	128
39348607Smm#define BP_VEND_LEN	 64
40348607Smm#define BP_MINPKTSZ	300	/* to check sizeof(struct bootp) */
41228753Smm/* Overhead to fit a bootp message into an Ethernet packet. */
42228753Smm#define BP_MSG_OVERHEAD	(14 + 20 + 8)	/* Ethernet + IP + UDP headers */
43228753Smm
44232153Smmstruct bootp {
45232153Smm    unsigned char    bp_op;			/* packet opcode type */
46232153Smm    unsigned char    bp_htype;			/* hardware addr type */
47232153Smm    unsigned char    bp_hlen;			/* hardware addr length */
48232153Smm    unsigned char    bp_hops;			/* gateway hops */
49232153Smm    u_int32	     bp_xid;			/* transaction ID */
50232153Smm    unsigned short   bp_secs;			/* seconds since boot began */
51232153Smm    unsigned short   bp_flags;			/* RFC1532 broadcast, etc. */
52232153Smm    struct in_addr   bp_ciaddr;			/* client IP address */
53228753Smm    struct in_addr   bp_yiaddr;			/* 'your' IP address */
54228753Smm    struct in_addr   bp_siaddr;			/* server IP address */
55228753Smm    struct in_addr   bp_giaddr;			/* gateway IP address */
56228753Smm    unsigned char    bp_chaddr[BP_CHADDR_LEN];	/* client hardware address */
57228753Smm    char	     bp_sname[BP_SNAME_LEN];	/* server host name */
58228753Smm    char	     bp_file[BP_FILE_LEN];	/* boot file name */
59228753Smm    unsigned char    bp_vend[BP_VEND_LEN];	/* vendor-specific area */
60228753Smm    /* note that bp_vend can be longer, extending to end of packet. */
61228753Smm};
62232153Smm
63232153Smm/*
64228753Smm * UDP port numbers, server and client.
65228753Smm */
66228753Smm#define	IPPORT_BOOTPS		67
67228753Smm#define	IPPORT_BOOTPC		68
68348607Smm
69348607Smm#define BOOTREPLY		2
70348607Smm#define BOOTREQUEST		1
71228753Smm
72228753Smm/*
73228753Smm * Hardware types from Assigned Numbers RFC.
74228753Smm */
75232153Smm#define HTYPE_ETHERNET		  1
76232153Smm#define HTYPE_EXP_ETHERNET	  2
77228753Smm#define HTYPE_AX25		  3
78228753Smm#define HTYPE_PRONET		  4
79228753Smm#define HTYPE_CHAOS		  5
80228753Smm#define HTYPE_IEEE802		  6
81228753Smm#define HTYPE_ARCNET		  7
82228753Smm
83228753Smm/*
84228753Smm * Vendor magic cookie (v_magic) for CMU
85228753Smm */
86232153Smm#define VM_CMU		"CMU"
87232153Smm
88228753Smm/*
89232153Smm * Vendor magic cookie (v_magic) for RFC1048
90232153Smm */
91228753Smm#define VM_RFC1048	{ 99, 130, 83, 99 }
92228753Smm
93228753Smm
94228753Smm
95228753Smm/*
96228753Smm * Tag values used to specify what information is being supplied in
97228753Smm * the vendor (options) data area of the packet.
98228753Smm */
99228753Smm/* RFC 1048 */
100228753Smm#define TAG_END			((unsigned char) 255)
101228753Smm#define TAG_PAD			((unsigned char)   0)
102228753Smm#define TAG_SUBNET_MASK		((unsigned char)   1)
103232153Smm#define TAG_TIME_OFFSET		((unsigned char)   2)
104232153Smm#define TAG_GATEWAY		((unsigned char)   3)
105232153Smm#define TAG_TIME_SERVER		((unsigned char)   4)
106232153Smm#define TAG_NAME_SERVER		((unsigned char)   5)
107232153Smm#define TAG_DOMAIN_SERVER	((unsigned char)   6)
108232153Smm#define TAG_LOG_SERVER		((unsigned char)   7)
109232153Smm#define TAG_COOKIE_SERVER	((unsigned char)   8)
110232153Smm#define TAG_LPR_SERVER		((unsigned char)   9)
111232153Smm#define TAG_IMPRESS_SERVER	((unsigned char)  10)
112232153Smm#define TAG_RLP_SERVER		((unsigned char)  11)
113232153Smm#define TAG_HOST_NAME		((unsigned char)  12)
114232153Smm#define TAG_BOOT_SIZE		((unsigned char)  13)
115232153Smm/* RFC 1395 */
116232153Smm#define TAG_DUMP_FILE		((unsigned char)  14)
117232153Smm#define TAG_DOMAIN_NAME		((unsigned char)  15)
118232153Smm#define TAG_SWAP_SERVER		((unsigned char)  16)
119232153Smm#define TAG_ROOT_PATH		((unsigned char)  17)
120232153Smm/* RFC 1497 */
121232153Smm#define TAG_EXTEN_FILE		((unsigned char)  18)
122232153Smm/* RFC 1533 */
123232153Smm#define TAG_NIS_DOMAIN		((unsigned char)  40)
124232153Smm#define TAG_NIS_SERVER		((unsigned char)  41)
125232153Smm#define TAG_NTP_SERVER		((unsigned char)  42)
126348607Smm/* DHCP maximum message size. */
127232153Smm#define TAG_MAX_MSGSZ		((unsigned char)  57)
128232153Smm
129232153Smm/* XXX - Add new tags here */
130232153Smm
131232153Smm
132232153Smm/*
133232153Smm * "vendor" data permitted for CMU bootp clients.
134232153Smm */
135232153Smm
136232153Smmstruct cmu_vend {
137232153Smm	char		v_magic[4];	/* magic number */
138232153Smm	u_int32		v_flags;	/* flags/opcodes, etc. */
139232153Smm	struct in_addr 	v_smask;	/* Subnet mask */
140228753Smm	struct in_addr 	v_dgate;	/* Default gateway */
141	struct in_addr	v_dns1, v_dns2; /* Domain name servers */
142	struct in_addr	v_ins1, v_ins2; /* IEN-116 name servers */
143	struct in_addr	v_ts1, v_ts2;	/* Time servers */
144	int32		v_unused[6];	/* currently unused */
145};
146
147
148/* v_flags values */
149#define VF_SMASK	1	/* Subnet mask field contains valid data */
150