【infiniband】IB_OPENIB_OUI

IB_OPENIB_OUI是一个InfiniBand网络中用于表示开放IB组织(OpenIB Organization)的组织唯一标识符(OUI)。
其数值定义为0x001405,转换为大端序存储在网络包中。
InfiniBand架构中,每一个组织需要申请自己唯一的OUI来标识自己的设备、软件等。OpenIB组织是InfiniBand技术的开源推动组织,其申请的OUI为0x001405。
这个OUI主要出现在一些InfiniBand网络包的标识字段中,例如:
- GRH(全局路由头)的Next Header字段使用0x001405表示其载荷是OpenIB封装的IP over IB数据报。
- Some MAD管理数据包使用0x001405表示其是OpenIB定义的MAD格式。
所以IB_OPENIB_OUI这个宏定义代表了OpenIB组织的OUI值0x001405,在InfiniBand网络协议栈的不同场合被用来标识某些属于OpenIB规范的网络包。它是InfiniBand技术中的一个重要标识符。
OUI(Organizationally Unique Identifier) 组织唯一标识符,是用来标识网卡等设备制造商的全球唯一标识符。
OUI由IEEE负责分配和管理,由3个八位字节构成,共24位。其中高级位必须为0,第二个八位字节用于标识制造商。剩下的40位可以由制造商自行分配,用来唯一标识网络设备。
OUI主要有以下几方面的作用:
- 标识网络硬件的制造商信息,如网卡、交换机等。通过OUI可以获知设备的生产厂商。
- 在以太网等网络中用来标识目标MAC地址。MAC地址的前3个字节是OUI。
- 在InfiniBand等网络中作为组织标识符出现在网络包头,标识组织类型。
- 在一些网络协议中用来唯一标识协议类型,如EtherType字段。
- 用于一些需要厂商编号的网络标准和技术中。
获取OUI需要向IEEE注册,以避免OUI的冲突。获得OUI后可以自行分配后40位,从而生成全局唯一的网络设备标识符。
__be32 oui = htobe32(IB_OPENIB_OUI);
这行代码定义了一个32位无符号整数变量oui,并用宏htobe32()将数值0x001405(对应Infiniband开放标准组织的OUI)转换为big endian字节序存入oui变量。
htobe32()是一个字节序转换宏,其展开如下:
c
#define htobe32(x) __bswap_32(x)
__bswap_32()是一个实现字节序交换的内联函数。
所以整行代码的作用等同于:
c
__be32 oui = __bswap_32(0x001405);
将0x001405这个小端序整数转换为大端序存入oui变量中。
Infiniband网络技术使用大端序表示,所以这里需要进行字节序转换,将一个常量OUI值转换为网络字节序后存入变量,方便后续操作。

猜你喜欢

转载自blog.csdn.net/eidolon_foot/article/details/132578685