uboot生成随机的MAC地址

转载:http://blog.chinaunix.net/uid-25885064-id-3303132.html

在使用U-boot时,有个问题就是MAC地址的设置,如果MAC地址相同的两块开发板在同一局域网中,会互相影响。由
于设备量产需要每台机器的MAC地址都不一样,所以我们给u-boot使用随即生成MAC地址,我们这里的随机生成的变量只保存到RAM空间中,其实也可
以保存到flash或MMC中,但是如果存储设备为nand的话,每次启动都会擦写一些nand
,众所周知,nand的擦写次数是有限的,写到nand中,每次还得读出到RAM,SDRAM或DDRII中,我们用的就是DDRII,还不如,一次直接
写到RAM中,供系统使用呢。我使用的是CPU 为 IMX515,CotexA8核,内存DDRII
2Gb,使用U-boot,支持,SD,Nand启动。

一、 在Imx515中找一个随机源也不容易,它不像x86一样有个硬件计数器可以作为随机源。这里我们使用了imx515的timer,经过测试也可以得到很好的随机数。

Timer部分的代码在ccpu/arm_cortexa8/mx51/timer.c中, ret
= get_timer(0).

二、得到随机数

上面得到的随机数值差别非常小,但是经过下面的计算,就可以得到看起来很随机的数。在common/main.c中实现以下函数:

  1. static
    unsigned char random(void)

  2. {

  3. unsigned
    long long rand =
    get_timer(0) *
    100000;

  4. unsigned
    char a;
  5. //
    See "Numerical Recipes in
    C", second edition,
    p. 284
  6. rand
    = rand *
    1664525L +
    1013904223L;

  7. a
    = rand >> 24;
    //不是最低8位
  8. //为了得到
    ‘0~9,
    a ~ f,
    A ~ F’ 的值
  9. if (a
    < ‘A‘)

  10. a
    = a %
    10 + 48;

  11. else if
    (a <
    ‘F‘)

  12. a
    = a %
    6 + 65;

  13. else if
    (a <
    ‘a‘
    ||
    a > ‘f‘)

  14. a
    = a %
    6 + 97;
  15. return
    a;

  16. }

三、设置随机MAC地址:

在common/main.c中实现以下函数:

  1. void
    autoset_mac_addr(void)

  2. {

  3. #define
    XMK_STR(x)
    #x

  4. #define
    MK_STR(x)
    XMK_STR(x)
  5. char
    cmd_buf[128];

  6. int i =
    0;

  7. char
    *p_val;
  8. p_val
    = getenv ("ethaddr");
  9. //如果mac地址为缺省值,则随机生成mac地址(后两位)

  10. if(strcmp(p_val,
    MK_STR(CONFIG_ETHADDR)) == 0 )

  11. {

  12. char
    new_ethaddr[20],
    new_ip[20];

  13. int rand_val =
    0;
  14. memset(new_ethaddr,
    0, sizeof(new_ethaddr));

  15. memset(new_ip,
    0, sizeof(new_ip));

  16. strcpy(new_ethaddr,
    MK_STR(CONFIG_ETHADDR));

  17. new_ethaddr[12]
    = 0;
  18. //随机生成mac地址后两位

  19. sprintf(new_ethaddr,
    "%s%02x:%02x", new_ethaddr,
    random(), random());

  20. printf("new_ethaddr
    = %s\n",
    new_ethaddr);

  21. setenv("ethaddr", new_ethaddr);

  22. setenv("fec_addr", new_ethaddr);
  23. while(1)

  24. {

  25. //随机生成IP地址(根据server地址生成,只更改最后一位)

  26. strcpy(new_ip,
    MK_STR(CONFIG_SERVERIP));

  27. p_val
    = strrchr(new_ip, ‘.‘);

  28. *(p_val
    + 1)
    = 0;
  29. rand_val
    = random();
  30. //最后位不能为0和255

  31. if(
    (rand_val != 0)
    &&
    (rand_val != 0xFF)
    )

  32. {

  33. sprintf(new_ip,
    "%s%d",
    new_ip, rand_val);

  34. }
  35. //不能和SERVERIP冲突

  36. if(strcmp(p_val,
    MK_STR(CONFIG_SERVERIP)) != 0)

  37. {

  38. break;

  39. }

  40. }
  41. printf("new_ip = %s\n", new_ip);

  42. setenv("ipaddr", new_ip);}//saveenv();保存环境变量到非失设备中,如:SD,Nnad中

  43. }

四、应用

上面的函数实现以后, 在系统第一次加载的时候,会重新生成一个随机的MAC地址,根据serverip地址设置ipaddr.我们使用的
lan8710,要设置ethaddr,fec_addr。如果要想将随机生成的MAC地址,IP地址存储到nand或MMC中,则在
setenv("ipaddr", new_ip) 下一行,添加 saveenv()函数调用。

时间: 2024-12-18 06:14:05

