Index: wireshark/epan/dissectors/packet-radiotap-defs.h
===================================================================
--- wireshark.orig/epan/dissectors/packet-radiotap-defs.h	2009-11-27 14:53:59.175483543 +0100
+++ wireshark/epan/dissectors/packet-radiotap-defs.h	2009-11-27 14:54:03.849014442 +0100
@@ -175,6 +175,11 @@
  *
  *     Number of unicast retries a transmitted frame used.
  *
+ * IEEE80211_RADIOTAP_RATE_MCS       2 x u8          data, bitmap
+ *
+ *     First byte is the MCS index of the rate,
+ *     second one has flags about channel width and guard interval
+ *
  */
 enum ieee80211_radiotap_type {
 	IEEE80211_RADIOTAP_TSFT = 0,
@@ -195,6 +200,7 @@
 	IEEE80211_RADIOTAP_TX_FLAGS = 15,
 	IEEE80211_RADIOTAP_RTS_RETRIES = 16,
 	IEEE80211_RADIOTAP_DATA_RETRIES = 17,
+	IEEE80211_RADIOTAP_RATE_MCS = 19,
 
 	/* valid in every it_present bitmap, even vendor namespaces */
 	IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29,
@@ -242,4 +248,8 @@
 #define IEEE80211_RADIOTAP_F_TX_CTS	0x0002	/* used cts 'protection' */
 #define IEEE80211_RADIOTAP_F_TX_RTS	0x0004	/* used rts/cts handshake */
 
+/* For IEEE80211_RADIOTAP_RATE_MCS */
+#define IEEE80211_RADIOTAP_RATE_MCS_40MHZ	0x01 /* 40 MHz channel width */
+#define IEEE80211_RADIOTAP_RATE_MCS_SHORT_GI	0x02 /* short guard interval */
+
 #endif				/* IEEE80211_RADIOTAP_H */
Index: wireshark/epan/dissectors/packet-radiotap-iter.c
===================================================================
--- wireshark.orig/epan/dissectors/packet-radiotap-iter.c	2009-11-27 14:53:59.175483543 +0100
+++ wireshark/epan/dissectors/packet-radiotap-iter.c	2009-11-27 14:54:03.853019402 +0100
@@ -37,6 +37,7 @@
 	[IEEE80211_RADIOTAP_TX_FLAGS] = { .align = 2, .size = 2, },
 	[IEEE80211_RADIOTAP_RTS_RETRIES] = { .align = 1, .size = 1, },
 	[IEEE80211_RADIOTAP_DATA_RETRIES] = { .align = 1, .size = 1, },
+	[IEEE80211_RADIOTAP_RATE_MCS] = { .align = 1, .size = 2, },
 	/*
 	 * add more here as they are defined in
 	 * include/net/ieee80211_radiotap.h
Index: wireshark/epan/dissectors/packet-radiotap.c
===================================================================
--- wireshark.orig/epan/dissectors/packet-radiotap.c	2009-11-27 14:53:59.179483222 +0100
+++ wireshark/epan/dissectors/packet-radiotap.c	2009-11-27 14:54:03.853019402 +0100
@@ -154,6 +154,8 @@
 static int hf_radiotap_db_antnoise = -1;
 static int hf_radiotap_tx_attenuation = -1;
 static int hf_radiotap_db_tx_attenuation = -1;
+static int hf_radiotap_mcs = -1;
+static int hf_radiotap_mcs_flags = -1;
 static int hf_radiotap_txpower = -1;
 static int hf_radiotap_vendor_ns = -1;
 static int hf_radiotap_ven_oui = -1;
@@ -179,6 +181,7 @@
 static int hf_radiotap_present_hdrfcs = -1;
 static int hf_radiotap_present_rxflags = -1;
 static int hf_radiotap_present_xchannel = -1;
+static int hf_radiotap_present_mcs = -1;
 static int hf_radiotap_present_rtap_ns = -1;
 static int hf_radiotap_present_vendor_ns = -1;
 static int hf_radiotap_present_ext = -1;
@@ -198,12 +201,17 @@
 static int hf_radiotap_fcs = -1;
 static int hf_radiotap_fcs_bad = -1;
 
+/* MCS flags */
+static int hf_radiotap_mcs_flags_40mhz = -1;
+static int hf_radiotap_mcs_flags_short_gi = -1;
+
 static gint ett_radiotap = -1;
 static gint ett_radiotap_present = -1;
 static gint ett_radiotap_flags = -1;
 static gint ett_radiotap_rxflags = -1;
 static gint ett_radiotap_channel_flags = -1;
 static gint ett_radiotap_xchannel_flags = -1;
+static gint ett_radiotap_mcs = -1;
 static gint ett_radiotap_vendor = -1;
 
 static dissector_handle_t ieee80211_handle;
@@ -465,6 +473,11 @@
 	FT_BOOLEAN, 32, NULL, RADIOTAP_MASK(XCHANNEL),
 	"Specifies if the extended channel info field is present", HFILL } },
 
