我正在尝试编写一个 netfilter 模块,并希望访问表示 DF 和 MF 字段的 IPHeader 字段。我可以根据需要访问大多数其他字段,但我认为我必须从结构中的 ipheader 中提取 DF 和 MF 字段并操作它们,例如我想根据收到的数据包类型设置或取消设置 DF 位。
下面的结构有“frag_off”,我如何从中访问/重写IP_DF和IP_MF?
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos;
__u16 tot_len;
__u16 id;
__u16 frag_off;
__u8 ttl;
__u8 protocol;
__u16 check;
__u32 saddr;
__u32 daddr;
/*The options start here. */
};
#define IP_MF 0x2000 /* Flag: "More Fragments" */
#define IP_OFFSET 0x1FFF /* "Fragment Offset" part */
#define IP_DF 0x4000 /* dont fragment flag */
printk(KERN_INFO "IP_FRAG_OFF : %d", (iph->frag_off & IP_OFFSET));
printk(KERN_INFO "MF: %d", (iph->frag_off & IP_MF));
最佳答案
字段frag_off是16位。 前 3 位是标志,其余 13 位是偏移量。
标志位是:第一个是保留的并且必须为 0。第二个是 DF,第三个是 MF。 因此,要访问 DF,您应该通过“frag_off & 0x4000”隔离第二位,并将 IP_DF 声明为 0x4000,这样您就可以执行“iph->frag_off & IP_DF”。
对于 MF,0x2000 和偏移 IP_OFFSET,0x1FFF 也相同
关于c - 使用netfilter时如何从iph->frag_offset访问IP_DF和IP_MF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51699201/