编写伪网络设备驱动程序
伪网络驱动程序和字符设备驱动程序一样,也必须初始化和注册。网络驱动需记录其发送和接收数据量的统计信息,所以我们定义一个记录这些信息的数据结构。
struct ednet_priv {
#ifdef LINUX_24
struct net_device_stats stats;
#else
struct enet_statistics stats;
#endif
struct sk_buff *skb;
spinlock_t lock;
}; |
struct ednet_priv只有3个数据成员。Linux2.4.x 使用的网络数据状态统计结构是struct net_device_stats,而Linux 2.2.x则使用的是struct enet_statistics。同样,对控制网络接口设备的设备结构也有不同的定义:Linux2.4.x使用的是struct net_device,而Linux2.2.x却是struct device。
#ifdef LINUX_24
struct net_device ednet_dev;
#else
struct device ednet_dev;
#endif |
伪网络驱动程序的也需要初始化和注册。和字符设备的注册不同之处是,它使用的是register_netdev(net_device *) kernel API。
int ednet_module_init(void)
{
int err;
strcpy(ednet_dev.name, "ed0");
ednet_dev.init = ednet_init;
if ( (err = register_netdev(&ednet_dev)) )
printk("ednet: error %i registering pseudo network device \"%s\"\n",
err, ednet_dev.name);
return err;
} |
ednet_dev的name域是接口名,ednet_module_init()中赋予网络接口的名字为ed0,如果本网络设备被加载,使用ifconfig命令可以看到ed0。
[root@localhost pku]# /sbin/ifconfig
ed0 Link encap:Ethernet HWaddr 00:45:44:30:30:30
inet addr:192.168.3.9 Bcast:192.168.3.255 Mask:255.255.255.0
UP BROADCAST RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) |