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中实现以下函数:
- static unsigned char random(void)
- {
- unsigned long long rand = get_timer(0) * 100000;
- unsigned char a;
- // See "Numerical Recipes in C", second edition, p. 284
- rand = rand * 1664525L + 1013904223L;
- a = rand >> 24; //不是最低8位
- //为了得到 ‘0~9, a ~ f, A ~ F’ 的值
- if (a < 'A')
- a = a % 10 + 48;
- else if (a < 'F')
- a = a % 6 + 65;
- else if (a < 'a' || a > 'f')
- a = a % 6 + 97;
- return a;
- }
三、设置随机MAC地址:
在common/main.c中实现以下函数:
- void autoset_mac_addr(void)
- {
- #define XMK_STR(x) #x
- #define MK_STR(x) XMK_STR(x)
- char cmd_buf[128];
- int i = 0;
- char *p_val;
- p_val = getenv ("ethaddr");
- //如果mac地址为缺省值,则随机生成mac地址(后两位)
- if(strcmp(p_val, MK_STR(CONFIG_ETHADDR)) == 0 )
- {
- char new_ethaddr[20], new_ip[20];
- int rand_val = 0;
- memset(new_ethaddr, 0, sizeof(new_ethaddr));
- memset(new_ip, 0, sizeof(new_ip));
- strcpy(new_ethaddr, MK_STR(CONFIG_ETHADDR));
- new_ethaddr[12] = 0;
- //随机生成mac地址后两位
- sprintf(new_ethaddr, "%s%02x:%02x", new_ethaddr, random(), random());
- printf("new_ethaddr = %s\n", new_ethaddr);
- setenv("ethaddr", new_ethaddr);
- setenv("fec_addr", new_ethaddr);
- while(1)
- {
- //随机生成IP地址(根据server地址生成,只更改最后一位)
- strcpy(new_ip, MK_STR(CONFIG_SERVERIP));
- p_val = strrchr(new_ip, '.');
- *(p_val + 1) = 0;
- rand_val = random();
- //最后位不能为0和255
- if( (rand_val != 0) && (rand_val != 0xFF) )
- {
- sprintf(new_ip, "%s%d", new_ip, rand_val);
- }
- //不能和SERVERIP冲突
- if(strcmp(p_val, MK_STR(CONFIG_SERVERIP)) != 0)
- {
- break;
- }
- }
- printf("new_ip = %s\n", new_ip);
- setenv("ipaddr", new_ip); } //saveenv();保存环境变量到非失设备中,如:SD,Nnad中
- }
四、应用
上面的函数实现以后, 在系统第一次加载的时候,会重新生成一个随机的MAC地址,根据serverip地址设置ipaddr.我们使用的
lan8710,要设置ethaddr,fec_addr。如果要想将随机生成的MAC地址,IP地址存储到nand或MMC中,则在
setenv("ipaddr", new_ip) 下一行,添加 saveenv()函数调用。
uboot生成随机的MAC地址的更多相关文章
- 隐私:随机选择 MAC 地址
隐私:随机选择 MAC 地址 从 Android 8.0 开始,Android 设备在未连接到网络的情况下探测新网络时会使用随机 MAC 地址. 在 Android 9 中,您可以启用开发者选项(默认 ...
- 分享一个随机更改 MAC地址 软件
有些软件 是根据 MAC地址 来判断 是不是 已经 安装过 这个 软件 (针对 有些软件是 可以 免费 使用的 ) 要想 一直 使用 的话 只需要 修改一下 mac地址 就可以 继续 使用! 在百度中 ...
- 运营商挂时长神器,批量导入账号,导出账号状态,随机修改MAC地址
话不多说,直接上图 可批量导入账号,同时修改广域网口MAC地址 导出账号状态,包括在线时长,MAC,IP地址等等
- imx6 mac地址设置
imx6的mac地址总是固定的值,所以需要更改,采用的方法是在uboot中设置环境变量,之后在kernel中使用uboot中设置的mac地址的值.本文记录更改的过程. 参考链接: http://www ...
- RK3288以太网的mac地址调试笔记【学习笔记】【原创】
平台信息:内核:linux3.1.0系统:android/android6.0平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 说明:提供以太网mac ...
- MAC地址欺骗(原理及实验)
MAC地址欺骗 MAC地址欺骗(或MAC地址盗用)通常用于突破基于MAC地址的局域网访问控制,例如在交换机上限定只转发源MAC地址修改为某个存在于访问列表中的MAC地址即可突破该访问限制,而且这种修改 ...
- 静态MAC地址配置案例
目录导航: 1.静态MAC地址简介 2.组网需求 3.配置思路 4.配置步骤 5.配置文件 1.静态MAC地址简介 返回目录导航 >MAC地址表项是交换机通过报文的源MAC地址学习过程而自动生成 ...
- 虚拟机克隆后修改mac地址和ip地址
(1)虚拟机克隆在新的虚拟机下会有文件产生变化. /etc/udev/rules.d/70-persistent-net.rules 文件中会多一个eth1 网卡的文件 ,eth0 的那行文件是原虚 ...
- Linux 生成随机mac地址,并固化到本地
前言: 将Mac地址随机化并固化到本地可以有效避免同一个网络内,mac地址冲突导致的网络阻塞问题. 以下是有关的方法: 1.使用$RANDOM和md5sum(嵌入式无需移植其他软件的优秀可选方案) M ...
随机推荐
- 自动合并多个文件如js css等 可以增加效率
原文发布时间为:2011-01-13 -- 来源于本人的百度文章 [由搬家工具导入] 原文地址:http://www.codeproject.com/KB/aspnet/HttpCombine.asp ...
- one pragmatical sqlhelper
namespace ConsoleApplication2 { using System; using System.Collections.Generic; using System.Linq; u ...
- Windows消息钩取
@author: dlive @date: 2016/12/19 0x01 SetWindowsHookEx() HHOOK SetWindowsHookEx( int idHook, //hook ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---24
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- 案子前申請 EVB board (Evaluation Board)
在跑案子前, 需向各 component vendor 申請 EVB board, 其中也包含 mosfet , 以利做實驗, spec 有可能會寫錯 或不清楚, 所以需要使用 EVB board 檢 ...
- C#图解教程学习笔记——事件
一.事件的定义事件:当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知,同时运行相应处理程序.事件的很多部分都与委托类似.实际上,事件就像专门用于特殊用途的简单委托.事件包含了一个 ...
- PHP安装oracle的php_oci和oci8扩展
环境:centos6.9 php5.3.3 oracle客户端:下载链接:http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277 ...
- 网络请求失败记录(安卓4g网络下第一次请求特别慢或者失败)
最近app的一次版本上线以后出现4g网络下请求接口特别慢,第一次调用接口非常非常慢或者直接访问失败,后面就正常了,但是WiFi情况下并不会出现这个问题.最主要的是IOS的线上app并没有问题. 开始怀 ...
- NOI模拟题5 Problem A: 开场题
Solution 注意到\(\gcd\)具有结合律: \[ \gcd(a, b, c) = \gcd(a, \gcd(b, c)) \] 因此我们从后往前, 对于每个位置\(L\), 找到每一段不同的 ...
- 2016集训测试赛(二十)Problem A: Y队列
Solution 考虑给定一个\(n\), 如何求\(1\)到\(n\)的正整数中有多少在队列中. 不难注意到我们只需要处理质数次方的情况即可, 因为合数次方会被其因数处理到. 同时我们考虑到可能存在 ...