PPI フレーム形式のパケットの解析に問題があります。802.11+mac+phy フィールドが必要です。共通フィールドの後に、オフセットに誤りがあるようです。これが私のコードです:
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);
}
common フィールドの出力は正しいです。type: 2、len: 20 と表示されます。ただし、mac フィールドの type: 64、len: 0 と同様に、他の値は間違っています (mac+phy も同様です)。リトルエンディアン/ビッグエンディアンの問題ですか、それとも私の間違いですか? 私はwiresharkの実装を見てきましたが、オフセットに関数 tvb_get_letohs() を使用しており、それはかなり複雑です...誰かが助けてくれることを願っています.