? a.out ? test.cpp Index: netboot/main.c =================================================================== RCS file: /sources/grub/grub/netboot/main.c,v retrieving revision 1.16 diff -u -p -r1.16 main.c --- netboot/main.c 20 May 2004 22:17:27 -0000 1.16 +++ netboot/main.c 31 Jan 2006 01:19:24 -0000 @@ -82,8 +82,9 @@ static const unsigned char dhcpdiscover[ RFC2132_MSG_TYPE, 1, DHCPDISCOVER, RFC2132_MAX_SIZE,2, /* request as much as we can */ ETH_MAX_MTU / 256, ETH_MAX_MTU % 256, - RFC2132_PARAM_LIST, 4, RFC1533_NETMASK, RFC1533_GATEWAY, - RFC1533_HOSTNAME, RFC1533_EXTENSIONPATH + RFC2132_PARAM_LIST, 5, RFC1533_NETMASK, RFC1533_GATEWAY, + RFC1533_HOSTNAME, RFC1533_EXTENSIONPATH, + RFC1533_VENDOR, RFC2132_VENDOR_CLASS_ID,7,'p','x','e','g','r','u','b' }; static const unsigned char dhcprequest[] = @@ -95,14 +96,16 @@ static const unsigned char dhcprequest[] ETH_MAX_MTU / 256, ETH_MAX_MTU % 256, /* request parameters */ RFC2132_PARAM_LIST, - /* 4 standard + 2 vendortags */ - 4 + 2, + /* 4 standard + 2 vendortags + 1 VSI tag*/ + 4 + 2 + 1, /* Standard parameters */ RFC1533_NETMASK, RFC1533_GATEWAY, RFC1533_HOSTNAME, RFC1533_EXTENSIONPATH, + RFC1533_VENDOR, /* Etherboot vendortags */ RFC1533_VENDOR_MAGIC, RFC1533_VENDOR_CONFIGFILE, + RFC2132_VENDOR_CLASS_ID,7,'p','x','e','g','r','u','b' }; #endif /* ! NO_DHCP_SUPPORT */ @@ -738,6 +741,9 @@ AWAIT_REPLY - Wait until we get a respon int await_reply (int type, int ival, void *ptr, int timeout) { + unsigned int x,y; + char grubvendorID[] = {0x70,0x78,0x65,0x67,0x72,0x75,0x62,0xFF}; + unsigned int gvIDsize = (sizeof(grubvendorID)/sizeof(char)); unsigned long time; struct iphdr *ip; struct udphdr *udp; @@ -900,6 +906,18 @@ await_reply (int type, int ival, void *p arptable[ARP_CLIENT].ipaddr.s_addr = bootpreply->bp_yiaddr.s_addr; #ifndef NO_DHCP_SUPPORT + /**Check that DHCP option 43 for magic grubvendorID*/ + for(x=y=0; x<(BOOTP_VENDOR_LEN+2-gvIDsize);x++) { + while(bootpreply->bp_vend[x+y]==grubvendorID[y]&& y < gvIDsize) + y++; + if (y==gvIDsize) + break; + y=0; + } + if (y==0) { + etherboot_printf("DHCP did not provide VSI\n"); + continue; + } dhcp_addr.s_addr = bootpreply->bp_yiaddr.s_addr; #ifdef DEBUG etherboot_printf ("dhcp_addr = %@\n", dhcp_addr.s_addr);