skb操作函数
来源:互联网 发布:自考和网络教育哪个好 编辑:程序博客网 时间:2024/05/21 07:11
使用一个 sk_buff 结构的网络驱动利用正式接口函数来操作它. 许多函数操作一个 socket 缓存; 这里是最有趣的几个:
- struct sk_buff *alloc_skb(unsigned int len, int priority);
- struct sk_buff *dev_alloc_skb(unsigned int len);
分配一个缓存区. alloc_skb 函数分配一个缓存并且将 skb->data 和 skb->tail 都初始化成 skb->head. dev_alloc_skb 函数是使用 GFP_ATOMIC 优先级调用 alloc_skb 的快捷方法, 并且在 skb->head 和 skb->data 之间保留了一些空间. 这个数据空间用在网络层之间的优化, 驱动不要动它.
- 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);
释放缓存. kfree_skb 调用由内核在内部使用. 一个驱动应当使用一种 dev_kfree_skb 的变体: 在非中断上下文中使用 dev_kfree_skb, 在中断上下文中使用 dev_kfree_skb_irq, 或者 dev_kfree_skb_any 在任何 2 种情况下.
- unsigned char *skb_put(struct sk_buff *skb, int len);
- unsigned char *__skb_put(struct sk_buff *skb, int len);
更新 sk_buff 结构中的 tail 和 len 成员; 它们用来增加数据到缓存的结尾, 每个函数的返回值是 skb->tail 的前一个值(换句话说, 它指向刚刚创建的数据空间). 驱动可以使用返回值通过引用 memcpy(skb_put(...), data, len) 来拷贝数据或者一个等同的东东. 两个函数的区别在于 skb_put 检查以确认数据适合缓存, 而 __skb_put 省略这个检查.
- unsigned char *skb_push(struct sk_buff *skb, int len);
- unsigned char *__skb_push(struct sk_buff *skb, int len);
递减 skb->data 和递增 skb->len 的函数. 它们与 skb_put 相似, 除了数据是添加到报文的开始而不是结尾. 返回值指向刚刚创建的数据空间. 这些函数用来在发送报文之前添加一个硬件头部. 又一次, __skb_push 不同在它不检查空间是否足够.
- int skb_tailroom(struct sk_buff *skb);
返回可以在缓存中放置数据的可用空间数量. 如果驱动放了多于它能持有的数据到缓存中, 系统傻掉. 尽管你可能反对说一个 printk 会足够来标识出这个错误, 内存破坏对系统是非常有害的以至于开发者决定采取确定的动作. 实际中, 你不该需要检查可用空间, 如果缓存被正确地分配了. 因为驱动常常在分配缓存前获知报文的大小, 只有一个严重坏掉的驱动会在缓存中安放太多的数据, 这样出乱子就可当作一个应得的惩罚.
- int skb_headroom(struct sk_buff *skb);
返回 data 前面的可用空间数量, 就是, 可以 "push" 给缓存多少字节.
- void skb_reserve(struct sk_buff *skb, int len);
递增 data 和 tail. 这个函数可用来在填充数据前保留空间. 大部分以太网接口保留 2 个字节在报文的前面; 因此, IP 头对齐到 16 字节, 在 14 字节的以太网头后面. snull 也这样做, 尽管没有在"报文接收"一节中展现这个指令以避免在那时引入过多概念.
- unsigned char *skb_pull(struct sk_buff *skb, int len);
从报文的头部去除数据. 驱动不会需要使用这个函数, 但是为完整而包含在这儿. 它递减 skb->len 和递增 skb->data; 这是硬件头如何从进入报文开始被剥离.
- 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 直接存取片, 这些函数为你映射以及去映射它们. 使用一个原子性 kmap, 因此你不能一次映射多于一个片.
- skb操作函数
- linux协议栈skb操作函数
- linux协议栈skb操作函数
- linux协议栈skb操作函数
- Linux协议栈skb操作函数介绍
- inux协议栈skb操作函数 -- linux
- linux协议栈skb操作函数
- skb相关的函数
- 有关SKB链表管理和数据操作的几个函数
- skb
- skb结构变化后的操作
- SKB几个复制函数的区别
- SKB几个复制函数的区别
- skb的两个函数pskb_copy和skb_copy
- skb结构
- skb-1
- skb-2
- skb-3
- position:absolute relative 绝对定位与相对定位
- JAVA定时器程序
- java中角度或弧度的计算
- 谁知道CMS系统(java)
- udev文件系统的使用和基本工作原理分析
- skb操作函数
- 正则表达式入门经典(学习笔记三)——正则表达式组成要素
- android activity属性
- Eclipse中设置文件的默认编码
- 关于document.domain的一些解释
- pyton: subprocess
- 做一个让长官、同侪、部属,乃至于民众认为你是一个值得信赖的人
- 三原色光模式(RGB color model)的颜色融合,C#代码
- 大蒜虽小,保健学问却很大