if (pool_is_free_index (cm->tables, table_index)) { rv = VNET_API_ERROR_NO_SUCH_TABLE; goto out; } unformat_init_cstring(&input_match, (char *)mp->match); unformat(&input_match, "%U", unformat_classify_match, cm, &match, table_index);
时间: 2024-04-19 12:28:54 浏览: 89
这段代码中,首先对 `cm->tables` 进行检查,判断索引 `table_index` 对应的表是否为空闲索引。如果是空闲索引,说明该表不存在,将错误码 `VNET_API_ERROR_NO_SUCH_TABLE` 赋值给 `rv`,然后跳转到 `out` 标签处。
接下来,通过调用 `unformat_init_cstring` 函数,将指向 `mp->match` 的指针转换为 C 字符串,并初始化一个用于解析的 `unformat_input_t` 结构体 `input_match`。
然后,通过调用 `unformat` 函数,使用 `%U` 格式化字符串解析器,将 `input_match` 和其他参数传递给 `unformat_classify_match` 函数进行解析。该解析函数会根据给定的参数进行匹配,并将结果存储在 `match` 变量中,并且使用 `table_index` 来指示正在处理的表。
这段代码的作用是判断给定的表索引是否存在,并进行匹配操作,将结果存储在 `match` 变量中。如果表索引不存在,则会将错误码赋值给 `rv`,并跳转到 `out` 标签处。
相关问题
static clib_error_t * flow_report_init (vlib_main_t * vm) { flow_report_main_t *frm = &flow_report_main; frm->vlib_main = vm; frm->vnet_main = vnet_get_main (); frm->unix_time_0 = time (0); frm->vlib_time_0 = vlib_time_now (frm->vlib_main); frm->fib_index = ~0; return 0; }
在这段代码中,`flow_report_init` 函数用于初始化 `flow_report_main_t` 结构体的成员变量,并返回一个指向 `clib_error_t` 类型的指针。这个指针在这段代码中被硬编码为0,表示没有发生错误。
具体的初始化过程如下:
1. 将 `flow_report_main` 结构体的地址赋值给指针 `frm`,以便对结构体进行操作。
2. 将 `vlib_main_t` 类型的指针 `vm` 赋值给 `frm->vlib_main`,用于保存 VLIB 主结构体的地址。
3. 通过调用 `vnet_get_main()` 函数获取 VNET 主结构体的地址,并将其赋值给 `frm->vnet_main`,用于保存 VNET 主结构体的地址。
4. 通过调用 `time(0)` 函数获取当前的 Unix 时间,并将其赋值给 `frm->unix_time_0`,用于保存初始时间戳。
5. 通过调用 `vlib_time_now(frm->vlib_main)` 函数获取当前的 VLIB 时间,并将其赋值给 `frm->vlib_time_0`,用于保存初始时间戳。
6. 将 `~0` 赋值给 `frm->fib_index`,表示该值为无效索引。
最后,函数返回一个指向 `clib_error_t` 类型的指针,指针的值被硬编码为0,表示没有发生错误。
总结起来,这段代码用于初始化 `flow_report_main_t` 结构体的成员变量,并返回一个指向 `clib_error_t` 类型的指针,表示初始化过程没有发生错误。
int vnet_app_add_cert_key_pair (vnet_app_add_cert_key_pair_args_t * a) { app_cert_key_pair_t *ckpair = app_cert_key_pair_alloc (); vec_validate (ckpair->cert, a->cert_len - 1); clib_memcpy_fast (ckpair->cert, a->cert, a->cert_len); vec_validate (ckpair->key, a->key_len - 1); clib_memcpy_fast (ckpair->key, a->key, a->key_len); a->index = ckpair->cert_key_index; return 0; }
这段代码定义了一个函数 `vnet_app_add_cert_key_pair`,用于向应用程序添加证书-密钥对。
函数接受一个指向 `vnet_app_add_cert_key_pair_args_t` 结构体的指针 `a` 作为参数。函数的目标是将传入的证书和密钥复制到一个新的 `app_cert_key_pair_t` 结构体中,并将其分配给应用程序。
首先,函数通过调用 `app_cert_key_pair_alloc` 分配了一个新的 `app_cert_key_pair_t` 结构体,该结构体表示证书-密钥对。
然后,使用 `vec_validate` 函数对 `ckpair->cert` 进行预分配,确保其大小为 `a->cert_len - 1`。这样做是为了确保 `ckpair->cert` 能够容纳 `a->cert_len` 字节的数据。
接下来,使用 `clib_memcpy_fast` 函数将 `a->cert` 中的数据复制到 `ckpair->cert` 中,复制的字节数为 `a->cert_len`。
类似地,使用 `vec_validate` 和 `clib_memcpy_fast` 函数将密钥复制到 `ckpair->key` 中。
最后,将 `ckpair->cert_key_index` 赋值给 `a->index`,表示成功添加证书-密钥对。
函数返回值为 0,表示成功执行添加操作。
综上所述,这段代码用于向应用程序添加证书-密钥对,并将相关信息存储在参数结构体中。
阅读全文
相关推荐















