net: add helper to generate random mac address
Add new function eth_random_enetaddr() to generate a locally administered ethernet address. Signed-off-by: Michael Walle <michael@walle.cc> Acked-by: Joe Hershberger <joe.hershberger@gmail.com>
This commit is contained in:
		
							parent
							
								
									99e139d590
								
							
						
					
					
						commit
						03c1b04f86
					
				|  | @ -122,6 +122,23 @@ extern int eth_setenv_enetaddr(char *name, const uchar *enetaddr); | ||||||
| extern int eth_getenv_enetaddr_by_index(const char *base_name, int index, | extern int eth_getenv_enetaddr_by_index(const char *base_name, int index, | ||||||
| 					uchar *enetaddr); | 					uchar *enetaddr); | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_RANDOM_MACADDR | ||||||
|  | /*
 | ||||||
|  |  * The u-boot policy does not allow hardcoded ethernet addresses. Under the | ||||||
|  |  * following circumstances a random generated address is allowed: | ||||||
|  |  *  - in emergency cases, where you need a working network connection to set | ||||||
|  |  *    the ethernet address. | ||||||
|  |  *    Eg. you want a rescue boot and don't have a serial port to access the | ||||||
|  |  *    CLI to set environment variables. | ||||||
|  |  * | ||||||
|  |  * In these cases, we generate a random locally administered ethernet address. | ||||||
|  |  * | ||||||
|  |  * Args: | ||||||
|  |  *  enetaddr - returns 6 byte hardware address | ||||||
|  |  */ | ||||||
|  | extern void eth_random_enetaddr(uchar *enetaddr); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| extern int usb_eth_initialize(bd_t *bi); | extern int usb_eth_initialize(bd_t *bi); | ||||||
| extern int eth_init(bd_t *bis);			/* Initialize the device */ | extern int eth_init(bd_t *bis);			/* Initialize the device */ | ||||||
| extern int eth_send(void *packet, int length);	   /* Send a packet */ | extern int eth_send(void *packet, int length);	   /* Send a packet */ | ||||||
|  |  | ||||||
							
								
								
									
										22
									
								
								net/eth.c
								
								
								
								
							
							
						
						
									
										22
									
								
								net/eth.c
								
								
								
								
							|  | @ -70,6 +70,28 @@ static int eth_mac_skip(int index) | ||||||
| 	return ((skip_state = getenv(enetvar)) != NULL); | 	return ((skip_state = getenv(enetvar)) != NULL); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_RANDOM_MACADDR | ||||||
|  | void eth_random_enetaddr(uchar *enetaddr) | ||||||
|  | { | ||||||
|  | 	uint32_t rval; | ||||||
|  | 
 | ||||||
|  | 	srand(get_timer(0)); | ||||||
|  | 
 | ||||||
|  | 	rval = rand(); | ||||||
|  | 	enetaddr[0] = rval & 0xff; | ||||||
|  | 	enetaddr[1] = (rval >> 8) & 0xff; | ||||||
|  | 	enetaddr[2] = (rval >> 16) & 0xff; | ||||||
|  | 
 | ||||||
|  | 	rval = rand(); | ||||||
|  | 	enetaddr[3] = rval & 0xff; | ||||||
|  | 	enetaddr[4] = (rval >> 8) & 0xff; | ||||||
|  | 	enetaddr[5] = (rval >> 16) & 0xff; | ||||||
|  | 
 | ||||||
|  | 	/* make sure it's local and unicast */ | ||||||
|  | 	enetaddr[0] = (enetaddr[0] | 0x02) & ~0x01; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * CPU and board-specific Ethernet initializations.  Aliased function |  * CPU and board-specific Ethernet initializations.  Aliased function | ||||||
|  * signals caller to move on |  * signals caller to move on | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue