skb管理函数之skb_put、skb_push、skb_pull、skb_reserve

四个操作函数直接的区别,如下图:

 1 /**
 2  *    skb_put - add data to a buffer
 3  *    @skb: buffer to use
 4  *    @len: amount of data to add
 5  *
 6  *    This function extends the used data area of the buffer. If this would
 7  *    exceed the total buffer size the kernel will panic. A pointer to the
 8  *    first byte of the extra data is returned.
 9  */
10 /*
11     向skb尾部添加数据
12 */
13 unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
14 {
15     /* 获取当前skb->tail */
16     unsigned char *tmp = skb_tail_pointer(skb);
17
18     /* 要求skb数据区必须为线性 */
19     SKB_LINEAR_ASSERT(skb);
20
21     /* skb尾部增加len字节 */
22     skb->tail += len;
23     /* skb数据总长度增加len字节 */
24     skb->len  += len;
25
26     /* 如果增加之后的tail > end ,则panic */
27     if (unlikely(skb->tail > skb->end))
28         skb_over_panic(skb, len, __builtin_return_address(0));
29
30     //返回添加数据的第一个字节位置
31     return tmp;
32 }
/**
 *    skb_push - add data to the start of a buffer
 *    @skb: buffer to use
 *    @len: amount of data to add
 *
 *    This function extends the used data area of the buffer at the buffer
 *    start. If this would exceed the total buffer headroom the kernel will
 *    panic. A pointer to the first byte of the extra data is returned.
 */
/*
    向skb数据区头部添加数据
*/
unsigned char *skb_push(struct sk_buff *skb, unsigned int len)
{
    /* 数据区data指针前移len字节 */
    skb->data -= len;
    /* 数据总长度增加len字节 */
    skb->len  += len;

    /* 添加数据长度溢出过header ,panic*/
    if (unlikely(skb->data<skb->head))
        skb_under_panic(skb, len, __builtin_return_address(0));

    /* 返回新的data指针 */
    return skb->data;
}
 1 /**
 2  *    skb_pull - remove data from the start of a buffer
 3  *    @skb: buffer to use
 4  *    @len: amount of data to remove
 5  *
 6  *    This function removes data from the start of a buffer, returning
 7  *    the memory to the headroom. A pointer to the next data in the buffer
 8  *    is returned. Once the data has been pulled future pushes will overwrite
 9  *    the old data.
10  */
11 /*
12     从数据区头部移除数据
13 */
14 unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)
15 {
16     return skb_pull_inline(skb, len);
17 }
 1 /*
 2     保留头部空间,只能对空的skb使用
 3 */
 4 static inline void skb_reserve(struct sk_buff *skb, int len)
 5 {
 6     /* 数据区data指针增加len字节*/
 7     skb->data += len;
 8     /* 数据区tail指针增加len字节 */
 9     skb->tail += len;
10 }
时间: 2024-10-11 23:44:24

skb管理函数之skb_put、skb_push、skb_pull、skb_reserve的相关文章

skb管理函数之skb_clone、pskb_copy、skb_copy

skb_clone--只复制skb描述符本身,如果只修改skb描述符则使用该函数克隆: pskb_copy--复制skb描述符+线性数据区域(包括skb_shared_info),如果需要修改描述符以及数据则使用该函数复制: skb_copy--复制所有数据,包括skb描述符+线性数据区域+非线性数据区,如果需要修改描述符和全部数据则使用该函数复制: 1 /** 2 * skb_clone - duplicate an sk_buff 3 * @skb: buffer to clone 4 *

skb管理函数之alloc_skb、dev_alloc_skb、kfree_skb、dev_kfree_skb、consume_skb

alloc_skb--分配skb dev_alloc_skb--分配skb,通常被设备驱动用在中断上下文中,它是alloc_skb的封装函数,因为在中断处理函数中被调用,因此要求原子操作(GFP_ATOMIC) kfree_skb--减少skb引用,为0则释放,用于出错丢包时释放skb使用: dev_kfree_skb==consume_skb--减少skb引用,为0则释放,成功状态下释放skb使用: 1 static inline struct sk_buff *alloc_skb(unsig

使用内存管理函数实现动态数组

C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间释放,为有效地使用内存资源提供了手段. 动态数组,指的就是利用内存的申请和释放函数,在程序的运行过程中,根据实际需要指定数组的大小.其本质就是一个指向数组的指针变量. 主要用到的内存管理函数是:malloc和free. 1.分配内存函数malloc: 调用形式:(类型说明符*)malloc(size): 功     能:在内存的动态存储区中分配一块长度为size字节的连续区域. 返     回:该区域

lwip-内存管理函数说明

1.mem_init()   : 内存堆初始化函数,主要设置内存堆的起始地址,以及初始化空闲列表,lwip初始化时调用,内部接口. 2.void *mem_malloc(mem_size_t size)  : 申请分配内存,size为需要申请的内存字节数,返回值为最新分配的内存块的数据地址,注意 不是内存块的地址.如果为分配好内存,返回NULL.申请的内存堆是全局变量. 3.*mem_calloc(mem_size_t count, mem_size_t size) : 是对mem_malloc

functools:管理函数工具(部分)

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #functools:管理函数工具 #作用:处理其他函数的函数 #版本:2.5及之后 #用于调整或者扩展函数和其他可回调对象,不用重写 #修饰符:主要工具是partial在,用于包装,一个有默认参数可回调对象.得到对象本身是可回调的,可以看作就像是原来的函数,它与原函数完全相同,调用时也可以提供额外的位置或者命名参数,可以使用partial而不是lambda提供的默

μC/OS-Ⅲ系统的时间管理函数和定时器

一.时间管理函数 μC/OS-Ⅲ系统提供一些列时间管理服务函数: 1.OSTimeDly():任务延时n个时钟节拍. 2.OSTimeDlyHMSM():任务延时指定的时间,采用“时:分:秒:毫秒”方式指定. 3.OSTimeDlyResume():恢复被延时的任务.注意,一个任务利用这个函数恢复其他函数时,被恢复任务不知道自己是被其他任务恢复,会任务是延时结束而得到恢复.所以此函数要谨慎使用. 4.OSTimeGet():获取当前时钟节拍计数器的值. 5.OSTimeSet():设置时钟节拍计

ucosiii几个常用的时间管理函数

昨天我们说了系统节拍,经过一步步的分析,了解了任务运行的基础,是怎么来的.今天就继续谈谈"时间管理"这个话题,系统节拍驱动任务的运行,时间管理就是对任务的运行时间进行管理的一种内核机制.那么下面就简单介绍几个常用的时间管理函数. 1.OSTimeDly函数,它位于os_time.c文件中,这个文件还有其他很多的时间管理函数,以下的函数都位于这个文件. 看了上面的参数是不是还是毫无感觉,那我们看看源码,注明:注释不是自己写的,是秉火团队写的.我们需要做的不光是学会使用这些别人提供的好内容

STM32中断管理函数

CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 有76 个中断,包括16 个内核中断和60 个可屏蔽中断,具有16 级可编程的中断优先级. 而我们常用的就是这60 个可屏蔽中断,所以我们就只针对这60 个可屏蔽中断进行介绍. 在 MDK 内,与NVIC 相关的寄存器,MDK 为其定义了如下的结构体: typedef struct { vu32 I

Linux C 堆内存管理函数malloc(),calloc(),realloc(),free()详解

C 编程中,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般由程序员分配与释放,基程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿的,初始化的全局变量和静态变量在一块区域,未初始化的全局变