Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 238f74a2 authored by Harvey Harrison's avatar Harvey Harrison Committed by John W. Linville
Browse files

mac80211: move QOS control helpers into ieee80211.h



Also remove the WLAN_IS_QOS_DATA inline after removing the last
two users.  This starts moving away from using rx->fc to using
the header frame_control directly.

Signed-off-by: default avatarHarvey Harrison <harvey.harrison@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 994d31f7
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -99,6 +99,8 @@
#define IEEE80211_MAX_SSID_LEN		32
#define IEEE80211_MAX_SSID_LEN		32
#define IEEE80211_MAX_MESH_ID_LEN	32
#define IEEE80211_MAX_MESH_ID_LEN	32
#define IEEE80211_QOS_CTL_LEN		2
#define IEEE80211_QOS_CTL_LEN		2
#define IEEE80211_QOS_CTL_TID_MASK	0x000F
#define IEEE80211_QOS_CTL_TAG1D_MASK	0x0007


struct ieee80211_hdr {
struct ieee80211_hdr {
	__le16 frame_control;
	__le16 frame_control;
+14 −14
Original line number Original line Diff line number Diff line
@@ -321,20 +321,20 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,


static void ieee80211_parse_qos(struct ieee80211_rx_data *rx)
static void ieee80211_parse_qos(struct ieee80211_rx_data *rx)
{
{
	u8 *data = rx->skb->data;
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
	int tid;
	int tid;


	/* does the frame have a qos control field? */
	/* does the frame have a qos control field? */
	if (WLAN_FC_IS_QOS_DATA(rx->fc)) {
	if (ieee80211_is_data_qos(hdr->frame_control)) {
		u8 *qc = data + ieee80211_get_hdrlen(rx->fc) - QOS_CONTROL_LEN;
		u8 *qc = ieee80211_get_qos_ctl(hdr);
		/* frame has qos control */
		/* frame has qos control */
		tid = qc[0] & QOS_CONTROL_TID_MASK;
		tid = *qc & IEEE80211_QOS_CTL_TID_MASK;
		if (qc[0] & IEEE80211_QOS_CONTROL_A_MSDU_PRESENT)
		if (*qc & IEEE80211_QOS_CONTROL_A_MSDU_PRESENT)
			rx->flags |= IEEE80211_RX_AMSDU;
			rx->flags |= IEEE80211_RX_AMSDU;
		else
		else
			rx->flags &= ~IEEE80211_RX_AMSDU;
			rx->flags &= ~IEEE80211_RX_AMSDU;
	} else {
	} else {
		if (unlikely((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT)) {
		if (unlikely(ieee80211_is_mgmt(hdr->frame_control))) {
			/* Separate TID for management frames */
			/* Separate TID for management frames */
			tid = NUM_RX_DATA_QUEUES - 1;
			tid = NUM_RX_DATA_QUEUES - 1;
		} else {
		} else {
@@ -1037,19 +1037,19 @@ ieee80211_rx_h_ps_poll(struct ieee80211_rx_data *rx)
static ieee80211_rx_result debug_noinline
static ieee80211_rx_result debug_noinline
ieee80211_rx_h_remove_qos_control(struct ieee80211_rx_data *rx)
ieee80211_rx_h_remove_qos_control(struct ieee80211_rx_data *rx)
{
{
	u16 fc = rx->fc;
	u8 *data = rx->skb->data;
	u8 *data = rx->skb->data;
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)data;
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)data;


	if (!WLAN_FC_IS_QOS_DATA(fc))
	if (!ieee80211_is_data_qos(hdr->frame_control))
		return RX_CONTINUE;
		return RX_CONTINUE;


	/* remove the qos control field, update frame type and meta-data */
	/* remove the qos control field, update frame type and meta-data */
	memmove(data + 2, data, ieee80211_get_hdrlen(fc) - 2);
	memmove(data + IEEE80211_QOS_CTL_LEN, data,
	hdr = (struct ieee80211_hdr *) skb_pull(rx->skb, 2);
		ieee80211_hdrlen(hdr->frame_control) - IEEE80211_QOS_CTL_LEN);
	hdr = (struct ieee80211_hdr *)skb_pull(rx->skb, IEEE80211_QOS_CTL_LEN);
	/* change frame type to non QOS */
	/* change frame type to non QOS */
	rx->fc = fc &= ~IEEE80211_STYPE_QOS_DATA;
	rx->fc &= ~IEEE80211_STYPE_QOS_DATA;
	hdr->frame_control = cpu_to_le16(fc);
	hdr->frame_control &= ~cpu_to_le16(IEEE80211_STYPE_QOS_DATA);


	return RX_CONTINUE;
	return RX_CONTINUE;
}
}
@@ -2044,7 +2044,7 @@ static u8 ieee80211_rx_reorder_ampdu(struct ieee80211_local *local,
	if (!ieee80211_is_data_qos(hdr->frame_control))
	if (!ieee80211_is_data_qos(hdr->frame_control))
		goto end_reorder;
		goto end_reorder;


	tid = *ieee80211_get_qos_ctl(hdr) & QOS_CONTROL_TID_MASK;
	tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;


	if (sta->ampdu_mlme.tid_state_rx[tid] != HT_AGG_STATE_OPERATIONAL)
	if (sta->ampdu_mlme.tid_state_rx[tid] != HT_AGG_STATE_OPERATIONAL)
		goto end_reorder;
		goto end_reorder;
+2 −2
Original line number Original line Diff line number Diff line
@@ -154,7 +154,7 @@ static int wme_qdiscop_enqueue(struct sk_buff *skb, struct Qdisc* qd)
		queue = skb_get_queue_mapping(skb);
		queue = skb_get_queue_mapping(skb);
		rcu_read_lock();
		rcu_read_lock();
		sta = sta_info_get(local, hdr->addr1);
		sta = sta_info_get(local, hdr->addr1);
		tid = skb->priority & QOS_CONTROL_TAG1D_MASK;
		tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
		if (sta) {
		if (sta) {
			int ampdu_queue = sta->tid_to_tx_q[tid];
			int ampdu_queue = sta->tid_to_tx_q[tid];
			if ((ampdu_queue < QD_NUM(hw)) &&
			if ((ampdu_queue < QD_NUM(hw)) &&
@@ -181,7 +181,7 @@ static int wme_qdiscop_enqueue(struct sk_buff *skb, struct Qdisc* qd)
	if (ieee80211_is_data_qos(hdr->frame_control)) {
	if (ieee80211_is_data_qos(hdr->frame_control)) {
		u8 *p = ieee80211_get_qos_ctl(hdr);
		u8 *p = ieee80211_get_qos_ctl(hdr);
		u8 ack_policy = 0;
		u8 ack_policy = 0;
		tid = skb->priority & QOS_CONTROL_TAG1D_MASK;
		tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
		if (local->wifi_wme_noack_test)
		if (local->wifi_wme_noack_test)
			ack_policy |= QOS_CONTROL_ACK_POLICY_NOACK <<
			ack_policy |= QOS_CONTROL_ACK_POLICY_NOACK <<
					QOS_CONTROL_ACK_POLICY_SHIFT;
					QOS_CONTROL_ACK_POLICY_SHIFT;
+0 −8
Original line number Original line Diff line number Diff line
@@ -19,18 +19,10 @@
#define QOS_CONTROL_ACK_POLICY_NORMAL 0
#define QOS_CONTROL_ACK_POLICY_NORMAL 0
#define QOS_CONTROL_ACK_POLICY_NOACK 1
#define QOS_CONTROL_ACK_POLICY_NOACK 1


#define QOS_CONTROL_TID_MASK 0x0f
#define QOS_CONTROL_ACK_POLICY_SHIFT 5
#define QOS_CONTROL_ACK_POLICY_SHIFT 5


#define QOS_CONTROL_TAG1D_MASK 0x07

extern const int ieee802_1d_to_ac[8];
extern const int ieee802_1d_to_ac[8];


static inline int WLAN_FC_IS_QOS_DATA(u16 fc)
{
	return (fc & 0x8C) == 0x88;
}

#ifdef CONFIG_MAC80211_QOS
#ifdef CONFIG_MAC80211_QOS
void ieee80211_install_qdisc(struct net_device *dev);
void ieee80211_install_qdisc(struct net_device *dev);
int ieee80211_qdisc_installed(struct net_device *dev);
int ieee80211_qdisc_installed(struct net_device *dev);