原创 Linux网卡驱动程序设计(二)

2012-8-31 14:36 1343 13 13 分类: MCU/ 嵌入式

2.2 网络协议接口层

网络协议接口层主要给上层协议提供透明的数据发送和接收的接口。

数据包发送:Dev_queuex_xmit (struct sk_buff  *skb);

数据包接收:Int netif_rx (struct sk_buff  *skb);

Sk_buff 套接字缓冲区 用于在linux网络子系统中的各层之间传递数据。当发送数据包时,linux内核网络处理模块必须建立一个包含要传输的数据包的sk_buff,然后将sk_buff递交给下层,各层在sk_buff中添加不同的协议头直至交给网络设备发送。同样,当网络设备从网络媒介上接收到数据包后,它必须将接收到的数据转换为sk_buff数据结构并传递给上层,各层剥去相应的协议头直至交给用户。

套接字缓冲区的分配

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

Struct sk_buff  *dev_alloc_skb(unsigned int len,int priority);

套接字缓冲区的释放

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); 前两项均可

套接字缓冲区的指针移动

1、put操作--tail指针下移,增加len值,在尾部添加数据

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

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

2、push操作—data指针上移,增加len值,发送时在头部添加数据

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

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

3、pull操作—data指针下移,减小len值

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

4、reserve操作—data和tail指针下移

Void skb_reserve(struct sk_buff *skb,unsigned int len);

2.3 网络设备接口层

net_device结构体在内核中指代一个网络设备,网络设备驱动程序只需通过填充net_device的具体成员并注册,即可实现硬件操作函数与内核的挂接。

net_device包含网络设备的属性描述和操作接口。在编写网络设备驱动程序时,只需要了解其中的一部分。

全局信息: char name[IFNAMESIZ]; Int (*init)(struct net_device *dev);

硬件信息: Unsigned long base_addr; Unsigned long irq;

设备操作函数:int (*open)/(*stop)(struct net_device *dev);

Int (*hard_start_xmit)(struct sk_buff *skb,struct net_device *dev);

Void (*tx_timeout)(struct net_device *dev)

Struct net_device_stats* (*get_stats)(struct net_device *dev);

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /3 下一条