diff options
| author | Wolfgang Denk <wd@pollux.denx.de> | 2006-03-12 18:26:46 +0100 | 
|---|---|---|
| committer | Wolfgang Denk <wd@pollux.denx.de> | 2006-03-12 18:26:46 +0100 | 
| commit | 3b2e4fd9b0348d49e7b55a19a0c919f6c83d9a43 (patch) | |
| tree | 6635ccd8efc2493c36eb43f413bbc5041c6e413b /net/bootp.c | |
| parent | 034698329067f74b66a457aaf8924f7b054996eb (diff) | |
| download | olio-uboot-2014.01-3b2e4fd9b0348d49e7b55a19a0c919f6c83d9a43.tar.xz olio-uboot-2014.01-3b2e4fd9b0348d49e7b55a19a0c919f6c83d9a43.zip | |
Add support for the DHCP vendor optional bootfile (#67).
Ignores the vendor TFTP server name option (#66).
Patch by Murray Jensen, 30 Jun 2005
Diffstat (limited to 'net/bootp.c')
| -rw-r--r-- | net/bootp.c | 34 | 
1 files changed, 31 insertions, 3 deletions
| diff --git a/net/bootp.c b/net/bootp.c index 8c56c0845..669d74a6a 100644 --- a/net/bootp.c +++ b/net/bootp.c @@ -715,7 +715,7 @@ BootpRequest (void)  }  #if (CONFIG_COMMANDS & CFG_CMD_DHCP) -static void DhcpOptionsProcess (uchar * popt) +static void DhcpOptionsProcess (uchar * popt, Bootp_t *bp)  {  	uchar *end = popt + BOOTP_HDR_SIZE;  	int oplen, size; @@ -772,6 +772,34 @@ static void DhcpOptionsProcess (uchar * popt)  			break;  		case 59:	/* Ignore Rebinding Time Option */  			break; +		case 66:	/* Ignore TFTP server name */ +			break; +		case 67:	/* vendor opt bootfile */ +			/* +			 * I can't use dhcp_vendorex_proc here because I need +			 * to write into the bootp packet - even then I had to +			 * pass the bootp packet pointer into here as the +			 * second arg +			 */ +			size = truncate_sz ("Opt Boot File", +					    sizeof(bp->bp_file), +					    oplen); +			if (bp->bp_file[0] == '\0' && size > 0) { +				/* +				 * only use vendor boot file if we didn't +				 * receive a boot file in the main non-vendor +				 * part of the packet - god only knows why +				 * some vendors chose not to use this perfectly +				 * good spot to store the boot file (join on +				 * Tru64 Unix) it seems mind bogglingly crazy +				 * to me +				 */ +				printf("*** WARNING: using vendor " +					"optional boot file\n"); +				memcpy(bp->bp_file, popt + 2, size); +				bp->bp_file[size] = '\0'; +			} +			break;  		default:  #if (CONFIG_BOOTP_MASK & CONFIG_BOOTP_VENDOREX)  			if (dhcp_vendorex_proc (popt)) @@ -882,7 +910,7 @@ DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)  			dhcp_state = REQUESTING;  			if (NetReadLong((ulong*)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC)) -				DhcpOptionsProcess((u8 *)&bp->bp_vend[4]); +				DhcpOptionsProcess((u8 *)&bp->bp_vend[4], bp);  			BootpCopyNetParams(bp); /* Store net params from reply */ @@ -901,7 +929,7 @@ DhcpHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)  			char *s;  			if (NetReadLong((ulong*)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC)) -				DhcpOptionsProcess((u8 *)&bp->bp_vend[4]); +				DhcpOptionsProcess((u8 *)&bp->bp_vend[4], bp);  			BootpCopyNetParams(bp); /* Store net params from reply */  			dhcp_state = BOUND;  			puts ("DHCP client bound to address "); |