9
0
Fork 0

w1: introduce helper to generate mac address from 1-wire id

use the first 3 byte of the id of a 1-wire
or 6 if no OUI provided device to provide an Ethernet address

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2012-10-30 22:00:16 +01:00 committed by Sascha Hauer
parent e14a55a4c0
commit 520cd660cd
1 changed files with 65 additions and 0 deletions

65
include/w1_mac_address.h Normal file
View File

@ -0,0 +1,65 @@
/*
* Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnio@jcrosoft.com>
*
* Under GPLv2 only
*/
#ifndef __W1_MAC_ADDRESS_H__
#define __W1_MAC_ADDRESS_H__
/**
* w1_local_mac_address_register - use the first 3 byte of the id of a 1-wire
* or 6 if no OUI provided device to provide an Ethernet address
* @ethid: ethernet device id
* @oui: Ethernet OUI (3 bytes)
* @w1_dev: 1-wire device name
*
* Generate a local Ethernet address (MAC) that is not multicast using a 1-wire id.
*/
static inline int w1_local_mac_address_register(int ethid, char * oui, char *w1_dev)
{
char addr[6];
const char *val;
u64 id;
int nb_oui = 0;
int i, shift;
char *tmp = NULL;
int ret = 0;
if (oui) {
nb_oui = 3;
for (i = 0; i < nb_oui; i++)
addr[i] = oui[i];
}
tmp = asprintf("%s.id", w1_dev);
if (!tmp)
return -ENOMEM;
val = getenv(tmp);
if (!val) {
ret = -EINVAL;
goto err;
}
id = simple_strtoull(val, NULL, 16);
if (!id) {
ret = -EINVAL;
goto err;
}
for (i = nb_oui, shift = 40; i < 6; i++, shift -= 8)
addr[i] = (id >> shift) & 0xff;
addr[0] &= 0xfe; /* clear multicast bit */
addr[0] |= 0x02; /* set local assignment bit (IEEE802) */
eth_register_ethaddr(ethid, addr);
err:
free(tmp);
return ret;
}
#endif /* __W1_MAC_ADDRESS_H__ */