You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

6LoWPAN嗅探获取发送方IPv6地址显示乱码问题排查

Contiki-NG 6LoWPAN嗅探中IPv6地址读取乱码的解决思路

1. 包头压缩问题的解决方法

要在不破坏原packetbuf中6LoWPAN数据包的前提下获取未压缩的IPv6地址,可通过临时拷贝数据包并调用Contiki-NG内置的6LoWPAN解压函数实现:

uint8_t temp_buf[PACKETBUF_SIZE];
// 拷贝原数据包到临时缓冲区,避免修改原数据
memcpy(temp_buf, packetbuf_dataptr(), packetbuf_datalen());

struct lowpan_hdr lp_hdr;
uint16_t decompressed_len;
// 解压6LoWPAN数据包,得到完整的IPv6头起始指针
uint8_t *decompressed_ptr = lowpan_decompress(temp_buf, packetbuf_datalen(), &lp_hdr, &decompressed_len);

if(decompressed_ptr != NULL) {
  struct ip6_hdr *ip6_hdr = (struct ip6_hdr *)decompressed_ptr;
  LOG_INFO_6ADDR(&ip6_hdr->ip6_src); // 打印解压后的源IPv6地址
}

2. 头链偏移问题的解决方法

针对6LoWPAN头链封装导致IPv6头位置偏移的情况,可利用Contiki-NG的头链解析函数定位正确的IPv6头起始位置:

struct lowpan_hdr lp_hdr;
// 解析6LoWPAN头链,跳过所有压缩头,直接返回IPv6头指针
uint8_t *ip6_ptr = lowpan_parse_hdr(packetbuf_dataptr(), packetbuf_datalen(), &lp_hdr);

if(ip6_ptr != NULL) {
  struct ip6_hdr *ip6_hdr = (struct ip6_hdr *)ip6_ptr;
  LOG_INFO_6ADDR(&ip6_hdr->ip6_src); // 打印正确位置的源IPv6地址
}

3. 其他可能原因及解决思路

  • packetbuf地址字段未正确填充:6LoWPAN层嗅探时机可能过早,PACKETBUF_ADDR_SENDER尚未被写入有效地址。可调整嗅探逻辑到IP层或UDP层的回调函数中,确保地址已被正确设置。
  • 地址类型不匹配:确认packetbuf_addr(PACKETBUF_ADDR_SENDER)返回的是标准uip_ipaddr_t类型指针。若类型不匹配,直接用LOG_INFO_6ADDR打印会导致乱码,可先手动打印十六进制值验证:
    uint8_t *addr_bytes = (uint8_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER);
    for(int i = 0; i < 16; i++) {
      LOG_INFO("%02x", addr_bytes[i]);
      if(i % 2 == 1 && i != 15) {
        LOG_INFO(":");
      }
    }
    LOG_INFO("\n");
    
  • 嗅探钩子位置错误:若在6LoWPAN包未完成解析时触发嗅探,地址数据可能未初始化。可将嗅探逻辑挂载到lowpan_input函数末尾,或IP层输入处理的阶段。

内容的提问来源于stack exchange,提问作者Colosen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:52:24