Skip to contentSkip to conversation

Packet injection with ath9k

DISCUSSION Roberto Riggio 3 participants 6 messages May 7, 2010 – May 12, 2010

lore
Share & tools
lore
#0 lore raw

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.

#1 lore raw

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_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.
--
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. :-)
#2 lore raw

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_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.
--
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

#3 lore raw

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_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.

Quoted 58 lines

} __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 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_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.
--
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. :-)
#4 lore raw
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.

#5 lore raw
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