【问题标题】:IP address family identificationIP 地址族标识
【发布时间】:2014-07-13 14:59:45
【问题描述】:

我需要识别数据包 IP 的 IP 地址系列(即 IPv4 或 IPv6)。 In 已设法利用libnetfilter 捕获数据包并获取源和目标 IP 地址。但是现在我需要从我正在实现的kernel module 中识别获得的IP 地址地址族。

IP地址存储如下,

struct iphdr *ip_header = (struct iphdr *)skb_network_header(skb);  

unsigned int src_ip = (unsigned int)ip_header->saddr;   
unsigned int dest_ip = (unsigned int)ip_header->daddr;  

在研究过程中,我空手而归,只知道如何使用%pI4%pI6 将其格式化并显示为字符串。但不是如何以编程方式识别 IP 地址系列。 (可能像Linux内核模块等价于函数IPAddress.AddressFamily

如果各位专家能帮助我解决这个困扰我好几天的问题,我将不胜感激。

提前致谢:)

编辑

根据@alk 的建议,如果各位专家建议我更改上述unsigned int 变量声明以支持IPv6,我将不胜感激。 :)

【问题讨论】:

  • @alk 谢谢他的回复,先生。我应该如何修改它以支持 IPv4 和 IPv6 并识别版本?

标签: c linux ip ip-address kernel-module


【解决方案1】:

skb_network_header 返回的指针指向的前 4 位为您提供了 ip 标头的版本以及该数据包的版本。

根据这一点,您需要以不同的方式踩头。

void * p = (void *) skb_network_header(skb);
unsigned int protocol_version = (*((unsigned char *) p) & 0xf0) >> 4;

switch (protocol_version)
{
case 4:
  struct ip_hdr * pip4_hdr = p; 

  printk("src=%pI4\n", &pip4_hdr->saddr);
  printk("dst=%pI4\n", &pip4_hdr->daddr);

  break;

case 6;
  struct ip6_hdr * pip6_hdr = p;

  printk("src=%pI6\n", &pip6_hdr->ip6_src);
  printk("dst=%pI6\n", &pip6_hdr->ip6_dst);

  break;

default:
  printk("<unhandled protocol version: %u>\n", protocol_version);

  break;
}

(未经测试)

供参考:IPv6IPv4 标头的结构。

【讨论】:

  • 谢谢你的回答 :) 我会检查并回复 :)
  • 再次感谢您的回答 :) 我知道您已经提到它未经测试,我尝试了代码,但它始终将 protocol_version 设为 0。我能知道这里发生了什么吗?void * p = (void *) skb_network_header(skb); unsigned int protocol_version = ntohs(*(uint16_t*) p) &amp; 0x000f;?这个功能和struct iphdr *iph; unsigned int protocol_version = iph-&gt;version一样吗?先生,非常感谢您的帮助:)
  • 去掉转换函数ntohs试试。也许标头数据已经按主机字节顺序排列。如果只是在做unsigned int protocol_version = *((uint16_t *) p); protocol_version 会得到什么?
  • ntohs(*(uint16_t*) p) &amp; 0x000f;p 视为指向uint16_t,取消引用此指针,该指针给出一个16 位值,将其从网络字节顺序转换为主机字节顺序,最后屏蔽掉除了最低的 4 位之外的所有内容。
  • 好吧,终于修好了,第一个字节的4msb携带版本。
猜你喜欢
  • 2014-11-07
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多