+    { &hf_radiotap_present_mcs,
+      { "MCS", "radiotap.present.mcs",
+	FT_BOOLEAN, 32, NULL, RADIOTAP_MASK(RATE_MCS),
+	"Specifies if the MCS rate field is present", HFILL } },
+
     { &hf_radiotap_present_rtap_ns,
       { "Radiotap NS next", "radiotap.present.rtap_ns",
 	FT_BOOLEAN, 32, NULL, RADIOTAP_MASK(RADIOTAP_NAMESPACE),
@@ -707,6 +720,26 @@
 	FT_UINT16, BASE_DEC, NULL, 0x0,
 	"Transmit power expressed as decibels from max power set at factory (0 is max power)", HFILL } },
 
+    { &hf_radiotap_mcs,
+      { "MCS rate index", "radiotap.mcs_index",
+	FT_UINT8, BASE_DEC, NULL, 0x0,
+	"Index of the MCS HT rate used (0-76)", HFILL } },
+
+    { &hf_radiotap_mcs_flags,
+      { "HT rate flags", "radiotap.mcs_flags",
+	FT_NONE, BASE_NONE, NULL, 0x0,
+	"Flags about HT rate used (channel width and guard interval)", HFILL } },
+
+    { &hf_radiotap_mcs_flags_40mhz,
+      { "40 MHz", "radiotap.mcs_flags.40mhz",
+	FT_BOOLEAN, 8, NULL, IEEE80211_RADIOTAP_RATE_MCS_40MHZ,
+	"40 MHz channel width", HFILL } },
+
+    { &hf_radiotap_mcs_flags_short_gi,
+      { "Short GI", "radiotap.mcs_flags.shortgi",
+	FT_BOOLEAN, 8, NULL, IEEE80211_RADIOTAP_RATE_MCS_SHORT_GI,
+	"Short guard interval", HFILL } },
+
     { &hf_radiotap_txpower,
       { "Transmit power", "radiotap.txpower",
 	FT_INT32, BASE_DEC, NULL, 0x0,
@@ -751,6 +784,7 @@
     &ett_radiotap_rxflags,
     &ett_radiotap_channel_flags,
     &ett_radiotap_xchannel_flags,
+    &ett_radiotap_mcs,
     &ett_radiotap_vendor,
   };
   module_t *radiotap_module;
@@ -776,6 +810,7 @@
 {
     proto_tree *radiotap_tree = NULL;
     proto_tree *pt, *present_tree = NULL;
+    proto_tree *mt, *mcs_tree = NULL;
     proto_tree *ft, *flags_tree = NULL;
     proto_item *ti = NULL;
     proto_item *hidden_item;
@@ -920,6 +955,8 @@
             }
             proto_tree_add_item(present_tree, hf_radiotap_present_xchannel,
                 tvb, offset + 4, 4, TRUE);
+            proto_tree_add_item(present_tree, hf_radiotap_present_mcs,
+                tvb, offset + 4, 4, TRUE);
 
  always_bits:
             proto_tree_add_item(present_tree, hf_radiotap_present_rtap_ns,
@@ -1159,6 +1196,17 @@
             proto_tree_add_item(radiotap_tree, hf_radiotap_db_tx_attenuation,
                                 tvb, offset, 2, FALSE);
             break;
+        case IEEE80211_RADIOTAP_RATE_MCS:
+            proto_tree_add_item(radiotap_tree, hf_radiotap_mcs,
+                                tvb, offset, 1, FALSE);
+            mt = proto_tree_add_item(radiotap_tree, hf_radiotap_mcs_flags,
+                                tvb, offset + 1, 1, FALSE);
+            mcs_tree = proto_item_add_subtree(mt, ett_radiotap_mcs);
+            proto_tree_add_item(mcs_tree, hf_radiotap_mcs_flags_40mhz,
+                                tvb, offset + 1, 1, FALSE);
+            proto_tree_add_item(mcs_tree, hf_radiotap_mcs_flags_short_gi,
+                                tvb, offset + 1, 1, FALSE);
+           break;
         case IEEE80211_RADIOTAP_TSFT:
             radiotap_info->tsft=tvb_get_letoh64(tvb, offset);
             if (tree) {

