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
相关产品推荐
相关产品推荐