uboot生成随机的MAC地址的相关文章

随机修改MAC地址批处理

@echo off mode con cols=70 lines=20 title MAC随机修改工具 color 3F setlocal enabledelayedexpansion :start cls echo                           MAC随机修改工具 echo         ---------------------------------------------------- echo         本地网卡: ipconfig /all|find "

Linux随机设置Mac地址

出于隐私需求,不想暴露真实mac地址,把下面这个脚本的内容加入/etc/init.d,就可以在每次开机的时候为网卡随机设置一个mac地址. #!/bin/bash #Chorder #2016/12/08 mhash=`date +%s|md5sum` ifconfig eth0 down ifconfig eth0 hw ether `echo ${mhash:$((RANDOM % 13)):2}:${mhash:$((RANDOM % 13)):2}:${mhash:$((RANDOM %

苹果iOS8使用随机MAC地址发送probe request的真正目的

现在众所周知,苹果在新的iPhone6中,会使用随机的MAC地址发送probe request 根据苹果自己的宣传,及目前大家的理解 苹果充分考虑了大家的隐私问题,避免了手机MAC地址的泄露 根据目前的测试情况,iPhone6只是在黑屏休眠的时候才会发送随机MAC 那么从另一方面来看 在手机休眠的时候完全可以不发送任何无线报文 这样才更合理,并保护手机MAC地址不泄露 但是苹果却保留发送probe request,只是使用了随机MAC地址而已 其实苹果的真正目的是收集周围的AP热点信息 而所谓的

RK3288以太网的mac地址调试笔记【学习笔记】【原创】

平台信息:内核:linux3.1.0系统:android/android6.0平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:[email protected] 说明:提供以太网mac地址烧录以及读写的方式 一.功能演示以及说明: 1.1在安卓的文件系统生成如下的设备节点:/sys/kernel/pax_ethernet/mac用于烧录以及读取以太网的mac地址.使用adb命令进行以太网mac地址的烧写以及读写.本质上在使用echo "aa:aa:aa:aa:aa:aa"

KVM虚拟机MAC地址冲突,引发服务器对xshell说:Go away!

开场白 最近在机房的服务器上装kvm虚拟主机.不经意间,上演了一场由MAC地址异常而引发的服务器与xshell之间的血案! 问题描述 在一台服务器上装了两个虚拟机,其中一台是从另一台上克隆的.克隆的虚拟机开机之后,发现ssh不能远程连接: 然后在虚拟机管理界面本地去连接上服务器排查: 查看IP地址,想确认xshell是不是连错了IP,找错了对象,却发现ifconfig居然查看不到IP??图: 查看network的启动状态,看到的是绿油油的active状态.然后又查看配置文件/etc/syscon

绕过MAC地址认证接入目标网络

仅供学习,禁止非法用途. 在本教程中,我将介绍如何绕过无线网络上的MAC地址过滤. MAC地址代表媒体访问控制地址,是分配给你的网络接口的唯一标识符,这有两个重要的含义:它可以用来识别试图访问网络的黑客或合法网络测试人员,并且可以用作验证个人身份并授予他们访问网络的手段.MAC过滤对于保护公司网络和数据或防止网络被WiFi入侵是完全没用的,因为它很容易绕过. 在本教程中,我们将通过欺骗已连接客户端的MAC地址绕过路由器上的MAC过滤.已连接客户端的MAC地址已列入白名单,否则将无法连接到无线网络

delphi 生成网卡MAC地址

生成MAC地址的小工具: {*------------------------------------------------ 生成mac地址 @author @version 2015.7.2 2015.10.22修改 步长最大长度为256,必须为2的n次方 长度不超过5位数 -------------------------------------------------} unit frmSaveMac; interface uses Windows, Messages, SysUtils

[转]一个简单的生成随机手机/电话号码/身份证号/银行卡号/地址/电子邮件等的Oracle小程序

在某些场景下我们可能需要生成一些随机数据,比如在测试环境中生成手机号.电子邮件地址等数据用来进行功能测试.或者将生产的数据导入到测试环境中,进行简单的脱敏处理.这是我在DBMS_RANDOM的基础上进行扩展开发的能够生成: 手机号码 电话号码 电子邮件 身份证号 银行卡号 住址 的一个Oracle Package,有兴趣的朋友可以从这里下载:http://pan.baidu.com/s/1pJBkVyF当然限于个人能力等原因,还有许多不足,恳请指正. 生成随机手机号码: 点击(此处)折叠或打开

MAC地址生成回环IPv6地址

设备48位MAC地址为00-60-80-52-f9-d8 在第三字节和第四字节之间插入FF-FE,形成64位地址地址00-60-08-FF-FE-52-F9-D8 对首字节0X00的第二个最低位求反,则变成0X02. 在前面补充FE80::,填满16字节(128位),最后为FE80::0260:08FF:FE52:F9D8.