c - 使用netfilter时如何从iph->frag_offset访问IP_DF和IP_MF

标签 c linux-kernel kernel netfilter

我正在尝试编写一个 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/

相关文章:

c - 管道、dup2 和 exec()

c++ - 读取数据或导入数据

c - 作为初学者卡住 : C Programming

makefile - 在单独的对象目录中构建树外 Linux 内核模块

linux - 如何使用 X 窗口为 Linux 操作系统界面创建 GUI?

c - 如何在printf中连接数字

hadoop - 使用 IBM/Datapower 硬件和 Linux 作为 hadoop/hdfs 节点

c - 基于分页的内存分配

C 内核字符串连接和比较

c - 使用 makefile 时,找到 linux header ,但是当调用 header 中的函数时,它说它们是隐式声明的