zoukankan      html  css  js  c++  java
  • 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 ", 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 ", 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()函数调用。

     

  • 相关阅读:
    CSS权重
    object.create(null) 和 {}创建对象的区别
    CSS边框作图
    细说HTML头部标签
    利用a标签导出csv文件
    细说CSS伪类和伪元素
    HTML标签的权重
    《SPA设计与架构》之客户端路由
    《SPA设计与架构》之JavaScript模块化
    《SPA设计与架构》之MV*框架
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3732747.html
Copyright © 2011-2022 走看看