【发布时间】:2021-11-27 03:30:58
【问题描述】:
在查看 linux 的源代码时,我遇到了以下关于 IPv6 标头格式的定义,并且根据字节序对“优先级”和“版本”字段的顺序感到困惑。 我认为这两个字段都是 4 位(半字节)并且它们与字节序无关。 我不明白为什么 linux 内核会这样定义 ipv6 标头。
关于这个结构还有另一个问题。 根据https://en.wikipedia.org/wiki/IPv6_packet,流量类是8位,流标签字段是20位,但这种结构分别定义了4位和24位。
struct ipv6hdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 priority:4,
version:4;
#elif defined(__BIG_ENDIAN_BITFIELD)
__u8 version:4,
priority:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 flow_lbl[3];
__be16 payload_len;
__u8 nexthdr;
__u8 hop_limit;
struct in6_addr saddr;
struct in6_addr daddr;
};
【问题讨论】:
-
宏
__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD与字节的通用字节序无关。它是“位字节序”——某些编译器的内部属性。