blob: 63ba6611fdff8a6e39485b824004b5bca4135d50 [file] [log] [blame]
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +02001.. SPDX-License-Identifier: GPL-2.0
2
3=========================================
Andy Green08d1f212007-07-10 19:29:37 +02004How to use packet injection with mac80211
5=========================================
6
7mac80211 now allows arbitrary packets to be injected down any Monitor Mode
8interface from userland. The packet you inject needs to be composed in the
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +02009following format::
Andy Green08d1f212007-07-10 19:29:37 +020010
11 [ radiotap header ]
12 [ ieee80211 header ]
13 [ payload ]
14
15The radiotap format is discussed in
Mauro Carvalho Chehab66d495d2020-04-30 18:04:17 +020016./Documentation/networking/radiotap-headers.rst.
Andy Green08d1f212007-07-10 19:29:37 +020017
Johannes Bergde2b3e82009-04-08 12:54:41 +020018Despite many radiotap parameters being currently defined, most only make sense
Johannes Berg58d41852007-09-26 17:53:18 +020019to appear on received packets. The following information is parsed from the
20radiotap headers and used to control injection:
Andy Green08d1f212007-07-10 19:29:37 +020021
Johannes Berg58d41852007-09-26 17:53:18 +020022 * IEEE80211_RADIOTAP_FLAGS
23
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020024 ========================= ===========================================
25 IEEE80211_RADIOTAP_F_FCS FCS will be removed and recalculated
26 IEEE80211_RADIOTAP_F_WEP frame will be encrypted if key available
27 IEEE80211_RADIOTAP_F_FRAG frame will be fragmented if longer than the
Johannes Bergde2b3e82009-04-08 12:54:41 +020028 current fragmentation threshold.
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020029 ========================= ===========================================
Johannes Bergde2b3e82009-04-08 12:54:41 +020030
Helmut Schaad9cd48f2011-10-07 11:53:41 +020031 * IEEE80211_RADIOTAP_TX_FLAGS
32
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020033 ============================= ========================================
34 IEEE80211_RADIOTAP_F_TX_NOACK frame should be sent without waiting for
Helmut Schaad9cd48f2011-10-07 11:53:41 +020035 an ACK even if it is a unicast frame
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020036 ============================= ========================================
Johannes Berg58d41852007-09-26 17:53:18 +020037
Sven Eckelmanndfdfc2b2016-01-26 17:11:13 +010038 * IEEE80211_RADIOTAP_RATE
39
40 legacy rate for the transmission (only for devices without own rate control)
41
42 * IEEE80211_RADIOTAP_MCS
43
44 HT rate for the transmission (only for devices without own rate control).
45 Also some flags are parsed
46
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020047 ============================ ========================
48 IEEE80211_RADIOTAP_MCS_SGI use short guard interval
49 IEEE80211_RADIOTAP_MCS_BW_40 send in HT40 mode
50 ============================ ========================
Sven Eckelmanndfdfc2b2016-01-26 17:11:13 +010051
52 * IEEE80211_RADIOTAP_DATA_RETRIES
53
54 number of retries when either IEEE80211_RADIOTAP_RATE or
55 IEEE80211_RADIOTAP_MCS was used
56
Lorenzo Bianconi646e76b2016-02-23 15:43:35 +010057 * IEEE80211_RADIOTAP_VHT
58
59 VHT mcs and number of streams used in the transmission (only for devices
60 without own rate control). Also other fields are parsed
61
62 flags field
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020063 IEEE80211_RADIOTAP_VHT_FLAG_SGI: use short guard interval
Lorenzo Bianconi646e76b2016-02-23 15:43:35 +010064
65 bandwidth field
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020066 * 1: send using 40MHz channel width
67 * 4: send using 80MHz channel width
68 * 11: send using 160MHz channel width
Lorenzo Bianconi646e76b2016-02-23 15:43:35 +010069
Johannes Berg58d41852007-09-26 17:53:18 +020070The injection code can also skip all other currently defined radiotap fields
71facilitating replay of captured radiotap headers directly.
Andy Green08d1f212007-07-10 19:29:37 +020072
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020073Here is an example valid radiotap header defining some parameters::
Andy Green08d1f212007-07-10 19:29:37 +020074
75 0x00, 0x00, // <-- radiotap version
76 0x0b, 0x00, // <- radiotap header length
77 0x04, 0x0c, 0x00, 0x00, // <-- bitmap
78 0x6c, // <-- rate
79 0x0c, //<-- tx power
80 0x01 //<-- antenna
81
82The ieee80211 header follows immediately afterwards, looking for example like
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020083this::
Andy Green08d1f212007-07-10 19:29:37 +020084
85 0x08, 0x01, 0x00, 0x00,
86 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
87 0x13, 0x22, 0x33, 0x44, 0x55, 0x66,
88 0x13, 0x22, 0x33, 0x44, 0x55, 0x66,
89 0x10, 0x86
90
91Then lastly there is the payload.
92
93After composing the packet contents, it is sent by send()-ing it to a logical
94mac80211 interface that is in Monitor mode. Libpcap can also be used,
95(which is easier than doing the work to bind the socket to the right
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020096interface), along the following lines:::
Andy Green08d1f212007-07-10 19:29:37 +020097
98 ppcap = pcap_open_live(szInterfaceName, 800, 1, 20, szErrbuf);
Mauro Carvalho Chehab429ff872020-04-30 18:03:59 +020099 ...
Andy Green08d1f212007-07-10 19:29:37 +0200100 r = pcap_inject(ppcap, u8aSendBuffer, nLength);
101
Johannes Bergde2b3e82009-04-08 12:54:41 +0200102You can also find a link to a complete inject application here:
Andy Green08d1f212007-07-10 19:29:37 +0200103
Flavio Suligoi327cdb92020-06-05 17:41:04 +0200104https://wireless.wiki.kernel.org/en/users/Documentation/packetspammer
Andy Green08d1f212007-07-10 19:29:37 +0200105
106Andy Green <andy@warmcat.com>