热度 13
2012-8-31 14:36
1330 次阅读|
0 个评论
2. 2 网络 协议接口层 网络协议接口层主要给上层协议提供透明的数据发送和接收的接口。 数据包发送: Dev_queuex_xmit (struct sk_buff *skb); 数据包接收: I nt 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 ; Int (*init)(struct net_device *dev); 硬件信息: U nsigned long base_addr; U nsigned long irq; 设备操作函数:int (* open )/(* stop )(struct net_device *dev); I nt (* hard_start_xmit )(struct sk_buff *skb,struct net_device *dev); V oid (* tx_timeout )(struct net_device *dev) S truct net_device_stats* (* get_stats )(struct net_device *dev);