3.6 参数设置和统计数据
当用户调用ioctl()函数,并制定SIOCSIFHWADDR命令时,意味着要设置这个设备的MAC地址。设置网络设备的MAC地址可以用如下模板。?
Static int set_mac_address (struct net_device *dev,void *addr)
{
If(netif_running(dev))
Return –Ebusy;
Xxx_set_mac(dev,addr);
Return 0;
}
上述程序首先用netif_running()宏判断设备是否正在运行,如果是,则意味着设备忙,此时不允许设置MAC地址;否则,条用xxx_set_mac()函数在网络适配器硬件内写入新的MAC地址。这个要求设备在硬件上支持MAC地址的修改,而实际上,许多设备并不提供修改MAC地址的接口。
驱动程序还应提供get_stats()函数用以向用户反馈设备状态和统计信息,该函数返回的是一个net_device_stats结构体(include/linux/netdevice.h)。
Struct net_device_stats
{
Unsigned long rx_packets;
Unsigned long tx_packets;
Unsigned long rx_bytes;
Unsigned long tx_bytes;
Unsigned long rx_errors;
Unsigned long tx_errors;
}
3.7 网络设备注册与注销
int register_netdev(struct net_device *dev);
void unregister_netdev(struct net_device *dev);
3.8 总结
Linux网络设备驱动体系结构的层次化设计实现了对上层协议接口的统一和硬件驱动的对下层多样化硬件设备的可适应。程序员需要完成的工作集中在设备驱动功能层,网络设备接口层net_device结构体的存在将千变万化的网络设备得以抽象,使得设备功能层中除数据包接收以外的主体都由填充net_device的属性和函数指针完成。
在linux网络子系统和设备驱动中,套接字缓冲区sk_buff发挥者巨大的作用,时所有数据流动的载体。网络设备驱动和上层协议之间也依赖此结构进行数据包交互,因此,我们要特别牢记它的操作方法。
用户370614 2012-9-4 09:16
用户1696769 2012-8-31 15:57