免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8440 | 回复: 22
打印 上一主题 下一主题

PCI网卡的MAC地址 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-02 15:42 |只看该作者 |倒序浏览
各位,请教一下,MAC的获取是怎样的?我的代码如下(但老是得不到MAC地址)

//遍历PCI配置空间
while(i<32)
    {
        out_word(0xCF8,j);
       
        pcidata = in_word(0xCFC);

        //找到网卡后
        if (pcidata == 0x831910EC )
        {
           out_word(0xCF8,j+0x10 );
          
           *iobase  =in_word(0xCFC );
           *iobase &= 0xFFFFFFF0;
          
           // for mac
            printf("mac addr is : " );

           mac_base         = *iobase + 0x50;
           for(k=0; k<6; k++)
           {
                   mac         = in_word(mac_base + k*0x8 );
                printf ("%x:",mac&0x000000FF );
           }
           printf("\n" );


           return 1;
        }

        i++;
        j += 0x800;
    }

[ 本帖最后由 sherf 于 2009-11-2 15:45 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-11-02 15:45 |只看该作者

回复 #1 sherf 的帖子

先顶一下

论坛徽章:
0
3 [报告]
发表于 2009-11-02 17:07 |只看该作者

回复 #2 sherf 的帖子

有人知道吗?

论坛徽章:
0
4 [报告]
发表于 2009-11-02 20:43 |只看该作者
为什么不用ioctl操作socket呢?

论坛徽章:
0
5 [报告]
发表于 2009-11-03 00:57 |只看该作者
LZ的代码是想读EEPROM里面的MAC么?如果是,你读EEPROM的方法不对。
下面这段是从LINUX, 8139TOO.C里面抄过来的:
另外,IO ADDR的前6个字节也含有MAC地址。可以直接读。具体方法可以参考8139TOO.C

static int __devinit read_eeprom (void __iomem *ioaddr, int location, int addr_len)
{
        int i;
        unsigned retval = 0;
        int read_cmd = location | (EE_READ_CMD << addr_len);

        RTL_W8 (Cfg9346, EE_ENB & ~EE_CS);
        RTL_W8 (Cfg9346, EE_ENB);
        eeprom_delay ();

        /* Shift the read command bits out. */
        for (i = 4 + addr_len; i >= 0; i--) {
                int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
                RTL_W8 (Cfg9346, EE_ENB | dataval);
                eeprom_delay ();
                RTL_W8 (Cfg9346, EE_ENB | dataval | EE_SHIFT_CLK);
                eeprom_delay ();
        }
        RTL_W8 (Cfg9346, EE_ENB);
        eeprom_delay ();

        for (i = 16; i > 0; i--) {
                RTL_W8 (Cfg9346, EE_ENB | EE_SHIFT_CLK);
                eeprom_delay ();
                retval =
                    (retval << 1) | ((RTL_R8 (Cfg9346) & EE_DATA_READ) ? 1 :
                                     0);
                RTL_W8 (Cfg9346, EE_ENB);
                eeprom_delay ();
        }

        /* Terminate the EEPROM access. */
        RTL_W8 (Cfg9346, ~EE_CS);
        eeprom_delay ();

        return retval;
}

论坛徽章:
0
6 [报告]
发表于 2009-11-03 09:24 |只看该作者

回复 #5 accessory 的帖子

accessory,

拿到的MAC地址仍为:FFFFFF.....

另外,你说的“IO ADDR的前6个字节也含有MAC地址”,IO ADDR是我上面的iobase吗?

论坛徽章:
0
7 [报告]
发表于 2009-11-03 09:40 |只看该作者
"另外,你说的“IO ADDR的前6个字节也含有MAC地址”,IO ADDR是我上面的iobase吗?"

Yes

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
8 [报告]
发表于 2009-11-03 10:08 |只看该作者
内核中有8139的网卡驱动代码啊

论坛徽章:
0
9 [报告]
发表于 2009-11-03 10:19 |只看该作者

回复 #7 accessory 的帖子

accessory,

拿到的仍然不对,不知道是不是我拿的有问题,具体代码如下:

//遍历PCI配置空间
while(i<32)
    {
        out_word(0xCF8,j);
      
        pcidata = in_word(0xCFC);

        //找到网卡后
        if (pcidata == 0x831910EC )
        {
           out_word(0xCF8,j+0x10 );
         
           *iobase  =in_word(0xCFC );
           *iobase &= 0xFFFFFFF0;
         
           // for mac
            printf("mac addr is : " );

          for(k=0;k<6;k++)
           {
                mac        = in_byte(*iobase + k );
                printl("%x:",mac&0x000000FF );
           }

           printf("\n" );

           return 1;
        }

        i++;
        j += 0x800;
    }

[ 本帖最后由 sherf 于 2009-11-3 10:20 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-11-03 12:55 |只看该作者

回复 #9 sherf 的帖子

改成以下方式,也是拿的不对。


//遍历PCI配置空间
while(i<32)
    {
        out_word(0xCF8,j);
      
        pcidata = in_word(0xCFC);

        //找到网卡后
        if (pcidata == 0x831910EC )
        {
           out_word(0xCF8,j+0x10 );
         
           *iobase  =in_word(0xCFC );
           *iobase &= 0xFFFFFFF0;
         
           // for mac
            printf("mac addr is : " );

              // u8** macaddr;
                 *macaddr = (u8*)(*iobase );

                   for(k=0;k<6;k++ )
                   {
                        printf("%x:",(*(*macaddr+k ) ) & 0x000000FF );
                   }

                   printf("\n");

           return 1;
        }

        i++;
        j += 0x800;
    }

[ 本帖最后由 sherf 于 2009-11-3 12:57 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP