VLIB_BUFFER_TRACE_TRAJECTORY宏的作用

可以通过开启宏VLIB_BUFFER_TRACE_TRAJECTORY,在mbuf里记录mbuf经过的node个数以及所经过的node的index:

if (VLIB_BUFFER_TRACE_TRAJECTORY && frame)

{

int i;

int log_index;

u32 * from;

from = vlib_frame_vector_args (frame);

for (i = 0; i < frame->n_vectors; i++)

{

vlib_buffer_t *b = vlib_get_buffer (vm, from[i]);

ASSERT (b->pre_data[0] < 32);

log_index = b->pre_data[0]++ + 1;

b->pre_data[log_index] = node->node_index;

}

n = node->function (vm, node, frame);

}

用以下函数打印记录的node信息

void vlib_dump_context_trace (vlib_main_t*vm, u32 bi)

{

vlib_node_main_t * vnm = &vm->node_main;

vlib_buffer_t * b;

u8 i, n;

if (VLIB_BUFFER_TRACE_TRAJECTORY)

{

b = vlib_get_buffer (vm, bi);

n = b->pre_data[0];

fformat(stderr, "Context trace for bi %d b 0x%llx, visited%d\n",

bi, b, n);

if (n == 0 || n > 20)

{

fformat(stderr, "n is unreasonable\n");

return;

}

for (i = 0; i < n; i++)

{

u32 node_index;

node_index = b->pre_data[i+1];

if (node_index > vec_len (vnm->nodes))

{

fformat(stderr, "Skip bogusnode index %d\n", node_index);

continue;

}

fformat(stderr, "%v (%d)\n",vnm->nodes[node_index]->name,

node_index);

}

}

else

{

fformat(stderr,

"in vlib/buffers.h,#define VLIB_BUFFER_TRACE_TRAJECTORY 1\n");

}

}

时间: 2024-10-26 12:00:05

VLIB_BUFFER_TRACE_TRAJECTORY宏的作用的相关文章

空的宏定义作用及常见用法

我们学习宏定义的第一个概念是,宏定义作为替换作用. 例如: #define SIZE 32 // 接下来代码使用SIZE就相当于32 宏定义是编译器在编译时,将程序中所有SIZE替换成32,我这里就不详细将宏定义的知识, 下面讲讲在项目中,看到空的宏定义是什么情况以及它作用和用法. 先看看项目中的代码, 如下: #ifndef SQLITE_API # define SQLITE_API #endif 这个宏定义什么都没有,作用是什么呢? 作用是标志 #ifndef __TYPE_DEFINE_

php源码分析之PHPAPI宏的作用

在PHP源码中,我们经常会看到很多函数前面有个PHPAPI,但这是什么呢? 于是我在php源码/main/php.h中找到了它的定义 #ifdef PHP_WIN32 # include "tsrm_win32.h" # include "win95nt.h" # ifdef PHP_EXPORTS # define PHPAPI __declspec(dllexport) # else # define PHPAPI __declspec(dllimport) #

简述C语言中宏的作用及其副作用

引问:写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个? 答案:#define  MIN(A,B)  ( (A) <= (B)? (A) : (B) ) 知识梳理: 1). 标识#define在宏中应用的基本知识.直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法, 对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法. 2). 三重条件操作符的知识.这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更

cocos2dx 的一些宏的作用

NS_CC_BEGIN cocos2d命名空间开始 NS_CC_END  cocos2d命名空间结束 USING_NS_CC 声明cocos2d命名空间 CC_SYNTHESIZE_READONLY(varType, varName, funName)  声明一个成员变量以及get##funName函数,没有set函数.代码如下: 1 protected: varType varName; 2 public: virtual varType get##funName(void) const {

#define宏作用

预处理器的任务 简单来讲,预处理器的任务就是执行源代码中的预处理指令,并对源代码进行相应的处理.因此,从预处理指令的类型来讲,预处理器的任务包括如下的几个部分: 将其他文件包含到当前文件中. 定义宏,用来取代某些复杂文本. 定义类似函数的宏,以更加灵活的方式控制源代码. 实施条件编译,即有选择地编译源代码的某些部分. 头文件中一般是函数.类等的声明,包含到当前文件中后,就可以在当前文件中引用头文件中的函数.类等. 宏的作用 使用预处理指令#define定义的宏主要有三个方面的作用: 替代字面常量

zabbix 中 宏 的介绍

宏的作用是便于在模板.items.trigger中的引用.宏的名称为 {$名称},宏的字符范围为 A~Z.0~9._ . 例如: 在key中的宏: net.tcp.service[ssh,{$SSH_PORT}] 其中,{$SSH_PORT}就是一个红,可以在添加items的时候,对不同端口的ssh单独定义端口,这样模板就可以被多个主机引用,达到通用的目的. 作用范围:模板,主机 配置步骤为:单击 administration -> general -> macros .就可以找到宏的定义

宏 和const

// 常用字符串,常见基本变量 定义宏 // const // 苹果一直推荐我们使用const,而不是宏 const作用:  1.修饰右边基本变量或者指针变量 int a int *p 2.被const修饰变量只读 // 修饰基本变量 //int const a = 3; // const int a = 3; int * const p;  // p:只读  *p:变量 int const * p1; // p1:变量 *p1:只读 const int * p2; // p2:变量 *p2:只

C语言--&gt;(十四)结构体、宏、编译

知识点: 1.结构体 struct 2.typedef关键字 3.宏的定义 4.宏与函数的区别 5.文件包含和多文件编译 6.条件编译 ===========================结构体 思考:如果现在希望保存一个学生的信息,姓名,身高,年龄,地址,该如何保存 char name[64]; float height; int age; char addr[64]; 1.什么是结构体 struct 结构体指的是一种数据结构,是c语言中复合数据类型的一 种多种不同数据类型的集合 2.结构体

qtp动态加载宏

说明:本文例子基于excel2010,其他版本类似 一.eom模型 在学习宏前,先了解下什么是eom模型. EOM:Excel Automation Object Model,excel的自动化模型对象.既然需要使用EOM就必须先要对其进行引用,引用完之后方可对其封装的所有方法进行调用,并对excel进行自动化.excel的组件和类名分别为Excel和Application.下图展示部分excel对象模型 说明: application->此主对象引用Excel本身. Workbooks->此