Packet injection with ath9k
Hi,
I'm writing an application to inject traffic over a wireless interface. This app is working fine on an x86 machine. However if i compile the same app for an arm platform, no frame are sent over the wireless interface (ath9k).
I'm guessing that this is because of some alignment issues but i cannot track the piece of code that is actually parsing the frame. I've found the __ieee80211_parse_tx_radiotap in net/mac80211/tx.c function, but it is not called when i try to inject some traffic, so the frame are dropped before that.
Any hints?
Thanks
R.
Hi!
Are you sure it is not your injector that is having alignment issues? AFAIK the radiotap parser explicitly uses endianness-aware function everywhere.
Quoted 23 lines · Roberto Riggio
Hi,
I'm writing an application to inject traffic over a wireless interface. This app
is working fine on an x86 machine. However if i compile the same app for an arm platform, no frame are sent over the wireless interface (ath9k).I'm guessing that this is because of some alignment issues but i cannot track
the piece of code that is actually parsing the frame. I've found the__ieee80211_parse_tx_radiotapinnet/mac80211/tx.cfunction, but it is not called when i try to inject some traffic, so the frame are dropped before that.Any hints?
Thanks
R.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 1 line
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
Hi,
well, that is what i wanted to understand. These are the struct that I'm using to compose the rediotap header:
struct ieee80211_radiotap_header {
u_int8_t it_version;
u_int8_t it_pad;
u_int16_t it_len;
u_int32_t it_present;
} __attribute__((__packed__));struct click_radiotap_header {
struct ieee80211_radiotap_header wt_ihdr;
u_int8_t wt_rate;
u_int8_t wt_txpower;
u_int8_t wt_rts_retries;
u_int8_t wt_data_retries;
};The flags are set in order to take into account the fields that I specify. But i do not know at which point the frame are dropped.
R.
Quoted 35 lines · Gábor Stefanik
Hi!
Are you sure it is not your injector that is having alignment issues? AFAIK the radiotap parser explicitly uses endianness-aware function everywhere.Quoted 24 lines · Roberto Riggio
Hi,
I'm writing an application to inject traffic over a wireless interface. This app
is working fine on an x86 machine. However if i compile the same app for an arm platform, no frame are sent over the wireless interface (ath9k).I'm guessing that this is because of some alignment issues but i cannot track
the piece of code that is actually parsing the frame. I've found the__ieee80211_parse_tx_radiotapinnet/mac80211/tx.cfunction, but it is not called when i try to inject some traffic, so the frame are dropped before that.Any hints?
Thanks
R.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
2010/5/7 Roberto Riggio <[email protected]>:
Quoted 10 lines
Hi,
well, that is what i wanted to understand. These are the struct that I'm using to compose the rediotap header:
struct
ieee80211_radiotap_header{
u_int8_t it_version;
u_int8_t it_pad;
u_int16_tit_len;
u_int32_tit_present;
AFAIK these 2 fields need to be little-endian even on big-endian machines. If your system is big-endian, this can cause problems.
Quoted 58 lines
} __attribute__((__packed__));
struct
click_radiotap_header{
structieee80211_radiotap_headerwt_ihdr;
u_int8_t wt_rate;
u_int8_t wt_txpower;
u_int8_t wt_rts_retries;
u_int8_t wt_data_retries;
};The flags are set in order to take into account the fields that I specify. But i do not know at which point the frame are dropped.
R.
Quoted 39 lines · Gábor Stefanik
Hi!
Are you sure it is not your injector that is having alignment issues? AFAIK the radiotap parser explicitly uses endianness-aware function everywhere.Quoted 27 lines · Roberto Riggio
Hi,
I'm writing an application to inject traffic over a wireless interface. This
app
is working fine on an x86 machine. However if i compile the same app for an arm platform, no frame are sent over the wireless interface (ath9k).I'm guessing that this is because of some alignment issues but i cannot track
the piece of code that is actually parsing the frame. I've found the__ieee80211_parse_tx_radiotapinnet/mac80211/tx.cfunction, but it is not called when i try to inject some traffic, so the frame are dropped before that.Any hints?
Thanks
R.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 1 line
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
Quoted 6 lines · Gábor Stefanik
Quoted 3 lines
u_int16_t it_len; u_int32_t it_present;AFAIK these 2 fields need to be little-endian even on big-endian machines. If your system is big-endian, this can cause problems.
Thanks, that was indeed the issue. I totally missed this info in the radiotap website. Everything is working fine now.
R.
Quoted 10 lines · Roberto Riggio
Quoted 6 lines · Gábor Stefanik
Quoted 3 lines
u_int16_t it_len; u_int32_t it_present;AFAIK these 2 fields need to be little-endian even on big-endian machines. If your system is big-endian, this can cause problems.
Thanks, that was indeed the issue. I totally missed this info in the radiotap website. Everything is working fine now.
I'd make it more prominent, but ... this is what it says now:
Important Radiotap Characteristics
* Fields are strictly ordered; The developer can specify any combination of fields, but the data must appear following the radiotap header in the order they are specified in the it_present bitmask (or more accurately, in the order the bit numbers for the it_present bitmask are defined).
* Data is specified in little endian byte-order, all data fields including the it_version, it_len and it_present fields in the radiotap header are to be specified in little endian byte-order. This wiki has adopted the Linux convention of using __le64, __le32 and __le16 for 64-, 32- and 16-bit little endian quantities.
johannes