mac地址在一般情况下是从网卡的eeprom中读取的,一般厂商会在出厂的时候固化在eeprom中,在有些时候,厂商为了省钱不会去买一个固定的唯一的mac,而是始终用一个固定的mac地址,这样就会在后续用户使用的时候造成mac地址冲突。
本文以qf9700网卡驱动为例,讲解添加mac地址以随机数变化的驱动程序。
#define qf9700_AUTOMAC
#ifdef qf9700_AUTOMAC
/* Global variables for file-based MAC address Machenism */
int mac_used[129] = {0};
int dev_addr[129] = {0};
DEFINE_SPINLOCK(qf9700_lock);
#endif
定义一个内核自旋锁qf9700_lock。
mac地址的读写主要在驱动的bind函数中
static const struct driver_info qf9700_info = {
.description = "QF9700 USB Ethernet",
.flags = FLAG_ETHER,
.bind = qf9700_bind,
.unbind = qf9700_unbind,
.rx_fixup = qf9700_rx_fixup,
.tx_fixup = qf9700_tx_fixup,
.status = qf9700_status,
.link_reset = qf9700_link_reset,
.reset = qf9700_link_reset,
};