一、函数定义
void gid_to_wire_gid(const union ibv_gid *gid, char wgid[])
{
uint32_t tmp_gid[4];
int i;
memcpy(tmp_gid, gid, sizeof(tmp_gid));
for (i = 0; i < 4; ++i)
sprintf(&wgid[i * 8], "%08x", htobe32(tmp_gid[i]));
}
二、代码解读
解读1
这个函数是用来将ibv_gid结构转换为字符串表示的wire格式的。
ibv_gid是一个16字节的结构体,定义在infiniband/verbs.h头文件中:
union ibv_gid {
uint8_t raw[16];
struct {
__be64 subnet_prefix;
__be64 interface_id;
} global;
};
它包含128位全局标识符(Global Identifier),用于在InfiniBand网络中标识端口。
而gid_to_wire_gid函数的作用是:
1. 将ibv_gid结构中的16字节内容拷贝到一个uint32_t数组tmp_gid中(每4字节拷贝到一个uint32_t)
2. 循环将每个uint32_t变量转换为8位十六进制字符串,组合成一个32字节十六进制字符串
3. 字符串以4个字节(8位十六进制)为一组,组与组之间无分隔符
这样就可以将原始的二进制ibv_gid表示成人类可读的wire格式字符串。
举例来说,如果ibv_gid的内容是:
raw = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00}
转换后的wire格式字符串就是:
"112233445566778899aabbccddeeff00"
这样来回转换就可以在人和程序之间传递ibv_gid信息了。
解读2
ibv_gid的wire格式指的是十六进制字符串表示形式。之所以称为"wire格式",是因为它常用于在网络设备之间传递ibv_gid信息。
wire在网络领域常指线缆或网络连接,wire format意为在网络上传输的格式。
ibv_gid的原始二进制格式不便在设备之间直接传递,需要转换为一个通用的文本格式以便在网络设备间传输。
所以这里的wire可以理解为"网络传输格式"的意思。wire格式将ibv_gid转换为可打印的十六进制字符串,便于在网络设备间传递。
另一方面,wire也暗示了这种格式经过"线缆"(wire)传输。
综上,wire格式是一种为网络传输而设计的编码格式, wire在这里表示这种格式用于在网络连接/"线缆"上传输信息。
所以wire格式可以翻译成:
- 网络传输格式
- 线缆格式
- 链路格式
表达了这是一种便于在网络设备间传递的编码格式。文章来源:https://www.toymoban.com/news/detail-684206.html
文章来源地址https://www.toymoban.com/news/detail-684206.html
到了这里,关于【infiniband】gid_to_wire_gid函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!