LDD3学习笔记(20):网络驱动

 

#include <linux/netdevice.h>

定义 struct net_device 和 struct net_device_stats 的头文件, 包含了几个其他网络驱动需要的头

文件.

struct net_device *alloc_netdev(int sizeof_priv, char *name, void (*setup)(struct net_device *);

struct net_device *alloc_etherdev(int sizeof_priv);

void free_netdev(struct net_device *dev);

分配和释放 net_device 结构的函数

int register_netdev(struct net_device *dev);

void unregister_netdev(struct net_device *dev);

注册和注销一个网络设备.

void *netdev_priv(struct net_device *dev);

获取网络设备结构的驱动私有区域的指针的函数.

struct net_device_stats;

持有设备统计的结构.

netif_start_queue(struct net_device *dev);

netif_stop_queue(struct net_device *dev);

netif_wake_queue(struct net_device *dev);

控制传送给驱动来发送的报文的函数. 没有报文被传送, 直到 netif_start_queue 被调用. 

netif_stop_queue 挂起发送, netif_wake_queue 重启队列并刺探网络层重启发送报文.

skb_shinfo(struct sk_buff *skb);

宏定义, 提供对报文缓存的"shared info"部分的存取.

void netif_rx(struct sk_buff *skb);

调用来通知内核一个报文已经收到并且封装到一个 socket 缓存中的函数.

void netif_rx_schedule(dev);

来告诉内核报文可用并且应当启动查询接口; 它只是被 NAPI 兼容的驱动使用.

int netif_receive_skb(struct sk_buff *skb);

void netif_rx_complete(struct net_device *dev);

应当只被 NAPI 兼容的驱动使用. netif_receive_skb 是对于 netif_rx 的 NAPI 对等函数; 它递交一个报文给内核. 当一个 NAPI 兼容的驱动已耗尽接收报文的供应, 它应当重开中断, 并且调用 netif_rx_complete 来停止查询.

#include <linux/if.h>

由 netdevice.h 包含, 这个文件声明接口标志( IFF_ 宏定义 )和 struct ifmap, 它在网络驱动的 ioctl 实现中有重要地位.

void netif_carrier_off(struct net_device *dev);

void netif_carrier_on(struct net_device *dev);

int netif_carrier_ok(struct net_device *dev);

前 2 个函数可用来告知内核是否接口上有载波信号. netif_carrier_ok 测试载波状态, 如同在设备结构中反映的.

#include <linux/if_ether.h>

ETH_ALEN

ETH_P_IP

struct ethhdr;

由 netdevice.h 包含, if_ether.h 定义所有的 ETH_ 宏定义, 用来代表字节长度( 例如地址长度 )以及网络协议(例如 IP). 它也定义 ethhdr 结构.

#include <linux/skbuff.h>

struct sk_buff 和相关结构的定义, 以及几个操作缓存的内联函数. 这个头文件由 netdevice.h 包含.

struct sk_buff *alloc_skb(unsigned int len, int priority);

struct sk_buff *dev_alloc_skb(unsigned int len);

void kfree_skb(struct sk_buff *skb);

void dev_kfree_skb(struct sk_buff *skb);

void dev_kfree_skb_irq(struct sk_buff *skb);

void dev_kfree_skb_any(struct sk_buff *skb);

处理 socket 缓存的分配和释放的函数. 通常驱动应当使用 dev_ 变体, 其意图就是此目的.

unsigned char *skb_put(struct sk_buff *skb, int len);

unsigned char *__skb_put(struct sk_buff *skb, int len);

unsigned char *skb_push(struct sk_buff *skb, int len);

unsigned char *__skb_push(struct sk_buff *skb, int len);

添加数据到一个 skb 的函数; skb_put 在 skb 的尾部放置数据, 而 skb_push 放在开始. 正常版本进行检查以确保有足够的空间; 双下划线版本不进行检查.

int skb_headroom(struct sk_buff *skb);

int skb_tailroom(struct sk_buff *skb);

void skb_reserve(struct sk_buff *skb, int len);

进行 skb 中的空间管理的函数. skb_headroom 和 skb_tailroom 说明在开始和结尾分别有多少空间可用. skb_reserve 可用来保留空间, 在一个必须为空的 skb 开始.

unsigned char *skb_pull(struct sk_buff *skb, int len);

skb_pull "去除" 数据从一个 skb, 通过调整内部指针.

int skb_is_nonlinear(struct sk_buff *skb);

如果这个 skb 是为发散/汇聚 I/O 分隔为几个片, 函数返回一个真值.

int skb_headlen(struct sk_buff *skb);

返回 skb 的第一个片的长度, 由 skb->data 指向.

void *kmap_skb_frag(skb_frag_t *frag);

void kunmap_skb_frag(void *vaddr);

提供对非线性 skb 中的片直接存取的函数.

#include <linux/etherdevice.h>

void ether_setup(struct net_device *dev);

为以太网驱动设置大部分方法为通用实现的函数. 它还设置 dev->flags 和安排下一个可用的 

ethx 给 dev->name, 如果名子的第一个字符是一个空格或者 NULL 字符.

unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev);

当一个以太网接口收到一个报文, 这个函数被调用来设置 skb->pkt_type. 返回值是一个协议号, 通常存储于 skb->protocol.

