网卡驱动11-网卡中的广播地址 0x8000解释
来源:互联网 发布:修改电脑mac地址 编辑:程序博客网 时间:2024/05/16 18:39
经常在网卡里面看到广播地址,赋值为0x8000,网上几乎没人去解释这个东西。
例如dm9000.
/* broadcast address */
hash_table[3] = 0x8000;
u16 hash_table[4];这个是16位的表,我们知道mac广播地址是FF:FF:FF:FF:FF:FF
那么为什么在这是个0x8000。
这要结合一下硬件,dm9000有个叫Multicast Address Register的寄存器
那个hash_table[4]会写入这里,这是为了组播用的。为什么组播里面要搞一个广播。
首先,组播是第一个字节的最低位为1的所有地址,例如01-12-0f-00-00-02。广播地址是全1的48位地址,也属于组播地址。但是广播又是组播中的特例,就像是正方形属于长方形,但是正方形有长方形没有的特点
顺便说一下这里指的是mac组播和广播,不是ip地址。
其次,当网卡设为Pass ALL Multicast,这个在dm9000的Rx Control Register中,网卡会通过校验后得到的值与上面的MAR寄存器里的值比较,相同的才会接收数据(这些都是硬件做的)。所以要有广播来支持arp。
上面说了那个0x8000其实是crc后的值,那么它对应的肯定是FF:FF:FF:FF:FF:FF。下面简单模块可以运行看一下:
#include <linux/module.h>#include <linux/crc32.h>static char macaddr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};static __exit void crc_cleanup(void){}static __init int crc_init(void){ unsigned long val = crc32_le(~0, macaddr, 6); printk("%lx\n", (unsigned long)(1 << (val % 16))); return 1;}module_init(crc_init);module_exit(crc_cleanup);MODULE_LICENSE("GPL");结果就是:
对于crc32_le(),有兴趣自己看看吧!
1 0
- 网卡驱动11-网卡中的广播地址 0x8000解释
- 网卡驱动移植 网卡地址计算
- 网卡驱动中的疑惑
- 获得网卡的IP及广播地址
- 网卡驱动-设置组播mac地址
- 网卡驱动
- 网卡驱动
- 网卡驱动
- 网卡驱动
- 多网卡的广播
- 网卡驱动2----虚拟网卡
- Mini2440中的DM9000网卡驱动分析
- win7中的无线网卡驱动文件
- USB2.0 100M网卡 USB百兆网卡驱动下载
- VB6 IP地址+网卡地址+网卡类型
- 虚拟机网卡解释
- Linux网卡配置文件解释
- shell 获取网卡IP地址 子网掩码 默认网关 广播地址 MAC地址
- 基于线程安全的单例
- 回收应用程序池
- [LeetCode]Rotate Image
- onvif规范的实现:成功实现ONVIF协议RTSP-Video-Stream与OnvifDeviceManager的视频对接
- HBase 0.98.0安装
- 网卡驱动11-网卡中的广播地址 0x8000解释
- 理解WebKit和Chromium: Canvas2D及其实现
- IPv4地址(二)
- rhel6.4 简单创建自己的http web 界面服务遇到的问题和解决方法
- VS2010 更改MFC标题栏图标和生成的执行文件图标
- 简明python教程学习笔记(二)
- 2014-04-02第14周周三工作日志: error C2377: 'BOOL' : redefinition; typedef cannot be overloaded with any othe
- Letter combinations of a phone number
- 小菜准备约会—装饰模式