144099b7bSPaul Traina /************************************************************************ 244099b7bSPaul Traina Copyright 1988, 1991 by Carnegie Mellon University 344099b7bSPaul Traina 444099b7bSPaul Traina All Rights Reserved 544099b7bSPaul Traina 644099b7bSPaul Traina Permission to use, copy, modify, and distribute this software and its 744099b7bSPaul Traina documentation for any purpose and without fee is hereby granted, provided 844099b7bSPaul Traina that the above copyright notice appear in all copies and that both that 944099b7bSPaul Traina copyright notice and this permission notice appear in supporting 1044099b7bSPaul Traina documentation, and that the name of Carnegie Mellon University not be used 1144099b7bSPaul Traina in advertising or publicity pertaining to distribution of the software 1244099b7bSPaul Traina without specific, written prior permission. 1344099b7bSPaul Traina 1444099b7bSPaul Traina CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 1544099b7bSPaul Traina SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. 1644099b7bSPaul Traina IN NO EVENT SHALL CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 1744099b7bSPaul Traina DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 1844099b7bSPaul Traina PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 1944099b7bSPaul Traina ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 2044099b7bSPaul Traina SOFTWARE. 2144099b7bSPaul Traina ************************************************************************/ 2244099b7bSPaul Traina 2344099b7bSPaul Traina /* 2444099b7bSPaul Traina * Bootstrap Protocol (BOOTP). RFC951 and RFC1395. 2544099b7bSPaul Traina * 2644099b7bSPaul Traina * 2744099b7bSPaul Traina * This file specifies the "implementation-independent" BOOTP protocol 2844099b7bSPaul Traina * information which is common to both client and server. 2944099b7bSPaul Traina * 3044099b7bSPaul Traina */ 3144099b7bSPaul Traina 3244099b7bSPaul Traina #include "bptypes.h" /* for int32, u_int32 */ 3344099b7bSPaul Traina 3444099b7bSPaul Traina #define BP_CHADDR_LEN 16 3544099b7bSPaul Traina #define BP_SNAME_LEN 64 3644099b7bSPaul Traina #define BP_FILE_LEN 128 3744099b7bSPaul Traina #define BP_VEND_LEN 64 3844099b7bSPaul Traina #define BP_MINPKTSZ 300 /* to check sizeof(struct bootp) */ 39*3f48bf18SIan Dowse /* Overhead to fit a bootp message into an Ethernet packet. */ 40*3f48bf18SIan Dowse #define BP_MSG_OVERHEAD (14 + 20 + 8) /* Ethernet + IP + UDP headers */ 4144099b7bSPaul Traina 4244099b7bSPaul Traina struct bootp { 4344099b7bSPaul Traina unsigned char bp_op; /* packet opcode type */ 4444099b7bSPaul Traina unsigned char bp_htype; /* hardware addr type */ 4544099b7bSPaul Traina unsigned char bp_hlen; /* hardware addr length */ 4644099b7bSPaul Traina unsigned char bp_hops; /* gateway hops */ 478ef94ce8SMarcel Moolenaar u_int32 bp_xid; /* transaction ID */ 4844099b7bSPaul Traina unsigned short bp_secs; /* seconds since boot began */ 4944099b7bSPaul Traina unsigned short bp_flags; /* RFC1532 broadcast, etc. */ 5044099b7bSPaul Traina struct in_addr bp_ciaddr; /* client IP address */ 5144099b7bSPaul Traina struct in_addr bp_yiaddr; /* 'your' IP address */ 5244099b7bSPaul Traina struct in_addr bp_siaddr; /* server IP address */ 5344099b7bSPaul Traina struct in_addr bp_giaddr; /* gateway IP address */ 5444099b7bSPaul Traina unsigned char bp_chaddr[BP_CHADDR_LEN]; /* client hardware address */ 5544099b7bSPaul Traina char bp_sname[BP_SNAME_LEN]; /* server host name */ 5644099b7bSPaul Traina char bp_file[BP_FILE_LEN]; /* boot file name */ 5744099b7bSPaul Traina unsigned char bp_vend[BP_VEND_LEN]; /* vendor-specific area */ 5844099b7bSPaul Traina /* note that bp_vend can be longer, extending to end of packet. */ 5944099b7bSPaul Traina }; 6044099b7bSPaul Traina 6144099b7bSPaul Traina /* 6244099b7bSPaul Traina * UDP port numbers, server and client. 6344099b7bSPaul Traina */ 6444099b7bSPaul Traina #define IPPORT_BOOTPS 67 6544099b7bSPaul Traina #define IPPORT_BOOTPC 68 6644099b7bSPaul Traina 6744099b7bSPaul Traina #define BOOTREPLY 2 6844099b7bSPaul Traina #define BOOTREQUEST 1 6944099b7bSPaul Traina 7044099b7bSPaul Traina /* 7144099b7bSPaul Traina * Hardware types from Assigned Numbers RFC. 7244099b7bSPaul Traina */ 7344099b7bSPaul Traina #define HTYPE_ETHERNET 1 7444099b7bSPaul Traina #define HTYPE_EXP_ETHERNET 2 7544099b7bSPaul Traina #define HTYPE_AX25 3 7644099b7bSPaul Traina #define HTYPE_PRONET 4 7744099b7bSPaul Traina #define HTYPE_CHAOS 5 7844099b7bSPaul Traina #define HTYPE_IEEE802 6 7944099b7bSPaul Traina #define HTYPE_ARCNET 7 8044099b7bSPaul Traina 8144099b7bSPaul Traina /* 8244099b7bSPaul Traina * Vendor magic cookie (v_magic) for CMU 8344099b7bSPaul Traina */ 8444099b7bSPaul Traina #define VM_CMU "CMU" 8544099b7bSPaul Traina 8644099b7bSPaul Traina /* 8744099b7bSPaul Traina * Vendor magic cookie (v_magic) for RFC1048 8844099b7bSPaul Traina */ 8944099b7bSPaul Traina #define VM_RFC1048 { 99, 130, 83, 99 } 9044099b7bSPaul Traina 9144099b7bSPaul Traina 9244099b7bSPaul Traina 9344099b7bSPaul Traina /* 9444099b7bSPaul Traina * Tag values used to specify what information is being supplied in 9544099b7bSPaul Traina * the vendor (options) data area of the packet. 9644099b7bSPaul Traina */ 9744099b7bSPaul Traina /* RFC 1048 */ 9844099b7bSPaul Traina #define TAG_END ((unsigned char) 255) 9944099b7bSPaul Traina #define TAG_PAD ((unsigned char) 0) 10044099b7bSPaul Traina #define TAG_SUBNET_MASK ((unsigned char) 1) 10144099b7bSPaul Traina #define TAG_TIME_OFFSET ((unsigned char) 2) 10244099b7bSPaul Traina #define TAG_GATEWAY ((unsigned char) 3) 10344099b7bSPaul Traina #define TAG_TIME_SERVER ((unsigned char) 4) 10444099b7bSPaul Traina #define TAG_NAME_SERVER ((unsigned char) 5) 10544099b7bSPaul Traina #define TAG_DOMAIN_SERVER ((unsigned char) 6) 10644099b7bSPaul Traina #define TAG_LOG_SERVER ((unsigned char) 7) 10744099b7bSPaul Traina #define TAG_COOKIE_SERVER ((unsigned char) 8) 10844099b7bSPaul Traina #define TAG_LPR_SERVER ((unsigned char) 9) 10944099b7bSPaul Traina #define TAG_IMPRESS_SERVER ((unsigned char) 10) 11044099b7bSPaul Traina #define TAG_RLP_SERVER ((unsigned char) 11) 11144099b7bSPaul Traina #define TAG_HOST_NAME ((unsigned char) 12) 11244099b7bSPaul Traina #define TAG_BOOT_SIZE ((unsigned char) 13) 11344099b7bSPaul Traina /* RFC 1395 */ 11444099b7bSPaul Traina #define TAG_DUMP_FILE ((unsigned char) 14) 11544099b7bSPaul Traina #define TAG_DOMAIN_NAME ((unsigned char) 15) 11644099b7bSPaul Traina #define TAG_SWAP_SERVER ((unsigned char) 16) 11744099b7bSPaul Traina #define TAG_ROOT_PATH ((unsigned char) 17) 11844099b7bSPaul Traina /* RFC 1497 */ 11944099b7bSPaul Traina #define TAG_EXTEN_FILE ((unsigned char) 18) 12044099b7bSPaul Traina /* RFC 1533 */ 12144099b7bSPaul Traina #define TAG_NIS_DOMAIN ((unsigned char) 40) 12244099b7bSPaul Traina #define TAG_NIS_SERVER ((unsigned char) 41) 12344099b7bSPaul Traina #define TAG_NTP_SERVER ((unsigned char) 42) 12444099b7bSPaul Traina /* DHCP maximum message size. */ 12544099b7bSPaul Traina #define TAG_MAX_MSGSZ ((unsigned char) 57) 12644099b7bSPaul Traina 12744099b7bSPaul Traina /* XXX - Add new tags here */ 12844099b7bSPaul Traina 12944099b7bSPaul Traina 13044099b7bSPaul Traina /* 13144099b7bSPaul Traina * "vendor" data permitted for CMU bootp clients. 13244099b7bSPaul Traina */ 13344099b7bSPaul Traina 13444099b7bSPaul Traina struct cmu_vend { 13544099b7bSPaul Traina char v_magic[4]; /* magic number */ 1368ef94ce8SMarcel Moolenaar u_int32 v_flags; /* flags/opcodes, etc. */ 13744099b7bSPaul Traina struct in_addr v_smask; /* Subnet mask */ 13844099b7bSPaul Traina struct in_addr v_dgate; /* Default gateway */ 13944099b7bSPaul Traina struct in_addr v_dns1, v_dns2; /* Domain name servers */ 14044099b7bSPaul Traina struct in_addr v_ins1, v_ins2; /* IEN-116 name servers */ 14144099b7bSPaul Traina struct in_addr v_ts1, v_ts2; /* Time servers */ 14244099b7bSPaul Traina int32 v_unused[6]; /* currently unused */ 14344099b7bSPaul Traina }; 14444099b7bSPaul Traina 14544099b7bSPaul Traina 14644099b7bSPaul Traina /* v_flags values */ 14744099b7bSPaul Traina #define VF_SMASK 1 /* Subnet mask field contains valid data */ 148