我在解析 PPI 帧格式的数据包时遇到了一些麻烦。我需要 802.11+mac+phy 字段,在 common 字段之后似乎我的偏移量有误。这是我的代码:
void process_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
int offset = 0;
const struct ppi_packetheader *ppi_header = (struct ppi_packetheader *)(packet + offset);
offset += 8;
const struct ppi_fieldheader *ppi_80211_common = (struct ppi_fieldheader *)(packet + offset);
printf("common type: %d | len: %d\n", ppi_80211_common->pfh_type, ppi_80211_common->pfh_datalen);
offset += 4 + 20;
const struct ppi_fieldheader *ppi_80211_mac = (struct ppi_fieldheader *)(packet + offset);
printf("mac type: %d | len: %d\n", ppi_80211_mac->pfh_type, ppi_80211_mac->pfh_datalen);
offset += 4 + 27;
const struct ppi_fieldheader *ppi_80211_mac_phy = (struct ppi_fieldheader *)(packet + offset);
printf("mac+phy type: %d | len: %d\n", ppi_80211_mac_phy->pfh_type, ppi_80211_mac_phy->pfh_datalen);
}
公共字段的输出是正确的,它显示 type: 2, len: 20。但其他值是错误的,就像 mac 字段 type: 64, len: 0 一样(mac+phy 看起来很相似)。是小/大端的问题还是我的错误在哪里?我一直在研究 Wireshark 的实现,但他们使用函数 tvb_get_letohs() 进行偏移,这非常复杂......希望有人能提供帮助。