preserve QoS tid for injected QoS data frames
The TX path will overwrite the TID based on the SKB priority. Load the QoS TID from 802.11 frames into the skb priority to preserve it during TX handling.
This commit is contained in:
parent
3626927722
commit
02e8d534b5
@ -1,4 +1,4 @@
|
|||||||
From 03b6aa026d60cd49931934338d8ca82d05acc818 Mon Sep 17 00:00:00 2001
|
From c26411bf0d00a6ceed42e85d66812b591b7c4c83 Mon Sep 17 00:00:00 2001
|
||||||
From: Andreas Schultz <aschultz@tpip.net>
|
From: Andreas Schultz <aschultz@tpip.net>
|
||||||
Date: Thu, 4 Feb 2016 15:57:11 +0100
|
Date: Thu, 4 Feb 2016 15:57:11 +0100
|
||||||
Subject: [PATCH] support patch for smartcapwap
|
Subject: [PATCH] support patch for smartcapwap
|
||||||
@ -7,10 +7,10 @@ Allows for kernel side interception and injection of IEEE 802.11 frames.
|
|||||||
---
|
---
|
||||||
include/net/mac80211.h | 25 ++++
|
include/net/mac80211.h | 25 ++++
|
||||||
net/mac80211/ieee80211_i.h | 6 +
|
net/mac80211/ieee80211_i.h | 6 +
|
||||||
net/mac80211/iface.c | 56 +++++++++
|
net/mac80211/iface.c | 56 ++++++++
|
||||||
net/mac80211/rx.c | 81 ++++++++++--
|
net/mac80211/rx.c | 81 ++++++++++--
|
||||||
net/mac80211/tx.c | 306 +++++++++++++++++++++++++++++++++++++++++++++
|
net/mac80211/tx.c | 312 +++++++++++++++++++++++++++++++++++++++++++++
|
||||||
5 files changed, 462 insertions(+), 12 deletions(-)
|
5 files changed, 468 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
|
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
|
||||||
index 760bc4d..6722da6 100644
|
index 760bc4d..6722da6 100644
|
||||||
@ -334,10 +334,10 @@ index 82af407..29cc59b 100644
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
|
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
|
||||||
index bdc224d..3769c33 100644
|
index bdc224d..fd48ccf 100644
|
||||||
--- a/net/mac80211/tx.c
|
--- a/net/mac80211/tx.c
|
||||||
+++ b/net/mac80211/tx.c
|
+++ b/net/mac80211/tx.c
|
||||||
@@ -2939,6 +2939,138 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
|
@@ -2939,6 +2939,144 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -388,6 +388,12 @@ index bdc224d..3769c33 100644
|
|||||||
+ payload[7]);
|
+ payload[7]);
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
+ if (ieee80211_is_data_qos(hdr->frame_control)) {
|
||||||
|
+ u8 *p = ieee80211_get_qos_ctl(hdr);
|
||||||
|
+
|
||||||
|
+ skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ memset(info, 0, sizeof(*info));
|
+ memset(info, 0, sizeof(*info));
|
||||||
+
|
+
|
||||||
+ info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
+ info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
||||||
@ -476,7 +482,7 @@ index bdc224d..3769c33 100644
|
|||||||
struct sk_buff *
|
struct sk_buff *
|
||||||
ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
|
ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
|
||||||
struct sk_buff *skb, u32 info_flags)
|
struct sk_buff *skb, u32 info_flags)
|
||||||
@@ -3914,3 +4046,177 @@ void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
|
@@ -3914,3 +4052,177 @@ void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
|
||||||
ieee80211_xmit(sdata, NULL, skb);
|
ieee80211_xmit(sdata, NULL, skb);
|
||||||
local_bh_enable();
|
local_bh_enable();
|
||||||
}
|
}
|
||||||
@ -655,5 +661,5 @@ index bdc224d..3769c33 100644
|
|||||||
+EXPORT_SYMBOL(ieee80211_inject_xmit);
|
+EXPORT_SYMBOL(ieee80211_inject_xmit);
|
||||||
+
|
+
|
||||||
--
|
--
|
||||||
2.7.0
|
2.8.1
|
||||||
|
|
||||||
|
@ -169,8 +169,6 @@ static void sc_send_8023(struct sk_buff *skb, struct net_device *dev)
|
|||||||
static void sc_send_80211(struct sk_buff *skb, struct net_device *dev)
|
static void sc_send_80211(struct sk_buff *skb, struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
struct ieee80211_hdr *hdr;
|
|
||||||
int hdrlen;
|
|
||||||
|
|
||||||
printk(KERN_DEBUG "capwap inject: %s: hdr: %p\n",
|
printk(KERN_DEBUG "capwap inject: %s: hdr: %p\n",
|
||||||
dev->name, skb->data);
|
dev->name, skb->data);
|
||||||
@ -185,17 +183,15 @@ static void sc_send_80211(struct sk_buff *skb, struct net_device *dev)
|
|||||||
/* drop conntrack reference */
|
/* drop conntrack reference */
|
||||||
nf_reset(skb);
|
nf_reset(skb);
|
||||||
|
|
||||||
hdr = (struct ieee80211_hdr *)skb->data;
|
skb_reset_mac_header(skb);
|
||||||
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
skb_reset_network_header(skb);
|
||||||
|
skb_reset_transport_header(skb);
|
||||||
|
|
||||||
skb->dev = dev;
|
skb->dev = dev;
|
||||||
|
|
||||||
skb_set_mac_header(skb, hdrlen);
|
|
||||||
skb_set_network_header(skb, hdrlen);
|
|
||||||
skb_set_transport_header(skb, hdrlen);
|
|
||||||
|
|
||||||
skb->protocol = htons(ETH_P_CONTROL);
|
skb->protocol = htons(ETH_P_CONTROL);
|
||||||
info->flags |= IEEE80211_TX_CTL_INJECTED;
|
|
||||||
|
memset(info, 0, sizeof(*info));
|
||||||
|
info->flags = IEEE80211_TX_CTL_INJECTED;
|
||||||
|
|
||||||
/* Force the device to verify it. */
|
/* Force the device to verify it. */
|
||||||
skb->ip_summed = CHECKSUM_NONE;
|
skb->ip_summed = CHECKSUM_NONE;
|
||||||
|
Loading…
Reference in New Issue
Block a user