一、网络设备驱动 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 结构并注册到内核的过程,实现上层协议和网络硬件设备之间的数据传递 。
文章插图
是一个巨大的结构体,主要包含网络设备的属性描述和操作接口 。实现网络设备驱动只需要了解其中相关的部分即可 。
(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);
- 虚拟养老院打造智慧养老新模式,虚拟养老院助力智慧养老发展-新导智能
- 网上投钱疯狂“抢狗”400人玩虚拟游戏被骗300多万 狗的世界之最完整版下载
- 山海经中记载的神秘生物,到底是虚拟的,还是真实存在
- 神医华佗竟是一个虚拟人?历史上有没有这个人
- 1.在虚拟机与主机连接之后,用远程连接用软件可以查看时间等等
- 详解:Host模式就是去除net设备的net模式,虚拟交换机
- Istio 对虚拟机支持史话
- Virtual Power Plant, VPP 什么是虚拟电厂
- 在虚拟机中对阿克曼转向车进行导航及避障的仿真测试
- 【深入理解JVM 六】虚拟机字节码执行系统