STM32MP157 | 虚拟网卡设备驱动

一、网络设备驱动 1. 概念
网络设备是Linux的第三类标准设备,没有对应的设备文件,使用内部设备名访问 。网络设备及其驱动属于整个TCP/IP协议层的一部分,实现遵循TCP/IP协议栈的要求 。
网络设备异步接收外部的数据包,主动请求将硬件收到的数据包交给内核 。
2. 网络设备驱动框架
3.套接字缓冲区
中重要的字段:
1.各层协议头传输层,网络层,链路层各个协议头2.数据缓冲区指针head,end,data,tail指向缓冲区的不同位置3.长度信息有效数据长度
使用处理数据包在协议层之间的传递,只需要移动其中的指针,效率比内存拷贝高 。
4. 的操作接口
(1)分配struct sk_buff*dev_alloc_skb(unsigned int len);//分配成功之后,因为还没有存放具体的网络数据包,所以sk_buff的data、tail指针都指向存储空间的起始地址head,而len的大小则为0 。(2)释放void dev_kfree_skb(struct sk_buff *skb);//用于释放被alloc_skb()函数分配的套接字缓冲区和数据缓冲区(3)指针移动//Linux套接字缓冲区中的数据缓冲区指针移动操作包括put(放置)、push(推)、pull(拉)、reserve(保留)等 。//put操作//将tail指针下移,增加sk_buff的len值,并返回skb->tail原先的值 。unsigned char/skb_put(struct sk_buff *skb, unsigned int len);//push操作//将data指针上移,因此也要增加sk_buff的len值 。unsigned char*skb_push(struct sk_buff *skb, unsigned int len);//pull操作//将data指针下移,并减小skb的len值 。unsigned char* skb _pull(struct sk_buff *skb, unsigned int len);//reserve操作//同时将skb-二data与skb->tail增加len字节数void skb_reserve(struct sk_buff *skb, unsigned int len);//获取skb->data与skb->head之间空闲空间的大小 static inline unsigned int skb_headroom(const struct sk_buff*skb)//获取skb->tail与skb->end之间空闲空间的大小⑥static inline int skb_tailroom(const struct sk_buff *skb)
结构
在内核中代表一个网络设备,网络设备驱动的实现实际上就是分配填充net 结构并注册到内核的过程,实现上层协议和网络硬件设备之间的数据传递 。

STM32MP157 | 虚拟网卡设备驱动

文章插图
是一个巨大的结构体,主要包含网络设备的属性描述和操作接口 。实现网络设备驱动只需要了解其中相关的部分即可 。
(1)成员组成
1.全局成员2.硬件相关成员3.接口相关成员4.设备方法成员5.公用成员
1)全局成员
1 char name[ IFNAMSIZ]; //网络设备名2 int (*init)(struct net_device *dev) ;//net_device初始化函数
2)硬件成员
1 unsigned long mem_end;/*设备使用共享内存结束地址*/2 unsigned long mem_start;/*设备使用共享内存起始地址*/3 unsigned long base_addr;/*设备Io基地址*/4 unsigned int irq;/*设备使用的中断号*/5 unsigned char if_port;/*多端口设备的端口号*/6 unsigned char dma;/*DMA通道*/
3)接口相关成员
1 unsigned int mtu;/*MTU值*/2 unsigned short type;/*网络硬件接口类型*/3 unsigned short hard_header_len; /*网络硬件设备头长度*/4 unsigned char *dev_addr ;/*MAc地址*/5 unsigned int flags;/*网络接口标志*/
4)设备方法成员
const struct net_device_ops *netdev_ops;//操作函数集合int (*ndo_open)(struct net_device *dev);//打开接口int (*ndo_stop) ( struct net_device *dev);//停止接口//初始化数据包的传输,将完整的数据包放入sk_buff中netdev_tx_t (*ndo_start_xmit) (struct sk_buff *skb, struct net_device *dev)//数据包发送超时调用的函数,通常是重新发送void (*ndo_tx_timeout) ( struct net_device *dev);