/* Dynamic Host Configuration Protocol / BOOTP */ enum { OfferTimeout= 60, /* when an offer times out */ MaxLease= 60*60, /* longest lease for dynamic binding */ MinLease= 15*60, /* shortest lease for dynamic binding */ StaticLease= 30*60, /* lease for static binding */ IPUDPHDRSIZE= 28, /* size of an IP plus UDP header */ MINSUPPORTED= 576, /* biggest IP message the client must support */ /* lengths of some bootp fields */ Maxhwlen= 16, Maxfilelen= 128, Maxoptlen= 312-4, /* bootp types */ Bootrequest= 1, Bootreply= 2, /* bootp flags */ Fbroadcast= 1<<15, /* dhcp v4 types */ Discover= 1, Offer= 2, Request= 3, Decline= 4, Ack= 5, Nak= 6, Release= 7, Inform= 8, /* bootp option types */ OBend= 255, OBpad= 0, OBmask= 1, OBtimeoff= 2, OBrouter= 3, OBtimeserver= 4, OBnameserver= 5, OBdnserver= 6, OBlogserver= 7, OBcookieserver= 8, OBlprserver= 9, OBimpressserver= 10, OBrlserver= 11, OBhostname= 12, /* 0x0c */ OBbflen= 13, OBdumpfile= 14, OBdomainname= 15, OBswapserver= 16, /* 0x10 */ OBrootpath= 17, OBextpath= 18, OBipforward= 19, OBnonlocal= 20, OBpolicyfilter= 21, OBmaxdatagram= 22, OBttl= 23, OBpathtimeout= 24, OBpathplateau= 25, OBmtu= 26, OBsubnetslocal= 27, OBbaddr= 28, OBdiscovermask= 29, OBsupplymask= 30, OBdiscoverrouter= 31, OBrsserver= 32, /* 0x20 */ OBstaticroutes= 33, OBtrailerencap= 34, OBarptimeout= 35, OBetherencap= 36, OBtcpttl= 37, OBtcpka= 38, OBtcpkag= 39, OBnisdomain= 40, OBniserver= 41, OBntpserver= 42, OBvendorinfo= 43, /* 0x2b */ OBnetbiosns= 44, OBnetbiosdds= 45, OBnetbiostype= 46, OBnetbiosscope= 47, OBxfontserver= 48, /* 0x30 */ OBxdispmanager= 49, OBnisplusdomain= 64, /* 0x40 */ OBnisplusserver= 65, OBhomeagent= 68, OBsmtpserver= 69, OBpop3server= 70, OBnntpserver= 71, OBwwwserver= 72, OBfingerserver= 73, OBircserver= 74, OBstserver= 75, OBstdaserver= 76, /* dhcp v4 options */ ODipaddr= 50, /* 0x32 */ ODlease= 51, ODoverload= 52, ODtype= 53, /* 0x35 */ ODserverid= 54, /* 0x36 */ ODparams= 55, /* 0x37 */ ODmessage= 56, ODmaxmsg= 57, ODrenewaltime= 58, ODrebindingtime= 59, ODvendorclass= 60, ODclientid= 61, /* 0x3d */ ODtftpserver= 66, ODbootfile= 67, /* plan9 vendor info options, v4 addresses only (deprecated) */ OP9fsv4= 128, /* plan9 file servers */ OP9authv4= 129, /* plan9 auth servers */ /* plan9 vendor info options, textual addresses, thus v4 or v6 */ OP9fs= 130, /* plan9 file servers */ OP9auth= 131, /* plan9 auth servers */ OP9ipaddr= 132, /* client's address */ OP9ipmask= 133, /* client's subnet mask */ OP9ipgw= 134, /* client's gateway */ /* OP9dns= 135, /* dns servers */ }; /* a lease that never expires */ #define Lforever ~0UL /* dhcp states */ enum { Sinit, Sselecting, Srequesting, Sbound, Srenewing, Srebinding, }; typedef struct Bootp Bootp; struct Bootp { /* Udphdr (included because of structure alignment on the alpha) */ uchar udphdr[Udphdrsize]; uchar op; /* opcode */ uchar htype; /* hardware type */ uchar hlen; /* hardware address len */ uchar hops; /* hops */ uchar xid[4]; /* a random number */ uchar secs[2]; /* elapsed since client started booting */ uchar flags[2]; uchar ciaddr[IPv4addrlen]; /* client IP address (client tells server) */ uchar yiaddr[IPv4addrlen]; /* client IP address (server tells client) */ uchar siaddr[IPv4addrlen]; /* server IP address */ uchar giaddr[IPv4addrlen]; /* gateway IP address */ uchar chaddr[Maxhwlen]; /* client hardware address */ char sname[64]; /* server host name (optional) */ char file[Maxfilelen]; /* boot file name */ uchar optmagic[4]; uchar optdata[Maxoptlen]; };