2013-08-29 50 views
2

我正在使用libtrace來解析網絡數據包,但我有,我認爲是endian問題。將數據包轉換爲結構的Endian問題

這裏是一個Radiotap包的libtrace定義:

typedef struct libtrace_radiotap_t { 
    uint8_t  it_version; /**< Radiotap version */ 
    uint8_t  it_pad; /**< Padding for natural alignment */ 
    uint16_t it_len; /**< Length in bytes of the entire Radiotap header */ 
    uint32_t it_present; /**< Which Radiotap fields are present */ 
} PACKED libtrace_radiotap_t; 

所以我投我libtrace_packet_t這個Radiotap結構和檢查結果:

link = (char *) trace_get_packet_buffer(packet, &linktype, NULL); 

if (linktype != TRACE_TYPE_80211_RADIO) 
    return; 

rtap = (libtrace_radiotap_t *) link; 

printf("%d %d %d %d\n", rtap->it_present, rtap->it_pad, rtap->it_len, 
     rtap->it_present); 

在我的機器,這是小endian,來自我的pcap文件中的數據包的Radiotap數據是:

806959 0 72 806959 

這是正確的。我的開發機器成功解析了我期望從pcap文件中看到的數據。

當我生產的盒子,裏面是大端跑,我看到不同的值:

793775104 0 18432 793775104 

同PCAP文件中相同的數據包。不同的Radiotap值。我懷疑這個問題是由於兩臺機器的不同的排列順序。但是,rtap.it_version是一個uint8_t,它是單字節,不應受endian問題的影響,不是?

+2

在這兩種情況下,您的8位值it_pad都會打印相同的「0」。您正在打印兩次「it_present」。你沒有打印'it_version'。 – lurker

+0

那真是愚蠢的我。你已經解決了我的Radiotap問題。然而,引導我到另一個問題。當我的''link''投向[Frame Control結構](http://www.wand.net.nz/trac/libtrace/browser/trunk/libpacketdump/link_4.c#L31)時,我的兩臺機器顯示了兩個「fc.type」和「fc.subtype」的不同值。這是FC結構中uint8_t的endian問題嗎? – Kane

+2

POSIX有'htonl','ntohl'等接口在「網絡」和「主機」之間進行轉換。 –

回答

1

這應該是一個排序問題。 對於72,十六進制是0x48,它是一個uint16_t,所以在0x4800 = 18432的不同字節順序上。沒錯。 而對於806959 = 0xC502F,在不同字節這0x2F50C000 = 793775104.

這可能會幫助:

#define T(x) (((x&0xff)<<24)|((x&0xff00)<<8)|((x&0xff0000)>>8)|((x&0xff000000)>>24)) 
+0

所以。如果這是一個16位的endian問題(我同意它是這樣),那麼32位解決方案有什麼用?16位版本的密度要小得多。 – WhozCraig

+0

我會說這是一個16位問題,也是一個32位的0x2F50C000 = 793775104. – TangXC

+0

我認爲調整代碼以適應16位問題並不困難。但是我錯誤地認識到了這個問題,它實際上是一個「8位」問題(請參閱問題下面的註釋)。 XD – TangXC

0

通過libtrace點回到了頭,因爲它出現在「線」的頭結構,即沒有任何嘗試轉換爲主機字節順序。

Radiotap標題字段總是小端(與傳統的網絡字節順序相反,這是大端),所以如果您要嘗試手動解析標頭,則需要對此進行補償。只使用ntohl將無法​​正常工作,因爲這需要您轉換的值爲big-endian。

然而,更好的方法是使用內置的libtrace函數來訪問各種無線電接口字段,例如, trace_get_wireless_ratetrace_get_wireless_signal_strength_dbm等等。這些函數將根據您的主機架構進行字節順序轉換,所以您不必擔心。

至於你的問題struct ieee80211_frame_control,這看起來像一個錯誤。我會推薦filing a bug ticket with the libtrace developers