STM32MP157 | 虚拟网卡设备驱动( 二 )


(2) 的注册和注销
int register_netdev(struct net_device *dev);//注册2void unregister _netdev(struct net_device *dev);//注销
(3)网络设备打开和关闭需要进行的操作

STM32MP157 | 虚拟网卡设备驱动

文章插图
int xxx_open( struct net_device *dev){//申请设备资源 ----- IO内存中断DMA.. .//激活设备发送队列void netif_start_queue( struct net_device *dev ) ;}int xxx_release( struct net_device *dev){//释放设备资源 ----- Io内存中断 DMA. . .//停止设备传输数据包void netif_stop_queue( struct net_device *dev ) ;}
(4)网络设备发送和超时处理进行的操作
int xxx_tx ( struct sk_buff *skb,struct det_device *dev){//从sk_buff中获取有效数据// ...//记录发送时间dev->trans_siart = jiffies;//通过设置网卡硬件的寄存器发送数据包//xxx_hw_tx( data,len, dev);}void xxx_tx_timeout( struct det_device *dev){// ...//重新发送void netif_wake_queue( struct net_device *dev) ;}
(5)网络设备数据接收进行的操作
//网卡接收中断函数void xxx_interrupt(int irq,void *dev_id , struct pt_regs *regs ){//接收中断//分配sk_buf结构//...//从网卡硬件结束数据// ...//获取上层协议类型skb- >protocol = eth_type_trans(skb, dev);//将数据包交给上层协议层netif_rx( skb);//记录时间戳dev- >last_rx =jiffies;}
二、编写虚拟网卡驱动 1.先写个模块
#include #include static int __init virnet_init(void){return 0;}static void __exit virnet_exit(void){}module_init(virnet_init);module_exit(virnet_exit);MODULE_LICENSE("GPL");
2.写个编译一下
ifeq ($(arch),arm)KERNELDIR :=/home/linux/linux-5.10.61CROSS_COMPILE ?=arm-linux-gnueabihf-else KERNELDIR :=/lib/modules/$(shell uname -r)/buildCROSS_COMPILE ?=endif modname ?=PWD :=$(shell pwd)CC :=$(CROSS_COMPILE)gccall:make -C $(KERNELDIR) M=$(PWD) modules# $(CC) test.c -o testclean:make -C $(KERNELDIR) M=$(PWD) clean# rm testinstall:cp *.ko ~/nfs/rootfs/# cp test ~/nfs/rootfs/help:echo "make arch = arm or x86 modname= dirvers file name"obj-m:=$(modname).o
3.再搭个网卡设备驱动框架
#include #include #include #include //网络设备结构体指针struct net_device *virnet_card = NULL;int virnet_card_init(struct net_device *dev){//以太网卡的初始化ether_setup(dev);//设置网卡名strcpy(dev->name,"virnetdevice");printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);return 0;}int virnet_card_open(struct net_device *dev){printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);return 0;}netdev_tx_t virnet_card_xmit(struct sk_buff *skb,struct net_device *dev){printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);return 0;}//操作函数集合struct net_device_ops vir_netdev_ops = {.ndo_init = virnet_card_init,.ndo_open = virnet_card_open,.ndo_start_xmit = virnet_card_xmit,};//加载函数static int __init virnet_init(void){//申请net_device空间virnet_card = alloc_etherdev(0);//设置net_devicede 操作函数集合virnet_card->netdev_ops = &vir_netdev_ops;//注册net_deviceregister_netdev(virnet_card);return 0;}//卸载函数static void __exit virnet_exit(void){//注销 net_deviecunregister_netdev(virnet_card);//释放net_device空间free_netdev(virnet_card);}module_init(virnet_init);module_exit(virnet_exit);MODULE_LICENSE("GPL");
3. 编译一下
下载到开发板上
【STM32MP157 | 虚拟网卡设备驱动】可以看到有新的网卡设备产生