]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - Documentation/networking/radiotap-headers.txt
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6
[linux-2.6-omap-h63xx.git] / Documentation / networking / radiotap-headers.txt
index e29e027d9be3ef0b8073c824b0f4440fbbecbba3..953331c7984f1c10c9e8d27df623b8dd7dc78c7e 100644 (file)
@@ -84,4 +84,69 @@ Example valid radiotap header
        0x01 //<-- antenna
 
 
+Using the Radiotap Parser
+-------------------------
+
+If you are having to parse a radiotap struct, you can radically simplify the
+job by using the radiotap parser that lives in net/wireless/radiotap.c and has
+its prototypes available in include/net/cfg80211.h.  You use it like this:
+
+#include <net/cfg80211.h>
+
+/* buf points to the start of the radiotap header part */
+
+int MyFunction(u8 * buf, int buflen)
+{
+       int pkt_rate_100kHz = 0, antenna = 0, pwr = 0;
+       struct ieee80211_radiotap_iterator iterator;
+       int ret = ieee80211_radiotap_iterator_init(&iterator, buf, buflen);
+
+       while (!ret) {
+
+               ret = ieee80211_radiotap_iterator_next(&iterator);
+
+               if (ret)
+                       continue;
+
+               /* see if this argument is something we can use */
+
+               switch (iterator.this_arg_index) {
+               /*
+                * You must take care when dereferencing iterator.this_arg
+                * for multibyte types... the pointer is not aligned.  Use
+                * get_unaligned((type *)iterator.this_arg) to dereference
+                * iterator.this_arg for type "type" safely on all arches.
+                */
+               case IEEE80211_RADIOTAP_RATE:
+                       /* radiotap "rate" u8 is in
+                        * 500kbps units, eg, 0x02=1Mbps
+                        */
+                       pkt_rate_100kHz = (*iterator.this_arg) * 5;
+                       break;
+
+               case IEEE80211_RADIOTAP_ANTENNA:
+                       /* radiotap uses 0 for 1st ant */
+                       antenna = *iterator.this_arg);
+                       break;
+
+               case IEEE80211_RADIOTAP_DBM_TX_POWER:
+                       pwr = *iterator.this_arg;
+                       break;
+
+               default:
+                       break;
+               }
+       }  /* while more rt headers */
+
+       if (ret != -ENOENT)
+               return TXRX_DROP;
+
+       /* discard the radiotap header part */
+       buf += iterator.max_length;
+       buflen -= iterator.max_length;
+
+       ...
+
+}
+
 Andy Green <andy@warmcat.com>