All of lore.kernel.org
 help / color / mirror / Atom feed
From: Roberto Riggio <roberto.riggio@create-net.org>
To: linux-wireless@vger.kernel.org
Subject: [PATCH] Frame injection
Date: Mon, 06 Jun 2011 13:12:46 +0200	[thread overview]
Message-ID: <4DECB62E.2020202@create-net.org> (raw)

This patch is a combination of Matteo's patch and another submitted
several months ago on the list. It is tested for what concerns 11g rates.
However I did not manage to inject frames at 11n rates (tested only with
an atheros sr71a card)

Signed-off-by: Roberto Riggio <roberto.riggio@create-net.org>

--

diff -urN compat-wireless-2011-05-13.old//include/net/mac80211.h 
compat-wireless-2011-05-13//include/net/mac80211.h
--- compat-wireless-2011-05-13.old//include/net/mac80211.h    2011-05-16 
19:20:13.000000000 +0100
+++ compat-wireless-2011-05-13//include/net/mac80211.h    2011-05-30 
12:52:25.260002000 +0100
@@ -344,6 +344,7 @@
   * @IEEE80211_TX_INTFL_TKIP_MIC_FAILURE: Marks this packet to be used 
for TKIP
   *    testing. It will be sent out with incorrect Michael MIC key to allow
   *    TKIP countermeasures to be tested.
+ * @IEEE80211_TX_CTL_RC_BYPASS: Don't use rate control on the frame.
   *
   * Note: If you have to add new flags to the enumeration, then don't
   *     forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary.
@@ -374,6 +375,7 @@
      IEEE80211_TX_CTL_STBC            = BIT(23) | BIT(24),
      IEEE80211_TX_CTL_TX_OFFCHAN        = BIT(25),
      IEEE80211_TX_INTFL_TKIP_MIC_FAILURE    = BIT(26),
+    IEEE80211_TX_CTL_RC_BYPASS        = BIT(27),
  };

  #define IEEE80211_TX_CTL_STBC_SHIFT        23
diff -urN compat-wireless-2011-05-13.old//net/mac80211/tx.c 
compat-wireless-2011-05-13//net/mac80211/tx.c
--- compat-wireless-2011-05-13.old//net/mac80211/tx.c    2011-05-16 
19:20:13.000000000 +0100
+++ compat-wireless-2011-05-13//net/mac80211/tx.c    2011-05-30 
14:00:36.936002002 +0100
@@ -1040,11 +1040,14 @@
      struct ieee80211_radiotap_iterator iterator;
      struct ieee80211_radiotap_header *rthdr =
          (struct ieee80211_radiotap_header *) skb->data;
+    struct ieee80211_supported_band *sband;
      bool hw_frag;
      struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
      int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len,
                             NULL);

+    sband = tx->local->hw.wiphy->bands[tx->channel->band];
+
      info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
      tx->flags &= ~IEEE80211_TX_FRAGMENTED;

@@ -1092,6 +1095,55 @@
                  tx->flags |= IEEE80211_TX_FRAGMENTED;
              break;

+        case IEEE80211_RADIOTAP_RATE: {
+            int i, idx = -1;
+            int rate = *iterator.this_arg * 5;
+
+            for (i = 0; i < sband->n_bitrates; i++)
+                if (sband->bitrates[i].bitrate == rate) {
+                    idx = i;
+                    break;
+                }
+
+            /* Rate not available - rejecting */
+            if (idx < 0)
+                return false;
+
+            info->flags |= IEEE80211_TX_CTL_RC_BYPASS;
+            info->control.rates[0].idx = idx;
+            info->control.rates[0].count = 1;
+            for (i = 1; i < IEEE80211_TX_MAX_RATES; i++)
+                info->control.rates[i].idx = -1;
+            break;
+        }
+
+        case IEEE80211_RADIOTAP_DATA_RETRIES:
+            /*
+             * Only allow setting the number of retries in
+             * conjunction with the rates, when the rate control
+             * is bypassed.
+             */
+            if (info->flags & IEEE80211_TX_CTL_RC_BYPASS)
+                info->control.rates[0].count =
+                    *iterator.this_arg;
+            break;
+
+        case IEEE80211_RADIOTAP_MCS: {
+            u8 flags = iterator.this_arg[1];
+            u8 mcs = iterator.this_arg[2];
+            info->flags |= IEEE80211_TX_CTL_RC_BYPASS;
+            info->control.rates[0].idx = mcs;
+            info->control.rates[0].flags |=
+                IEEE80211_TX_RC_MCS;
+            if (flags & IEEE80211_RADIOTAP_MCS_BW_40)
+                info->control.rates[0].flags |=
+                IEEE80211_TX_RC_40_MHZ_WIDTH;
+            if (flags & IEEE80211_RADIOTAP_MCS_SGI)
+                info->control.rates[0].flags |=
+                IEEE80211_TX_RC_SHORT_GI;
+            break;
+        }
+
          /*
           * Please update the file
           * Documentation/networking/mac80211-injection.txt
@@ -1398,8 +1450,9 @@
      CALL_TXH(ieee80211_tx_h_ps_buf);
      CALL_TXH(ieee80211_tx_h_check_control_port_protocol);
      CALL_TXH(ieee80211_tx_h_select_key);
-    if (!(tx->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL))
-        CALL_TXH(ieee80211_tx_h_rate_ctrl);
+    if (!(tx->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) &&
+        !(info->flags & IEEE80211_TX_CTL_RC_BYPASS))
+         CALL_TXH(ieee80211_tx_h_rate_ctrl);

      if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION))
          goto txh_done;
diff -urN compat-wireless-2011-05-13.old//net/wireless/radiotap.c 
compat-wireless-2011-05-13//net/wireless/radiotap.c
--- compat-wireless-2011-05-13.old//net/wireless/radiotap.c    
2011-05-16 19:20:10.000000000 +0100
+++ compat-wireless-2011-05-13//net/wireless/radiotap.c    2011-05-30 
12:51:56.348002001 +0100
@@ -40,6 +40,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_MCS] = { .align = 1, .size = 3, },
      /*
       * add more here as they are defined in radiotap.h
       */

             reply	other threads:[~2011-06-06 11:12 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-06 11:12 Roberto Riggio [this message]
2011-07-07 17:02 ` [PATCH] Frame injection John W. Linville
2011-07-07 17:33   ` Johannes Berg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4DECB62E.2020202@create-net.org \
    --to=roberto.riggio@create-net.org \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.