Android 9 固定以太网MAC地址(cmdline)
该功能是针对没有MAC地址的设备,通过cpu 序列号(设备唯一ID)转换为MAC地址.
该章节将要了解: MAC地址构造; cmdline; 以太网驱动相关知识.
系统默认情况下获取不到MAC地址,每次开机会随机生成一个MAC地址,导致网络管理员无法管理上网设备.
以太网驱动部分
设置以太网MAC地址部分源码如下:
主要文件:kernel-4.9/drivers/net/ethernet/cadence/macb.c
进入probe函数:macb_probe
static int macb_probe(struct platform_device *pdev)
{
int (*clk_init)(struct platform_device *, struct clk **,
struct clk **, struct clk **, struct clk **)
= macb_clk_init;
int (*init)(struct platform_device *) = macb_init;
struct device_node *np = pdev->dev.of_node;
struct device_node *phy_node;
const struct macb_config *macb_config = NULL;
struct clk *pclk = NULL, *hclk = NULL, *tx_clk = NULL, *rx_clk = NULL;
unsigned int queue_mask, num_queues;
struct macb_platform_data *pdata;
bool native_io;
struct net_device *dev;
struct resource *regs;
void __iomem *mem;
const char *mac;
struct macb *bp;
int err;
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
mem = devm_ioremap_resource(&pdev->dev, regs);
if (IS_ERR(mem))
return PTR_ERR(mem);
if (np) {
const struct of_device_id *match;
match = of_match_node(macb_dt_ids, np);
if (match && match->data) {
macb_config = match->data;
clk_init = macb_config->clk_init;
init = macb_config->init;
}
}
//err = clk_init(pdev, &pclk, &hclk, &tx_clk, &rx_clk);
//if (err)
// return err;
native_io = hw_is_native_io(mem);
macb_probe_queues(mem, native_io, &queue_mask, &num_queues);
dev = alloc_etherdev_mq(sizeof(*bp), num_queues);