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);
文章评论(0条评论)
登录后参与讨论