#include <linux/sockios.h>

SIOCDEVPRIVATE 

前 16 个 ioctl 命令, 每个驱动可为它们自己的私有用途而实现. 所有的网络 ioctl 命令都在 sockios.h 中定义.

#include <linux/mii.h>

struct mii_if_info;

声明和一个结构, 支持实现 MII 标准的设备的驱动.

#include <linux/ethtool.h>

struct ethtool_ops;

声明和结构, 使得设备与 ethtool 工具一起工作.

时间: 2024-11-10 07:26:29

LDD3学习笔记(20):网络驱动的相关文章

API Demos 2.3 学习笔记 (20)-- Views-&amp;gt;Lists-&amp;gt;Array

更多精彩内容,请点击阅读:<API Demos 2.3 学习笔记> 从本节开始,我们开始接触List方面的内容.List部分的内容主要用到控件ListView.根据我的了解,我喜欢把ListView的应用框架分成三层来理解:数据,适配器,UI.其中,数据主要是一系列特定数据的集合,例如,一个字符串数组等:UI主要是ListView,或者包含ListView控件的ListActivity:适配器则有很多,例如:ArrayAdapter<T>, BaseAdapter, CursorA

LDD3学习笔记(3):字符驱动1

1.scull( Simple Character Utility for Loading  Localities)的设计 Scull是一个字符驱动,它操作一块内存区域,就好像它是一个设备,因此在以下的介绍中我们可以互换的使用设备和scull操作的内存区. 编写驱动的第一步是定义驱动将要提供给用户的功能. 模块实现的每种设备都被引用为一种类型. Scull源码实现: scull0到scull3四个设备,每个都由一个全局永久的内存区组成,全局表示如果设备被多次打开设备中含有的数据将由所有打开它的文

LDD3学习笔记(15):PCI驱动

 #include <linux/pci.h> 包含 PCI 寄存器的符号名和几个供应商和设备 ID 值的头文件. struct pci_dev; 表示内核中一个 PCI 设备的结构. struct pci_driver; 代表一个 PCI 驱动的结构. 所有的 PCI 驱动必须定义这个. struct pci_device_id; 描述这个驱动支持的 PCI 设备类型的结构. int pci_register_driver(struct pci_driver *drv); int pci_m

LDD3学习笔记(1):设备驱动简介

 1.几乎每个系统操作都被映射到具体的物理设备上,而任何设备的控制操作都由特定于要寻址的相关代码来进行,这些代码成为设备驱动. 2.linux可以在运行时扩展由内核提供的特性,既可以在系统运行时增加内核的功能(也可以删除). 3.每块可以在运行时添加到内核的代码称为一个模块,每个模块由目标代码组成(既功能的实现). 4.linux将设备分为三种基本类型:字符设备.块设备.网络设备.典型的字符设备如:/dev/tty1(串口),块设备如:/dev/sda(磁盘),网络设备如:eth0(网卡),在这

LDD3学习笔记(16):USB驱动

  #include <linux/usb.h> 所有和 USB 相关的头文件. 它必须被所有的 USB 设备驱动包含. struct usb_driver; 描述 USB 驱动的结构. struct usb_device_id; 描述这个驱动支持的 USB 设备的结构. int usb_register(struct usb_driver *d); 用来从USB核心注册和注销一个 USB 驱动的函数. struct usb_device *interface_to_usbdev(struct

LDD3学习笔记(21):tty驱动

  #include <linux/tty_driver.h> 头文件, 包含 struct tty_driver 的定义和声明一些在这个结构中的不同的标志. #include <linux/tty.h> 头文件, 包含 tty_struct 结构的定义和几个不同的宏定义来易于存取 struct termios 的成员的单个值. 它还含有 tty 驱动核心的函数声明. #include <linux/tty_flip.h> 头文件, 包含几个 tty flip 缓冲内联

LDD3学习笔记(6):字符驱动4

  1.快速参考 本章介绍了下面符号和头文件. struct file_operations 和 struct file 中的成员的列表这里不重复了. #include <linux/types.h> dev_t  dev_t 是用来在内核里代表设备号的类型. int MAJOR(dev_t dev); int MINOR(dev_t dev); 从设备编号中抽取主次编号的宏. dev_t MKDEV(unsigned int major, unsigned int minor); 从主次编号

LDD3学习笔记(9):高级字符驱动操作

 1.ioctl接口 ioctl 驱动方法有和用户空间版本不同的原型: int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); 2.阻塞I/O 阻塞进程,使它进入睡眠直到请求可继续. 当一个进程被置为睡眠,它被标识为处于一个特殊的状态并且从调度器的运行队列中去除,直到发生某些事情改变了那个状态.一个睡着的进程将不被任何CPU调度,因此不会运行,一个睡着的进程已被搁置到系

LDD3学习笔记(5):字符驱动3

  1.字符设备注册 在运行时获得一个独立的cdev结构的代码: Struct cdev* my_cdev=cdev_alloc(); My_codev->ops=&my_fops; 将cdev结构嵌入自己设备特定的结构: Void cdev_init(struct cdev* cdev , struct file_operations* fops); Cdev结构建立后,告诉内核: Int cdev_add(struct cdev*dev ,dev_t num,unsigned int c