转载: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()函数调用。

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

  1. 隐私:随机选择 MAC 地址

    隐私:随机选择 MAC 地址 从 Android 8.0 开始,Android 设备在未连接到网络的情况下探测新网络时会使用随机 MAC 地址. 在 Android 9 中,您可以启用开发者选项(默认 ...

  2. 分享一个随机更改 MAC地址 软件

    有些软件 是根据 MAC地址 来判断 是不是 已经 安装过 这个 软件 (针对 有些软件是 可以 免费 使用的 ) 要想 一直 使用 的话 只需要 修改一下 mac地址 就可以 继续 使用! 在百度中 ...

  3. 运营商挂时长神器,批量导入账号,导出账号状态,随机修改MAC地址

    话不多说,直接上图 可批量导入账号,同时修改广域网口MAC地址 导出账号状态,包括在线时长,MAC,IP地址等等

  4. imx6 mac地址设置

    imx6的mac地址总是固定的值,所以需要更改,采用的方法是在uboot中设置环境变量,之后在kernel中使用uboot中设置的mac地址的值.本文记录更改的过程. 参考链接: http://www ...

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

    平台信息:内核:linux3.1.0系统:android/android6.0平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 说明:提供以太网mac ...

  6. MAC地址欺骗(原理及实验)

    MAC地址欺骗 MAC地址欺骗(或MAC地址盗用)通常用于突破基于MAC地址的局域网访问控制,例如在交换机上限定只转发源MAC地址修改为某个存在于访问列表中的MAC地址即可突破该访问限制,而且这种修改 ...

  7. 静态MAC地址配置案例

    目录导航: 1.静态MAC地址简介 2.组网需求 3.配置思路 4.配置步骤 5.配置文件 1.静态MAC地址简介 返回目录导航 >MAC地址表项是交换机通过报文的源MAC地址学习过程而自动生成 ...

  8. 虚拟机克隆后修改mac地址和ip地址

    (1)虚拟机克隆在新的虚拟机下会有文件产生变化. /etc/udev/rules.d/70-persistent-net.rules  文件中会多一个eth1 网卡的文件 ,eth0 的那行文件是原虚 ...

  9. Linux 生成随机mac地址,并固化到本地

    前言: 将Mac地址随机化并固化到本地可以有效避免同一个网络内,mac地址冲突导致的网络阻塞问题. 以下是有关的方法: 1.使用$RANDOM和md5sum(嵌入式无需移植其他软件的优秀可选方案) M ...

随机推荐

  1. 【CF1068D】Array Without Local Maximums(计数DP)

    题意: n<=1e5 思路:卡内存 dp[i][j][k]表示当前第i个数字为j,第i-1个数字与第i个之间大小关系为k的方案数(a[i-1]<a[i],=,>) 转移时使用前缀和和 ...

  2. About chrysanthemum and matrimony vine

    红枣.枸杞茶:可经常喝. 菊花茶.枸杞茶:适当,一般建议喝3天停3天会比较妥当. 湿热重的人不宜食红枣,可只泡枸杞.菊花或将红枣改为红茶,也能起到明目.养肝.益血.抗疲劳的功效.红枣要去核,才不会太燥 ...

  3. sgu 275 To xor or not to xor 线性基 最大异或和

    题目链接 题意 给定\(n\)个数,取其中的一个子集,使得异或和最大,求该最大的异或和. 思路 先求得线性基. 则求原\(n\)个数的所有子集的最大异或和便可转化成求其线性基的子集的最大异或和. 因为 ...

  4. PHPCMS V9 采集实例

    采集目标: 列表: http://www.cnys.com/zixun/list_2_2.html

  5. springBoot AOP切面编程

    AOP 为 Aspect Oriented Programming 的缩写,意为 面向切面编程.AOP 为spring 中的一个重要内容,它是通过对既有程序定义一个切入点,然后在其前后切入不同的执行内 ...

  6. AC日记——灾后重建 洛谷 P1119

    灾后重建 思路: 看到n<=200,思考弗洛伊德算法: 如何floyed呢? floyed是一种动态规划求最短路的算法: 它通过枚举中间点来更新两点之间最短路: 回到这个题本身: 所有点的重建完 ...

  7. AC日记——[国家集训队2010]小Z的袜子 cogs 1775

    [国家集训队2010]小Z的袜子 思路: 传说中的莫队算法(优雅的暴力): 莫队算法是一个离线的区间询问算法: 如果我们知道[l,r], 那么,我们就能O(1)的时间求出(l-1,r),(l+1,r) ...

  8. 洛谷 P2089 烤鸡【DFS递归/10重枚举】

    [链接]:https://www.luogu.org/problemnew/show/P2089 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢? ...

  9. MySQL复制表结构和内容到另一张表(转)

    MySQL不要看它小,一个开源的产物,要学习它的东西真的很多.而它的一切是SQL Server无法比拟的. 复制表结构及数据到新表 create table 新表 select * from 旧表 只 ...

  10. smartsvn学习(三) Error validating server certificate for

    Error validating server certificate for 'xxxxxxxxxxxx:443':  - The certificate is not issued by a tr ...