diff options
Diffstat (limited to 'contrib/dhcpid/dhcpid.txt')
-rw-r--r-- | contrib/dhcpid/dhcpid.txt | 884 |
1 files changed, 0 insertions, 884 deletions
diff --git a/contrib/dhcpid/dhcpid.txt b/contrib/dhcpid/dhcpid.txt deleted file mode 100644 index e6b5d2771..000000000 --- a/contrib/dhcpid/dhcpid.txt +++ /dev/null @@ -1,884 +0,0 @@ -From daniel@insu.com Thu Apr 27 14:14:55 2000 -Sender: root@iNsu.COM -Message-ID: <39075669.FAEB20F2@insu.com> -Date: Wed, 26 Apr 2000 16:49:45 -0400 -From: Daniel Shane <daniel@insu.com> -X-Mailer: Mozilla 4.72 [en] (X11; U; Linux 2.2.14-5.0 i686) -X-Accept-Language: en -MIME-Version: 1.0 -Subject: Re: New feature added to etherboot -References: <20000425170804.6677127D8A@Goffman.iNsu.COM> -Content-Type: multipart/mixed; - boundary="------------4734FDA0BF2F2FBDF8EB8DF6" - -This is a multi-part message in MIME format. ---------------4734FDA0BF2F2FBDF8EB8DF6 -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit - -Ok, here is a diff for etherboot 4.6.0 that adds identifiers. - -To test this you need to use a class in the dhcpd.conf file and -also send back a string in option 208. - -These identifiers prevent a client from booting from other DHCP -servers when you have more than 1 in your network. - -In will also prevent any client, except the valid ones, to use this -DHCP server. - -Here is a subset of my dhcpd.conf : - -option iNdiskless-state code 208 = text; - -class "iNdiskless-boot" { - match if substring(option iNdiskless-state,0,4) = "BOOT"; -} -class "iNdiskless-setup" { - match if substring(option iNdiskless-state,0,5) = "SETUP"; -} - -subnet 10.4.1.0 netmask 255.255.255.0 { -pool { - allow members of "iNdiskless-boot"; - deny unknown clients; - range 10.4.1.2 10.4.1.200; - next-server 10.4.1.1; - -# Identify ourselves to the etherboot/DHCP client - option iNdiskless-state "BOOT"; - - host labo01 { - hardware ethernet 00:80:c8:ec:04:1b; - } - host labo02 { - hardware ethernet 00:4f:4c:04:45:d6; - } - host labo03 { - hardware ethernet 00:50:ba:c8:db:d6; - } -} -pool { - allow members of "iNdiskless-setup"; - range 10.4.1.201 10.4.1.254; - option iNdiskless-state "SETUP"; - -# send another kernel to setup the diskless workstation - } -} - -Daniel Shane. ---------------4734FDA0BF2F2FBDF8EB8DF6 -Content-Type: text/plain; charset=us-ascii; - name="main.c.diff" -Content-Transfer-Encoding: 7bit -Content-Disposition: inline; - filename="main.c.diff" - ---- etherboot-4.6.0/src/main.c Tue Apr 25 08:30:01 2000 -+++ etherboot-4.5.6-new/src/main.c Wed Apr 26 16:17:09 2000 -@@ -42,6 +42,23 @@ char *motd[RFC1533_VENDOR_NUMOFMOTD]; - #ifdef IMAGE_FREEBSD - int freebsd_howto = 0; - #endif -+ -+#ifdef SERVER_IDENT -+#ifdef DEFAULT_SERVER_IDENT -+char server_ident[9] = DEFAULT_SERVER_IDENT; -+#else -+char server_ident[9] = {}; -+#endif -+#endif -+ -+#ifdef CLIENT_IDENT -+#ifdef DEFAULT_CLIENT_IDENT -+char client_ident[9] = DEFAULT_CLIENT_IDENT; -+#else -+char client_ident[9] = {}; -+#endif -+#endif -+ - int vendorext_isvalid; - char config_buffer[TFTP_MAX_PACKET+1]; /* +1 for null byte */ - unsigned long netmask; -@@ -63,61 +80,85 @@ char rfc1533_cookie[5] = { RFC1533_CO - char rfc1533_cookie[] = { RFC1533_COOKIE}; - char rfc1533_end[]={RFC1533_END }; - static const char dhcpdiscover[]={ -- RFC2132_MSG_TYPE,1,DHCPDISCOVER, -- RFC2132_MAX_SIZE,2,2,64, -- RFC2132_PARAM_LIST,4,RFC1533_NETMASK,RFC1533_GATEWAY, -- RFC1533_HOSTNAME,RFC1533_EXTENSIONPATH -- }; --static const char dhcprequest []={ -- RFC2132_MSG_TYPE,1,DHCPREQUEST, -- RFC2132_SRV_ID,4,0,0,0,0, -- RFC2132_REQ_ADDR,4,0,0,0,0, -- RFC2132_MAX_SIZE,2,2,64, -- /* request parameters */ -- RFC2132_PARAM_LIST, --#ifdef IMAGE_FREEBSD -- /* 4 standard + 4 vendortags + 8 motd + 16 menu items */ -- 4 + 4 + 8 + 16, -+ RFC2132_MSG_TYPE,1,DHCPDISCOVER, -+ RFC2132_MAX_SIZE,2,2,64, -+#ifdef CLIENT_IDENT -+ RFC1533_VENDOR_CLIENT_IDENT,8,0,0,0,0,0,0,0,0, -+#endif -+ RFC2132_PARAM_LIST, -+#ifdef SERVER_IDENT -+ 5, - #else -- /* 4 standard + 3 vendortags + 8 motd + 16 menu items */ -- 4 + 3 + 8 + 16, -+ 4, - #endif -- /* Standard parameters */ -- RFC1533_NETMASK, RFC1533_GATEWAY, -- RFC1533_HOSTNAME, RFC1533_EXTENSIONPATH, -- /* Etherboot vendortags */ -- RFC1533_VENDOR_MAGIC, -+#ifdef SERVER_IDENT -+ RFC1533_VENDOR_SERVER_IDENT, -+#endif -+ RFC1533_NETMASK, -+ RFC1533_GATEWAY, -+ RFC1533_HOSTNAME, -+ RFC1533_EXTENSIONPATH -+}; -+static const char dhcprequest []={ -+ RFC2132_MSG_TYPE,1,DHCPREQUEST, -+ RFC2132_SRV_ID,4,0,0,0,0, -+ RFC2132_REQ_ADDR,4,0,0,0,0, -+#ifdef CLIENT_IDENT -+ RFC1533_VENDOR_CLIENT_IDENT,8,0,0,0,0,0,0,0,0, -+#endif -+ RFC2132_MAX_SIZE,2,2,64, -+ /* request parameters */ -+ RFC2132_PARAM_LIST, -+ /* 4 standard + 3 vendortags + 8 motd + 16 menu items */ -+ 4 + -+ 3 + -+#ifdef IMAGE_FREEBSD -+ 1 + /* One more vendortags for VENDOR_HOWTO */ -+#endif -+#ifdef SERVER_IDENT -+ 1 + /* One more vendortags for VENDOR_SERVER_IDENT */ -+#endif -+ 8 + -+ 16, -+ /* Standard parameters */ -+ RFC1533_NETMASK, RFC1533_GATEWAY, -+ RFC1533_HOSTNAME, RFC1533_EXTENSIONPATH, -+ /* Etherboot vendortags */ -+ RFC1533_VENDOR_MAGIC, - #ifdef IMAGE_FREEBSD -- RFC1533_VENDOR_HOWTO, -+ RFC1533_VENDOR_HOWTO, - #endif -- RFC1533_VENDOR_MNUOPTS, RFC1533_VENDOR_SELECTION, -- /* 8 MOTD entries */ -- RFC1533_VENDOR_MOTD, -- RFC1533_VENDOR_MOTD+1, -- RFC1533_VENDOR_MOTD+2, -- RFC1533_VENDOR_MOTD+3, -- RFC1533_VENDOR_MOTD+4, -- RFC1533_VENDOR_MOTD+5, -- RFC1533_VENDOR_MOTD+6, -- RFC1533_VENDOR_MOTD+7, -- /* 16 image entries */ -- RFC1533_VENDOR_IMG, -- RFC1533_VENDOR_IMG+1, -- RFC1533_VENDOR_IMG+2, -- RFC1533_VENDOR_IMG+3, -- RFC1533_VENDOR_IMG+4, -- RFC1533_VENDOR_IMG+5, -- RFC1533_VENDOR_IMG+6, -- RFC1533_VENDOR_IMG+7, -- RFC1533_VENDOR_IMG+8, -- RFC1533_VENDOR_IMG+9, -- RFC1533_VENDOR_IMG+10, -- RFC1533_VENDOR_IMG+11, -- RFC1533_VENDOR_IMG+12, -- RFC1533_VENDOR_IMG+13, -- RFC1533_VENDOR_IMG+14, -- RFC1533_VENDOR_IMG+15, -- }; -+#ifdef SERVER_IDENT -+ RFC1533_VENDOR_SERVER_IDENT, -+#endif -+ RFC1533_VENDOR_MNUOPTS, RFC1533_VENDOR_SELECTION, -+ /* 8 MOTD entries */ -+ RFC1533_VENDOR_MOTD, -+ RFC1533_VENDOR_MOTD+1, -+ RFC1533_VENDOR_MOTD+2, -+ RFC1533_VENDOR_MOTD+3, -+ RFC1533_VENDOR_MOTD+4, -+ RFC1533_VENDOR_MOTD+5, -+ RFC1533_VENDOR_MOTD+6, -+ RFC1533_VENDOR_MOTD+7, -+ /* 16 image entries */ -+ RFC1533_VENDOR_IMG, -+ RFC1533_VENDOR_IMG+1, -+ RFC1533_VENDOR_IMG+2, -+ RFC1533_VENDOR_IMG+3, -+ RFC1533_VENDOR_IMG+4, -+ RFC1533_VENDOR_IMG+5, -+ RFC1533_VENDOR_IMG+6, -+ RFC1533_VENDOR_IMG+7, -+ RFC1533_VENDOR_IMG+8, -+ RFC1533_VENDOR_IMG+9, -+ RFC1533_VENDOR_IMG+10, -+ RFC1533_VENDOR_IMG+11, -+ RFC1533_VENDOR_IMG+12, -+ RFC1533_VENDOR_IMG+13, -+ RFC1533_VENDOR_IMG+14, -+ RFC1533_VENDOR_IMG+15, -+}; - - #endif /* NO_DHCP_SUPPORT */ - static const char broadcast[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; -@@ -176,6 +217,55 @@ done: - break; - } - #endif -+ -+#ifdef SHIFTED_IDENT_INPUT -+ if (getshift() & 3) -+ { -+#endif -+ -+#ifdef CLIENT_IDENT -+# ifdef ASK_CLIENT_IDENT -+ { -+ char tmp_ident[9] = {}; -+# ifdef DEFAULT_CLIENT_IDENT -+ printf("Enter the client identifier (8 char max.) default [%s] : ",client_ident); -+# else -+ printf("Enter the client identifier (8 char max.) : "); -+# endif -+ getstr(tmp_ident,8); -+ if (strlen(tmp_ident) != 0) -+ memcpy(client_ident,tmp_ident,8); -+ else -+ printf("%s",client_ident); -+ putchar('\n'); -+ } -+# endif -+#endif -+ -+#ifdef SERVER_IDENT -+# ifdef ASK_SERVER_IDENT -+ { -+ char tmp_ident[9] = {}; -+# ifdef DEFAULT_SERVER_IDENT -+ printf("Enter the server identifier (8 char max.) default [%s] : ",server_ident); -+# else -+ printf("Enter the server identifier (8 char max.) : "); -+# endif -+ getstr(tmp_ident,8); -+ if (strlen(tmp_ident) != 0) -+ memcpy(server_ident,tmp_ident,8); -+ else -+ printf("%s",server_ident); -+ putchar('\n'); -+ } -+# endif -+#endif -+ -+#ifdef SHIFTED_IDENT_INPUT -+ } -+#endif -+ -+ print_config(); - #if (TRY_FLOPPY_FIRST > 0) && defined(FLOPPY) - disk_init(); - printf("Trying floppy"); -@@ -188,7 +278,7 @@ done: - } - printf("no floppy\n"); - #endif /* TRY_FLOPPY_FIRST && FLOPPY */ -- print_config(); -+ print_config(); - gateA20_set(); - #ifdef EMERGENCYDISKBOOT - if (!eth_probe()) { -@@ -663,6 +753,8 @@ BOOTP - Get my IP address and load infor - int bootp() - { - int retry; -+ int offset = 0; -+ - #ifndef NO_DHCP_SUPPORT - int retry1; - #endif /* NO_DHCP_SUPPORT */ -@@ -680,11 +772,18 @@ int bootp() - bp.bp_xid = xid = starttime = currticks(); - memcpy(bp.bp_hwaddr, arptable[ARP_CLIENT].node, ETHER_ADDR_SIZE); - #ifdef NO_DHCP_SUPPORT -- memcpy(bp.bp_vend, rfc1533_cookie, 5); /* request RFC-style options */ -+ memcpy(bp.bp_vend+offset, rfc1533_cookie, 5); /* request RFC-style options */ -+ offset += sizeof rfc1533_cookie; - #else -- memcpy(bp.bp_vend, rfc1533_cookie, sizeof rfc1533_cookie); /* request RFC-style options */ -- memcpy(bp.bp_vend+sizeof rfc1533_cookie, dhcpdiscover, sizeof dhcpdiscover); -- memcpy(bp.bp_vend+sizeof rfc1533_cookie +sizeof dhcpdiscover, rfc1533_end, sizeof rfc1533_end); -+ memcpy(bp.bp_vend+offset, rfc1533_cookie, sizeof rfc1533_cookie); /* request RFC-style options */ -+ offset += sizeof rfc1533_cookie; -+ memcpy(bp.bp_vend+offset, dhcpdiscover, sizeof dhcpdiscover); -+ offset += sizeof dhcpdiscover; -+#ifdef CLIENT_IDENT -+ memcpy(bp.bp_vend+13, client_ident, strlen(client_ident)); -+#endif -+ memcpy(bp.bp_vend+offset, rfc1533_end, sizeof rfc1533_end); -+ offset += sizeof rfc1533_end; - #endif /* NO_DHCP_SUPPORT */ - - for (retry = 0; retry < MAX_BOOTP_RETRIES; ) { -@@ -715,19 +814,22 @@ int bootp() - #else - if (await_reply(AWAIT_BOOTP, 0, NULL, TIMEOUT)){ - if (dhcp_reply==DHCPOFFER){ -- dhcp_reply=0; -- memcpy(bp.bp_vend, rfc1533_cookie, sizeof rfc1533_cookie); -- memcpy(bp.bp_vend+sizeof rfc1533_cookie, dhcprequest, sizeof dhcprequest); -- memcpy(bp.bp_vend+sizeof rfc1533_cookie +sizeof dhcprequest, rfc1533_end, sizeof rfc1533_end); -- memcpy(bp.bp_vend+9, &dhcp_server, sizeof(in_addr)); -- memcpy(bp.bp_vend+15, &dhcp_addr, sizeof(in_addr)); -- for (retry1 = 0; retry1 < MAX_BOOTP_RETRIES;) { -- udp_transmit(IP_BROADCAST, 0, BOOTP_SERVER, -- sizeof(struct bootp_t), &bp); - dhcp_reply=0; -- if (await_reply(AWAIT_BOOTP, 0, NULL, TIMEOUT)) -- if (dhcp_reply==DHCPACK) -- return(1); -+ memcpy(bp.bp_vend, rfc1533_cookie, sizeof rfc1533_cookie); -+ memcpy(bp.bp_vend+sizeof rfc1533_cookie, dhcprequest, sizeof dhcprequest); -+ memcpy(bp.bp_vend+sizeof rfc1533_cookie +sizeof dhcprequest, rfc1533_end, sizeof rfc1533_end); -+ memcpy(bp.bp_vend+9, &dhcp_server, sizeof(in_addr)); -+ memcpy(bp.bp_vend+15, &dhcp_addr, sizeof(in_addr)); -+#ifdef CLIENT_IDENT -+ memcpy(bp.bp_vend+21, client_ident, strlen(client_ident)); -+#endif -+ for (retry1 = 0; retry1 < MAX_BOOTP_RETRIES;) { -+ udp_transmit(IP_BROADCAST, 0, BOOTP_SERVER, -+ sizeof(struct bootp_t), &bp); -+ dhcp_reply=0; -+ if (await_reply(AWAIT_BOOTP, 0, NULL, TIMEOUT)) -+ if (dhcp_reply==DHCPACK) -+ return(1); - rfc951_sleep(++retry1); - } - } else -@@ -750,6 +852,7 @@ AWAIT_REPLY - Wait until we get a respon - **************************************************************************/ - int await_reply(int type, int ival, void *ptr, int timeout) - { -+ int result; - unsigned long time; - struct iphdr *ip; - struct udphdr *udp; -@@ -757,6 +860,7 @@ int await_reply(int type, int ival, void - struct bootp_t *bootpreply; - struct rpc_t *rpc; - unsigned short ptype; -+ unsigned int min_packetlen; - - unsigned int protohdrlen = ETHER_HDR_SIZE + sizeof(struct iphdr) + - sizeof(struct udphdr); -@@ -766,35 +870,35 @@ int await_reply(int type, int ival, void - * needs a negligible amount of time. */ - for (;;) { - if (eth_poll()) { /* We have something! */ -- /* Check for ARP - No IP hdr */ -+ /* Check for ARP - No IP hdr */ - if (nic.packetlen >= ETHER_HDR_SIZE) { - ptype = ((unsigned short) nic.packet[12]) << 8 - | ((unsigned short) nic.packet[13]); - } else continue; /* what else could we do with it? */ - if ((nic.packetlen >= ETHER_HDR_SIZE + -- sizeof(struct arprequest)) && -- (ptype == ARP) ) { -+ sizeof(struct arprequest)) && -+ (ptype == ARP) ) { - unsigned long tmp; -- -+ - arpreply = (struct arprequest *) - &nic.packet[ETHER_HDR_SIZE]; - if ((arpreply->opcode == ntohs(ARP_REPLY)) && -- !memcmp(arpreply->sipaddr, ptr, sizeof(in_addr)) && -- (type == AWAIT_ARP)) { -+ !memcmp(arpreply->sipaddr, ptr, sizeof(in_addr)) && -+ (type == AWAIT_ARP)) { - memcpy(arptable[ival].node, arpreply->shwaddr, ETHER_ADDR_SIZE); - return(1); - } - memcpy(&tmp, arpreply->tipaddr, sizeof(in_addr)); - if ((arpreply->opcode == ntohs(ARP_REQUEST)) && -- (tmp == arptable[ARP_CLIENT].ipaddr.s_addr)) { -+ (tmp == arptable[ARP_CLIENT].ipaddr.s_addr)) { - arpreply->opcode = htons(ARP_REPLY); - memcpy(arpreply->tipaddr, arpreply->sipaddr, sizeof(in_addr)); - memcpy(arpreply->thwaddr, arpreply->shwaddr, ETHER_ADDR_SIZE); - memcpy(arpreply->sipaddr, &arptable[ARP_CLIENT].ipaddr, sizeof(in_addr)); - memcpy(arpreply->shwaddr, arptable[ARP_CLIENT].node, ETHER_ADDR_SIZE); - eth_transmit(arpreply->thwaddr, ARP, -- sizeof(struct arprequest), -- arpreply); -+ sizeof(struct arprequest), -+ arpreply); - #ifdef MDEBUG - memcpy(&tmp, arpreply->tipaddr, sizeof(in_addr)); - printf("Sent ARP reply to: %I\n",tmp); -@@ -802,20 +906,20 @@ int await_reply(int type, int ival, void - } - continue; - } -- -+ - if (type == AWAIT_QDRAIN) { - continue; - } -- -- /* Check for RARP - No IP hdr */ -+ -+ /* Check for RARP - No IP hdr */ - if ((type == AWAIT_RARP) && -- (nic.packetlen >= ETHER_HDR_SIZE + -- sizeof(struct arprequest)) && -- (ptype == RARP)) { -+ (nic.packetlen >= ETHER_HDR_SIZE + -+ sizeof(struct arprequest)) && -+ (ptype == RARP)) { - arpreply = (struct arprequest *) - &nic.packet[ETHER_HDR_SIZE]; - if ((arpreply->opcode == ntohs(RARP_REPLY)) && -- !memcmp(arpreply->thwaddr, ptr, ETHER_ADDR_SIZE)) { -+ !memcmp(arpreply->thwaddr, ptr, ETHER_ADDR_SIZE)) { - memcpy(arptable[ARP_SERVER].node, arpreply->shwaddr, ETHER_ADDR_SIZE); - memcpy(& arptable[ARP_SERVER].ipaddr, arpreply->sipaddr, sizeof(in_addr)); - memcpy(& arptable[ARP_CLIENT].ipaddr, arpreply->tipaddr, sizeof(in_addr)); -@@ -823,64 +927,72 @@ int await_reply(int type, int ival, void - } - continue; - } -- -- /* Anything else has IP header */ -+ -+ /* Anything else has IP header */ - if ((nic.packetlen < protohdrlen) || -- (ptype != IP) ) continue; -+ (ptype != IP) ) continue; - ip = (struct iphdr *)&nic.packet[ETHER_HDR_SIZE]; - if ((ip->verhdrlen != 0x45) || -- ipchksum((unsigned short *)ip, sizeof(struct iphdr)) || -- (ip->protocol != IP_UDP)) continue; -+ ipchksum((unsigned short *)ip, sizeof(struct iphdr)) || -+ (ip->protocol != IP_UDP)) continue; - udp = (struct udphdr *)&nic.packet[ETHER_HDR_SIZE + -- sizeof(struct iphdr)]; -- -- /* BOOTP ? */ -+ sizeof(struct iphdr)]; -+ -+ /* BOOTP ? */ - bootpreply = (struct bootp_t *)&nic.packet[ETHER_HDR_SIZE]; -- if ((type == AWAIT_BOOTP) && -- (nic.packetlen >= (ETHER_HDR_SIZE + --#ifdef NO_DHCP_SUPPORT -- sizeof(struct bootp_t))) && -+#ifdef NO_DHCP_SUPPORT -+ min_packetlen = ETHER_HDR_SIZE + sizeof(struct bootp_t); - #else -- sizeof(struct bootp_t))-DHCP_OPT_LEN) && --#endif /* NO_DHCP_SUPPORT */ -- (ntohs(udp->dest) == BOOTP_CLIENT) && -- (bootpreply->bp_op == BOOTP_REPLY) && -- (bootpreply->bp_xid == xid)) { -- arptable[ARP_CLIENT].ipaddr.s_addr = -- bootpreply->bp_yiaddr.s_addr; -+ min_packetlen = ETHER_HDR_SIZE + sizeof(struct bootp_t) - DHCP_OPT_LEN; -+#endif -+ if ( -+ (type == AWAIT_BOOTP) && -+ (nic.packetlen >= min_packetlen) && -+ (ntohs(udp->dest) == BOOTP_CLIENT) && -+ (bootpreply->bp_op == BOOTP_REPLY) && -+ (bootpreply->bp_xid == xid) -+ ) { -+ arptable[ARP_CLIENT].ipaddr.s_addr = bootpreply->bp_yiaddr.s_addr; - #ifndef NO_DHCP_SUPPORT - dhcp_addr.s_addr = bootpreply->bp_yiaddr.s_addr; - #endif /* NO_DHCP_SUPPORT */ - netmask = default_netmask(); -- arptable[ARP_SERVER].ipaddr.s_addr = -- bootpreply->bp_siaddr.s_addr; -+ arptable[ARP_SERVER].ipaddr.s_addr = bootpreply->bp_siaddr.s_addr; - memset(arptable[ARP_SERVER].node, 0, ETHER_ADDR_SIZE); /* Kill arp */ -- arptable[ARP_GATEWAY].ipaddr.s_addr = -- bootpreply->bp_giaddr.s_addr; -+ arptable[ARP_GATEWAY].ipaddr.s_addr = bootpreply->bp_giaddr.s_addr; - memset(arptable[ARP_GATEWAY].node, 0, ETHER_ADDR_SIZE); /* Kill arp */ - if (bootpreply->bp_file[0]) { - memcpy(kernel_buf, bootpreply->bp_file, 128); - kernel = kernel_buf; - } - memcpy((char *)BOOTP_DATA_ADDR, (char *)bootpreply, sizeof(struct bootpd_t)); -- decode_rfc1533(BOOTP_DATA_ADDR->bootp_reply.bp_vend, --#ifdef NO_DHCP_SUPPORT -- 0, BOOTP_VENDOR_LEN + -- MAX_BOOTP_EXTLEN, 1); --#else -- 0, DHCP_OPT_LEN, 1); --#endif /* NO_DHCP_SUPPORT */ -- return(1); -+#ifdef NO_DHCP_SUPPORT -+ if (decode_rfc1533(BOOTP_DATA_ADDR->bootp_reply.bp_vend, -+ 0, BOOTP_VENDOR_LEN + -+ MAX_BOOTP_EXTLEN, 1)) { -+ return(1); -+ } -+ else { -+ continue; -+ } -+#else -+ if (decode_rfc1533(BOOTP_DATA_ADDR->bootp_reply.bp_vend, -+ 0, DHCP_OPT_LEN, 1)) { -+ return(1); -+ } -+ else { -+ continue; -+ } - } -- -+#endif /* NO_DHCP_SUPPORT */ - #ifdef DOWNLOAD_PROTO_TFTP -- /* TFTP ? */ -+ /* TFTP ? */ - if ((type == AWAIT_TFTP) && -- (ntohs(udp->dest) == ival)) return(1); -+ (ntohs(udp->dest) == ival)) return(1); - #endif /* DOWNLOAD_PROTO_TFTP */ -- -+ - #ifdef DOWNLOAD_PROTO_NFS -- /* RPC ? */ -+ /* RPC ? */ - rpc = (struct rpc_t *)&nic.packet[ETHER_HDR_SIZE]; - if ((type == AWAIT_RPC) && - (ntohs(udp->dest) == ival) && -@@ -889,19 +1001,19 @@ int await_reply(int type, int ival, void - return (1); - } - #endif /* DOWNLOAD_PROTO_NFS */ -- -+ - } else { -- /* Check for abort key only if the Rx queue is empty - -- * as long as we have something to process, don't -- * assume that something failed. It is unlikely that -- * we have no processing time left between packets. */ -+ /* Check for abort key only if the Rx queue is empty - -+ * as long as we have something to process, don't -+ * assume that something failed. It is unlikely that -+ * we have no processing time left between packets. */ - if (iskey() && (getchar() == ESC)) - #ifdef EMERGENCYDISKBOOT - exit(0); - #else -- longjmp(jmp_bootmenu,1); -+ longjmp(jmp_bootmenu,1); - #endif -- /* Do the timeout after at least a full queue walk. */ -+ /* Do the timeout after at least a full queue walk. */ - if ((timeout == 0) || (currticks() > time)) { - break; - } -@@ -914,13 +1026,15 @@ int await_reply(int type, int ival, void - DECODE_RFC1533 - Decodes RFC1533 header - **************************************************************************/ - int decode_rfc1533(p, block, len, eof) -- register unsigned char *p; -- int block, len, eof; -+ register unsigned char *p; -+ int block, len, eof; - { - static unsigned char *extdata = NULL, *extend = NULL; - unsigned char *extpath = NULL; - unsigned char *endp; -- -+#ifdef SERVER_IDENT -+ char rcvd_server_ident[9] = {}; -+#endif - if (block == 0) { - #ifdef IMAGE_MENU - memset(imagelist, 0, sizeof(imagelist)); -@@ -1002,11 +1116,16 @@ int decode_rfc1533(p, block, len, eof) - } - #endif - #ifdef MOTD -- else if (c >= RFC1533_VENDOR_MOTD && -+ else if (c >= RFC1533_VENDOR_MOTD && - c < RFC1533_VENDOR_MOTD + - RFC1533_VENDOR_NUMOFMOTD) - motd[c - RFC1533_VENDOR_MOTD] = p; - #endif -+#ifdef SERVER_IDENT -+ else if (c == RFC1533_VENDOR_SERVER_IDENT) { -+ memcpy(rcvd_server_ident,p+2,TAG_LEN(p)); -+ } -+#endif - else { - #if 0 - unsigned char *q; -@@ -1018,6 +1137,30 @@ int decode_rfc1533(p, block, len, eof) - } - p += TAG_LEN(p) + 2; - } -+#if defined(SERVER_IDENT) && defined(DBG_IDENT) -+ if (strcasecmp(rcvd_server_ident,server_ident)) { -+ char ip[16]; -+ -+ inet_ntoa(dhcp_server,ip); -+ printf("[%s]: Option %d (%s), invalid response. Wanted (%s).\n", -+ ip, -+ RFC1533_VENDOR_SERVER_IDENT, -+ rcvd_server_ident, -+ server_ident); -+ strcpy(rcvd_server_ident,""); -+ return(0); -+ } -+ else { -+ char ip[16]; -+ -+ inet_ntoa(dhcp_server,ip); -+ printf("[%s]: Option %d (%s), valid response.\n", -+ ip, -+ RFC1533_VENDOR_SERVER_IDENT, -+ rcvd_server_ident); -+ strcpy(rcvd_server_ident,""); -+ } -+#endif - extdata = extend = endp; - if (block == 0 && extpath != NULL) { - char fname[64]; -@@ -1103,3 +1246,4 @@ void cleanup(void) - * c-basic-offset: 8 - * End: - */ -+ - ---------------4734FDA0BF2F2FBDF8EB8DF6 -Content-Type: text/plain; charset=us-ascii; - name="misc.c.diff" -Content-Transfer-Encoding: 7bit -Content-Disposition: inline; - filename="misc.c.diff" - ---- etherboot-4.6.0/src/misc.c Tue Apr 25 08:30:25 2000 -+++ etherboot-4.5.6-new/src/misc.c Wed Apr 26 16:26:38 2000 -@@ -140,9 +140,11 @@ void printf(const char *fmt, ...) - - #ifdef IMAGE_MENU - /************************************************************************** --INET_ATON - Convert an ascii x.x.x.x to binary form -+INET_NTOA - Convert an ascii x.x.x.x to binary form - **************************************************************************/ --int inet_aton(char *p, in_addr *i) -+int inet_aton(p, i) -+ char *p; -+ in_addr *i; - { - unsigned long ip = 0; - int val; -@@ -165,7 +167,19 @@ int inet_aton(char *p, in_addr *i) - - #endif /* IMAGE_MENU */ - --int getdec(char **ptr) -+#if defined(CLIENT_IDENT) || defined (SERVER_IDENT) -+/************************************************************************** -+INET_NTOA - Convert a binary form to an ascii x.x.x.x form -+**************************************************************************/ -+char *inet_ntoa(in_addr i, char *p) -+{ -+ sprintf(p,"%d.%d.%d.%d",i.s_addr>>24,i.s_addr<<8>>24,i.s_addr<<16>>24,i.s_addr<<24>>24); -+ return p; -+} -+#endif -+ -+int getdec(ptr) -+ char **ptr; - { - char *p = *ptr; - int ret=0; -@@ -308,6 +322,45 @@ iskey(void) - return 0; - } - #endif /* ETHERBOOT32 */ -+ -+/************************************************************************** -+GETSTR - Read a string of size bytes from the keyboard -+(without echoing the final return) -+**************************************************************************/ -+void getstr(char *s, int size) -+{ -+ int i=0; -+ char c; -+ -+ while(1) { -+ c = getc(); -+ -+ -+ if (c == 13) -+ { -+ s[i]='\0'; -+ break; -+ } -+ else if ( -+ ((c >= 'a') && (c <='z')) || -+ ((c >= 'A') && (c <='Z')) || -+ ((c >= '0') && (c <='9')) -+ ) { -+ if (i==8) { -+ putchar(8); -+ putchar(s[i-1]=c); -+ } -+ else -+ putchar(s[i++]=c); -+ } -+ else if ( c == 8 ) { -+ if (i != 0) { -+ --i; -+ s[i]='\0'; -+ putchar(8); -+ putchar(32); -+ putchar(8); -+ } -+ } -+ } -+} - - /* - * Local variables: - ---------------4734FDA0BF2F2FBDF8EB8DF6 -Content-Type: text/plain; charset=us-ascii; - name="Config.diff" -Content-Transfer-Encoding: 7bit -Content-Disposition: inline; - filename="Config.diff" - ---- etherboot-4.6.0/src/Config Tue Apr 25 08:30:57 2000 -+++ etherboot-4.5.6-new/src/Config Wed Apr 26 15:55:57 2000 -@@ -59,6 +59,27 @@ - # may no longer be appropriate. You might need to set - # MAX_ARP_RETRIES, MAX_BOOTP_RETRIES, MAX_TFTP_RETRIES - # and MAX_RPC_RETRIES to a larger value. -+# -DDEFAULT_CLIENT_IDENT -+# The default client identifier that is sent to the -+# DHCP server to identify itself. -+# -DDEFAULT_SERVER_IDENT -+# The expected response that the client will wait -+# for when a DHCP server responds to the the initial -+# client discovery. -+# -DASK_CLIENT_IDENT -+# -DASK_SERVER_IDENT -+# If these are set, the boot process will include -+# a question period where you can manualy specify -+# the client and/or server identifiers. -+# -DSHIFTED_IDENT_INPUT -+# If this is set then the boot process will only -+# ask for the identifiers if one of the shift keys -+# is pressed. Else it will send the default identifiers -+# automatically -+# -DDBG_IDENT -+# This will give show all the DHCP responses with -+# their identifiers. -+# - # - # Etherboot/32 only options: - # -DAOUT_IMAGE - Add a.out kernel boot support (generic) -@@ -147,6 +168,14 @@ CFLAGS32+= -DASK_BOOT=3 -DANS_DEFAULT=AN - - # Change download protocol to NFS. Only available for Etherboot/32 for now. - # CFLAGS32+= -DDOWNLOAD_PROTO_NFS -+ -+# If you have more than one DHCP server you might want to -+# enable these to be able to sort out which one you want to -+# respond to. -+CFLAGS32+= -DDEFAULT_CLIENT_IDENT=\"BOOT\" -DDEFAULT_SERVER_IDENT=\"BOOT\" -+CFLAGS32+= -DASK_CLIENT_IDENT -DASK_SERVER_IDENT -+CFLAGS32+= -DSHIFTED_IDENT_INPUT -+CFLAGS32+= -DDBG_IDENT - - # These flags affect the loader that is prepended to the Etherboot image - LCONFIG+= -DMOVEROM - ---------------4734FDA0BF2F2FBDF8EB8DF6 -Content-Type: text/plain; charset=us-ascii; - name="etherboot.h.diff" -Content-Transfer-Encoding: 7bit -Content-Disposition: inline; - filename="etherboot.h.diff" - ---- etherboot-4.6.0/src/etherboot.h Tue Apr 25 08:30:55 2000 -+++ etherboot-4.5.6-new/src/etherboot.h Wed Apr 26 16:07:16 2000 -@@ -8,6 +8,14 @@ Author: Martin Renters - - #include "osdep.h" - -+#if (! defined(NO_DHCP_SUPPORT)) && (defined(ASK_CLIENT_IDENT) || defined(DEFAULT_CLIENT_IDENT)) -+# define CLIENT_IDENT -+#endif -+ -+#if (! defined(NO_DHCP_SUPPORT)) && (defined(ASK_SERVER_IDENT) || defined(DEFAULT_SERVER_IDENT)) -+# define SERVER_IDENT -+#endif -+ - /* These could be customised for different languages perhaps */ - #define ASK_PROMPT "Boot from (N)etwork or from (L)ocal? " - #define ANS_NETWORK 'N' -@@ -224,6 +232,12 @@ Author: Martin Renters - #ifdef IMAGE_FREEBSD - #define RFC1533_VENDOR_HOWTO 132 - #endif -+#ifdef CLIENT_IDENT -+#define RFC1533_VENDOR_CLIENT_IDENT 208 -+#endif -+#ifdef SERVER_IDENT -+#define RFC1533_VENDOR_SERVER_IDENT 208 -+#endif - #define RFC1533_VENDOR_MNUOPTS 160 - #define RFC1533_VENDOR_SELECTION 176 - #define RFC1533_VENDOR_MOTD 184 -@@ -477,11 +491,13 @@ extern int getdec P((char **)); - extern void printf P((const char *, ...)); - extern char *sprintf P((char *, const char *, ...)); - extern int inet_aton P((char *p, in_addr *i)); -+extern char *inet_ntoa P((in_addr i, char *p)); - extern void gateA20_set P((void)); - extern void gateA20_unset P((void)); - extern void putchar P((int)); - extern int getchar P((void)); - extern int iskey P((void)); -+extern void getstr P((char *s, int size)); - - /* start*.S */ - extern int getc P((void)); -@@ -528,8 +544,10 @@ extern int hostnamelen; - extern unsigned long netmask; - extern int jmp_bootmenu[10]; - extern struct arptable_t arptable[MAX_ARP]; --#ifdef IMAGE_MENU -+#ifdef MOTD - extern char *motd[RFC1533_VENDOR_NUMOFMOTD]; -+#endif -+#ifdef IMAGE_MENU - extern int menutmo,menudefault; - extern unsigned char *defparams; - extern int defparams_max; - ---------------4734FDA0BF2F2FBDF8EB8DF6-- - |