mac80211: refactor ieee80211_set_qos_hdr
Return early if not a QoS Data frame. Give proper documentation. Signed-off-by: Marco Porsch <marco.porsch@etit.tu-chemnitz.de> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
65821635d2
commit
40aefedc8b
|
@ -160,31 +160,37 @@ u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
||||||
return ieee80211_downgrade_queue(sdata, skb);
|
return ieee80211_downgrade_queue(sdata, skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ieee80211_set_qos_hdr - Fill in the QoS header if there is one.
|
||||||
|
*
|
||||||
|
* @sdata: local subif
|
||||||
|
* @skb: packet to be updated
|
||||||
|
*/
|
||||||
void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata,
|
void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata,
|
||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
|
u8 *p;
|
||||||
|
u8 ack_policy, tid;
|
||||||
|
|
||||||
/* Fill in the QoS header if there is one. */
|
if (!ieee80211_is_data_qos(hdr->frame_control))
|
||||||
if (ieee80211_is_data_qos(hdr->frame_control)) {
|
return;
|
||||||
u8 *p = ieee80211_get_qos_ctl(hdr);
|
|
||||||
u8 ack_policy, tid;
|
|
||||||
|
|
||||||
tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
|
p = ieee80211_get_qos_ctl(hdr);
|
||||||
|
tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
|
||||||
|
|
||||||
/* preserve EOSP bit */
|
/* preserve EOSP bit */
|
||||||
ack_policy = *p & IEEE80211_QOS_CTL_EOSP;
|
ack_policy = *p & IEEE80211_QOS_CTL_EOSP;
|
||||||
|
|
||||||
if (is_multicast_ether_addr(hdr->addr1) ||
|
if (is_multicast_ether_addr(hdr->addr1) ||
|
||||||
sdata->noack_map & BIT(tid)) {
|
sdata->noack_map & BIT(tid)) {
|
||||||
ack_policy |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK;
|
ack_policy |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK;
|
||||||
info->flags |= IEEE80211_TX_CTL_NO_ACK;
|
info->flags |= IEEE80211_TX_CTL_NO_ACK;
|
||||||
}
|
|
||||||
|
|
||||||
/* qos header is 2 bytes */
|
|
||||||
*p++ = ack_policy | tid;
|
|
||||||
*p = ieee80211_vif_is_mesh(&sdata->vif) ?
|
|
||||||
(IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT >> 8) : 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* qos header is 2 bytes */
|
||||||
|
*p++ = ack_policy | tid;
|
||||||
|
*p = ieee80211_vif_is_mesh(&sdata->vif) ?
|
||||||
|
(IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT >> 8) : 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue